Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: org/apache/commons/lang/exception/NestableExceptionTestCase.java


1   /*
2    * Copyright 2002-2005 The Apache Software Foundation.
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * 
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.apache.commons.lang.exception;
17  
18  import java.io.ByteArrayInputStream;
19  import java.io.ByteArrayOutputStream;
20  import java.io.EOFException;
21  import java.io.ObjectInputStream;
22  import java.io.ObjectOutputStream;
23  import java.io.PrintStream;
24  
25  import junit.framework.Test;
26  import junit.framework.TestSuite;
27  import junit.textui.TestRunner;
28  
29  /**
30   * Tests the org.apache.commons.lang.exception.NestableException class.
31   *
32   * @author <a href="mailto:steven@caswell.name">Steven Caswell</a>
33   * @version $Id: NestableExceptionTestCase.java 161244 2005-04-14 06:16:36Z ggregory $
34   */
35  public class NestableExceptionTestCase extends AbstractNestableTestCase {
36      
37      /**
38       * Construct a new instance of
39       * <code>NestableExceptionTestCase</code>.
40       *
41       * @param name test case name
42       */
43      public NestableExceptionTestCase(String name)
44      {
45          super(name);
46      }
47  
48      /**
49       * Sets up instance variables required by this test case.
50       */
51      public void setUp()
52      {
53      }
54      
55      /**
56       * Returns the test suite
57       *
58       * @return the test suite
59       */
60      public static Test suite()
61      {
62          return new TestSuite(NestableExceptionTestCase.class);
63      }
64      
65      /**
66       * Tears down instance variables required by this test case.
67       */
68      public void tearDown()
69      {
70      }
71      
72      /**
73       * Command line entry point for running the test suite.
74       *
75       * @param args array of command line arguments
76       */
77      public static void main(String args[])
78      {
79          TestRunner.run(suite());
80      }
81      
82      /**
83       * @see AbstractNestableTestCase#getNestable()
84       */
85      public Nestable getNestable()
86      {
87          return new NestableException();
88      }
89      
90      /**
91       * @see AbstractNestableTestCase#getNestable(Nestable)
92       */
93      public Nestable getNestable(Nestable n)
94      {
95          return new NestableException((Throwable) n);
96      }
97      
98      /**
99       * @see AbstractNestableTestCase#getNestable(String)
100      */
101     public Nestable getNestable(String msg)
102     {
103         return new NestableException(msg);
104     }
105     
106     /**
107      * @see AbstractNestableTestCase#getNestable(Throwable)
108      */
109     public Nestable getNestable(Throwable t)
110     {
111         return new NestableException(t);
112     }
113     
114     /**
115      * @see AbstractNestableTestCase#getNestable(String, Throwable)
116      */
117     public Nestable getNestable(String msg, Throwable t)
118     {
119         return new NestableException(msg, t);
120     }
121     
122     /**
123      * @see AbstractNestableTestCase#getNestable(String, Nestable)
124      */
125     public Nestable getNestable(String msg, Nestable n)
126     {
127         return new NestableException(msg, (Throwable) n);
128     }
129     
130     /**
131      * @see AbstractNestableTestCase#getTester1(Throwable)
132      */
133     public Nestable getTester1(Throwable t)
134     {
135         return new NestableExceptionTester1(t);
136     }
137     
138     /**
139      * @see AbstractNestableTestCase#getTester1(Nestable)
140      */
141     public Nestable getTester1(Nestable n)
142     {
143         return new NestableExceptionTester1((Throwable) n);
144     }
145     
146     /**
147      * @see AbstractNestableTestCase#getTester1(String, Throwable)
148      */
149     public Nestable getTester1(String msg, Throwable t)
150     {
151         return new NestableExceptionTester1(msg, t);
152     }
153     
154     /**
155      * @see AbstractNestableTestCase#getTester1(String, Nestable)
156      */
157     public Nestable getTester1(String msg, Nestable n)
158     {
159         return new NestableExceptionTester1(msg, (Throwable) n);
160     }
161     
162     /**
163      * @see AbstractNestableTestCase#getTester1Class()
164      */
165     public Class getTester1Class()
166     {
167         return NestableExceptionTester1.class;
168     }
169     
170     /**
171      * @see AbstractNestableTestCase#getTester2(String, Throwable)
172      */
173     public Nestable getTester2(String msg, Throwable t)
174     {
175         return new NestableExceptionTester2(msg, t);
176     }
177     
178     /**
179      * @see AbstractNestableTestCase#getTester2(String, Nestable)
180      */
181     public Nestable getTester2(String msg, Nestable n)
182     {
183         return new NestableExceptionTester2(msg, (Throwable) n);
184     }
185     
186     /**
187      * @see AbstractNestableTestCase#getTester2Class()
188      */
189     public Class getTester2Class()
190     {
191         return NestableExceptionTester2.class;
192     }
193     
194     /**
195      * @see AbstractNestableTestCase#getThrowable(String)
196      */
197     public Throwable getThrowable(String msg)
198     {
199         return new EOFException(msg);
200     }
201     
202     /**
203      * @see AbstractNestableTestCase#getThrowableClass()
204      */
205     public Class getThrowableClass()
206     {
207         return EOFException.class;
208     }
209 
210     /**
211      * @see AbstractNestableTestCase#getBaseThrowableClass()
212      */
213     public Class getBaseThrowableClass()
214     {
215         return Exception.class;
216     }
217     
218     public void testSpecificPrintStackTrace()
219     {
220         ByteArrayOutputStream baos = new ByteArrayOutputStream();
221         PrintStream ps = new PrintStream(baos);
222         NestableException ne = new NestableException("outer", new NestableException("inner", new Exception("another exception")));
223         for(int i = 0; i < 2; i++)
224         {
225             if(i == 0)
226             {
227                 // Test printStackTrac()
228                 // Replace System.err with our own PrintStream so that we can
229                 // obtain and check the printStrackTrace output
230                 PrintStream err = System.err;
231                 System.setErr(ps);
232                 ne.printStackTrace();
233                 // Restore the System.err
234                 System.setErr(err);
235             }
236             else
237             {
238                 // Test printStackTrace(PrintStream)
239                 ne.printStackTrace(ps);
240             }
241         }
242         String msg = baos.toString();
243         assertTrue( "printStackTrace() starts with outer message", msg.startsWith("org.apache.commons.lang.exception.NestableException: outer"));
244         assertTrue( "printStackTrace() contains 1st nested message", msg.indexOf("Caused by: org.apache.commons.lang.exception.NestableException: inner") >= 0);
245         assertTrue( "printStackTrace() contains 2nd nested message", msg.indexOf("Caused by: java.lang.Exception: another exception") >= 0);
246         assertTrue( "printStackTrace() inner message after outer message", 
247             msg.indexOf("org.apache.commons.lang.exception.NestableException: outer") <
248             msg.indexOf("Caused by: org.apache.commons.lang.exception.NestableException: inner"));
249         assertTrue( "printStackTrace() cause message after inner message",
250             msg.indexOf("Caused by: org.apache.commons.lang.exception.NestableException: inner") <
251             msg.indexOf("Caused by: java.lang.Exception: another exception"));
252     }
253     
254     public void testSerialization()
255         throws java.io.IOException, ClassNotFoundException
256     {
257         RuntimeException nestedEx = new RuntimeException("nested exception message");
258         NestableExceptionTester1 ex = new NestableExceptionTester1("serialization test", nestedEx);
259 
260         assertTrue( "implements java.io.Serializable", nestedEx instanceof java.io.Serializable);
261         
262         assertTrue( "implements java.io.Serializable", ex instanceof java.io.Serializable);
263         
264         ByteArrayOutputStream baos = new ByteArrayOutputStream();
265         ByteArrayInputStream bais = null;
266         ObjectOutputStream oos = null;
267         ObjectInputStream ois = null;
268 
269         try
270         {        
271             oos = new ObjectOutputStream(baos);
272             oos.writeObject(ex);
273             oos.flush();
274             bais = new ByteArrayInputStream(baos.toByteArray());
275             ois = new ObjectInputStream(bais);
276             NestableExceptionTester1 deserializedEx = (NestableExceptionTester1) ois.readObject();
277             assertEquals( 
278                     "getThrowableCount() return value",
279                         ex.getThrowableCount(),
280                         deserializedEx.getThrowableCount());
281             
282             for (int i = 0; i < ex.getThrowableCount(); i++)
283             {
284                 Throwable t = ex.getThrowable(i);
285                 Throwable deserializedThrowable = deserializedEx.getThrowable(i);
286                 
287                 assertEquals( t.getClass(),
288                         deserializedThrowable.getClass());
289                         
290                 assertEquals(
291                     t.getMessage(),
292                     deserializedThrowable.getMessage());
293             }
294         }
295         finally
296         {
297             if (null != oos)
298             {
299                 try
300                 {
301                     oos.close();
302                 }
303                 catch (Exception ignored)
304                 {
305                     // intentionally empty
306                 }
307             }
308         }
309         
310     }
311 }
312 
313 /**
314  * First nestable tester implementation for use in test cases.
315  */
316 class NestableExceptionTester1 extends NestableException
317 {
318     public NestableExceptionTester1()
319     {
320         super();
321     }
322 
323     public NestableExceptionTester1(String reason, Throwable cause)
324     {
325         super(reason, cause);
326     }
327     
328     public NestableExceptionTester1(String reason)
329     {
330         super(reason);
331     }
332     
333     public NestableExceptionTester1(Throwable cause)
334     {
335         super(cause);
336     }
337     
338 }
339 
340 /**
341  * Second nestable tester implementation for use in test cases.
342  */
343 class NestableExceptionTester2 extends NestableException
344 {
345     public NestableExceptionTester2()
346     {
347         super();
348     }
349     
350     public NestableExceptionTester2(String reason, Throwable cause)
351     {
352         super(reason, cause);
353     }
354     
355     public NestableExceptionTester2(String reason)
356     {
357         super(reason);
358     }
359     
360     public NestableExceptionTester2(Throwable cause)
361     {
362         super(cause);
363     }
364     
365 }
366