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.CatalogFactoryBase; 028 import org.apache.commons.chain.impl.NonDelegatingCommand; 029 030 /** 031 * <p>Test case for the <code>DispatchLookupCommand</code> class.</p> 032 * 033 * @author Sean Schofield 034 * @version $Revision: 480477 $ 035 */ 036 037 public class DispatchLookupCommandTestCase extends TestCase { 038 039 040 // ---------------------------------------------------- Instance Variables 041 042 /** 043 * The instance of {@link Catalog} to use when looking up commands 044 */ 045 protected Catalog catalog; 046 047 /** 048 * The {@link DispatchLookupCommand} instance under test. 049 */ 050 protected DispatchLookupCommand command; 051 052 /** 053 * The {@link Context} instance on which to execute the chain. 054 */ 055 protected Context context = null; 056 057 058 // ---------------------------------------------------------- Constructors 059 060 /** 061 * Construct a new instance of this test case. 062 * 063 * @param name Name of the test case 064 */ 065 public DispatchLookupCommandTestCase(String name) { 066 super(name); 067 } 068 069 070 // -------------------------------------------------- Overall Test Methods 071 072 073 /** 074 * Set up instance variables required by this test case. 075 */ 076 public void setUp() { 077 catalog = new CatalogBase(); 078 CatalogFactoryBase.getInstance().setCatalog(catalog); 079 command = new DispatchLookupCommand(); 080 context = new ContextBase(); 081 } 082 083 084 /** 085 * Return the tests included in this test suite. 086 * 087 * @return The suite of tests to run 088 */ 089 public static Test suite() { 090 return (new TestSuite(DispatchLookupCommandTestCase.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 a dispatch method on a single 108 // non-delegating command 109 public void testExecuteDispatchLookup_1a() { 110 111 // use default catalog 112 catalog.addCommand("fooCommand", new TestCommand("1")); 113 114 // command should lookup the fooCommand and execute the fooMethod 115 command.setName("fooCommand"); 116 command.setMethod("fooMethod"); 117 118 try { 119 assertTrue("Command should return true", 120 command.execute(context)); 121 } catch (Exception e) { 122 123 fail("Threw exception: " + e); 124 } 125 126 // command should lookup the fooCommand and execute the barMethod 127 command.setMethod("barMethod"); 128 129 try { 130 assertTrue("Command should return true", 131 command.execute(context)); 132 } catch (Exception e) { 133 fail("Threw exception: " + e); 134 } 135 136 checkExecuteLog("1/1"); 137 138 } 139 140 // Test IllegalArgumentException when incorrect command name specified 141 public void testExecuteDispatchLookup_2() { 142 143 // use default catalog 144 catalog.addCommand("barCommand", new TestCommand("2")); 145 146 // command should lookup the fooCommand and execute the fooMethod 147 command.setName("fooCommand"); 148 command.setMethod("fooMethod"); 149 150 try { 151 command.execute(context); 152 } catch (IllegalArgumentException e) { 153 // test passed 154 return; 155 } catch (Exception e) { 156 // this is a failure 157 } 158 159 fail("Expected IllegalArgumentException"); 160 } 161 162 // Test ability to lookup and execute a dispatch method on a single 163 // non-delegating command (using context to specify method name) 164 public void testExecuteDispatchLookup_3() { 165 166 // use default catalog 167 catalog.addCommand("fooCommand", new TestCommand("3")); 168 169 // command should lookup the fooCommand and execute the fooMethod 170 command.setName("fooCommand"); 171 command.setMethodKey("methodKey"); 172 context.put("methodKey", "fooMethod"); 173 174 try { 175 assertTrue("Command should return true", 176 command.execute(context)); 177 } catch (Exception e) { 178 fail("Threw exception: " + e); 179 } 180 181 // command should lookup the fooCommand and execute the barMethod 182 command.setMethodKey("methodKey"); 183 context.put("methodKey", "barMethod"); 184 185 186 try { 187 assertTrue("Command should return true", 188 command.execute(context)); 189 } catch (Exception e) { 190 fail("Threw exception: " + e); 191 } 192 193 checkExecuteLog("3/3"); 194 195 } 196 197 198 // -------------------------------------------------------- Support Methods 199 200 201 // Verify the contents of the execution log 202 protected void checkExecuteLog(String expected) { 203 StringBuffer log = (StringBuffer) context.get("log"); 204 assertNotNull("Context failed to return log", log); 205 assertEquals("Context returned correct log", 206 expected, log.toString()); 207 } 208 209 // ---------------------------------------------------------- Inner Classes 210 211 212 class TestCommand extends NonDelegatingCommand { 213 214 public TestCommand(String id) 215 { 216 super(id); 217 } 218 219 public boolean fooMethod(Context context) { 220 log(context, id); 221 return true; 222 } 223 224 public boolean barMethod(Context context) { 225 log(context, id); 226 return true; 227 } 228 229 } 230 231 }