/* * 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.tuscany.sca.context; import org.apache.tuscany.sca.core.DefaultExtensionPointRegistry; import org.apache.tuscany.sca.core.ExtensionPointRegistry; import org.junit.Assert; import org.junit.Test; /** * This test case will test the class * org.apache.tuscany.sca.context.DefaultContextFactoryExtensionPoint * * $Date$ $Rev$ */ public class DefaultContextFactoryExtensionPointTestCase { /** * Tests adding/getting/removing a factory with no interfaces */ @Test public void testFactoryWithNoInterfaces() { Object factory = new FactoryWithNoInterfaces(); Class<?>[] ifaces = {}; addGetRemoveFactory(factory, ifaces); } /** * Tests adding/getting/removing a factory with one interface */ @Test public void testFactoryWithOneInterface() { Object factory = new FactoryWithOneInterface(); Class<?>[] ifaces = { FactoryOneInterface.class }; addGetRemoveFactory(factory, ifaces); } /** * Tests adding/getting/removing a factory with two interfaces */ @Test public void testFactoryWithTwoInterfaces() { Object factory = new FactoryWithTwoInterfaces(); Class<?>[] ifaces = { FactoryTwoInterfacesA.class, FactoryTwoInterfacesB.class }; addGetRemoveFactory(factory, ifaces); } /** * Tests having multiple factories registered */ @Test public void testMultipleFactories() { // Create new factories FactoryWithOneInterface factory1 = new FactoryWithOneInterface(); FactoryWithTwoInterfaces factory2 = new FactoryWithTwoInterfaces(); ExtensionPointRegistry registry = new DefaultExtensionPointRegistry(); // Register the factories DefaultContextFactoryExtensionPoint ctxFactory = new DefaultContextFactoryExtensionPoint(registry); ctxFactory.addFactory(factory1); ctxFactory.addFactory(factory2); // Re-get each of the factories FactoryOneInterface regotFactory1 = ctxFactory.getFactory(FactoryOneInterface.class); Assert.assertNotNull(regotFactory1); Assert.assertSame(factory1, regotFactory1); FactoryTwoInterfacesA regotFactory2A = ctxFactory.getFactory(FactoryTwoInterfacesA.class); Assert.assertNotNull(regotFactory2A); Assert.assertSame(factory2, regotFactory2A); FactoryTwoInterfacesB regotFactory2B = ctxFactory.getFactory(FactoryTwoInterfacesB.class); Assert.assertNotNull(regotFactory1); Assert.assertSame(factory2, regotFactory2B); } /** * Tests passing in null to addFactory() */ @Test public void testAddingNullFactory() { ExtensionPointRegistry registry = new DefaultExtensionPointRegistry(); DefaultContextFactoryExtensionPoint ctxFactory = new DefaultContextFactoryExtensionPoint(registry); try { ctxFactory.addFactory(null); Assert.fail("Should have thrown IllegalArgumentException"); } catch (IllegalArgumentException ex) { // As expected } } /** * Test passing in null to removeFactory() */ @Test public void testRemovingNullFactory() { ExtensionPointRegistry registry = new DefaultExtensionPointRegistry(); DefaultContextFactoryExtensionPoint ctxFactory = new DefaultContextFactoryExtensionPoint(registry); try { ctxFactory.removeFactory(null); Assert.fail("Should have thrown IllegalArgumentException"); } catch (IllegalArgumentException ex) { // As expected } } /** * Test passing in null to getFactory() */ @Test public void testGetNullFactory() { ExtensionPointRegistry registry = new DefaultExtensionPointRegistry(); DefaultContextFactoryExtensionPoint ctxFactory = new DefaultContextFactoryExtensionPoint(registry); try { ctxFactory.getFactory(null); Assert.fail("Should have thrown IllegalArgumentException"); } catch (IllegalArgumentException ex) { // As expected } } /** * Utility method for testing adding and removing a factory * * @param factory The factory class to test * @param factoryInterfaces The list of interfaces implemented by the factory */ private void addGetRemoveFactory(Object factory, Class<?>[] factoryInterfaces) { ExtensionPointRegistry registry = new DefaultExtensionPointRegistry(); DefaultContextFactoryExtensionPoint ctxFactory = new DefaultContextFactoryExtensionPoint(registry); // Make sure factory not already present for (Class<?> iface : factoryInterfaces) { Assert.assertNull(ctxFactory.getFactory(iface)); } // Add the factory ctxFactory.addFactory(factory); // Make sure we can get the factory recently registered factory for (Class<?> iface : factoryInterfaces) { Object regot = ctxFactory.getFactory(iface); Assert.assertNotNull(regot); Assert.assertSame(factory, regot); } // Remove the factory ctxFactory.removeFactory(factory); // Make sure factory is no longer registered for (Class<?> iface : factoryInterfaces) { Assert.assertNull(ctxFactory.getFactory(iface)); } } /** * Simple factory with no interfaces */ private class FactoryWithNoInterfaces { } /** * Simple interface for the factory with one interface */ private interface FactoryOneInterface { } /** * Simple factory with one interface */ private class FactoryWithOneInterface implements FactoryOneInterface { } /** * Simple interface for the factory with two interfaces */ private interface FactoryTwoInterfacesA { } /** * Simple interface for the factory with two interfaces */ private interface FactoryTwoInterfacesB { } /** * Simple factory with two interfaces */ private class FactoryWithTwoInterfaces implements FactoryTwoInterfacesA, FactoryTwoInterfacesB { } }