]> source.dussan.org Git - aspectj.git/blob
c777f75de7a803e5ce3b2bd040f9eb8bcd858f5f
[aspectj.git] /
1 /* ====================================================================
2  * The Apache Software License, Version 1.1
3  *
4  * Copyright (c) 2001 The Apache Software Foundation.  All rights
5  * reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  *
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in
16  *    the documentation and/or other materials provided with the
17  *    distribution.
18  *
19  * 3. The end-user documentation included with the redistribution,
20  *    if any, must include the following acknowledgment:
21  *       "This product includes software developed by the
22  *        Apache Software Foundation (http://www.apache.org/)."
23  *    Alternately, this acknowledgment may appear in the software itself,
24  *    if and wherever such third-party acknowledgments normally appear.
25  *
26  * 4. The names "Apache" and "Apache Software Foundation" and
27  *    "Apache BCEL" must not be used to endorse or promote products
28  *    derived from this software without prior written permission. For
29  *    written permission, please contact apache@apache.org.
30  *
31  * 5. Products derived from this software may not be called "Apache",
32  *    "Apache BCEL", nor may "Apache" appear in their name, without
33  *    prior written permission of the Apache Software Foundation.
34  *
35  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
36  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
37  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
38  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
39  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
42  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
43  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
44  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
45  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
46  * SUCH DAMAGE.
47  * ====================================================================
48  *
49  * This software consists of voluntary contributions made by many
50  * individuals on behalf of the Apache Software Foundation.  For more
51  * information on the Apache Software Foundation, please see
52  * <http://www.apache.org/>.
53  */
54
55 package org.aspectj.apache.bcel.classfile.tests;
56
57 import java.util.ArrayList;
58 import java.util.List;
59
60 import junit.framework.TestCase;
61
62 import org.aspectj.apache.bcel.classfile.JavaClass;
63 import org.aspectj.apache.bcel.util.NonCachingClassLoaderRepository;
64
65 /**
66  * @author Kristian Rosenvold
67  */
68 public class NonCachingClassLoaderRepositoryTest extends TestCase {
69
70         private final NonCachingClassLoaderRepository nonCachingClassLoaderRepository = new NonCachingClassLoaderRepository(
71                         NonCachingClassLoaderRepositoryTest.class.getClassLoader());
72
73         protected void setUp() throws Exception {
74                 super.setUp();
75         }
76
77         abstract class DoneChecker implements Runnable {
78                 private volatile boolean success = false;
79                 private volatile boolean done = false;
80
81                 public boolean isSuccess() {
82                         return success;
83                 }
84
85                 public boolean isDone() {
86                         return done;
87                 }
88
89                 protected void setDone(boolean successFully) {
90                         success = successFully;
91                         done = true;
92                 }
93
94                 public abstract void run();
95         }
96
97         class Loader extends DoneChecker implements Runnable {
98                 public void run() {
99                         try {
100                                 JavaClass javaClass = nonCachingClassLoaderRepository.loadClass(NonCachingClassLoaderRepositoryTest.class
101                                                 .getCanonicalName());
102                                 nonCachingClassLoaderRepository.clear();
103                                 setDone(true);
104                         } catch (Throwable e) {
105                                 e.printStackTrace(System.out);
106                                 setDone(false);
107                         }
108                 }
109         }
110
111         class Clearer extends DoneChecker implements Runnable {
112                 public void run() {
113                         try {
114                                 nonCachingClassLoaderRepository.clear();
115                                 setDone(true);
116                         } catch (Throwable e) {
117                                 e.printStackTrace(System.out);
118                                 setDone(false);
119                         }
120                 }
121         }
122
123         public void testConcurrency() throws ClassNotFoundException, InterruptedException {
124                 List loaders = new ArrayList();
125                 int i1 = 1000;
126                 for (int i = 0; i < i1; i++) {
127                         DoneChecker loader = new Loader();
128                         loaders.add(loader);
129                         new Thread(loader).start();
130                         DoneChecker clearer = new Clearer();
131                         loaders.add(clearer);
132                         new Thread(clearer).start();
133                 }
134
135                 for (int i = 0; i < i1 * 2; i++) {
136                         DoneChecker loader = (DoneChecker) loaders.get(i);
137                         while (!loader.isDone()) {
138                                 Thread.sleep(10);
139                         }
140                         assertTrue("Loader " + i + " is supposed to run successfully", loader.isSuccess());
141                 }
142
143         }
144
145         protected void tearDown() throws Exception {
146                 super.tearDown();
147         }
148
149 }