blob: f9d1c71e94e86bb815dac2e163eacb1a702a0f52 [file] [log] [blame]
/*
* Licensed to Metamarkets Group Inc. (Metamarkets) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. Metamarkets licenses this file
* to you 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.
*/
package io.druid.guice;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.collect.ImmutableList;
import com.google.inject.Binder;
import com.google.inject.Injector;
import com.google.inject.Module;
import com.google.inject.name.Names;
import io.druid.initialization.Initialization;
import io.druid.java.util.common.StringUtils;
import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.UUID;
/**
*
*/
public abstract class JsonConfigTesterBase<T>
{
protected static final String configPrefix = "druid.test.prefix";
protected Injector injector;
protected final Class<T> clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
protected Map<String, String> propertyValues = new HashMap<>();
protected int assertions = 0;
protected Properties testProperties = new Properties();
protected static String getPropertyKey(String fieldName)
{
return StringUtils.format(
"%s.%s",
configPrefix, fieldName
);
}
protected static String getPropertyKey(Field field)
{
JsonProperty jsonProperty = field.getAnnotation(JsonProperty.class);
if (null != jsonProperty) {
return getPropertyKey(
(jsonProperty.value() == null || jsonProperty.value().isEmpty())
? field.getName()
: jsonProperty.value()
);
}
return null;
}
private final Module simpleJsonConfigModule = new Module()
{
@Override
public void configure(Binder binder)
{
binder.bindConstant().annotatedWith(Names.named("serviceName")).to("druid/test");
binder.bindConstant().annotatedWith(Names.named("servicePort")).to(0);
binder.bindConstant().annotatedWith(Names.named("tlsServicePort")).to(-1);
JsonConfigProvider.bind(binder, configPrefix, clazz);
}
};
protected final void validateEntries(T config)
throws IllegalAccessException, NoSuchMethodException, InvocationTargetException
{
for (Field field : clazz.getDeclaredFields()) {
final String propertyKey = getPropertyKey(field);
if (null != propertyKey) {
field.setAccessible(true);
String getter = StringUtils.format(
"get%s%s",
StringUtils.toUpperCase(field.getName().substring(0, 1)),
field.getName().substring(1)
);
Method method = clazz.getDeclaredMethod(getter);
final String value;
if (null != method) {
value = method.invoke(config).toString();
} else {
value = field.get(config).toString();
}
Assert.assertEquals(propertyValues.get(propertyKey), value);
++assertions;
}
}
}
protected JsonConfigurator configurator;
protected JsonConfigProvider<T> configProvider;
@Before
public void setup() throws IllegalAccessException
{
assertions = 0;
T fakeValues = EasyMock.createNiceMock(clazz);
propertyValues.clear();
testProperties.clear();
for (Field field : clazz.getDeclaredFields()) {
final String propertyKey = getPropertyKey(field);
if (null != propertyKey) {
field.setAccessible(true);
Class<?> fieldType = field.getType();
if (String.class.isAssignableFrom(fieldType)) {
propertyValues.put(propertyKey, UUID.randomUUID().toString());
} else if (Collection.class.isAssignableFrom(fieldType)) {
propertyValues.put(propertyKey, "[]");
} else if (Map.class.isAssignableFrom(fieldType)) {
propertyValues.put(propertyKey, "{}");
} else {
propertyValues.put(propertyKey, String.valueOf(field.get(fakeValues)));
}
}
}
testProperties.putAll(System.getProperties());
testProperties.putAll(propertyValues);
injector = Initialization.makeInjectorWithModules(
GuiceInjectors.makeStartupInjector(),
ImmutableList.<Module>of(simpleJsonConfigModule)
);
configurator = injector.getBinding(JsonConfigurator.class).getProvider().get();
configProvider = JsonConfigProvider.of(configPrefix, clazz);
}
@Test
public final void simpleInjectionTest()
throws IllegalAccessException, NoSuchMethodException, InvocationTargetException
{
configProvider.inject(testProperties, configurator);
validateEntries(configProvider.get().get());
Assert.assertEquals(propertyValues.size(), assertions);
}
}