1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    * 
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */ 
17  package org.apache.commons.logging.pathable;
18  
19  import java.net.URL;
20  import java.net.URLClassLoader;
21  
22  import junit.framework.Test;
23  import junit.framework.TestCase;
24  
25  import org.apache.commons.logging.PathableClassLoader;
26  import org.apache.commons.logging.PathableTestSuite;
27  
28  /**
29   * Tests for the PathableTestSuite class.
30   */
31  
32  public class GeneralTestCase extends TestCase {
33      
34      /**
35       * Set up a custom classloader hierarchy for this test case.
36       */
37      public static Test suite() throws Exception {
38          Class thisClass = GeneralTestCase.class;
39          ClassLoader thisClassLoader = thisClass.getClassLoader();
40          
41          PathableClassLoader loader = new PathableClassLoader(null);
42          loader.useExplicitLoader("junit.", thisClassLoader);
43          loader.addLogicalLib("testclasses");
44  
45          // reload this class via the child classloader
46          Class testClass = loader.loadClass(thisClass.getName());
47          
48          // and return our custom TestSuite class
49          return new PathableTestSuite(testClass, loader);
50      }
51      
52      /**
53       * Verify that a certain system property is not set, then set it.
54       */
55      private static void checkAndSetProperties() {
56          String prop = System.getProperty("no.such.property");
57          assertNull("no.such.property is unexpectedly defined", prop);
58          System.setProperty("no.such.property", "dummy value");
59          prop = System.getProperty("no.such.property");
60          assertNotNull("no.such.property is unexpectedly undefined", prop);
61      }
62      
63      /**
64       * Verify that when a test method modifies the system properties they are
65       * reset before the next test is run.
66       * <p>
67       * This method works in conjunction with testResetProps2. There is no
68       * way of knowing which test method junit will run first, but it doesn't
69       * matter; whichever one of them runs first will modify the system properties.
70       * If the PathableTestSuite isn't resetting the system properties then whichever
71       * of them runs second will fail. Of course if other methods are run in-between
72       * then those methods might also fail...
73       */
74      public void testResetProps1() {
75          checkAndSetProperties();
76      }
77  
78      /**
79       * See testResetProps1.
80       */
81      public void testResetProps2() {
82          checkAndSetProperties();
83      }
84      
85      /**
86       * Verify that the context classloader is a custom one, then reset it to
87       * a non-custom one.
88       */
89      private static void checkAndSetContext() {
90          ClassLoader contextLoader = Thread.currentThread().getContextClassLoader();
91          assertEquals("ContextLoader is of unexpected type", 
92                  contextLoader.getClass().getName(), 
93                  PathableClassLoader.class.getName());
94          
95          URL[] noUrls = new URL[0];
96          Thread.currentThread().setContextClassLoader(new URLClassLoader(noUrls));
97      }
98      
99      /**
100      * Verify that when a test method modifies the context classloader it is
101      * reset before the next test is run.
102      * <p>
103      * This method works in conjunction with testResetContext2. There is no
104      * way of knowing which test method junit will run first, but it doesn't
105      * matter; whichever one of them runs first will modify the contextClassloader.
106      * If the PathableTestSuite isn't resetting the contextClassLoader then whichever
107      * of them runs second will fail. Of course if other methods are run in-between
108      * then those methods might also fail...
109      */
110     public void testResetContext1() {
111         checkAndSetContext();
112     }
113 
114     /**
115      * See testResetContext1.
116      */
117     public void testResetContext2() {
118         checkAndSetContext();
119     }
120 }