package com.hubspot.singularity.config; import static junit.framework.TestCase.assertEquals; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import org.junit.Test; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import com.google.inject.Inject; import com.hubspot.singularity.SingularityTestBaseNoDb; import io.dropwizard.configuration.ConfigurationSourceProvider; public class MergingSourceProviderTest extends SingularityTestBaseNoDb { private static final String DEFAULT_PATH = "/configs/default.yaml"; private static final String OVERRIDE_PATH = "/configs/override.yaml"; private static final String JUST_A_STRING_PATH = "/configs/just_a_string.yaml"; private static final String DOESNT_EXIST_PATH = "/configs/doesnt_exist.yaml"; private static final YAMLFactory YAML_FACTORY = new YAMLFactory(); @Inject private ObjectMapper objectMapper; private ConfigurationSourceProvider buildConfigurationSourceProvider(String baseFilename) { final Class<?> klass = getClass(); return new MergingSourceProvider(new ConfigurationSourceProvider() { @Override public InputStream open(String path) throws IOException { final InputStream stream = klass.getResourceAsStream(path); if (stream == null) { throw new FileNotFoundException("File " + path + " not found in test resources directory"); } return stream; } }, baseFilename, objectMapper, YAML_FACTORY); } @Test public void testMergedConfigs() throws Exception { final InputStream mergedConfigStream = buildConfigurationSourceProvider(DEFAULT_PATH).open(OVERRIDE_PATH); final SingularityConfiguration mergedConfig = objectMapper.readValue(YAML_FACTORY.createParser(mergedConfigStream), SingularityConfiguration.class); assertEquals(10000, mergedConfig.getCacheTasksMaxSize()); assertEquals(500, mergedConfig.getCacheTasksInitialSize()); assertEquals(100, mergedConfig.getCheckDeploysEverySeconds()); assertEquals("baseuser", mergedConfig.getDatabaseConfiguration().get().getUser()); assertEquals("overridepassword", mergedConfig.getDatabaseConfiguration().get().getPassword()); } @Test( expected = SingularityConfigurationMergeException.class ) public void testNonObjectFails() throws Exception { buildConfigurationSourceProvider(DEFAULT_PATH).open(JUST_A_STRING_PATH); } @Test( expected = FileNotFoundException.class) public void testFileNoExistFail() throws Exception { buildConfigurationSourceProvider(DEFAULT_PATH).open(DOESNT_EXIST_PATH); buildConfigurationSourceProvider(DOESNT_EXIST_PATH).open(OVERRIDE_PATH); } }