/* * Copyright 2004-2006 The Apache Software Foundation. * * 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 javax.faces; import java.lang.reflect.Field; import java.util.List; import java.util.Map; import junit.framework.TestCase; import org.apache.myfaces.mock.api.Mock2ApplicationFactory; import org.apache.myfaces.mock.api.MockApplicationFactory; public class FactoryFinderTest extends TestCase { public static void main(String[] args) { junit.textui.TestRunner.run(FactoryFinderTest.class); } public FactoryFinderTest(String name) { super(name); } protected void setUp() throws Exception { super.setUp(); // this needs to be called *before* the first Test test is run, // as there may be left over FactoryFinder configurations from // that previous tests that may interfere with the first test here. FactoryFinder.releaseFactories(); } protected void tearDown() throws Exception { super.tearDown(); // call this again so there is no possibility of messing up tests that will // run after this one FactoryFinder.releaseFactories(); releaseRegisteredFactoryNames(); } private void releaseRegisteredFactoryNames() throws Exception { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); Map _registeredFactoryNames = getRegisteredFactoryNames(); _registeredFactoryNames.remove(classLoader); } private List registeredFactoryNames(String factoryName) throws Exception { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); Map _registeredFactoryNames = getRegisteredFactoryNames(); Map map = (Map) _registeredFactoryNames.get(classLoader); return (List) map.get(factoryName); } /* * This method allows us access to the _registeredFactoryNames field so we can * test the content of that map during the running of this test. * * @return Returns the _registeredFactoryNames Map from the FactoryFinder * class. @throws NoSuchFieldException @throws IllegalAccessException */ private Map getRegisteredFactoryNames() throws NoSuchFieldException, IllegalAccessException { Class factoryFinderClass = FactoryFinder.class; Field fields[] = factoryFinderClass.getDeclaredFields(); Field field = null; for (int i = 0; i < fields.length; i++) { if (fields[i].getName().equals("_registeredFactoryNames")) { field = fields[i]; field.setAccessible(true); break; } } Map _registeredFactoryNames = (Map) field.get(null); return _registeredFactoryNames; } /* * Test method for 'javax.faces.FactoryFinder.getFactory(String)' */ public void testGetFactory() throws Exception { // no catch because if this fails the test fails, i.e. not trying to test // setFactory here FactoryFinder.setFactory(FactoryFinder.APPLICATION_FACTORY, MockApplicationFactory.class.getName()); try { Object factory = FactoryFinder .getFactory(FactoryFinder.APPLICATION_FACTORY); assertNotNull(factory); assertTrue(factory.getClass().equals(MockApplicationFactory.class)); } catch (IllegalStateException e) { fail("Should not throw an illegal state exception"); } } /* * Test method for 'javax.faces.FactoryFinder.getFactory(String)' */ public void testGetFactoryTwice() throws Exception { // this test just makes sure that things work when the get has been called // more than once FactoryFinder.setFactory(FactoryFinder.APPLICATION_FACTORY, MockApplicationFactory.class.getName()); try { Object factory1 = FactoryFinder .getFactory(FactoryFinder.APPLICATION_FACTORY); assertNotNull(factory1); assertTrue(factory1.getClass().equals(MockApplicationFactory.class)); Object factory2 = FactoryFinder .getFactory(FactoryFinder.APPLICATION_FACTORY); assertNotNull(factory2); assertTrue(factory2.getClass().equals(MockApplicationFactory.class)); assertEquals(factory1, factory2); } catch (IllegalStateException e) { fail("Should not throw an illegal state exception"); } } /* * Test method for 'javax.faces.FactoryFinder.getFactory(String)' */ public void testGetFactoryNoFactory() throws Exception { // no catch because if this fails the test fails, i.e. not trying to test // setFactory here FactoryFinder.setFactory(FactoryFinder.APPLICATION_FACTORY, MockApplicationFactory.class.getName()); try { FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY); fail("Should have thrown an illegal state exception"); } catch (IllegalArgumentException e) { assertNotNull(e.getMessage()); } } /* * No configuration test, this should throw and deliver a useful message Test * method for 'javax.faces.FactoryFinder.getFactory(String)' */ public void testGetFactoryNoConfiguration() throws Exception { try { FactoryFinder.getFactory(FactoryFinder.APPLICATION_FACTORY); fail("Should have thrown an illegal state exception"); } catch (IllegalStateException e) { assertNotNull(e.getMessage()); assertTrue(e.getMessage().startsWith( "No Factories configured for this Application")); } } /* * Bogus factory name test Test method for * 'javax.faces.FactoryFinder.setFactory(String, String)' */ public void testSetFactoryBogusName() { try { FactoryFinder.setFactory("BogusFactoryName", MockApplicationFactory.class .getName()); fail("Should have thrown an illegal argument exception"); } catch (IllegalArgumentException e) { assertNotNull(e.getMessage()); } } /* * Test method for 'javax.faces.FactoryFinder.setFactory(String, String)' */ public void testSetFactory() throws Exception { try { FactoryFinder.setFactory(FactoryFinder.APPLICATION_FACTORY, MockApplicationFactory.class.getName()); assertTrue(registeredFactoryNames(FactoryFinder.APPLICATION_FACTORY) .contains(MockApplicationFactory.class.getName())); } catch (IllegalArgumentException e) { fail("Should not throw an illegal argument exception"); } } /* * If a factory has ever been handed out then setFactory is not supposed to * change the factory layout. This test checks to see if that is true. Test * method for 'javax.faces.FactoryFinder.setFactory(String, String)' */ public void testSetFactoryNoEffect() throws Exception { try { FactoryFinder.setFactory(FactoryFinder.APPLICATION_FACTORY, MockApplicationFactory.class.getName()); assertTrue(registeredFactoryNames(FactoryFinder.APPLICATION_FACTORY) .contains(MockApplicationFactory.class.getName())); assertFalse(registeredFactoryNames(FactoryFinder.APPLICATION_FACTORY) .contains(Mock2ApplicationFactory.class.getName())); // getFactory should cause setFactory to stop changing the // registered classes FactoryFinder.getFactory(FactoryFinder.APPLICATION_FACTORY); // this should essentially be a no-op FactoryFinder.setFactory(FactoryFinder.APPLICATION_FACTORY, Mock2ApplicationFactory.class.getName()); assertFalse(registeredFactoryNames(FactoryFinder.APPLICATION_FACTORY) .contains(Mock2ApplicationFactory.class.getName())); assertTrue(registeredFactoryNames(FactoryFinder.APPLICATION_FACTORY) .contains(MockApplicationFactory.class.getName())); } catch (IllegalArgumentException e) { fail("Should not throw an illegal argument exception"); } } /* * Adding factories should add the class name to the list of avalable class * names Test method for 'javax.faces.FactoryFinder.setFactory(String, * String)' */ public void testSetFactoryAdditiveClassNames() throws Exception { try { FactoryFinder.setFactory(FactoryFinder.APPLICATION_FACTORY, MockApplicationFactory.class.getName()); assertTrue(registeredFactoryNames(FactoryFinder.APPLICATION_FACTORY) .contains(MockApplicationFactory.class.getName())); assertFalse(registeredFactoryNames(FactoryFinder.APPLICATION_FACTORY) .contains(Mock2ApplicationFactory.class.getName())); FactoryFinder.setFactory(FactoryFinder.APPLICATION_FACTORY, Mock2ApplicationFactory.class.getName()); assertTrue(registeredFactoryNames(FactoryFinder.APPLICATION_FACTORY) .contains(Mock2ApplicationFactory.class.getName())); assertTrue(registeredFactoryNames(FactoryFinder.APPLICATION_FACTORY) .contains(MockApplicationFactory.class.getName())); } catch (IllegalArgumentException e) { fail("Should not throw an illegal argument exception"); } } /* * Test method for 'javax.faces.FactoryFinder.releaseFactories()' */ public void testReleaseFactories() { } }