package org.mockserver.configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.mockserver.socket.SSLFactory;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.security.KeyStore;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.collection.IsEmptyCollection.empty;
import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.*;
/**
* @author jamesdbloom
*/
public class ConfigurationPropertiesTest {
@Rule
public ExpectedException exception = ExpectedException.none();
String propertiesBeforeTest;
@Before
public void backupProperties() throws IOException {
StringWriter stringWriter = new StringWriter();
System.getProperties().store(stringWriter, "");
propertiesBeforeTest = stringWriter.toString();
ConfigurationProperties.rebuildKeyStore(false);
}
@After
public void restoreProperties() throws IOException {
java.util.Properties properties = new java.util.Properties();
properties.load(new StringReader(propertiesBeforeTest));
System.setProperties(properties);
}
@Test
public void shouldSetAndReadEnableCORSSettingForAPI() {
// given
System.clearProperty("mockserver.enableCORSForAPI");
// when
assertEquals(true, ConfigurationProperties.enableCORSForAPI());
ConfigurationProperties.enableCORSForAPI(false);
// then
assertEquals(false, ConfigurationProperties.enableCORSForAPI());
assertEquals("false", System.getProperty("mockserver.enableCORSForAPI"));
}
@Test
public void shouldSetAndReadEnableCORSSettingForAllResponses() {
// given
System.clearProperty("mockserver.enableCORSForAllResponses");
// when
assertEquals(false, ConfigurationProperties.enableCORSForAllResponses());
ConfigurationProperties.enableCORSForAllResponses(false);
// then
assertEquals(false, ConfigurationProperties.enableCORSForAllResponses());
assertEquals("false", System.getProperty("mockserver.enableCORSForAllResponses"));
}
@Test
public void shouldSetAndReadMaxSocketTimeout() {
// given
System.clearProperty("mockserver.maxTimeout");
// when
assertEquals(TimeUnit.SECONDS.toMillis(ConfigurationProperties.DEFAULT_MAX_TIMEOUT), ConfigurationProperties.maxSocketTimeout());
ConfigurationProperties.maxSocketTimeout(100);
// then
assertEquals(100, ConfigurationProperties.maxSocketTimeout());
}
@Test
public void shouldHandleInvalidMaxSocketTimeout() {
// given
System.setProperty("mockserver.maxTimeout", "invalid");
// then
assertEquals(TimeUnit.SECONDS.toMillis(ConfigurationProperties.DEFAULT_MAX_TIMEOUT), ConfigurationProperties.maxSocketTimeout());
}
@Test
public void shouldSetAndReadJavaKeyStoreFilePath() {
// given
System.clearProperty("mockserver.javaKeyStoreFilePath");
// when
assertEquals(SSLFactory.defaultKeyStoreFileName(), ConfigurationProperties.javaKeyStoreFilePath());
ConfigurationProperties.javaKeyStoreFilePath("newKeyStoreFile.jks");
// then
assertEquals("newKeyStoreFile.jks", ConfigurationProperties.javaKeyStoreFilePath());
assertEquals("newKeyStoreFile.jks", System.getProperty("mockserver.javaKeyStoreFilePath"));
assertEquals(true, ConfigurationProperties.rebuildKeyStore());
}
@Test
public void shouldSetAndReadJavaKeyStorePassword() {
// given
System.clearProperty("mockserver.javaKeyStorePassword");
// when
assertEquals(SSLFactory.KEY_STORE_PASSWORD, ConfigurationProperties.javaKeyStorePassword());
ConfigurationProperties.javaKeyStorePassword("newPassword");
// then
assertEquals("newPassword", ConfigurationProperties.javaKeyStorePassword());
assertEquals("newPassword", System.getProperty("mockserver.javaKeyStorePassword"));
assertEquals(true, ConfigurationProperties.rebuildKeyStore());
}
@Test
public void shouldSetAndReadJavaKeyStoreType() {
// given
System.clearProperty("mockserver.javaKeyStoreType");
// when
assertEquals(KeyStore.getDefaultType(), ConfigurationProperties.javaKeyStoreType());
ConfigurationProperties.javaKeyStoreType("PKCS11");
// then
assertEquals("PKCS11", ConfigurationProperties.javaKeyStoreType());
assertEquals("PKCS11", System.getProperty("mockserver.javaKeyStoreType"));
assertEquals(true, ConfigurationProperties.rebuildKeyStore());
}
@Test
public void shouldSetAndReadDeleteGeneratedKeyStoreOnExit() {
// given
System.clearProperty("mockserver.deleteGeneratedKeyStoreOnExit");
// when
assertEquals(true, ConfigurationProperties.deleteGeneratedKeyStoreOnExit());
ConfigurationProperties.deleteGeneratedKeyStoreOnExit(false);
// then
assertEquals(false, ConfigurationProperties.deleteGeneratedKeyStoreOnExit());
assertEquals("false", System.getProperty("mockserver.deleteGeneratedKeyStoreOnExit"));
}
@Test
public void shouldSetAndReadSslCertificateDomainName() {
// given
System.clearProperty("mockserver.sslCertificateDomainName");
// when
assertEquals(SSLFactory.CERTIFICATE_DOMAIN, ConfigurationProperties.sslCertificateDomainName());
ConfigurationProperties.sslCertificateDomainName("newDomain");
// then
assertEquals("newDomain", ConfigurationProperties.sslCertificateDomainName());
assertEquals("newDomain", System.getProperty("mockserver.sslCertificateDomainName"));
assertEquals(true, ConfigurationProperties.rebuildKeyStore());
}
@Test
public void shouldSetAndReadSslSubjectAlternativeNameDomains() {
// given
ConfigurationProperties.clearSslSubjectAlternativeNameDomains();
// when
assertThat(Arrays.asList(ConfigurationProperties.sslSubjectAlternativeNameDomains()), empty());
ConfigurationProperties.addSslSubjectAlternativeNameDomains("a", "b", "c", "d");
// then
assertThat(Arrays.asList(ConfigurationProperties.sslSubjectAlternativeNameDomains()), containsInAnyOrder("a", "b", "c", "d"));
assertEquals("a,b,c,d", System.getProperty("mockserver.sslSubjectAlternativeNameDomains"));
assertEquals(true, ConfigurationProperties.rebuildKeyStore());
}
@Test
public void shouldAddSslSubjectAlternativeNameDomains() {
// given
ConfigurationProperties.clearSslSubjectAlternativeNameDomains();
ConfigurationProperties.rebuildKeyStore(false);
// when
assertThat(Arrays.asList(ConfigurationProperties.sslSubjectAlternativeNameDomains()), empty());
ConfigurationProperties.addSslSubjectAlternativeNameDomains("a", "b", "c", "d");
// then
assertThat(Arrays.asList(ConfigurationProperties.sslSubjectAlternativeNameDomains()), containsInAnyOrder("a", "b", "c", "d"));
assertEquals("a,b,c,d", System.getProperty("mockserver.sslSubjectAlternativeNameDomains"));
// when
ConfigurationProperties.addSslSubjectAlternativeNameDomains("e", "f", "g");
// then - add subject alternative domain names
assertThat(Arrays.asList(ConfigurationProperties.sslSubjectAlternativeNameDomains()), containsInAnyOrder("a", "b", "c", "d", "e", "f", "g"));
assertEquals("a,b,c,d,e,f,g", System.getProperty("mockserver.sslSubjectAlternativeNameDomains"));
assertEquals(true, ConfigurationProperties.rebuildKeyStore());
// given
ConfigurationProperties.rebuildKeyStore(false);
// when
ConfigurationProperties.addSslSubjectAlternativeNameDomains("e", "f", "g");
// then - do not add duplicate subject alternative domain names
assertThat(Arrays.asList(ConfigurationProperties.sslSubjectAlternativeNameDomains()), containsInAnyOrder("a", "b", "c", "d", "e", "f", "g"));
assertEquals("a,b,c,d,e,f,g", System.getProperty("mockserver.sslSubjectAlternativeNameDomains"));
assertEquals(false, ConfigurationProperties.rebuildKeyStore());
}
@Test
public void shouldSetAndReadSslSubjectAlternativeNameIps() {
// given
ConfigurationProperties.clearSslSubjectAlternativeNameIps();
// when
assertThat(Arrays.asList(ConfigurationProperties.sslSubjectAlternativeNameIps()), containsInAnyOrder("127.0.0.1", "0.0.0.0"));
ConfigurationProperties.addSslSubjectAlternativeNameIps("1", "2", "3", "4");
// then
assertThat(Arrays.asList(ConfigurationProperties.sslSubjectAlternativeNameIps()), containsInAnyOrder("0.0.0.0", "1", "127.0.0.1", "2", "3", "4"));
assertEquals("0.0.0.0,1,127.0.0.1,2,3,4", System.getProperty("mockserver.sslSubjectAlternativeNameIps"));
assertEquals(true, ConfigurationProperties.rebuildKeyStore());
}
@Test
public void shouldAddSslSubjectAlternativeNameIps() {
// given
ConfigurationProperties.clearSslSubjectAlternativeNameIps();
ConfigurationProperties.rebuildKeyStore(false);
// when
assertThat(Arrays.asList(ConfigurationProperties.sslSubjectAlternativeNameIps()), containsInAnyOrder("127.0.0.1", "0.0.0.0"));
ConfigurationProperties.addSslSubjectAlternativeNameIps("1", "2", "3", "4");
// then
assertThat(Arrays.asList(ConfigurationProperties.sslSubjectAlternativeNameIps()), containsInAnyOrder("0.0.0.0", "1", "127.0.0.1", "2", "3", "4"));
assertEquals("0.0.0.0,1,127.0.0.1,2,3,4", System.getProperty("mockserver.sslSubjectAlternativeNameIps"));
// when
ConfigurationProperties.addSslSubjectAlternativeNameIps("5", "6", "7");
// then - add subject alternative domain names
assertThat(Arrays.asList(ConfigurationProperties.sslSubjectAlternativeNameIps()), containsInAnyOrder("0.0.0.0", "1", "127.0.0.1", "2", "3", "4", "5", "6", "7"));
assertEquals("0.0.0.0,1,127.0.0.1,2,3,4,5,6,7", System.getProperty("mockserver.sslSubjectAlternativeNameIps"));
assertEquals(true, ConfigurationProperties.rebuildKeyStore());
// given
ConfigurationProperties.rebuildKeyStore(false);
// when
ConfigurationProperties.addSslSubjectAlternativeNameIps("5", "6", "7");
// then - do not add duplicate subject alternative domain names
assertThat(Arrays.asList(ConfigurationProperties.sslSubjectAlternativeNameIps()), containsInAnyOrder("0.0.0.0", "1", "127.0.0.1", "2", "3", "4", "5", "6", "7"));
assertEquals("0.0.0.0,1,127.0.0.1,2,3,4,5,6,7", System.getProperty("mockserver.sslSubjectAlternativeNameIps"));
assertEquals(false, ConfigurationProperties.rebuildKeyStore());
}
@Test
public void shouldSetAndReadRebuildKeyStore() {
// given
ConfigurationProperties.rebuildKeyStore(false);
// when
assertEquals(false, ConfigurationProperties.rebuildKeyStore());
ConfigurationProperties.rebuildKeyStore(true);
// then
assertEquals(true, ConfigurationProperties.rebuildKeyStore());
}
@Test
public void shouldSetAndReadServerPort() {
// given
System.clearProperty("mockserver.mockServerPort");
// when
assertEquals(Arrays.asList(-1), ConfigurationProperties.mockServerPort());
ConfigurationProperties.mockServerPort(10);
// then
assertEquals("10", System.getProperty("mockserver.mockServerPort"));
assertEquals(Arrays.asList(10), ConfigurationProperties.mockServerPort());
}
@Test
public void shouldSetAndReadServerPortAsList() {
// given
System.clearProperty("mockserver.mockServerPort");
// when
assertEquals(Arrays.asList(-1), ConfigurationProperties.mockServerPort());
ConfigurationProperties.mockServerPort(10, 20, 30);
// then
assertEquals("10,20,30", System.getProperty("mockserver.mockServerPort"));
assertEquals(Arrays.asList(10, 20, 30), ConfigurationProperties.mockServerPort());
}
@Test
public void shouldHandleInvalidServerPort() {
// given
System.setProperty("mockserver.mockServerPort", "invalid");
// then
assertEquals(Arrays.asList(), ConfigurationProperties.mockServerPort());
}
@Test
public void shouldSetAndReadProxyPort() {
// given
System.clearProperty("mockserver.proxyPort");
// when
assertEquals(new Integer(-1), ConfigurationProperties.proxyPort());
ConfigurationProperties.proxyPort(10);
// then
assertEquals("10", System.getProperty("mockserver.proxyPort"));
assertEquals(new Integer(10), ConfigurationProperties.proxyPort());
}
@Test
public void shouldHandleInvalidProxyPort() {
// given
System.setProperty("mockserver.proxyPort", "invalid");
// then
assertEquals(new Integer(-1), ConfigurationProperties.proxyPort());
}
@Test
public void shouldThrowIllegalArgumentExceptionForInvalidLogLevel() {
exception.expect(IllegalArgumentException.class);
exception.expectMessage(containsString("log level \"WRONG\" is not legal it must be one of \"TRACE\", \"DEBUG\", \"INFO\", \"WARN\", \"ERROR\", \"OFF\""));
ConfigurationProperties.overrideLogLevel("WRONG");
}
@Test
public void shouldIgnoreNull() {
// given
System.clearProperty("mockserver.logLevel");
// when
ConfigurationProperties.overrideLogLevel(null);
// then
assertNull(System.getProperty("mockserver.logLevel"));
}
@Test
public void shouldSetLogLevel() {
// given
System.clearProperty("mockserver.logLevel");
// when
ConfigurationProperties.overrideLogLevel("TRACE");
// then
assertThat(System.getProperty("mockserver.logLevel"), is("TRACE"));
}
}