package org.geoserver.jdbcconfig.internal;
import static org.geoserver.jdbcconfig.JDBCConfigTestSupport.createTempDir;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import org.apache.commons.io.FileUtils;
import org.geoserver.jdbcloader.JDBCLoaderPropertiesFactoryBean;
import org.geoserver.platform.GeoServerResourceLoader;
import org.geoserver.platform.resource.Files;
import org.geoserver.platform.resource.Resources;
import org.geotools.data.DataUtilities;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class JDBCConfigPropertiesTest {
protected static final String CONFIG_FILE = "jdbcconfig.properties";
protected static final String CONFIG_SYSPROP = "jdbcconfig.properties";
protected static final String JDBCURL_SYSPROP = "jdbcconfig.jdbcurl";
protected static final String INITDB_SYSPROP = "jdbcconfig.initdb";
protected static final String IMPORT_SYSPROP = "jdbcconfig.import";
GeoServerResourceLoader loader;
@Before
public void setUp() throws IOException {
loader = new GeoServerResourceLoader(createTempDir());
}
@After
public void tearDown() throws IOException {
FileUtils.deleteDirectory(loader.getBaseDirectory());
}
@Test
public void testLoadDefaults() throws IOException {
JDBCConfigPropertiesFactoryBean factory = new JDBCConfigPropertiesFactoryBean(loader);
JDBCConfigProperties props = (JDBCConfigProperties) factory.createProperties();
assertFalse(props.isEnabled());
assertTrue(props.isInitDb());
assertTrue(props.isImport());
//assert files copied over
assertNotNull(loader.find("jdbcconfig", "jdbcconfig.properties"));
assertNotNull(loader.find("jdbcconfig", "scripts", "initdb.postgres.sql"));
//assert file location are accessible
assertNotNull(factory.getFileLocations());
//assert configuration can be stored successfully on another resource loader
File tmpDir = org.geoserver.jdbcconfig.JDBCConfigTestSupport.createTempDir();
Resources.directory(Files.asResource(tmpDir).get("jdbcconfig"), true);
GeoServerResourceLoader resourceLoader = new GeoServerResourceLoader(tmpDir);
factory.saveConfiguration(resourceLoader);
assertEquals(factory.getFileLocations().size(),
(resourceLoader.find("jdbcconfig").list().length-1)+(resourceLoader.find("jdbcconfig/scripts").list().length) );
}
private File createDummyConfigFile() throws IOException {
Properties p = new Properties();
p.put("foo", "bar");
p.put("initdb", "false");
p.put("import", "false");
File configFile = new File(loader.getBaseDirectory(), "foo.properties");
FileOutputStream fout = new FileOutputStream(configFile);
p.store(fout, "");
fout.flush();
fout.close();
return configFile;
}
@Test
public void testLoadFromFile() throws Exception {
File configFile = createDummyConfigFile();
System.setProperty(CONFIG_SYSPROP, configFile.getAbsolutePath());
try {
JDBCLoaderPropertiesFactoryBean factory = new JDBCConfigPropertiesFactoryBean(loader);
JDBCConfigProperties props = (JDBCConfigProperties) factory.createProperties();
assertEquals("bar", props.getProperty("foo"));
assertFalse(props.isInitDb());
assertFalse(props.isImport());
}
finally {
System.clearProperty(CONFIG_SYSPROP);
}
}
@Test
public void testLoadFromURL() throws Exception {
File configFile = createDummyConfigFile();
System.setProperty(CONFIG_SYSPROP, DataUtilities.fileToURL(configFile).toString());
try {
JDBCLoaderPropertiesFactoryBean factory = new JDBCConfigPropertiesFactoryBean(loader);
JDBCConfigProperties props = (JDBCConfigProperties) factory.createProperties();
assertEquals("bar", props.getProperty("foo"));
assertFalse(props.isInitDb());
assertFalse(props.isImport());
}
finally {
System.clearProperty(CONFIG_SYSPROP);
}
}
@Test
public void testLoadFromSysProps() throws Exception {
System.setProperty(JDBCURL_SYSPROP, "jdbc:h2:nofile");
System.setProperty(INITDB_SYSPROP, "false");
System.setProperty(IMPORT_SYSPROP, "false");
try {
JDBCLoaderPropertiesFactoryBean factory = new JDBCConfigPropertiesFactoryBean(loader);
JDBCConfigProperties props = (JDBCConfigProperties) factory.createProperties();
assertEquals("jdbc:h2:nofile", props.getJdbcUrl().get());
assertFalse(props.isInitDb());
assertFalse(props.isImport());
}
finally {
System.clearProperty(JDBCURL_SYSPROP);
System.clearProperty(INITDB_SYSPROP);
System.clearProperty(IMPORT_SYSPROP);
}
}
@Test
public void testDataDirPlaceholder() throws Exception {
JDBCConfigPropertiesFactoryBean factory = new JDBCConfigPropertiesFactoryBean(loader);
JDBCConfigProperties props = (JDBCConfigProperties) factory.createProperties();
props.setJdbcUrl("jdbc:h2:file:${GEOSERVER_DATA_DIR}");
assertThat(props.getJdbcUrl().get(), containsString(loader.getBaseDirectory().getAbsolutePath()));
}
}