package org.ff4j.test.parser;
/*
* #%L
* ff4j-core
* $Id:$
* $HeadURL:$
* %%
* Copyright (C) 2013 Ff4J
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import org.ff4j.conf.XmlConfig;
import org.ff4j.conf.XmlParser;
import org.ff4j.conf.XmlParserErrorHandler;
import org.ff4j.core.Feature;
import org.ff4j.property.Property;
import org.ff4j.property.PropertyLogLevel;
import org.ff4j.property.PropertyLogLevel.LogLevel;
import org.junit.Assert;
import org.junit.Test;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
/**
* Unit Testing
*
* @author Cedrick Lunven (@clunven)
*/
public class FeatureXmlParserTest {
@Test
public void testLoaderXMLFile() {
InputStream in = getClass().getClassLoader().getResourceAsStream("test-featureXmlParserTest-ok.xml");
Map<String, Feature> features = new XmlParser().parseConfigurationFile(in).getFeatures();
Assert.assertEquals(7, features.size());
Assert.assertTrue(features.containsKey("f0"));
Assert.assertNotNull(features.get("f0").getDescription());
Assert.assertNotNull(features.get("f0").getPermissions());
Assert.assertEquals(2, features.get("f0").getPermissions().size());
Assert.assertNotNull(features.get("f0").getFlippingStrategy());
Assert.assertEquals(1, features.get("f0").getFlippingStrategy().getInitParams().size());
Assert.assertNotNull(features.get("f0").getGroup());
Assert.assertEquals("group3", features.get("f0").getGroup());
Assert.assertTrue(features.containsKey("f1"));
Assert.assertTrue(features.containsKey("f2"));
Assert.assertTrue(features.containsKey("f3"));
Assert.assertTrue(features.containsKey("f4"));
Assert.assertTrue(features.containsKey("f5"));
}
@Test(expected = IllegalArgumentException.class)
public void testSaxException() {
InputStream in = new ByteArrayInputStream("<TOTO>Invalid</TOTO2>".getBytes());
new XmlParser().parseConfigurationFile(in);
}
@Test(expected = IllegalArgumentException.class)
public void testNullFile() {
new XmlParser().parseConfigurationFile(null);
}
@Test(expected = IllegalArgumentException.class)
public void testLoaderRequiredUid() {
InputStream in = getClass().getClassLoader().getResourceAsStream("test-featureXmlParserTest-ko-uidrequired.xml");
new XmlParser().parseConfigurationFile(in);
}
@Test(expected = IllegalArgumentException.class)
public void testLoaderRequiredEnable() {
InputStream in = getClass().getClassLoader().getResourceAsStream("test-featureXmlParserTest-ko-enablerequired.xml");
new XmlParser().parseConfigurationFile(in);
}
@Test(expected = IllegalArgumentException.class)
public void testLoaderLoadInvalidStream() throws IOException {
InputStream in = getClass().getClassLoader().getResourceAsStream("test-featureXmlParserTest-ok.xml");
in.close();
new XmlParser().parseConfigurationFile(in);
}
@Test
public void importThenExport() throws IOException {
// Given
XmlParser parser = new XmlParser();
InputStream in = getClass().getClassLoader().getResourceAsStream("test-featureXmlParserTest-import-export.xml");
Map<String, Feature> features = parser.parseConfigurationFile(in).getFeatures();
Assert.assertNotNull(features);
// When
InputStream in2 = parser.exportFeatures(features);
// Then
// output is OK
Map<String, Feature> features2 = parser.parseConfigurationFile(in2).getFeatures();
Assert.assertNotNull(features2);
Assert.assertEquals(features.size(), features2.size());
}
@Test
public void importThenExportFeatures2() throws IOException {
// Given
XmlParser parser = new XmlParser();
InputStream in = getClass().getClassLoader().getResourceAsStream("ff4j-parser-all.xml");
Map<String, Feature> features = parser.parseConfigurationFile(in).getFeatures();
Assert.assertNotNull(features);
// When
InputStream in3 = parser.exportFeatures(features);
// Then
// output is OK
Map<String, Feature> features2 = parser.parseConfigurationFile(in3).getFeatures();
Assert.assertNotNull(features2);
Assert.assertEquals(features.size(), features2.size());
}
@Test
public void importThenExportALL() throws IOException {
// Given
XmlParser parser = new XmlParser();
InputStream in = getClass().getClassLoader().getResourceAsStream("ff4j-parser-all.xml");
XmlConfig conf = parser.parseConfigurationFile(in);
Assert.assertNotNull(conf.getFeatures());
Assert.assertNotNull(conf.getProperties());
// When
InputStream in3 = parser.exportAll(conf);
// Then
XmlConfig conf2 = parser.parseConfigurationFile(in3);
Assert.assertNotNull(conf2.getFeatures());
Assert.assertNotNull(conf2.getProperties());
}
@Test
public void testPropertiesParsing() throws IOException {
// Given
XmlParser parser = new XmlParser();
InputStream in = getClass().getClassLoader().getResourceAsStream("ff4j.xml");
// When
XmlConfig conf = parser.parseConfigurationFile(in);
// Then
Map<String, Feature> features = conf.getFeatures();
Assert.assertNotNull(features);
Feature f = features.get("first");
Assert.assertNotNull(f);
Assert.assertNotNull(f.getUid());
Assert.assertNotNull(f.getCustomProperties());
Assert.assertNotNull(f.getCustomProperties().get("ppint"));
Assert.assertEquals(f.getCustomProperties().get("ppint").asInt(), 12);
Assert.assertEquals(f.getCustomProperties().get("ppdouble").asDouble(), 12.5,0);
Assert.assertEquals(f.getCustomProperties().get("ppboolean").asBoolean(),true);
Assert.assertEquals(f.getCustomProperties().get("ppstring").asString(), "hello");
Assert.assertEquals(f.getCustomProperties().get("regionIdentifier").asString(), "AMER");
Assert.assertNotNull(f.getCustomProperties().get("regionIdentifier").getFixedValues());
Assert.assertFalse(f.getCustomProperties().get("regionIdentifier").getFixedValues().isEmpty());
PropertyLogLevel pll = (PropertyLogLevel) f.getCustomProperties().get("myLogLevel");
Assert.assertEquals(pll.getValue(), LogLevel.DEBUG);
// Then
Map < String, Property<?>> properties = conf.getProperties();
Assert.assertNotNull(properties);
}
@Test
public void testParsingALL() throws IOException {
// Given
XmlParser parser = new XmlParser();
InputStream in = getClass().getClassLoader().getResourceAsStream("ff4j-parser-all.xml");
// When
XmlConfig conf = parser.parseConfigurationFile(in);
// Then
Map<String, Feature> features = conf.getFeatures();
Assert.assertNotNull(features);
// Then
Map < String, Property<?>> properties = conf.getProperties();
Assert.assertNotNull(properties);
}
@Test
public void testParsingFeatures() throws IOException {
// Given
XmlParser parser = new XmlParser();
InputStream in = getClass().getClassLoader().getResourceAsStream("ff4j-parser-features.xml");
// When
XmlConfig conf = parser.parseConfigurationFile(in);
// Then
Map<String, Feature> features = conf.getFeatures();
Assert.assertNotNull(features);
// Then
Map < String, Property<?>> properties = conf.getProperties();
Assert.assertNotNull(properties);
}
@Test
public void testParsingProperties() throws IOException {
// Given
XmlParser parser = new XmlParser();
InputStream in = getClass().getClassLoader().getResourceAsStream("ff4j-parser-properties.xml");
// When
XmlConfig conf = parser.parseConfigurationFile(in);
// Then
Map<String, Feature> features = conf.getFeatures();
Assert.assertNotNull(features);
// Then
Map < String, Property<?>> properties = conf.getProperties();
Assert.assertNotNull(properties);
}
@Test(expected = SAXParseException.class)
public void testErrorHandler() throws SAXException {
XmlParserErrorHandler eh = new XmlParserErrorHandler();
eh.warning(null);
eh.fatalError(new SAXParseException("", null));
}
@Test(expected = SAXParseException.class)
public void testErrorHandler2() throws SAXException {
XmlParserErrorHandler eh = new XmlParserErrorHandler();
eh.warning(null);
eh.error(new SAXParseException("", null));
}
}