You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ClassloaderRepositoryTest.java 3.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package org.aspectj.apache.bcel.classfile.tests;
  2. import java.net.URL;
  3. import java.net.URLClassLoader;
  4. import org.aspectj.apache.bcel.classfile.JavaClass;
  5. import org.aspectj.apache.bcel.util.ClassLoaderRepository;
  6. import junit.framework.TestCase;
  7. /*
  8. * Tests create a simple classloader repository configuration and check sharing of information.
  9. */
  10. public class ClassloaderRepositoryTest extends TestCase {
  11. private ClassLoaderRepository rep1,rep2;
  12. public void setUp() throws Exception {
  13. super.setUp();
  14. ClassLoader cl = Thread.currentThread().getContextClassLoader();
  15. ClassLoader cl1 = new URLClassLoader(new URL[]{},cl);
  16. ClassLoader cl2 = new URLClassLoader(new URL[]{},cl);
  17. rep1 = new ClassLoaderRepository(cl1);
  18. rep2 = new ClassLoaderRepository(cl2);
  19. }
  20. // Retrieve string 5 times from same repository, 4 hits should be from local cache
  21. public void testLocalCacheWorks() throws ClassNotFoundException {
  22. ClassLoaderRepository.useSharedCache=false;
  23. JavaClass jc = rep1.loadClass("java.lang.String");
  24. jc = rep1.loadClass("java.lang.String");
  25. jc = rep1.loadClass("java.lang.String");
  26. jc = rep1.loadClass("java.lang.String");
  27. jc = rep1.loadClass("java.lang.String");
  28. assertTrue("Should have used local cache 4 times: "+reportLocalCacheHits(rep1),reportLocalCacheHits(rep1)==4);
  29. }
  30. // Retrieve string 5 times from same repository, 4 hits should be from local cache
  31. public void testSharedCacheWorksOnOne() throws ClassNotFoundException {
  32. ClassLoaderRepository.useSharedCache=true;
  33. JavaClass jc = rep1.loadClass("java.lang.String");
  34. jc = rep1.loadClass("java.lang.String");
  35. jc = rep1.loadClass("java.lang.String");
  36. jc = rep1.loadClass("java.lang.String");
  37. jc = rep1.loadClass("java.lang.String");
  38. assertTrue("Should have used local cache 4 times: "+reportSharedCacheHits(rep1),reportSharedCacheHits(rep1)==4);
  39. }
  40. // Retrieve String through one repository then load again through another, should be shared cache hit
  41. public void testSharedCacheWorks() throws ClassNotFoundException {
  42. ClassLoaderRepository.useSharedCache=true;
  43. JavaClass jc = rep1.loadClass("java.lang.String");
  44. jc = rep2.loadClass("java.lang.String");
  45. assertTrue("Should have retrieved String from shared cache: "+reportSharedCacheHits(rep1),
  46. reportSharedCacheHits(rep1)==1);
  47. }
  48. // Shared cache OFF, shouldn't get a shared cache hit
  49. public void testSharedCacheCanBeDeactivated() throws ClassNotFoundException {
  50. try {
  51. ClassLoaderRepository.useSharedCache=false;
  52. JavaClass jc = rep1.loadClass("java.lang.String");
  53. jc = rep2.loadClass("java.lang.String");
  54. assertTrue("Should not have retrieved String from shared cache: "+
  55. reportSharedCacheHits(rep1),
  56. reportSharedCacheHits(rep1)==0);
  57. } finally {
  58. ClassLoaderRepository.useSharedCache=true;
  59. }
  60. }
  61. public void tearDown() throws Exception {
  62. super.tearDown();
  63. System.err.println("Rep1: "+rep1.reportStats());
  64. System.err.println("Rep2: "+rep2.reportStats());
  65. rep1.reset();
  66. rep2.reset();
  67. }
  68. private long reportLocalCacheHits(ClassLoaderRepository rep) {
  69. return rep.reportStats()[5];
  70. }
  71. private long reportSharedCacheHits(ClassLoaderRepository rep) {
  72. return rep.reportStats()[3];
  73. }
  74. }