/* * Copyright 2008-2014 the original author or authors * * 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. */ package org.kaleidofoundry.core.config; import java.math.BigDecimal; import java.net.URISyntaxException; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import junit.framework.Assert; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.kaleidofoundry.core.context.RuntimeContext; import org.kaleidofoundry.core.lang.NotNullException; import org.kaleidofoundry.core.store.ResourceException; /** * @author jraduget */ public abstract class AbstractConfigurationTest extends Assert { protected Configuration configuration; /** * create configuration instance calling abstract method {@link #newInstance()}<br/> * and load it after creation * * @throws ResourceException * @throws URISyntaxException */ @Before public void setup() throws ResourceException, URISyntaxException { // create and load instance configuration = newInstance(); if (configuration != null) { configuration.load(); } } /** * unload and cleanup internal configuration cache * * @throws ResourceException */ @After public void cleanup() throws ResourceException { if (configuration != null) { configuration.unload(); } } /** * @return the configuration manager to load and test * @throws ResourceException * @throws URISyntaxException */ protected abstract Configuration newInstance() throws ResourceException, URISyntaxException; @Test public void isLoaded() { assertNotNull(configuration); assertTrue(configuration.isLoaded()); } @Test public void load() throws ResourceException, URISyntaxException { final Configuration configuration = newInstance(); assertNotNull(configuration); assertFalse(configuration.isLoaded()); configuration.load(); assertTrue(configuration.isLoaded()); } @Test public void unload() throws ResourceException, URISyntaxException { final Configuration configuration = newInstance(); assertNotNull(configuration); assertFalse(configuration.isLoaded()); configuration.load(); assertTrue(configuration.isLoaded()); configuration.unload(); assertTrue(!configuration.isLoaded()); } @Test public void store() throws ResourceException, URISyntaxException { assertNotNull(configuration); final Configuration configuration = newInstance(); assertNotNull(configuration); assertFalse(configuration.isLoaded()); try { configuration.store(); fail(); } catch (final ConfigurationException ce) { assertEquals("config.load.notloaded", ce.getCode()); } configuration.load(); assertTrue(configuration.isLoaded()); try { configuration.store(); if (!configuration.isStorable()) { fail(); } } catch (final ResourceException se) { assertEquals("store.readonly.illegal", se.getCode()); } // can't test store anymore // -> store can be a classpath resource and store method is not handled // -> store() is tested in file store module } @Test public void getProperty() { assertNotNull(configuration); assertEquals("app", configuration.getProperty("//application/name")); assertEquals("1.0.0", configuration.getProperty("//application/version")); assertEquals("description of the application...", configuration.getProperty("//application/description")); assertEquals("", configuration.getProperty("//application/modules/netbusiness/name")); // test unknown key assertNull(configuration.getProperty("foo")); } @Test public void setProperty() { assertNotNull(configuration); assertEquals("app", configuration.getProperty("//application/name")); configuration.setProperty("//application/name", "foo"); assertEquals("foo", configuration.getProperty("//application/name")); // restore right value configuration.setProperty("//application/name", "app"); } @Test public void removeProperty() { assertNotNull(configuration); assertEquals("app", configuration.getProperty("//application/name")); configuration.removeProperty("//application/name"); assertNull(configuration.getProperty("//application/name")); } @Test public void getCharacter() { assertNotNull(configuration); assertEquals(Character.valueOf('a'), configuration.getCharacter("//application/name")); assertEquals(Character.valueOf('1'), configuration.getCharacter("//application/version")); assertEquals(Character.valueOf('d'), configuration.getCharacter("//application/description")); assertNull(configuration.getCharacter("//application/modules/netbusiness/name")); // test unknown key assertNull(configuration.getCharacter("foo")); assertEquals(Character.valueOf('e'), configuration.getCharacter("foo", 'e')); } @Test public void getCharacterList() { assertNotNull(configuration); final List<Character> values = configuration.getCharacterList("//application/librairies"); assertNotNull(values); assertEquals(3, values.size()); assertEquals(Character.valueOf('d'), values.get(0)); assertEquals(Character.valueOf('l'), values.get(1)); assertEquals(Character.valueOf('m'), values.get(2)); // test unknown key assertNull(configuration.getCharacterList("foo")); // test raw property // assertEquals("d|l|m", configuration.getString("//application/librairies")); } @Test public void getString() { assertNotNull(configuration); assertEquals("app", configuration.getString("//application/name")); assertEquals("1.0.0", configuration.getString("//application/version")); assertEquals("description of the application...", configuration.getString("//application/description")); assertEquals("", configuration.getString("//application/modules/netbusiness/name")); // test unknown key assertNull(configuration.getString("foo")); assertEquals("eheh", configuration.getString("foo", "eheh")); } @Test public void getStringList() { assertNotNull(configuration); final List<String> values = configuration.getStringList("//application/librairies"); assertNotNull(values); assertEquals(3, values.size()); assertEquals("dom4j.jar", values.get(0)); assertEquals("log4j.jar", values.get(1)); assertEquals("mail.jar", values.get(2)); // test unknown key assertNull(configuration.getStringList("foo")); } @Test public void getDate() throws ParseException { final DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); final Date mockDate = df.parse("2006-09-01"); assertNotNull(configuration); // test raw property assertEquals("2006-09-01T00:00:00", configuration.getString("//application/date")); assertEquals(mockDate, configuration.getDate("//application/date")); // test unknown key assertNull(configuration.getDate("foo")); assertEquals(mockDate, configuration.getDate("foo", mockDate)); } @Test public void getDateList() throws ParseException { final DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); assertNotNull(configuration); assertNotNull(configuration.getDateList("//application/array/date")); assertEquals(3, configuration.getDateList("//application/array/date").size()); assertEquals(df.parse("2009-01-02"), configuration.getDateList("//application/array/date").get(0)); assertEquals(df.parse("2009-12-31"), configuration.getDateList("//application/array/date").get(1)); assertEquals(df.parse("2012-05-15"), configuration.getDateList("//application/array/date").get(2)); // test unknown key assertNull(configuration.getDateList("foo")); // test raw property assertEquals("2009-01-02T00:00:00|2009-12-31T00:00:00|2012-05-15T00:00:00", configuration.getString("//application/array/date")); } @Test public void getBigDecimal() { assertNotNull(configuration); // test raw property assertEquals("1.123456789", configuration.getString("//application/single/bigdecimal")); assertEquals(new BigDecimal("1.123456789"), configuration.getBigDecimal("//application/single/bigdecimal")); // test unknown key assertNull(configuration.getBigDecimal("foo")); assertEquals(new BigDecimal(1.123456789), configuration.getBigDecimal("foo", new BigDecimal(1.123456789))); } @Test public void getBigDecimalList() { assertNotNull(configuration); assertEquals(2, configuration.getBigDecimalList("//application/array/bigdecimal").size()); assertEquals(new BigDecimal("987.5"), configuration.getBigDecimalList("//application/array/bigdecimal").get(0)); assertEquals(new BigDecimal("1.123456789"), configuration.getBigDecimalList("//application/array/bigdecimal").get(1)); // test unknown key assertNull(configuration.getBigDecimalList("foo")); // test raw property assertEquals("987.5|1.123456789", configuration.getString("//application/array/bigdecimal")); } @Test public void getBoolean() { assertNotNull(configuration); // test raw property assertEquals("true", configuration.getString("//application/single/boolean")); assertTrue(configuration.getBoolean("//application/single/boolean")); // test unknown key assertNull(configuration.getBoolean("foo")); assertEquals(Boolean.TRUE, configuration.getBoolean("foo", Boolean.TRUE)); } @Test public void getBooleanList() { assertNotNull(configuration); assertEquals(2, configuration.getBooleanList("//application/array/boolean").size()); assertTrue(!configuration.getBooleanList("//application/array/boolean").get(0)); assertTrue(configuration.getBooleanList("//application/array/boolean").get(1)); // test unknown key assertNull(configuration.getBooleanList("foo")); // test raw property assertEquals("false|true", configuration.getString("//application/array/boolean")); } @Test public void keySet() { assertNotNull(configuration); assertNotNull(configuration.keySet()); assertEquals(14, configuration.keySet().size()); } @Test public void keySetWithPrefix() { assertNotNull(configuration); assertNotNull(configuration.keySet("//application/modules")); assertEquals(4, configuration.keySet("//application/modules").size()); // @NotNull result assertNotNull(configuration.keySet("//application/modules/foo")); assertEquals(0, configuration.keySet("//application/modules/foo").size()); // @NotNull argument try { configuration.keySet(null); fail("null prefix is not allowed"); } catch (final NotNullException nae) { } } @Test public void containsKey() { assertNotNull(configuration); assertTrue(configuration.containsKey("//application/modules/marketing/name", "//application/modules")); assertTrue(configuration.containsKey("application.modules.marketing.name", "application.modules")); assertTrue(configuration.containsKey("application.modules.marketing.name", "")); assertTrue(configuration.containsKey("application.modules.marketing.name")); assertFalse(configuration.containsKey("//application/modules/marketing", "foo")); try { configuration.containsKey("//application/modules/marketing", null); fail("null prefix is not allowed"); } catch (final NotNullException nae) { } } @Test public void roots() { assertNotNull(configuration); assertNotNull(configuration.roots()); assertEquals(1, configuration.roots().size()); } @Test public void rootsWithPrefix() { assertNotNull(configuration); assertNotNull(configuration.roots("//application/modules")); assertEquals(3, configuration.roots("//application/modules").size()); assertTrue(configuration.roots("//application/modules").contains("sales")); assertTrue(configuration.roots("//application/modules").contains("marketing")); assertTrue(configuration.roots("//application/modules").contains("netbusiness")); } @Test public void containsRoot() { assertNotNull(configuration); assertTrue(configuration.containsRoot("sales", "//application/modules")); assertFalse(configuration.containsRoot("foo", "//application/modules")); try { configuration.containsRoot("foo", null); fail("null prefix is not allowed"); } catch (final NotNullException nae) { } } @Test public void addConfiguration() throws ResourceException, URISyntaxException { assertNotNull(configuration); assertTrue(configuration.isLoaded()); assertNotNull(configuration.roots()); assertNotNull(configuration.keySet()); final int roots = configuration.roots().size(); final int keys = configuration.keySet().size(); // assertions before adding new configuration content assertTrue(configuration.containsRoot("application", "")); assertFalse(configuration.containsRoot("application2", "")); assertFalse(configuration.containsKey("//application2/name", "")); assertEquals("", configuration.getString("//application/modules/netbusiness/name")); // configuration to add final Configuration configurationToAdd = new PropertiesConfiguration("app2Config", "classpath:/config/addTest.properties", new RuntimeContext<Configuration>(Configuration.class)); configurationToAdd.load(); configuration.addConfiguration(configurationToAdd); // new assertions after adding new configuration content assertEquals(roots + 1, configuration.roots().size()); assertEquals(keys + 2, configuration.keySet().size()); assertTrue(configuration.containsRoot("application", "")); assertTrue(configuration.containsRoot("application2", "")); assertTrue(configuration.containsKey("//application2/name", "")); // test override assertEquals("Netbusi.", configuration.getString("//application/modules/netbusiness/name")); // restore original value configuration.setProperty("//application/modules/netbusiness/name", ""); } @Test public void extractConfiguration() throws ResourceException, URISyntaxException { assertNotNull(configuration); assertTrue(configuration.isLoaded()); // configuration to add final Configuration emptyConfiguration = new PropertiesConfiguration("empty", "classpath:/config/empty.properties", new RuntimeContext<Configuration>( Configuration.class)); assertNotNull(emptyConfiguration); configuration.extractConfiguration("//application/modules", emptyConfiguration); assertEquals(4, emptyConfiguration.keySet().size()); assertTrue(emptyConfiguration.keySet().contains("//sales/version")); assertTrue(emptyConfiguration.keySet().contains("//marketing/name")); assertTrue(emptyConfiguration.keySet().contains("//sales/name")); assertTrue(emptyConfiguration.keySet().contains("//netbusiness/name")); assertEquals(3, emptyConfiguration.roots().size()); assertTrue(emptyConfiguration.roots().contains("sales")); assertTrue(emptyConfiguration.roots().contains("marketing")); assertTrue(emptyConfiguration.roots().contains("netbusiness")); } @Test public void toProperties() { assertNotNull(configuration); assertTrue(configuration.isLoaded()); assertEquals("app", configuration.toProperties().getProperty("application.name")); assertEquals("description of the application...", configuration.toProperties().getProperty("application.description")); assertEquals("2006-09-01T00:00:00", configuration.toProperties().getProperty("application.date")); assertEquals("1.0.0", configuration.toProperties().getProperty("application.version")); assertEquals("dom4j.jar|log4j.jar|mail.jar", configuration.toProperties().getProperty("application.librairies")); assertEquals("Sales", configuration.toProperties().getProperty("application.modules.sales.name")); assertEquals("1.1.0", configuration.toProperties().getProperty("application.modules.sales.version")); assertEquals("Market.", configuration.toProperties().getProperty("application.modules.marketing.name")); assertEquals("", configuration.toProperties().getProperty("application.modules.netbusiness.name")); assertEquals("987.5|1.123456789", configuration.toProperties().getProperty("application.array.bigdecimal")); assertEquals("false|true", configuration.toProperties().getProperty("application.array.boolean")); assertEquals("true", configuration.toProperties().getProperty("application.single.boolean")); assertEquals("1.123456789", configuration.toProperties().getProperty("application.single.bigdecimal")); assertEquals("2009-01-02T00:00:00|2009-12-31T00:00:00|2012-05-15T00:00:00", configuration.toProperties().getProperty("application.array.date")); } @Test public void toPropertiesCount() { assertNotNull(configuration); assertTrue(configuration.isLoaded()); assertEquals(14, configuration.toProperties().stringPropertyNames().size()); } @Test public void toPropertiesWithPrefix() { assertNotNull(configuration); assertTrue(configuration.isLoaded()); assertEquals(4, configuration.toProperties("//application/modules").entrySet().size()); assertEquals("Sales", configuration.toProperties("//application/modules").getProperty("application.modules.sales.name")); assertEquals("1.1.0", configuration.toProperties("//application/modules").getProperty("application.modules.sales.version")); assertEquals("Market.", configuration.toProperties("//application/modules").getProperty("application.modules.marketing.name")); assertEquals("", configuration.toProperties("//application/modules").getProperty("application.modules.netbusiness.name")); } }