package ws.antonov.config.consumer;
import com.google.protobuf.Message;
import junit.framework.TestCase;
import org.apache.commons.httpclient.HttpMethod;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import ws.antonov.config.api.consumer.ConfigClient;
import ws.antonov.config.api.consumer.ConfigClientFactoryBean;
import ws.antonov.config.api.consumer.ConfigParamsBuilder;
import ws.antonov.config.api.provider.ConfigProvider;
import ws.antonov.config.consumer.mock.MockHttpClient;
import ws.antonov.config.consumer.mock.MockHttpMethod;
import ws.antonov.config.provider.HttpConfigProvider;
import ws.antonov.config.provider.ResourceConfigProvider;
import ws.antonov.config.test.proto.model.FlatConfigObject;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Copyright 2011 Alex Antonov
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* @author aantonov
* @since 0.1
*/
public class ConfigClientTest extends TestCase {
public void setUp() throws IOException {
FlatConfigObject.Builder builder = FlatConfigObject.newBuilder();
builder.setSystemCode("101");
builder.setValidate(false);
builder.setTimeout(10);
FlatConfigObject msg = builder.build();
FileOutputStream fos = new FileOutputStream("build/classes/test/config.pb");
msg.writeTo(fos);
fos.close();
}
public void testFileConfigConsumptionWithBinary() throws Exception {
ConfigClient client = new ProviderBasedConfigClient(
new ResourceConfigProvider("file://" + System.getProperty("user.dir", "."), "/{file}"));
FlatConfigObject config = client.getConfig(FlatConfigObject.class,
ConfigParamsBuilder.newInstance("file", "build/classes/test/config.pb").build());
assertEquals(config.getTimeout(), 10);
assertEquals(config.getValidate(), false);
assertEquals(config.getSystemCode(), "101");
}
public void testFileConfigConsumptionWithXml() throws Exception {
ConfigClient client = new ProviderBasedConfigClient(
new ResourceConfigProvider("file://" + System.getProperty("user.dir", "."), "/{file}"));
FlatConfigObject config = client.getConfig(FlatConfigObject.class,
ConfigParamsBuilder.newInstance("file", "build/classes/test/config.xml").build());
assertEquals(config.getTimeout(), 10);
assertEquals(config.getValidate(), false);
assertEquals(config.getSystemCode(), "101");
}
public void testFileConfigConsumptionWithJson() throws Exception {
ConfigClient client = new ProviderBasedConfigClient(
new ResourceConfigProvider("file://" + System.getProperty("user.dir", "."), "/{file}"));
FlatConfigObject config = client.getConfig(FlatConfigObject.class,
ConfigParamsBuilder.newInstance("file", "build/classes/test/config.json").build());
assertEquals(config.getTimeout(), 10);
assertEquals(config.getValidate(), false);
assertEquals(config.getSystemCode(), "101");
}
public void testFileConfigConsumptionWithProps() throws Exception {
ConfigClient client = new ProviderBasedConfigClient(
new ResourceConfigProvider("file://" + System.getProperty("user.dir", "."), "/{file}"));
FlatConfigObject config = client.getConfig(FlatConfigObject.class,
ConfigParamsBuilder.newInstance("file", "build/classes/test/config.properties").build());
assertEquals(config.getTimeout(), 10);
assertEquals(config.getValidate(), false);
assertEquals(config.getSystemCode(), "101");
}
public void testHttpCouchDbConsumption() throws Exception {
MockHttpClient httpClient = new MockHttpClient();
final MockHttpMethod method = new MockHttpMethod();
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource json = resolver.getResource("classpath:config.couch");
method.data = json.getInputStream();
ConfigClient client = new ProviderBasedConfigClient(
new HttpConfigProvider("http://domain:port/config/", "{path}", httpClient) {
@Override
protected HttpMethod createHttpMethod(String url) {
assertEquals(url, "http://domain:port/config/bf4919676664810d86479e997c4b86a5");
return method;
}
});
FlatConfigObject config = client.getConfig(FlatConfigObject.class,
ConfigParamsBuilder.newInstance("path", "bf4919676664810d86479e997c4b86a5").build());
assertEquals(config.getTimeout(), 10);
assertEquals(config.getValidate(), false);
assertEquals(config.getSystemCode(), "101");
}
public void testInvocationHandlerConsumption() throws Exception {
ConfigClient client = new ProviderBasedConfigClient(
new ResourceConfigProvider("file://" + System.getProperty("user.dir", "."), "/{domain}/{path}"));
ConfigClientFactoryBean<FlatConfigService> bean =
new ConfigClientFactoryBean<FlatConfigService>(FlatConfigService.class, client);
bean.afterPropertiesSet();
FlatConfigService service = bean.getObject();
FlatConfigObject config = service.getConfig("build/classes", "test/config.properties");
assertEquals(config.getTimeout(), 10);
assertEquals(config.getValidate(), false);
assertEquals(config.getSystemCode(), "101");
}
@SuppressWarnings({"unchecked"})
public void testCachingConfigClientWrapper() throws Exception {
FileInputStream fis = new FileInputStream("build/classes/test/config.pb");
final FlatConfigObject msg = FlatConfigObject.parseFrom(fis);
final AtomicInteger accessCount = new AtomicInteger(0);
ConfigClient client = new ConfigClient() {
@Override
public Message getConfig(Class configClass, ConfigParamsBuilder.ConfigParamsMap configParams) {
accessCount.incrementAndGet();
if (configParams.size() == 0)
return msg;
else
return null;
}
@Override
public ConfigProvider getConfigProvider() {
return null;
}
@Override
public boolean reloadConfig() {
return true;
}
};
Map objects = new HashMap();
Set keys = new HashSet();
CachingConfigClientWrapper cachingConfig = new CachingConfigClientWrapper(client, objects, keys);
assertEquals(0, accessCount.get());
assertEquals(0, cachingConfig.getObjectCache().size());
assertEquals(0, cachingConfig.getNegativeCache().size());
assertEquals(cachingConfig.getConfig(FlatConfigObject.class,
ConfigParamsBuilder.newInstance().build()), msg);
assertEquals(1, accessCount.get());
assertEquals(1, cachingConfig.getObjectCache().size());
assertEquals(0, cachingConfig.getNegativeCache().size());
assertEquals(cachingConfig.getConfig(FlatConfigObject.class,
ConfigParamsBuilder.newInstance().build()), msg);
assertEquals(1, accessCount.get());
assertEquals(1, cachingConfig.getObjectCache().size());
assertEquals(0, cachingConfig.getNegativeCache().size());
assertNull(cachingConfig.getConfig(FlatConfigObject.class,
ConfigParamsBuilder.newInstance("foo", "bar").build()));
assertEquals(2, accessCount.get());
assertEquals(1, cachingConfig.getObjectCache().size());
assertEquals(1, cachingConfig.getNegativeCache().size());
assertNull(cachingConfig.getConfig(FlatConfigObject.class,
ConfigParamsBuilder.newInstance("foo", "bar").build()));
assertEquals(2, accessCount.get());
assertEquals(1, cachingConfig.getObjectCache().size());
assertEquals(1, cachingConfig.getNegativeCache().size());
}
public void testSpring() throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
context.refresh();
FlatConfigService service = context.getBean(FlatConfigService.class);
FlatConfigObject config = service.getConfig("build/classes", "test/config.properties");
assertEquals(config.getTimeout(), 10);
assertEquals(config.getValidate(), false);
assertEquals(config.getSystemCode(), "101");
}
}