001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.commons.chain.generic;
018    
019    
020    import junit.framework.Test;
021    import junit.framework.TestCase;
022    import junit.framework.TestSuite;
023    import org.apache.commons.chain.Context;
024    import org.apache.commons.chain.Catalog;
025    import org.apache.commons.chain.impl.CatalogBase;
026    import org.apache.commons.chain.impl.ContextBase;
027    import org.apache.commons.chain.impl.ChainBase;
028    import org.apache.commons.chain.impl.CatalogFactoryBase;
029    import org.apache.commons.chain.impl.DelegatingCommand;
030    import org.apache.commons.chain.impl.NonDelegatingCommand;
031    
032    /**
033     * <p>Test case for the <code>LookupCommand</code> class.</p>
034     *
035     * @author Sean Schofield
036     * @version $Revision: 480477 $
037     */
038    
039    public class LookupCommandTestCase extends TestCase {
040    
041    
042        // ---------------------------------------------------- Instance Variables
043    
044        /**
045         * The instance of {@link Catalog} to use when looking up commands
046         */
047        protected Catalog catalog;
048    
049        /**
050         * The {@link LookupCommand} instance under test.
051         */
052        protected LookupCommand command;
053    
054        /**
055         * The {@link Context} instance on which to execute the chain.
056         */
057        protected Context context = null;
058    
059    
060        // ---------------------------------------------------------- Constructors
061    
062        /**
063         * Construct a new instance of this test case.
064         *
065         * @param name Name of the test case
066         */
067        public LookupCommandTestCase(String name) {
068            super(name);
069        }
070    
071    
072        // -------------------------------------------------- Overall Test Methods
073    
074    
075        /**
076         * Set up instance variables required by this test case.
077         */
078        public void setUp() {
079            catalog = new CatalogBase();
080            CatalogFactoryBase.getInstance().setCatalog(catalog);
081            command = new LookupCommand();        
082            context = new ContextBase();
083        }
084    
085    
086        /**
087         * Return the tests included in this test suite.
088         */
089        public static Test suite() {
090            return (new TestSuite(LookupCommandTestCase.class));
091        }
092    
093        /**
094         * Tear down instance variables required by this test case.
095         */
096        public void tearDown() {
097            catalog = null;
098            CatalogFactoryBase.getInstance().clear();
099            command = null;
100            context = null;
101        }
102    
103    
104        // ------------------------------------------------ Individual Test Methods
105    
106    
107        // Test ability to lookup and execute single non-delegating command
108        public void testExecuteMethodLookup_1a() {
109    
110            // use default catalog
111            catalog.addCommand("foo", new NonDelegatingCommand("1a"));
112            command.setName("foo");
113    
114            try {
115                assertTrue("Command should return true",
116                           command.execute(context));
117            } catch (Exception e) {
118                fail("Threw exception: " + e);
119            }
120            checkExecuteLog("1a");
121        }
122    
123        // Test ability to lookup and execute a chain
124        public void testExecuteMethodLookup_1b() {
125    
126            ChainBase chain = new ChainBase();
127            chain.addCommand(new DelegatingCommand("1b1"));
128            chain.addCommand(new DelegatingCommand("1b2"));
129            chain.addCommand(new NonDelegatingCommand("1b3"));
130            
131            // use default catalog
132            catalog.addCommand("foo", chain);
133            command.setName("foo");
134    
135            try {
136                assertTrue("Command should return true",
137                           command.execute(context));
138            } catch (Exception e) {
139                fail("Threw exception: " + e);
140            }
141            checkExecuteLog("1b1/1b2/1b3");
142        }
143    
144        // Test ability to lookup and execute single non-delegating command
145        // using the context
146        public void testExecuteMethodLookup_2a() {
147    
148            // use default catalog
149            catalog.addCommand("foo", new NonDelegatingCommand("2a"));
150            command.setNameKey("nameKey");
151            context.put("nameKey", "foo");
152    
153            try {
154                assertTrue("Command should return true",
155                           command.execute(context));
156            } catch (Exception e) {
157                fail("Threw exception: " + e);
158            }
159            checkExecuteLog("2a");
160        }
161    
162        // Test ability to lookup and execute a chain using the context 
163        public void testExecuteMethodLookup_2b() {
164    
165            ChainBase chain = new ChainBase();
166            chain.addCommand(new DelegatingCommand("2b1"));
167            chain.addCommand(new DelegatingCommand("2b2"));
168            chain.addCommand(new NonDelegatingCommand("2b3"));
169    
170            // use default catalog
171            catalog.addCommand("foo", chain);
172            command.setNameKey("nameKey");
173            context.put("nameKey", "foo");
174    
175            try {
176                assertTrue("Command should return true",
177                           command.execute(context));
178            } catch (Exception e) {
179                fail("Threw exception: " + e);
180            }
181            checkExecuteLog("2b1/2b2/2b3");
182        }
183    
184        // Test ability to lookup and execute single non-delegating command, ignoring its result
185        public void testExecuteMethodLookup_3a() {
186    
187            // use default catalog
188            catalog.addCommand("foo", new NonDelegatingCommand("3a"));
189            command.setIgnoreExecuteResult(true);
190            command.setName("foo");
191    
192            try {
193                assertFalse("Command should return false",
194                           command.execute(context));
195            } catch (Exception e) {
196                fail("Threw exception: " + e);
197            }
198            checkExecuteLog("3a");
199        }
200    
201    
202        // -------------------------------------------------------- Support Methods
203    
204    
205        // Verify the contents of the execution log
206        protected void checkExecuteLog(String expected) {
207            StringBuffer log = (StringBuffer) context.get("log");
208            assertNotNull("Context failed to return log", log);
209            assertEquals("Context returned correct log",
210                         expected, log.toString());
211        }
212    
213    
214    }