org.ff4j.commonsconf.FF4JConfigurationTest.java Source code

Java tutorial

Introduction

Here is the source code for org.ff4j.commonsconf.FF4JConfigurationTest.java

Source

package org.ff4j.commonsconf;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

/*
 * #%L
 * ff4j-archaius
 * %%
 * Copyright (C) 2013 - 2016 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.util.Properties;

import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.ConfigurationException;
import org.ff4j.exception.InvalidPropertyTypeException;
import org.ff4j.exception.PropertyNotFoundException;
import org.ff4j.property.store.InMemoryPropertyStore;
import org.ff4j.property.store.PropertyStore;
import org.ff4j.utils.Util;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

/**
 * Test implementatiton of {@link Configuration} relying on FF4J {@link PropertyStore}.
 *
 * @author Cedrick LUNVEN (@clunven)
 */
public class FF4JConfigurationTest {

    /** Configuration implementation relying on property store. */
    private FF4jConfiguration ff4jConf;

    /** Underlying ff4j property store. */
    private PropertyStore pStore;

    @Before
    public void initCommonsConfWithFF4j() throws ConfigurationException {
        pStore = new InMemoryPropertyStore("ff4j-configuration.xml");
        ff4jConf = new FF4jConfiguration();
        ff4jConf.setFf4jStore(pStore);
    }

    @Test
    public void testSubSet() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("name"));
        // When
        Configuration conf2 = ff4jConf.subset("prop");
        // Then
        Assert.assertTrue(conf2.containsKey("propInt"));
        Assert.assertFalse(conf2.containsKey("name"));
    }

    @Test
    public void testgetPropertiesByKey() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("name"));
        // When
        Properties conf2 = ff4jConf.getProperties("prop");
        // Then
        Assert.assertTrue(conf2.containsKey("propInt"));
        Assert.assertFalse(conf2.containsKey("name"));
        Assert.assertTrue(ff4jConf.getProperties(null).isEmpty());
    }

    @Test
    public void testNullValues() {
        Assert.assertFalse(ff4jConf.containsKey(null));
        Assert.assertFalse(ff4jConf.isEmpty());
    }

    @Test
    public void testAddProperty() {
        // Given
        Assert.assertFalse(ff4jConf.containsKey("myNewProp"));
        // When
        ff4jConf.addProperty("myNewProp", "hello");
        // Then
        Assert.assertTrue(ff4jConf.containsKey("myNewProp"));
        Assert.assertTrue(pStore.existProperty("myNewProp"));
        Assert.assertEquals("hello", pStore.readProperty("myNewProp").asString());
    }

    @Test
    public void testAddPropertyDirect() {
        // Given
        Assert.assertFalse(ff4jConf.containsKey("myNewProp"));
        // When
        ff4jConf.addPropertyDirect("myNewProp", "hello");
        // Then
        Assert.assertTrue(ff4jConf.containsKey("myNewProp"));
        Assert.assertTrue(pStore.existProperty("myNewProp"));
        Assert.assertEquals("hello", pStore.readProperty("myNewProp").asString());
    }

    @Test
    public void testSetPropertyOK() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propInt"));
        Assert.assertNotEquals(10, ff4jConf.getInt("propInt"));
        // When
        ff4jConf.setProperty("propInt", 10);
        // Then
        Assert.assertEquals(10, ff4jConf.getInt("propInt"));
    }

    @Test(expected = InvalidPropertyTypeException.class)
    public void testSetPropertyKO() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propInt"));
        Assert.assertNotEquals(10, ff4jConf.getInt("propInt"));
        // When
        ff4jConf.setProperty("propInt", "hello");
        // Then
        Assert.assertEquals(10, ff4jConf.getInt("propInt"));
    }

    @Test
    public void testClearProperty() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propInt"));
        // When
        ff4jConf.clearProperty("propInt");
        // Then
        Assert.assertFalse(ff4jConf.containsKey("propInt"));
        Assert.assertFalse(pStore.existProperty("myNewProp"));
    }

    @Test
    public void testClear() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propInt"));
        // When
        ff4jConf.clear();
        // Then
        Assert.assertFalse(ff4jConf.containsKey("propInt"));
        Assert.assertTrue(ff4jConf.isEmpty());
        Assert.assertTrue(pStore.isEmpty());
    }

    @Test
    public void testgetKeys() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propInt"));
        Assert.assertTrue(ff4jConf.containsKey("propString"));
        Assert.assertTrue(ff4jConf.getKeys().hasNext());
        // When
        Iterator<String> propsKeys = ff4jConf.getKeys("prop");
        // Then
        Assert.assertTrue(propsKeys.hasNext());
    }

    @Test
    public void testgetKeysEmpty() {
        // Given
        Assert.assertFalse(ff4jConf.containsKey("z"));
        // When
        Iterator<String> propsKeys = ff4jConf.getKeys("z");
        // Then
        Assert.assertFalse(propsKeys.hasNext());
    }

    @Test
    public void testgetKeysNull() {
        // Given
        InMemoryPropertyStore tmpStore = new InMemoryPropertyStore();
        Configuration tmpConf = new FF4jConfiguration(tmpStore);
        Iterator<String> propsKeys = tmpConf.getKeys("z");
        Assert.assertFalse(propsKeys.hasNext());

        tmpStore.setProperties(null);
        Assert.assertFalse(tmpConf.getKeys().hasNext());
        Assert.assertFalse(tmpConf.getKeys("z").hasNext());
    }

    @Test(expected = InvalidPropertyTypeException.class)
    public void testgetBooleanKO() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propInt"));
        // When
        ff4jConf.getBoolean("propInt");
    }

    @Test
    public void testgetBooleanOK() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propBool"));
        Assert.assertTrue(ff4jConf.containsKey("propBool2"));
        // When
        Assert.assertEquals("true", ff4jConf.getString("propBool"));
        Assert.assertEquals("false", ff4jConf.getString("propBool2"));
        Assert.assertTrue(ff4jConf.getBoolean("propBool"));
        Assert.assertFalse(ff4jConf.getBoolean("propBool2"));
        Assert.assertEquals(Boolean.TRUE, ff4jConf.getBoolean("propBool"));
    }

    @Test
    public void testgetBooleanDefault() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propBool"));
        // When
        Assert.assertEquals("true", ff4jConf.getString("propBool"));
        Assert.assertTrue(ff4jConf.getBoolean("propBool", false));
        Assert.assertFalse(ff4jConf.getBoolean("invalid", false));
        Assert.assertEquals(Boolean.TRUE, ff4jConf.getBoolean("propBool", Boolean.FALSE));
        Assert.assertEquals(Boolean.FALSE, ff4jConf.getBoolean("invalid", Boolean.FALSE));
    }

    @Test(expected = InvalidPropertyTypeException.class)
    public void testgetByteKO() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propString"));
        // When
        ff4jConf.getByte("propString");
    }

    @Test
    public void testgetByteOK() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propByte"));
        // When
        Assert.assertEquals("123", ff4jConf.getString("propByte"));
        Assert.assertEquals(new Byte("123"), (Byte) ff4jConf.getByte("propByte"));
        Assert.assertEquals(new Byte("123").byteValue(), ff4jConf.getByte("propByte"));
        Assert.assertEquals(123, ff4jConf.getByte("propByte"));
    }

    @Test
    public void testgetByteDefault() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propByte"));
        // When
        Assert.assertEquals("123", ff4jConf.getString("propByte"));
        Assert.assertEquals(new Byte("120"), (Byte) ff4jConf.getByte("invalid", new Byte("120")));
        Assert.assertEquals(new Byte("120").byteValue(), ff4jConf.getByte("invalid", new Byte("120").byteValue()));
        Assert.assertEquals(new Byte("123"), (Byte) ff4jConf.getByte("propByte", new Byte("120")));
        Assert.assertEquals(new Byte("123").byteValue(), ff4jConf.getByte("propByte", new Byte("120").byteValue()));
    }

    @Test(expected = InvalidPropertyTypeException.class)
    public void testgetDoubleKO() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propString"));
        // When
        ff4jConf.getDouble("propString");
    }

    @Test
    public void testgetDoubleOK() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propDouble"));
        // When
        Assert.assertEquals(new Double(12.5), (Double) ff4jConf.getDouble("propDouble"));
        Assert.assertEquals(new Double(12.5), new Double(ff4jConf.getDouble("propDouble")));
    }

    @Test
    public void testgetDoubleDefault() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propDouble"));
        Assert.assertFalse(ff4jConf.containsKey("invalid"));
        // When
        Assert.assertEquals(new Double(12.5), (Double) ff4jConf.getDouble("propDouble", 20.5));
        Assert.assertEquals(new Double(20.5), (Double) ff4jConf.getDouble("invalid", 20.5));
        Assert.assertEquals(new Double(12.5), (Double) ff4jConf.getDouble("propDouble", new Double(20.5)));
        Assert.assertEquals(new Double(20.5), (Double) ff4jConf.getDouble("invalid", new Double(20.5)));
    }

    @Test(expected = InvalidPropertyTypeException.class)
    public void testgetFloatKO() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propString"));
        // When
        ff4jConf.getFloat("propString");
    }

    @Test
    public void testgetFloatOK() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propDouble"));
        // When
        Assert.assertEquals(new Float(12.5), (Float) ff4jConf.getFloat("propDouble"));
        Assert.assertEquals(new Float(12.5), new Float(ff4jConf.getFloat("propDouble")));
    }

    @Test
    public void testgetFloatDefault() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propDouble"));
        Assert.assertFalse(ff4jConf.containsKey("invalid"));
        // When
        Assert.assertEquals(new Float(12.5), (Float) ff4jConf.getFloat("propDouble", 20.5f));
        Assert.assertEquals(new Float(20.5), (Float) ff4jConf.getFloat("invalid", 20.5f));
        Assert.assertEquals(new Float(12.5), (Float) ff4jConf.getFloat("propDouble", new Float(20.5)));
        Assert.assertEquals(new Float(20.5), (Float) ff4jConf.getFloat("invalid", new Float(20.5)));
    }

    @Test(expected = InvalidPropertyTypeException.class)
    public void testgetIntKO() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propString"));
        // When
        ff4jConf.getInt("propString");
    }

    @Test
    public void testgetIntOK() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propInt"));
        // When
        Assert.assertEquals(new Integer(12), (Integer) ff4jConf.getInt("propInt"));
        Assert.assertEquals(new Integer(12), new Integer(ff4jConf.getInt("propInt")));
    }

    @Test
    public void testgetIntDefault() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propInt"));
        Assert.assertFalse(ff4jConf.containsKey("invalid"));
        // When
        Assert.assertEquals(new Integer(12), (Integer) ff4jConf.getInt("propInt", 20));
        Assert.assertEquals(new Integer(20), (Integer) ff4jConf.getInt("invalid", 20));
        Assert.assertEquals(new Integer(12), (Integer) ff4jConf.getInteger("propInt", new Integer(20)));
        Assert.assertEquals(new Integer(20), (Integer) ff4jConf.getInteger("invalid", new Integer(20)));
    }

    @Test(expected = InvalidPropertyTypeException.class)
    public void testgetLongKO() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propString"));
        // When
        ff4jConf.getLong("propString");
    }

    @Test
    public void testgetLongOK() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propLong"));
        // When
        Assert.assertEquals(new Long(12), (Long) ff4jConf.getLong("propLong"));
        Assert.assertEquals(new Long(12), new Long(ff4jConf.getLong("propLong")));
    }

    @Test
    public void testgetLongDefault() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propInt"));
        Assert.assertFalse(ff4jConf.containsKey("invalid"));
        // When
        Assert.assertEquals(new Long(12), (Long) ff4jConf.getLong("propLong", 20));
        Assert.assertEquals(new Long(20), (Long) ff4jConf.getLong("invalid", 20));
        Assert.assertEquals(new Long(12), (Long) ff4jConf.getLong("propLong", new Long(20)));
        Assert.assertEquals(new Long(20), (Long) ff4jConf.getLong("invalid", new Long(20)));
    }

    @Test(expected = InvalidPropertyTypeException.class)
    public void testgetShortKO() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propString"));
        // When
        ff4jConf.getShort("propString");
    }

    @Test
    public void testgetShortOK() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propShort"));
        // When
        Assert.assertEquals(new Short("12"), (Short) ff4jConf.getShort("propShort"));
        Assert.assertEquals(new Short("12"), new Short(ff4jConf.getShort("propShort")));
    }

    @Test
    public void testgetShortDefault() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propInt"));
        Assert.assertFalse(ff4jConf.containsKey("invalid"));
        // When
        Assert.assertEquals(new Short("12"), (Short) ff4jConf.getShort("propShort", new Short("20").shortValue()));
        Assert.assertEquals(new Short("20"), (Short) ff4jConf.getShort("invalid", new Short("20").shortValue()));
        Assert.assertEquals(new Short("12"), (Short) ff4jConf.getShort("propShort", new Short("20")));
        Assert.assertEquals(new Short("20"), (Short) ff4jConf.getShort("invalid", new Short("20")));
    }

    @Test(expected = InvalidPropertyTypeException.class)
    public void testgetBigDecimalKO() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propString"));
        // When
        ff4jConf.getBigDecimal("propString");
    }

    @Test
    public void testgetBigDecimalOK() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propDouble"));
        // When
        Assert.assertEquals(new BigDecimal(12.5), (BigDecimal) ff4jConf.getBigDecimal("propDouble"));
    }

    @Test
    public void testgetBigDecimalDefault() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propDouble"));
        Assert.assertFalse(ff4jConf.containsKey("invalid"));
        // When
        Assert.assertEquals(new BigDecimal(12.5),
                (BigDecimal) ff4jConf.getBigDecimal("propDouble", new BigDecimal(20.5)));
        Assert.assertEquals(new BigDecimal(20.5),
                (BigDecimal) ff4jConf.getBigDecimal("invalid", new BigDecimal(20.5)));
    }

    @Test(expected = InvalidPropertyTypeException.class)
    public void testgetBigIntegerKO() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propString"));
        // When
        ff4jConf.getBigInteger("propString");
    }

    @Test
    public void testgetBigIntegerOK() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propInt"));
        // When
        Assert.assertEquals(new BigInteger("12"), (BigInteger) ff4jConf.getBigInteger("propInt"));
        Assert.assertEquals(new BigInteger("12"), new BigInteger(ff4jConf.getString("propInt")));
    }

    @Test
    public void testgetBigIntegerDefault() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propInt"));
        Assert.assertFalse(ff4jConf.containsKey("invalid"));
        // When
        Assert.assertEquals(new BigInteger("12"),
                (BigInteger) ff4jConf.getBigInteger("propInt", new BigInteger("20")));
        Assert.assertEquals(new BigInteger("20"),
                (BigInteger) ff4jConf.getBigInteger("invalid", new BigInteger("20")));
    }

    @Test
    public void testgetStringDefault() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propString"));
        Assert.assertFalse(ff4jConf.containsKey("invalid"));
        // When
        Assert.assertEquals("hello", ff4jConf.getString("propString", "byebye"));
        Assert.assertEquals("byebye", ff4jConf.getString("invalid", "byebye"));
    }

    @Test(expected = PropertyNotFoundException.class)
    public void getListInvalid() {
        Assert.assertFalse(ff4jConf.containsKey("toto"));
        ff4jConf.getList("toto");
    }

    @Test
    public void getListOK() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propList"));
        // When
        List<Object> c = ff4jConf.getList("propList");
        // Then
        Assert.assertTrue(Util.list("a", "b", "c").containsAll(c));
        Assert.assertNotNull(ff4jConf.getList("propEmptyList"));
    }

    @Test
    public void getListArrayOK() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propList"));
        // When
        String[] c = ff4jConf.getStringArray("propList");
        // Then
        Assert.assertTrue(Util.list("a", "b", "c").containsAll(Arrays.asList(c)));
    }

    @Test
    public void testgetListDefault() {
        // Given
        Assert.assertTrue(ff4jConf.containsKey("propList"));
        Assert.assertFalse(ff4jConf.containsKey("invalid"));
        // When
        List<Object> c1 = ff4jConf.getList("propList", Util.list("d", "e", "f"));
        List<Object> c2 = ff4jConf.getList("invalid", Util.list("d", "e", "f"));
        // Then
        Assert.assertTrue(Util.list("a", "b", "c").containsAll(c1));
        Assert.assertTrue(Util.list("d", "e", "f").containsAll(c2));
    }

    @Test(expected = IllegalStateException.class)
    public void testNullStore() {
        new FF4jConfiguration().ff4jStore();
    }

}