1 22 package org.jboss.test.classloader.test; 23 24 import java.io.File ; 25 import java.net.URL ; 26 import java.lang.reflect.Field ; 27 28 import junit.framework.TestCase; 29 import junit.framework.TestSuite; 30 import junit.framework.Test; 31 32 import org.jboss.mx.loading.UnifiedLoaderRepository3; 33 import org.jboss.mx.loading.RepositoryClassLoader; 34 import org.jboss.test.util.ClassMover; 35 import org.jboss.logging.Logger; 36 import javassist.ClassPool; 37 import javassist.CtClass; 38 import javassist.CtField; 39 import javassist.Modifier; 40 41 46 public class BasicLoaderUnitTestCase extends TestCase 47 { 48 static Logger log = Logger.getLogger(BasicLoaderUnitTestCase.class); 49 String jbosstestDeployDir; 50 51 public BasicLoaderUnitTestCase(String name) 52 { 53 super(name); 54 } 55 56 protected void setUp() throws Exception 57 { 58 jbosstestDeployDir = System.getProperty("jbosstest.deploy.dir"); 59 if( jbosstestDeployDir == null ) 60 throw new Exception ("System property jbosstest.deploy.dir is not defined"); 61 } 62 63 65 public void testNoClassDefFoundError() throws Exception 66 { 67 UnifiedLoaderRepository3 ulr = new UnifiedLoaderRepository3(); 68 File cwd = new File (jbosstestDeployDir); 69 URL cp = new URL (cwd.toURL(), "../classes"); 70 log.info("Using cp: " + cp); 71 ClassLoader loader = ulr.newClassLoader(cp, true); 72 73 File bakFile = null; 74 try 75 { 76 bakFile = ClassMover.move("org.jboss.test.classloader.test.ex.BaseException"); 77 loader.loadClass("org.jboss.test.classloader.test.ex.DerivedException"); 78 fail("Should not have loaded DerivedException"); 79 } 80 catch (NoClassDefFoundError e) 81 { 82 String msg = e.getMessage(); 83 log.info("NCDFE msg: " + msg, e); 84 int index = msg.indexOf("BaseException"); 85 assertTrue("Saw BaseException in NCDFE: (" + index + "), msg=" + msg, index > 0); 86 } 87 finally 88 { 89 if (bakFile != null) 90 ClassMover.restore(bakFile); 91 } 92 93 } 94 95 public void testNoClassDefFoundError2() throws Exception 96 { 97 UnifiedLoaderRepository3 ulr = new UnifiedLoaderRepository3(); 98 File cwd = new File (jbosstestDeployDir); 99 URL cp = new URL (cwd.toURL(), "../classes"); 100 log.info("Using cp: " + cp); 101 ClassLoader loader = ulr.newClassLoader(cp, true); 102 103 File bakFile = null; 104 try 105 { 106 bakFile = ClassMover.move("org.jboss.test.classloader.test.ex.BaseException"); 107 Class c = loader.loadClass("org.jboss.test.classloader.test.ex.ExThrower"); 108 c.getMethods(); 109 fail("Should not have gotten ExThrower methods"); 110 } 111 catch (NoClassDefFoundError e) 112 { 113 String msg = e.getMessage(); 114 log.info("CNFE msg: " + msg, e); 115 int index = msg.indexOf("BaseException"); 116 assertTrue("Saw BaseException in CNFE: (" + index + "), msg=" + msg, index > 0); 117 } 118 finally 119 { 120 if (bakFile != null) 121 ClassMover.restore(bakFile); 122 } 123 124 } 125 126 public void testDeadlockScenario1() throws Exception 127 { 128 File libDir = new File (jbosstestDeployDir); 129 log.info("Using cp: " + libDir); 130 DeadlockTests32 test = new DeadlockTests32(libDir); 131 test.testDeadLock(); 132 } 133 134 public void testDeadlockScenario2() throws Exception 135 { 136 File libDir = new File (jbosstestDeployDir); 137 log.info("Using cp: " + libDir); 138 DeadlockTests32 test = new DeadlockTests32(libDir); 139 test.testDeadLockAndCircularity(); 140 } 141 142 148 public void testClasspathOrdering() throws Exception 149 { 150 File libDir = new File (jbosstestDeployDir); 151 File classes1 = new File (libDir, "classes1"); 152 classes1.mkdir(); 153 154 ClassPool defaultPool = ClassPool.getDefault(); 156 ClassPool classes1Pool = new ClassPool(defaultPool); 157 CtClass info = classes1Pool.makeClass("test.Info"); 158 CtClass s = classes1Pool.get("java.lang.String"); 159 CtField version = new CtField(s, "version", info); 160 version.setModifiers(Modifier.PUBLIC | Modifier.STATIC); 161 info.addField(version, CtField.Initializer.constant("Version 1.0")); 162 info.writeFile(classes1.getAbsolutePath()); 163 164 ClassPool classes2Pool = new ClassPool(defaultPool); 166 info = classes2Pool.makeClass("test.Info"); 167 File classes2 = new File (libDir, "classes2"); 168 classes2.mkdir(); 169 version = new CtField(s, "version", info); 170 version.setModifiers(Modifier.PUBLIC | Modifier.STATIC); 171 info.addField(version, CtField.Initializer.constant("Version 2.0")); 172 info.writeFile(classes2.getAbsolutePath()); 173 174 ClassPool classes3Pool = new ClassPool(defaultPool); 176 info = classes3Pool.makeClass("test.Info"); 177 File classes3 = new File (libDir, "classes3"); 178 classes3.mkdir(); 179 version = new CtField(s, "version", info); 180 version.setModifiers(Modifier.PUBLIC | Modifier.STATIC); 181 info.addField(version, CtField.Initializer.constant("Version 3.0")); 182 info.writeFile(classes3.getAbsolutePath()); 183 184 UnifiedLoaderRepository3 ulr = new UnifiedLoaderRepository3(); 186 RepositoryClassLoader loader1 = ulr.newClassLoader(classes1.toURL(), true); 187 loader1.addURL(classes2.toURL()); 188 RepositoryClassLoader loader2 = ulr.newClassLoader(classes3.toURL(), true); 189 190 Class infoClass = loader1.loadClass("test.Info"); 192 log.info("#1.1"+infoClass.getProtectionDomain().getCodeSource()); 193 Field theVersion = infoClass.getField("version"); 194 String v = (String ) theVersion.get(null); 195 assertTrue(v, v.equals("Version 1.0")); 196 197 infoClass = loader2.loadClass("test.Info"); 199 log.info("#1.2"+infoClass.getProtectionDomain().getCodeSource()); 200 theVersion = infoClass.getField("version"); 201 v = (String ) theVersion.get(null); 202 assertTrue(v, v.equals("Version 1.0")); 203 ulr.removeClassLoader(loader1); 204 ulr.removeClassLoader(loader2); 205 ulr.flush(); 206 207 ulr = new UnifiedLoaderRepository3(); 209 loader1 = ulr.newClassLoader(classes2.toURL(), true); 210 loader1.addURL(classes1.toURL()); 211 loader2 = ulr.newClassLoader(classes3.toURL(), true); 212 213 infoClass = loader1.loadClass("test.Info"); 215 log.info("#2.1"+infoClass.getProtectionDomain().getCodeSource()); 216 theVersion = infoClass.getField("version"); 217 v = (String ) theVersion.get(null); 218 assertTrue(v, v.equals("Version 2.0")); 219 220 infoClass = loader2.loadClass("test.Info"); 222 log.info("#2.2"+infoClass.getProtectionDomain().getCodeSource()); 223 theVersion = infoClass.getField("version"); 224 v = (String ) theVersion.get(null); 225 assertTrue(v, v.equals("Version 2.0")); 226 ulr.removeClassLoader(loader1); 227 ulr.removeClassLoader(loader2); 228 ulr.flush(); 229 230 ulr = new UnifiedLoaderRepository3(); 232 loader1 = ulr.newClassLoader(classes3.toURL(), true); 233 loader1.addURL(classes1.toURL()); 234 loader2 = ulr.newClassLoader(classes2.toURL(), true); 235 236 infoClass = loader1.loadClass("test.Info"); 238 log.info("#3.1"+infoClass.getProtectionDomain().getCodeSource()); 239 theVersion = infoClass.getField("version"); 240 v = (String ) theVersion.get(null); 241 assertTrue(v, v.equals("Version 3.0")); 242 243 infoClass = loader2.loadClass("test.Info"); 245 log.info("#3.2"+infoClass.getProtectionDomain().getCodeSource()); 246 theVersion = infoClass.getField("version"); 247 v = (String ) theVersion.get(null); 248 assertTrue(v, v.equals("Version 3.0")); 249 } 250 251 257 public void testBlacklistLeak() 258 throws Exception 259 { 260 UnifiedLoaderRepository3 ulr = new UnifiedLoaderRepository3(); 261 URL cs = getClass().getProtectionDomain().getCodeSource().getLocation(); 262 RepositoryClassLoader loader = ulr.newClassLoader(cs, true); 263 String base = "org.jboss"; 265 for(int n = 0; n < 1000; n ++) 266 base += ".package"+n; 267 for(int n = 0; n < 1000; n ++) 268 { 269 String name = base + ".Class"+n; 270 try 271 { 272 Class c = loader.loadClass(name); 273 fail("was able to load: "+name); 274 } 275 catch(ClassNotFoundException e) 276 { 277 278 } 279 catch(Error e) 280 { 281 fail("Failed with error: "+e+", iter: "+n); 282 } 283 } 284 } 285 286 public static Test suite() 287 { 288 TestSuite suite = new TestSuite(); 289 suite.addTest(new BasicLoaderUnitTestCase("testNoClassDefFoundError")); 290 suite.addTest(new BasicLoaderUnitTestCase("testNoClassDefFoundError2")); 291 suite.addTest(new BasicLoaderUnitTestCase("testDeadlockScenario1")); 292 suite.addTest(new BasicLoaderUnitTestCase("testDeadlockScenario2")); 293 suite.addTest(new BasicLoaderUnitTestCase("testClasspathOrdering")); 294 suite.addTest(new BasicLoaderUnitTestCase("testClasspathOrdering")); 295 return suite; 296 } 297 } 298 299 | Popular Tags |