package com.ctrip.framework.apollo.spi; import static org.hamcrest.core.IsEqual.equalTo; import static org.hamcrest.core.IsInstanceOf.instanceOf; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import org.junit.Before; import org.junit.Test; import com.ctrip.framework.apollo.Config; import com.ctrip.framework.apollo.ConfigFile; import com.ctrip.framework.apollo.build.MockInjector; import com.ctrip.framework.apollo.core.enums.ConfigFileFormat; /** * @author Jason Song(song_s@ctrip.com) */ public class DefaultConfigFactoryManagerTest { private DefaultConfigFactoryManager defaultConfigFactoryManager; @Before public void setUp() throws Exception { MockInjector.reset(); MockInjector.setInstance(ConfigRegistry.class, new MockConfigRegistry()); defaultConfigFactoryManager = new DefaultConfigFactoryManager(); } @Test public void testGetFactoryFromRegistry() throws Exception { ConfigFactory result = defaultConfigFactoryManager.getFactory(MockConfigRegistry.NAMESPACE_REGISTERED); assertEquals(MockConfigRegistry.REGISTERED_CONFIGFACTORY, result); } @Test public void testGetFactoryFromNamespace() throws Exception { String someNamespace = "someName"; MockInjector.setInstance(ConfigFactory.class, someNamespace, new SomeConfigFactory()); ConfigFactory result = defaultConfigFactoryManager.getFactory(someNamespace); assertThat("When namespace is registered, should return the registerd config factory", result, instanceOf(SomeConfigFactory.class)); } @Test public void testGetFactoryFromNamespaceMultipleTimes() throws Exception { String someNamespace = "someName"; MockInjector.setInstance(ConfigFactory.class, someNamespace, new SomeConfigFactory()); ConfigFactory result = defaultConfigFactoryManager.getFactory(someNamespace); ConfigFactory anotherResult = defaultConfigFactoryManager.getFactory(someNamespace); assertThat( "Get config factory with the same namespace multiple times should returnt the same instance", anotherResult, equalTo(result)); } @Test public void testGetFactoryFromDefault() throws Exception { String someNamespace = "someName"; MockInjector.setInstance(ConfigFactory.class, new AnotherConfigFactory()); ConfigFactory result = defaultConfigFactoryManager.getFactory(someNamespace); assertThat("When namespace is not registered, should return the default config factory", result, instanceOf(AnotherConfigFactory.class)); } public static class MockConfigRegistry implements ConfigRegistry { public static String NAMESPACE_REGISTERED = "some-namespace-registered"; public static ConfigFactory REGISTERED_CONFIGFACTORY = new ConfigFactory() { @Override public Config create(String namespace) { return null; } @Override public ConfigFile createConfigFile(String namespace, ConfigFileFormat configFileFormat) { return null; } }; @Override public void register(String namespace, ConfigFactory factory) { //do nothing } @Override public ConfigFactory getFactory(String namespace) { if (namespace.equals(NAMESPACE_REGISTERED)) { return REGISTERED_CONFIGFACTORY; } return null; } } public static class SomeConfigFactory implements ConfigFactory { @Override public Config create(String namespace) { return null; } @Override public ConfigFile createConfigFile(String namespace, ConfigFileFormat configFileFormat) { return null; } } public static class AnotherConfigFactory implements ConfigFactory { @Override public Config create(String namespace) { return null; } @Override public ConfigFile createConfigFile(String namespace, ConfigFileFormat configFileFormat) { return null; } } }