package org.fluentlenium.configuration;
import org.apache.commons.io.IOUtils;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.Properties;
import static org.assertj.core.api.Assertions.assertThat;
public class ConfigurationDefaultsFactoryTest {
private final Properties environmentVariables = new Properties();
private final Properties systemProperties = new Properties();
@FluentConfiguration(pageLoadTimeout = 2000L)
public static class AnnotatedContainer {
}
@Before
public void before() {
environmentVariables.clear();
systemProperties.clear();
}
public void mockEnvironmentVariable(String property, String value) {
environmentVariables.put(property, value);
}
public void mockSystemProperty(String property, String value) {
systemProperties.put(property, value);
}
@Test
public void testFactoryWithAnnotation() {
DefaultConfigurationFactory factory = new DefaultConfigurationFactory() {
@Override
protected InputStream getPropertiesInputStream() {
return IOUtils.toInputStream("pageLoadTimeout=5000", Charset.forName("UTF-8"));
}
};
Configuration configuration = factory.newConfiguration(AnnotatedContainer.class, new ConfigurationDefaults());
setupConfiguration((ComposedConfiguration) configuration);
// Annotation has higher priority than configuration file, so it should be 2000L and not 5000L.
assertThat(configuration.getPageLoadTimeout()).isEqualTo(2000L);
mockEnvironmentVariable("fluentlenium.pageLoadTimeout", "1000");
assertThat(configuration.getPageLoadTimeout()).isEqualTo(1000L);
mockSystemProperty("fluentlenium.pageLoadTimeout", "500");
assertThat(configuration.getPageLoadTimeout()).isEqualTo(500L);
configuration.setPageLoadTimeout(250L);
assertThat(configuration.getPageLoadTimeout()).isEqualTo(250L);
}
private void setupConfiguration(ComposedConfiguration composedConfiguration) {
for (ConfigurationProperties configuration : composedConfiguration.getConfigurations()) {
if (configuration instanceof PropertiesBackendConfiguration) {
PropertiesBackendConfiguration readerConfiguration = (PropertiesBackendConfiguration) configuration;
if (readerConfiguration.getPropertiesBackend() instanceof EnvironmentVariablesBackend) {
readerConfiguration.setPropertiesBackend(new DefaultPropertiesBackend(environmentVariables));
} else if (readerConfiguration.getPropertiesBackend() instanceof SystemPropertiesBackend) {
readerConfiguration.setPropertiesBackend(new DefaultPropertiesBackend(systemProperties));
}
}
}
}
@Test
public void testFactoryNoAnnotation() {
DefaultConfigurationFactory factory = new DefaultConfigurationFactory() {
@Override
protected InputStream getPropertiesInputStream() {
return IOUtils.toInputStream("fluentlenium.pageLoadTimeout=5000\nscriptTimeout=1000", Charset.forName("UTF-8"));
}
};
Configuration configuration = factory.newConfiguration(null, null);
setupConfiguration((ComposedConfiguration) configuration);
assertThat(configuration.getPageLoadTimeout()).isEqualTo(5000L);
assertThat(configuration.getScriptTimeout()).isEqualTo(1000L);
mockEnvironmentVariable("fluentlenium.pageLoadTimeout", "1000");
assertThat(configuration.getPageLoadTimeout()).isEqualTo(1000L);
mockSystemProperty("fluentlenium.pageLoadTimeout", "500");
assertThat(configuration.getPageLoadTimeout()).isEqualTo(500L);
configuration.setPageLoadTimeout(250L);
assertThat(configuration.getPageLoadTimeout()).isEqualTo(250L);
}
@Test(expected = ConfigurationException.class)
public void testFactoryInvalidPropertyFile() {
DefaultConfigurationFactory factory = new DefaultConfigurationFactory() {
@Override
protected InputStream getPropertiesInputStream() {
return new InputStream() {
@Override
public int read() throws IOException {
throw new IOException();
}
};
}
};
factory.newConfiguration(null, null);
}
public void testCustomConfigurationDefaults() {
DefaultConfigurationFactory factory = new DefaultConfigurationFactory() {
@Override
protected InputStream getPropertiesInputStream() {
return IOUtils.toInputStream("pageLoadTimeout=5000", Charset.forName("UTF-8"));
}
};
ConfigurationDefaults configurationDefaults = new ConfigurationDefaults() {
@Override
public String getBaseUrl() {
return "custom-default-value";
}
};
Configuration configuration = factory.newConfiguration(AnnotatedContainer.class, configurationDefaults);
setupConfiguration((ComposedConfiguration) configuration);
// Annotation has higher priority than configuration file, so it should be 2000L and not 5000L.
assertThat(configuration.getPageLoadTimeout()).isEqualTo(2000L);
mockEnvironmentVariable("fluentlenium.pageLoadTimeout", "1000");
assertThat(configuration.getPageLoadTimeout()).isEqualTo(1000L);
mockSystemProperty("fluentlenium.pageLoadTimeout", "500");
assertThat(configuration.getPageLoadTimeout()).isEqualTo(500L);
configuration.setPageLoadTimeout(250L);
assertThat(configuration.getPageLoadTimeout()).isEqualTo(250L);
assertThat(configuration.getBaseUrl()).isEqualTo("custom-default-value");
}
}