/* * Copyright (c) 2002-2012 Alibaba Group Holding Limited. * All rights reserved. * * 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. */ package com.alibaba.citrus.service.moduleloader; import static com.alibaba.citrus.test.TestUtil.*; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; import com.alibaba.citrus.service.moduleloader.impl.ModuleLoaderServiceImpl; import com.alibaba.test.app1.module.control.InvalidControl; import org.junit.BeforeClass; import org.junit.Test; import org.springframework.beans.factory.BeanCreationException; import org.springframework.context.ApplicationContext; public class ModuleLoaderServiceTests extends AbstractModuleLoaderTests { @BeforeClass public static void initFactory() { factory = createContext("services-module-loader.xml", false); } @Test public void notFound() { moduleLoaderService = (ModuleLoaderService) factory.getBean("moduleLoaderService"); assertNull(moduleLoaderService.getModuleQuiet("action", "NotFound")); try { moduleLoaderService.getModule("action", "NotFound"); fail(); } catch (ModuleNotFoundException e) { assertThat(e, exception("Module not found: type=action, name=NotFound")); } } @Test public void unadaptable() { moduleLoaderService = (ModuleLoaderService) factory.getBean("moduleLoaderService"); try { moduleLoaderService.getModuleQuiet("control", "InvalidControl"); fail(); } catch (UnadaptableModuleException e) { assertThat( e, exception("Could not adapt object to module: type=control, name=InvalidControl, class=", InvalidControl.class.getName())); } try { moduleLoaderService.getModule("control", "InvalidControl"); fail(); } catch (UnadaptableModuleException e) { assertThat( e, exception("Could not adapt object to module: type=control, name=InvalidControl, class=", InvalidControl.class.getName())); } } @Test public void failureLoading() { moduleLoaderService = (ModuleLoaderService) factory.getBean("failure"); try { moduleLoaderService.getModuleQuiet("action", "Failure"); fail(); } catch (ModuleLoaderException e) { assertThat(e, exception("Failure loading module: action:Failure")); assertThat(e, exception(BeanCreationException.class, "module.action.Failure")); assertThat(e, exception(IllegalArgumentException.class, "[Assertion failed] - the expression must be true")); } try { moduleLoaderService.getModule("action", "Failure"); fail(); } catch (ModuleLoaderException e) { assertThat(e, exception("Failure loading module: action:Failure")); assertThat(e, exception(BeanCreationException.class, "module.action.Failure")); assertThat(e, exception(IllegalArgumentException.class, "[Assertion failed] - the expression must be true")); } } @Test public void no_cache() { // productionMode=false, cacheEnabled=default moduleLoaderService = (ModuleLoaderService) factory.getBean("moduleLoaderService"); Module action = moduleLoaderService.getModule("action", "myprod.MyAction"); // adapter assertNotNull(action); assertNotSame(action, moduleLoaderService.getModule("action", "myprod.MyAction")); // productionMode=true, cacheEnabled=false ApplicationContext factory = createContext("services-module-loader.xml", true); moduleLoaderService = (ModuleLoaderService) factory.getBean("noCache"); action = moduleLoaderService.getModule("action", "myprod.MyAction"); // adapter assertNotNull(action); assertNotSame(action, moduleLoaderService.getModule("action", "myprod.MyAction")); } @Test public void with_cache() { // productionMode=true, cacheEnabled=default ApplicationContext factory = createContext("services-module-loader.xml", true); moduleLoaderService = (ModuleLoaderService) factory.getBean("moduleLoaderService"); Module action = moduleLoaderService.getModule("action", "myprod.MyAction"); // adapter assertNotNull(action); assertSame(action, moduleLoaderService.getModule("action", "myprod.MyAction")); } @Test public void productionMode_byDefault() { assertTrue(new ModuleLoaderServiceImpl().isProductionMode()); } @Test public void toString_defaultAdapters() { moduleLoaderService = (ModuleLoaderService) factory.getBean("moduleLoaderService"); String str = moduleLoaderService.toString(); assertThat(str, containsString("ModuleLoaderService {")); assertThat(str, containsString("factories")); assertThat(str, containsString("adapters")); assertThat(str, containsString("ClassModuleFactory")); assertThat(str, containsString("ActionEventAdapterFactory")); // 默认adapter assertThat(str, containsString("ScreenEventAdapterFactory")); // 默认adapter assertThat(str, containsString("DataBindingAdapterFactory")); // 默认adapter assertThat(str, containsString("}")); ModuleAdapterFactory[] adapters = getFieldValue(moduleLoaderService, "adapters", ModuleAdapterFactory[].class); assertEquals(3, adapters.length); } @Test public void toString_specifiedAdapters_includeDefaultAdapters() { moduleLoaderService = (ModuleLoaderService) factory.getBean("includeDefaultAdapters"); String str = moduleLoaderService.toString(); assertThat(str, containsString("ModuleLoaderService {")); assertThat(str, containsString("factories")); assertThat(str, containsString("adapters")); assertThat(str, containsString("ClassModuleFactory")); assertThat(str, containsString("ActionEventAdapterFactory")); // 明确指定 assertThat(str, containsString("ScreenEventAdapterFactory")); // 明确指定 assertThat(str, containsString("MySimpleAdapterFactory")); // 明确指定 assertThat(str, containsString("DataBindingAdapterFactory")); // 明确指定 assertThat(str, containsString("}")); ModuleAdapterFactory[] adapters = getFieldValue(moduleLoaderService, "adapters", ModuleAdapterFactory[].class); assertEquals(4, adapters.length); } @Test public void toString_specifiedAdapters_dontIncludeDefaultAdapters() { moduleLoaderService = (ModuleLoaderService) factory.getBean("dontIncludeDefaultAdapters"); String str = moduleLoaderService.toString(); assertThat(str, containsString("ModuleLoaderService {")); assertThat(str, containsString("factories")); assertThat(str, containsString("adapters")); assertThat(str, containsString("ClassModuleFactory")); assertThat(str, containsString("ActionEventAdapterFactory")); // 明确指定 assertThat(str, containsString("ScreenEventAdapterFactory")); // 明确指定 assertThat(str, containsString("MySimpleAdapterFactory")); // 明确指定 assertThat(str, not(containsString("DataBindingAdapterFactory"))); // 未指定 assertThat(str, containsString("}")); ModuleAdapterFactory[] adapters = getFieldValue(moduleLoaderService, "adapters", ModuleAdapterFactory[].class); assertEquals(3, adapters.length); } public static class MySimpleAdapterFactory implements ModuleAdapterFactory { public Module adapt(String type, String name, Object moduleObject) throws ModuleLoaderException { return null; } } }