package org.stagemonitor.configuration;
import org.junit.Before;
import org.junit.Test;
import org.stagemonitor.configuration.source.ConfigurationSource;
import org.stagemonitor.configuration.source.SimpleSource;
import org.stagemonitor.configuration.source.SystemPropertyConfigurationSource;
import org.stagemonitor.core.CorePlugin;
import java.io.IOException;
import java.util.Collections;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.stagemonitor.core.Stagemonitor.STAGEMONITOR_PASSWORD;
public class ConfigurationRegistryTest {
private ConfigurationRegistry configuration;
private CorePlugin corePlugin;
@Before
public void init() {
configuration = new ConfigurationRegistry(Collections.singletonList(new CorePlugin()),
Collections.<ConfigurationSource>singletonList(new SimpleSource()), STAGEMONITOR_PASSWORD);
corePlugin = configuration.getConfig(CorePlugin.class);
}
@Test
public void testGetConfigSubclass() {
final CorePlugin corePluginMock = mock(CorePlugin.class);
configuration = new ConfigurationRegistry(Collections.singletonList(corePluginMock),
Collections.<ConfigurationSource>singletonList(new SimpleSource()), STAGEMONITOR_PASSWORD);
assertSame(corePluginMock, configuration.getConfig(CorePlugin.class));
assertNull(configuration.getConfig(new ConfigurationOptionProvider(){}.getClass()));
}
@Test
public void testUpdateConfigurationWithoutPasswordSet() throws IOException {
assertFalse(corePlugin.isInternalMonitoringActive());
try {
configuration.save("stagemonitor.internal.monitoring", "true", "Transient Configuration Source", null);
fail();
} catch (IllegalStateException e) {
assertEquals("'stagemonitor.password' is not set.", e.getMessage());
}
assertFalse(corePlugin.isInternalMonitoringActive());
}
@Test
public void testUpdateConfiguration() throws IOException {
configuration.addConfigurationSource(SimpleSource.forTest(STAGEMONITOR_PASSWORD, ""));
assertFalse(corePlugin.isInternalMonitoringActive());
configuration.save("stagemonitor.internal.monitoring", "true", "Transient Configuration Source", null);
assertTrue(corePlugin.isInternalMonitoringActive());
}
@Test
public void testUpdateConfigurationWrongDatatype() throws IOException {
configuration.addConfigurationSource(SimpleSource.forTest(STAGEMONITOR_PASSWORD, "").add("stagemonitor.internal.monitoring", "1"));
configuration.reloadAllConfigurationOptions();
assertFalse(corePlugin.isInternalMonitoringActive());
assertEquals("Error in Test Configuration Source: Can't convert '1' to Boolean.", configuration.getConfigurationOptionByKey("stagemonitor.internal.monitoring").getErrorMessage());
configuration.save("stagemonitor.internal.monitoring", "true", "Test Configuration Source", null);
assertTrue(corePlugin.isInternalMonitoringActive());
assertNull(configuration.getConfigurationOptionByKey("stagemonitor.internal.monitoring").getErrorMessage());
}
@Test
public void testUpdateConfigurationWrongConfigurationSource() throws IOException {
configuration.addConfigurationSource(SimpleSource.forTest(STAGEMONITOR_PASSWORD, ""));
assertFalse(corePlugin.isInternalMonitoringActive());
try {
configuration.save("stagemonitor.internal.monitoring", "true", "foo", null);
fail();
} catch (IllegalArgumentException e) {
assertEquals("Configuration source 'foo' does not exist.", e.getMessage());
}
assertFalse(corePlugin.isInternalMonitoringActive());
}
@Test
public void testUpdateConfigurationNotSaveableConfigurationSource() throws IOException {
configuration.addConfigurationSource(SimpleSource.forTest(STAGEMONITOR_PASSWORD, ""));
configuration.addConfigurationSource(new SystemPropertyConfigurationSource());
assertFalse(corePlugin.isInternalMonitoringActive());
try {
configuration.save("stagemonitor.internal.monitoring", "true", "Java System Properties", null);
fail();
} catch (UnsupportedOperationException e) {
assertEquals("Saving to Java System Properties is not possible.", e.getMessage());
}
assertFalse(corePlugin.isInternalMonitoringActive());
}
@Test
public void testUpdateConfigurationNonDynamicTransient() throws IOException {
configuration.addConfigurationSource(SimpleSource.forTest(STAGEMONITOR_PASSWORD, ""));
assertEquals(0, corePlugin.getConsoleReportingInterval());
try {
configuration.save("stagemonitor.reporting.interval.console", "1", "Transient Configuration Source", null);
fail();
} catch (IllegalArgumentException e) {
assertEquals("Non dynamic options can't be saved to a transient configuration source.", e.getMessage());
}
assertEquals(0, corePlugin.getConsoleReportingInterval());
}
@Test
public void testUpdateConfigurationNonDynamicPersistent() throws IOException {
configuration.addConfigurationSource(SimpleSource.forTest(STAGEMONITOR_PASSWORD, ""));
final ConfigurationSource persistentSourceMock = mock(ConfigurationSource.class);
when(persistentSourceMock.isSavingPossible()).thenReturn(true);
when(persistentSourceMock.isSavingPersistent()).thenReturn(true);
when(persistentSourceMock.getName()).thenReturn("Test Persistent");
configuration.addConfigurationSource(persistentSourceMock);
assertEquals(0, corePlugin.getConsoleReportingInterval());
configuration.save("stagemonitor.reporting.interval.console", "1", "Test Persistent", null);
verify(persistentSourceMock).save("stagemonitor.reporting.interval.console", "1");
}
@Test
public void testSetNewPasswordViaQueryParamsShouldFail() throws IOException {
configuration.addConfigurationSource(SimpleSource.forTest(STAGEMONITOR_PASSWORD, ""));
try {
configuration.save(STAGEMONITOR_PASSWORD, "pwd", "Transient Configuration Source", null);
fail();
} catch (IllegalArgumentException e) {
assertEquals("Config key 'stagemonitor.password' does not exist.", e.getMessage());
}
}
@Test
public void testUpdateConfigurationWithoutPassword() throws IOException {
configuration.addConfigurationSource(SimpleSource.forTest(STAGEMONITOR_PASSWORD, "pwd"));
assertFalse(corePlugin.isInternalMonitoringActive());
try {
configuration.save("stagemonitor.internal.monitoring", "true", "Transient Configuration Source", null);
fail();
} catch (IllegalStateException e) {
assertEquals("Wrong password for 'stagemonitor.password'.", e.getMessage());
}
assertFalse(corePlugin.isInternalMonitoringActive());
}
@Test
public void testUpdateConfigurationWithPassword() throws IOException {
configuration.addConfigurationSource(SimpleSource.forTest(STAGEMONITOR_PASSWORD, "pwd"));
assertFalse(corePlugin.isInternalMonitoringActive());
configuration.save("stagemonitor.internal.monitoring", "true", "Transient Configuration Source", "pwd");
assertTrue(corePlugin.isInternalMonitoringActive());
}
}