package com.ctrip.framework.apollo;
import static org.junit.Assert.assertEquals;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
import com.ctrip.framework.apollo.build.MockInjector;
import com.ctrip.framework.apollo.core.ConfigConsts;
import com.ctrip.framework.apollo.core.enums.ConfigFileFormat;
import com.ctrip.framework.apollo.internals.AbstractConfig;
import com.ctrip.framework.apollo.internals.DefaultInjector;
import com.ctrip.framework.apollo.spi.ConfigFactory;
import com.ctrip.framework.apollo.util.ConfigUtil;
/**
* @author Jason Song(song_s@ctrip.com)
*/
public class ConfigServiceTest {
private static String someAppId;
@Before
public void setUp() throws Exception {
someAppId = "someAppId";
//as ConfigService is singleton, so we must manually clear its container
ConfigService.reset();
MockInjector.reset();
MockInjector.setDelegate(new DefaultInjector());
MockInjector.setInstance(ConfigUtil.class, new MockConfigUtil());
}
@Test
public void testHackConfig() {
String someNamespace = "hack";
String someKey = "first";
ConfigService.setConfig(new MockConfig(someNamespace));
Config config = ConfigService.getAppConfig();
assertEquals(someNamespace + ":" + someKey, config.getProperty(someKey, null));
assertEquals(null, config.getProperty("unknown", null));
}
@Test
public void testHackConfigFactory() throws Exception {
String someKey = "someKey";
ConfigService.setConfigFactory(new MockConfigFactory());
Config config = ConfigService.getAppConfig();
assertEquals(ConfigConsts.NAMESPACE_APPLICATION + ":" + someKey,
config.getProperty(someKey, null));
}
@Test
public void testMockConfigFactory() throws Exception {
String someNamespace = "mock";
String someKey = "someKey";
MockInjector.setInstance(ConfigFactory.class, someNamespace, new MockConfigFactory());
Config config = ConfigService.getConfig(someNamespace);
assertEquals(someNamespace + ":" + someKey, config.getProperty(someKey, null));
assertEquals(null, config.getProperty("unknown", null));
}
@Test
public void testMockConfigFactoryForConfigFile() throws Exception {
String someNamespace = "mock";
ConfigFileFormat someConfigFileFormat = ConfigFileFormat.Properties;
String someNamespaceFileName =
String.format("%s.%s", someNamespace, someConfigFileFormat.getValue());
MockInjector.setInstance(ConfigFactory.class, someNamespaceFileName, new MockConfigFactory());
ConfigFile configFile = ConfigService.getConfigFile(someNamespace, someConfigFileFormat);
assertEquals(someNamespaceFileName, configFile.getNamespace());
assertEquals(someNamespaceFileName + ":" + someConfigFileFormat.getValue(), configFile.getContent());
}
private static class MockConfig extends AbstractConfig {
private final String m_namespace;
public MockConfig(String namespace) {
m_namespace = namespace;
}
@Override
public String getProperty(String key, String defaultValue) {
if (key.equals("unknown")) {
return null;
}
return m_namespace + ":" + key;
}
@Override
public Set<String> getPropertyNames() {
return null;
}
}
private static class MockConfigFile implements ConfigFile {
private ConfigFileFormat m_configFileFormat;
private String m_namespace;
public MockConfigFile(String namespace,
ConfigFileFormat configFileFormat) {
m_namespace = namespace;
m_configFileFormat = configFileFormat;
}
@Override
public String getContent() {
return m_namespace + ":" + m_configFileFormat.getValue();
}
@Override
public boolean hasContent() {
return true;
}
@Override
public String getNamespace() {
return m_namespace;
}
@Override
public ConfigFileFormat getConfigFileFormat() {
return m_configFileFormat;
}
@Override
public void addChangeListener(ConfigFileChangeListener listener) {
}
}
public static class MockConfigFactory implements ConfigFactory {
@Override
public Config create(String namespace) {
return new MockConfig(namespace);
}
@Override
public ConfigFile createConfigFile(String namespace, ConfigFileFormat configFileFormat) {
return new MockConfigFile(namespace, configFileFormat);
}
}
public static class MockConfigUtil extends ConfigUtil {
@Override
public String getAppId() {
return someAppId;
}
}
}