/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2009-2011, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.util; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.util.Properties; import org.geotools.data.DataUtilities; import org.geotools.data.complex.config.XMLConfigDigester; import org.geotools.test.AppSchemaTestSupport; import org.geotools.util.InterpolationProperties; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNotNull; /** * Tests for {@link PropertyInterpolationUtils}. * * @author Ben Caradoc-Davies (CSIRO Earth Science and Resource Engineering) * * * * @source $URL$ */ public class InterpolationPropertiesTest extends AppSchemaTestSupport { /** * Base string used for properties and filenames. */ public static final String IDENTIFIER = "interpolation-properties-test"; /** * Test property set in the property files. */ public static final String TEST_PROPERTY = IDENTIFIER + ".test.property"; /** * Test property set in system properties. */ public static final String TEST_SYSTEM_PROPERTY = IDENTIFIER + ".test.system.property"; /** * Value of property set in system properties. */ public static final String TEST_SYSTEM_PROPERTY_VALUE = "system"; /** * System property set to trigger file (not classpath) loading. */ public static final String TEST_FILE_SYSTEM_PROPERTY = IDENTIFIER + "-file-identifier" + ".properties"; @Before public void setUp() throws Exception { System.setProperty(TEST_SYSTEM_PROPERTY, TEST_SYSTEM_PROPERTY_VALUE); System.setProperty(TEST_FILE_SYSTEM_PROPERTY, DataUtilities.urlToFile( InterpolationProperties.class.getResource("/" + IDENTIFIER + ".file.properties")).getPath()); } /** * Test for {@link PropertyInterpolationUtils#interpolate(Properties, String)} that properties * are interpolated as expected. Note that this test includes multiple lines, and also * opportunity for excessive regex greed, which must be avoided. */ @Test public void testInterpolate() { Properties properties = new Properties(); properties.put("foo.x", "123"); properties.put("foo.y", "abc"); properties.put("foo.z", "bar"); InterpolationProperties props = new InterpolationProperties(properties); String result = props.interpolate( "123ajh${foo.z} akl ${foo.y}${foo.y} laskj ${foo.x}\n" + "foo.x${foo.x}${foo.x} ${foo.z}${foo.y}"); assertEquals("123ajhbar akl abcabc laskj 123\nfoo.x123123 barabc", result); } /** * Test for {@link PropertyInterpolationUtils#interpolate(Properties, String)} that * interpolating a nonexistent property is an error. */ @Test public void testInterpolateNonexistent() { boolean interpolatedNonexistentProperty = false; try { InterpolationProperties props = new InterpolationProperties(new Properties()); props.interpolate("123 ${does.not.exist} 456"); interpolatedNonexistentProperty = true; } catch (Exception e) { // success } assertFalse(interpolatedNonexistentProperty); } /** * Test that {@link PropertyInterpolationUtils#loadProperties(String)} can load properties from * the classpath. */ @Test public void testLoadPropertiesFromClasspath() { InterpolationProperties props = new InterpolationProperties(IDENTIFIER); assertEquals("found-on-classpath", props.getProperty(TEST_PROPERTY)); checkSystemProperties(props); } /** * Test that in {@link PropertyInterpolationUtils#loadProperties(String)} only system properties * are loaded when the properties files does not exist. */ @Test public void testLoadPropertiesDoesNotExist() { InterpolationProperties props = new InterpolationProperties(IDENTIFIER+ ".does-not-exist"); assertNull(props.getProperty(TEST_PROPERTY)); checkSystemProperties(props); } /** * Test that {@link PropertyInterpolationUtils#loadProperties(String)} can load properties from * the a file specified in a system property. */ @Test public void testLoadPropertiesFromFile() { // note that the identifier does *not* match the filename InterpolationProperties props = new InterpolationProperties(TEST_FILE_SYSTEM_PROPERTY .replace(".properties", "")); assertEquals("found-in-file", props.getProperty(TEST_PROPERTY)); checkSystemProperties(props); } /** * Check that the system properties are as expected. * * @param properties */ private void checkSystemProperties(InterpolationProperties properties) { // check that synthetic system property is loaded assertNotNull(properties.getProperty(TEST_SYSTEM_PROPERTY)); assertTrue(properties.getProperty(TEST_SYSTEM_PROPERTY).equals(TEST_SYSTEM_PROPERTY_VALUE)); // check we are loading real system properties assertNotNull(properties.getProperty("java.version")); // system properties should override this assertFalse(properties.getProperty("java.version").equals("should-be-overridden")); } /** * Test for {@link XMLConfigDigester#readAll(InputStream)}. */ @Test public void testReadAll() { String s = "line one\nline two\n"; InputStream input = new ByteArrayInputStream("line one\nline two\n".getBytes()); assertEquals(s, InterpolationProperties.readAll(input)); } }