/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.config; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.util.Properties; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.mockito.Mockito; import com.enonic.cms.core.home.HomeDir; public class ConfigLoaderTest { @Rule public TemporaryFolder folder = new TemporaryFolder(); private File homeDir; private ConfigLoader configLoader; private ClassLoader classLoader; @Before public void setUp() throws Exception { this.classLoader = Mockito.mock( ClassLoader.class ); this.homeDir = this.folder.newFolder( "cms-home" ); this.configLoader = new ConfigLoader( new HomeDir( this.homeDir ) ); this.configLoader.setClassLoader( this.classLoader ); } private void setupSystemProperties() { final Properties props = new Properties(); props.setProperty( "system.param", "system.value" ); this.configLoader.addSystemProperties( props ); } private void setupHomeProperties() throws Exception { final Properties props = new Properties(); props.setProperty( "home.param", "home.value" ); props.setProperty( "override", "home" ); props.setProperty( "interpolate", "${home.param} ${system.param}" ); final File file = new File( this.homeDir, "config/cms.properties" ); file.getParentFile().mkdirs(); final FileOutputStream out = new FileOutputStream( file ); props.store( out, "" ); out.close(); } private void setupClassPathProperties() throws Exception { final Properties props = new Properties(); props.setProperty( "classpath.param", "classpath.value" ); props.setProperty( "override", "classpath" ); props.setProperty( "interpolate", "${classpath.param} ${system.param}" ); final ByteArrayOutputStream out = new ByteArrayOutputStream(); props.store( out, "" ); out.close(); final ByteArrayInputStream in = new ByteArrayInputStream( out.toByteArray() ); Mockito.when( this.classLoader.getResourceAsStream( "com/enonic/vertical/default.properties" ) ).thenReturn( in ); } @Test(expected = IllegalArgumentException.class) public void testNoDefaultProperties() throws Exception { this.configLoader.load(); } @Test public void testDefaultConfig() throws Exception { setupClassPathProperties(); final Properties props = this.configLoader.load(); Assert.assertNotNull( props ); Assert.assertEquals( 5, props.size() ); Assert.assertEquals( this.homeDir.toString(), props.getProperty( "cms.home" ) ); Assert.assertEquals( this.homeDir.toURI().toString(), props.getProperty( "cms.home.uri" ) ); Assert.assertEquals( "classpath.value", props.getProperty( "classpath.param" ) ); Assert.assertEquals( "classpath", props.getProperty( "override" ) ); Assert.assertEquals( "classpath.value ${system.param}", props.getProperty( "interpolate" ) ); } @Test public void testHomeConfig() throws Exception { setupClassPathProperties(); setupHomeProperties(); final Properties props = this.configLoader.load(); Assert.assertNotNull( props ); Assert.assertEquals( 6, props.size() ); Assert.assertEquals( this.homeDir.toString(), props.getProperty( "cms.home" ) ); Assert.assertEquals( this.homeDir.toURI().toString(), props.getProperty( "cms.home.uri" ) ); Assert.assertEquals( "home.value", props.getProperty( "home.param" ) ); Assert.assertEquals( "classpath.value", props.getProperty( "classpath.param" ) ); Assert.assertEquals( "home", props.getProperty( "override" ) ); Assert.assertEquals( "home.value ${system.param}", props.getProperty( "interpolate" ) ); } @Test public void testSystemProperties() throws Exception { setupSystemProperties(); setupClassPathProperties(); final Properties props = this.configLoader.load(); Assert.assertNotNull( props ); Assert.assertEquals( 5, props.size() ); Assert.assertEquals( this.homeDir.toString(), props.getProperty( "cms.home" ) ); Assert.assertEquals( this.homeDir.toURI().toString(), props.getProperty( "cms.home.uri" ) ); Assert.assertEquals( "classpath.value", props.getProperty( "classpath.param" ) ); Assert.assertEquals( "classpath", props.getProperty( "override" ) ); Assert.assertEquals( "classpath.value system.value", props.getProperty( "interpolate" ) ); } @Test public void testTrimWhiteSpace() throws Exception { setupClassPathProperties(); final Properties props = new Properties(); props.setProperty( "property.outside.spaced", " spaced outside " ); props.setProperty( "property.inside.spaced", "spaced inside" ); props.setProperty( "property.empty.spaced", " " ); props.setProperty( "property.empty", "" ); props.setProperty( "property.null", "null" ); final File file = new File( this.homeDir, "config/cms.properties" ); file.getParentFile().mkdirs(); final FileOutputStream out = new FileOutputStream( file ); props.store( out, "" ); out.close(); final Properties loadedProps = this.configLoader.load(); Assert.assertEquals( "spaced outside", loadedProps.getProperty( "property.outside.spaced" ) ); Assert.assertEquals( "spaced inside", loadedProps.getProperty( "property.inside.spaced" ) ); Assert.assertEquals( "", loadedProps.getProperty( "property.empty.spaced" ) ); Assert.assertEquals( "", loadedProps.getProperty( "property.empty" ) ); Assert.assertEquals( "null", loadedProps.getProperty( "property.null" ) ); } }