1   /*
2    * $Id: TestFormBeanConfig.java 471754 2006-11-06 14:55:09Z husted $
3    *
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  package org.apache.struts.config;
22  
23  import junit.framework.Test;
24  import junit.framework.TestCase;
25  import junit.framework.TestSuite;
26  
27  import java.lang.reflect.InvocationTargetException;
28  
29  /**
30   * Unit tests for the <code>org.apache.struts.config.FormBeanConfig</code>
31   * class.  Currently only contains code to test the methods that support
32   * configuration inheritance.
33   *
34   * @version $Rev: 471754 $ $Date: 2005-05-25 19:35:00 -0400 (Wed, 25 May 2005)
35   *          $
36   */
37  public class TestFormBeanConfig extends TestCase {
38      // ----------------------------------------------------- Instance Variables
39  
40      /**
41       * The ModuleConfig we'll use.
42       */
43      protected ModuleConfig config = null;
44  
45      /**
46       * The common base we'll use.
47       */
48      protected FormBeanConfig baseForm = null;
49  
50      // ----------------------------------------------------------- Constructors
51  
52      /**
53       * Construct a new instance of this test case.
54       *
55       * @param name Name of the test case
56       */
57      public TestFormBeanConfig(String name) {
58          super(name);
59      }
60  
61      // --------------------------------------------------------- Public Methods
62  
63      /**
64       * Set up instance variables required by this test case.
65       */
66      public void setUp() {
67          ModuleConfigFactory factoryObject = ModuleConfigFactory.createFactory();
68  
69          config = factoryObject.createModuleConfig("");
70  
71          // setup the base form
72          baseForm = new FormBeanConfig();
73          baseForm.setName("baseForm");
74          baseForm.setType("org.apache.struts.action.DynaActionForm");
75  
76          // set up id, name, and score
77          FormPropertyConfig property = new FormPropertyConfig();
78  
79          property.setName("id");
80          property.setType("java.lang.String");
81          baseForm.addFormPropertyConfig(property);
82  
83          property = new FormPropertyConfig();
84          property.setName("name");
85          property.setType("java.lang.String");
86          property.setProperty("count", "10");
87          baseForm.addFormPropertyConfig(property);
88  
89          property = new FormPropertyConfig();
90          property.setName("score");
91          property.setType("java.lang.String");
92          baseForm.addFormPropertyConfig(property);
93  
94          property = new FormPropertyConfig();
95          property.setName("message");
96          property.setType("java.lang.String");
97          baseForm.addFormPropertyConfig(property);
98  
99          // register it to our config
100         config.addFormBeanConfig(baseForm);
101     }
102 
103     /**
104      * Return the tests included in this test suite.
105      */
106     public static Test suite() {
107         return (new TestSuite(TestFormBeanConfig.class));
108     }
109 
110     /**
111      * Tear down instance variables required by this test case.
112      */
113     public void tearDown() {
114         config = null;
115         baseForm = null;
116     }
117 
118     // ------------------------------------------------------- Individual Tests
119 
120     /**
121      * Basic check that shouldn't detect an error.
122      */
123     public void testCheckCircularInheritance() {
124         FormBeanConfig child = new FormBeanConfig();
125 
126         child.setName("child");
127         child.setExtends("baseForm");
128 
129         FormBeanConfig grandChild = new FormBeanConfig();
130 
131         grandChild.setName("grandChild");
132         grandChild.setExtends("child");
133 
134         config.addFormBeanConfig(child);
135         config.addFormBeanConfig(grandChild);
136 
137         assertTrue("Circular inheritance shouldn't have been detected",
138             !grandChild.checkCircularInheritance(config));
139     }
140 
141     /**
142      * Basic check that SHOULD detect an error.
143      */
144     public void testCheckCircularInheritanceError() {
145         FormBeanConfig child = new FormBeanConfig();
146 
147         child.setName("child");
148         child.setExtends("baseForm");
149 
150         FormBeanConfig grandChild = new FormBeanConfig();
151 
152         grandChild.setName("grandChild");
153         grandChild.setExtends("child");
154 
155         // establish the circular relationship with base
156         baseForm.setExtends("grandChild");
157 
158         config.addFormBeanConfig(child);
159         config.addFormBeanConfig(grandChild);
160 
161         assertTrue("Circular inheritance should've been detected",
162             grandChild.checkCircularInheritance(config));
163     }
164 
165     /**
166      * Test that processExtends() makes sure that a base form's own extension
167      * has been processed.
168      */
169     public void testProcessExtendsBaseFormExtends()
170         throws Exception {
171         CustomFormBeanConfig first = new CustomFormBeanConfig();
172 
173         first.setName("first");
174 
175         CustomFormBeanConfig second = new CustomFormBeanConfig();
176 
177         second.setName("second");
178         second.setExtends("first");
179 
180         config.addFormBeanConfig(first);
181         config.addFormBeanConfig(second);
182 
183         // set baseForm to extend second
184         baseForm.setExtends("second");
185 
186         baseForm.processExtends(config);
187 
188         assertTrue("The first form's processExtends() wasn't called",
189             first.processExtendsCalled);
190         assertTrue("The second form's processExtends() wasn't called",
191             second.processExtendsCalled);
192     }
193 
194     /**
195      * Make sure that correct exception is thrown if a base form can't be
196      * found.
197      */
198     public void testProcessExtendsMissingBaseForm()
199         throws Exception {
200         baseForm.setExtends("someMissingForm");
201 
202         try {
203             baseForm.processExtends(config);
204             fail(
205                 "An exception should be thrown if a super form can't be found.");
206         } catch (NullPointerException e) {
207             // succeed
208         } catch (InstantiationException e) {
209             fail("Unrecognized exception thrown.");
210         }
211     }
212 
213     /**
214      * Test a typical form bean configuration extension where various
215      * properties should be inherited from a base form.  This method checks
216      * all the properties.
217      */
218     public void testInheritFrom()
219         throws Exception {
220         // give baseForm some arbitrary parameters
221         String baseFormCount = "1";
222 
223         baseForm.setProperty("count", baseFormCount);
224 
225         // create a basic subform
226         FormBeanConfig subForm = new FormBeanConfig();
227         String subFormName = "subForm";
228 
229         subForm.setName(subFormName);
230         subForm.setExtends("baseForm");
231 
232         // override score
233         FormPropertyConfig property = new FormPropertyConfig();
234 
235         property.setName("score");
236         property.setType("java.lang.Integer");
237         subForm.addFormPropertyConfig(property);
238 
239         // ... and id
240         property = new FormPropertyConfig();
241         property.setName("id");
242         property.setType("java.lang.String");
243         property.setInitial("unknown");
244         subForm.addFormPropertyConfig(property);
245 
246         // ... and message
247         property = new FormPropertyConfig();
248         property.setName("message");
249         property.setType("java.lang.String");
250         property.setSize(10);
251         subForm.addFormPropertyConfig(property);
252 
253         config.addFormBeanConfig(subForm);
254 
255         subForm.inheritFrom(baseForm);
256 
257         // check that our subForm is still the one in the config
258         assertSame("subForm no longer in ModuleConfig", subForm,
259             config.findFormBeanConfig("subForm"));
260 
261         // check our configured sub form
262         assertNotNull("Form bean type was not inherited", subForm.getType());
263         assertEquals("Wrong form bean name", subFormName, subForm.getName());
264         assertEquals("Wrong form bean type", baseForm.getType(),
265             subForm.getType());
266         assertEquals("Wrong restricted value", baseForm.isRestricted(),
267             subForm.isRestricted());
268 
269         FormPropertyConfig[] formPropertyConfigs =
270             subForm.findFormPropertyConfigs();
271 
272         assertEquals("Wrong prop count", 4, formPropertyConfigs.length);
273 
274         // we want to check that the form is EXACTLY as we want it, so
275         //  here are some fine grain checks
276         property = subForm.findFormPropertyConfig("name");
277 
278         FormPropertyConfig original = baseForm.findFormPropertyConfig("name");
279 
280         assertNotNull("'name' property was not inherited", property);
281         assertEquals("Wrong type for name", original.getType(),
282             property.getType());
283         assertEquals("Wrong initial value for name", original.getInitial(),
284             property.getInitial());
285         assertEquals("Wrong size value for name", original.getSize(),
286             property.getSize());
287 
288         property = subForm.findFormPropertyConfig("id");
289         original = baseForm.findFormPropertyConfig("id");
290         assertNotNull("'id' property was not found", property);
291         assertEquals("Wrong type for id", original.getType(), property.getType());
292         assertEquals("Wrong initial value for id", "unknown",
293             property.getInitial());
294         assertEquals("Wrong size value for id", original.getSize(),
295             property.getSize());
296 
297         property = subForm.findFormPropertyConfig("score");
298         original = baseForm.findFormPropertyConfig("score");
299         assertNotNull("'score' property was not found", property);
300         assertEquals("Wrong type for score", "java.lang.Integer",
301             property.getType());
302         assertEquals("Wrong initial value for score", original.getInitial(),
303             property.getInitial());
304         assertEquals("Wrong size value for score", original.getSize(),
305             property.getSize());
306 
307         property = subForm.findFormPropertyConfig("message");
308         original = baseForm.findFormPropertyConfig("message");
309         assertNotNull("'message' property was not found", property);
310         assertEquals("Wrong type for message", original.getType(),
311             property.getType());
312         assertEquals("Wrong initial value for message", original.getInitial(),
313             property.getInitial());
314         assertEquals("Wrong size value for message", 10, property.getSize());
315 
316         property = subForm.findFormPropertyConfig("name");
317         original = baseForm.findFormPropertyConfig("name");
318         assertEquals("Arbitrary property not found",
319             original.getProperty("count"), property.getProperty("count"));
320 
321         String count = subForm.getProperty("count");
322 
323         assertEquals("Arbitrary property was not inherited", baseFormCount,
324             count);
325     }
326 
327     /**
328      * Used to detect that FormBeanConfig is making the right calls.
329      */
330     public static class CustomFormBeanConfig extends FormBeanConfig {
331         boolean processExtendsCalled = false;
332 
333         public void processExtends(ModuleConfig moduleConfig)
334             throws ClassNotFoundException, IllegalAccessException,
335                 InstantiationException, InvocationTargetException {
336             super.processExtends(moduleConfig);
337             processExtendsCalled = true;
338         }
339     }
340 }