package act.conf;
/*-
* #%L
* ACT Framework
* %%
* Copyright (C) 2014 - 2017 ActFramework
* %%
* 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.
* #L%
*/
import act.Act;
import act.TestBase;
import act.app.conf.AutoConfig;
import act.app.conf.AutoConfigPlugin;
import act.app.data.StringValueResolverManager;
import act.inject.genie.GenieInjector;
import act.plugin.GenericPluginManager;
import org.hamcrest.Description;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentMatcher;
import org.osgl.$;
import org.osgl.http.H;
import org.osgl.util.C;
import org.osgl.util.Const;
import java.lang.reflect.Field;
import java.util.List;
import static org.mockito.Matchers.argThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class AutoConfigPluginTest extends TestBase {
private String intVal = "37";
private String intListVal = "37,23";
private long longVal = 21345315436L;
private boolean boolVal = true;
private String stringVal = $.randomStr();
private H.Method enumVal = H.Method.CONNECT;
private StringValueResolverManager resolverManager;
private GenieInjector injector;
@Before
public void before() throws Exception {
setup();
resolverManager = new StringValueResolverManager(mockApp);
when(mockApp.resolverManager()).thenReturn(resolverManager);
injector = new GenieInjector(mockApp);
when(mockApp.injector()).thenReturn(injector);
GenericPluginManager pluginManager = mock(GenericPluginManager.class);
Field field = Act.class.getDeclaredField("pluginManager");
field.setAccessible(true);
field.set(null, pluginManager);
when(mockAppConfig.getIgnoreCase(argThat(new ContainsIgnoreCase(".int")))).thenReturn(intVal);
when(mockAppConfig.getIgnoreCase(argThat(new ContainsIgnoreCase(".long")))).thenReturn(longVal);
when(mockAppConfig.getIgnoreCase(argThat(new ContainsIgnoreCase(".bool")))).thenReturn(boolVal);
when(mockAppConfig.getIgnoreCase(argThat(new ContainsIgnoreCase(".str")))).thenReturn(stringVal);
when(mockAppConfig.getIgnoreCase(argThat(new ContainsIgnoreCase(".method")))).thenReturn(enumVal);
when(mockAppConfig.getIgnoreCase(argThat(new ContainsIgnoreCase(".list")))).thenReturn(intListVal);
}
@Test
public void testProvisionConfigData() {
AutoConfigPlugin.loadPluginAutoConfig(Foo.class, mockApp);
eq(Integer.parseInt(intVal), Foo.foo_int);
eq(Integer.parseInt(intVal), Foo.foo_int_val.get());
eq(longVal, Foo.foo_long);
eq(longVal, Foo.foo_long_val.get());
eq(boolVal, Foo.foo_bool);
eq(boolVal, Foo.foo_bool_val.get());
eq(stringVal, Foo.foo_str);
eq(stringVal, Foo.FOO_STR_VAL.get());
eq(enumVal, Foo.foo_method);
eq(enumVal, Foo.FOO_METHOD_VAL.get());
ceq(C.listOf(37, 23), Foo.foo_list);
ceq(C.listOf(37, 23), Foo.FOO_LIST.get());
}
@AutoConfig
private static class Foo {
static int foo_int;
static final Const<Integer> foo_int_val = $.constant(0);
static long foo_long;
static final Const<Long> foo_long_val = $.constant(0L);
static boolean foo_bool;
static final Const<Boolean> foo_bool_val = $.constant(false);
static String foo_str;
static final Const<String> FOO_STR_VAL = $.constant("UNIX");
static H.Method foo_method;
static final $.Val<H.Method> FOO_METHOD_VAL = $.val(H.Method.GET);
static List<Integer> foo_list;
static final Const<List<Integer>> FOO_LIST = $.constant(null);
}
private class ContainsIgnoreCase extends ArgumentMatcher<String> {
private final String substring;
ContainsIgnoreCase(String substring) {
this.substring = substring;
}
public boolean matches(Object actual) {
return actual != null && ((String) actual).toUpperCase().contains(substring.toUpperCase());
}
public void describeTo(Description description) {
description.appendText("containsIgnoreCase(\"" + substring + "\")");
}
}
}