/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF 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 org.apache.cloudstack.spring.module.factory; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.IOException; import java.util.Collection; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.context.ApplicationContext; import org.apache.cloudstack.spring.module.locator.impl.ClasspathModuleDefinitionLocator; import org.apache.cloudstack.spring.module.model.ModuleDefinition; import org.apache.cloudstack.spring.module.model.ModuleDefinitionSet; public class ModuleBasedContextFactoryTest { Collection<ModuleDefinition> defs; @Before public void setUp() throws IOException { InstantiationCounter.count = 0; ClasspathModuleDefinitionLocator locator = new ClasspathModuleDefinitionLocator(); defs = locator.locateModules("testhierarchy"); } @Test public void testLoad() throws IOException { ModuleBasedContextFactory factory = new ModuleBasedContextFactory(); ModuleDefinitionSet set = factory.loadModules(defs, "base"); assertNotNull(set.getApplicationContext("base")); } @Test public void testOverride() throws IOException { InitTest.initted = false; ModuleBasedContextFactory factory = new ModuleBasedContextFactory(); ModuleDefinitionSet set = factory.loadModules(defs, "base"); assertTrue(!InitTest.initted); assertEquals("a string", set.getApplicationContext("child1").getBean("override", String.class)); } @Test public void testExcluded() throws IOException { ModuleBasedContextFactory factory = new ModuleBasedContextFactory(); ModuleDefinitionSet set = factory.loadModules(defs, "base"); assertNull(set.getApplicationContext("excluded")); assertNull(set.getApplicationContext("excluded2")); assertNull(set.getApplicationContext("orphan-of-excluded")); } @Test public void testBeans() throws IOException { ModuleBasedContextFactory factory = new ModuleBasedContextFactory(); ModuleDefinitionSet set = factory.loadModules(defs, "base"); testBeansInContext(set, "base", 1, new String[] {"base"}, new String[] {"child1", "child2", "child1-1"}); testBeansInContext(set, "child1", 2, new String[] {"base", "child1"}, new String[] {"child2", "child1-1"}); testBeansInContext(set, "child2", 4, new String[] {"base", "child2"}, new String[] {"child1", "child1-1"}); testBeansInContext(set, "child1-1", 3, new String[] {"base", "child1", "child1-1"}, new String[] {"child2"}); } protected void testBeansInContext(ModuleDefinitionSet set, String name, int order, String[] parents, String[] notTheres) { ApplicationContext context = set.getApplicationContext(name); String nameBean = context.getBean("name", String.class); assertEquals(name, nameBean); for (String parent : parents) { String parentBean = context.getBean(parent, String.class); assertEquals(parent, parentBean); } int notfound = 0; for (String notThere : notTheres) { try { context.getBean(notThere, String.class); fail(); } catch (NoSuchBeanDefinitionException e) { notfound++; } } int count = context.getBean("count", InstantiationCounter.class).getCount(); assertEquals(notTheres.length, notfound); assertEquals(order, count); } public static class InstantiationCounter { public static Integer count = 0; int myCount; public InstantiationCounter() { synchronized (count) { myCount = count + 1; count = myCount; } } public int getCount() { return myCount; } } }