xref: /aosp_15_r20/external/javassist/src/test/testproxy/ProxyTester.java (revision f1fbf3c2ab775ce834e0af96b7a85bdc7a0eac65)
1*f1fbf3c2SXin Li package testproxy;
2*f1fbf3c2SXin Li 
3*f1fbf3c2SXin Li import java.lang.reflect.Method;
4*f1fbf3c2SXin Li import java.lang.reflect.Constructor;
5*f1fbf3c2SXin Li import java.lang.reflect.Modifier;
6*f1fbf3c2SXin Li 
7*f1fbf3c2SXin Li import org.junit.Assert;
8*f1fbf3c2SXin Li 
9*f1fbf3c2SXin Li import java.lang.reflect.InvocationTargetException;
10*f1fbf3c2SXin Li import javassist.util.proxy.ProxyFactory;
11*f1fbf3c2SXin Li import javassist.util.proxy.MethodFilter;
12*f1fbf3c2SXin Li import javassist.util.proxy.MethodHandler;
13*f1fbf3c2SXin Li import javassist.util.proxy.ProxyObject;
14*f1fbf3c2SXin Li import javassist.util.proxy.Proxy;
15*f1fbf3c2SXin Li import junit.framework.TestCase;
16*f1fbf3c2SXin Li import java.io.*;
17*f1fbf3c2SXin Li 
18*f1fbf3c2SXin Li @SuppressWarnings({"unchecked", "rawtypes","unused"})
19*f1fbf3c2SXin Li public class ProxyTester extends TestCase {
ProxyTester(String s)20*f1fbf3c2SXin Li     public ProxyTester(String s) {
21*f1fbf3c2SXin Li         super(s);
22*f1fbf3c2SXin Li     }
23*f1fbf3c2SXin Li 
ProxyTester()24*f1fbf3c2SXin Li     public ProxyTester() {
25*f1fbf3c2SXin Li         this("proxy");
26*f1fbf3c2SXin Li     }
27*f1fbf3c2SXin Li 
28*f1fbf3c2SXin Li     static class Interceptor1 implements MethodHandler {
29*f1fbf3c2SXin Li         int counter = 0;
30*f1fbf3c2SXin Li 
invoke(Object self, Method m, Method proceed, Object[] args)31*f1fbf3c2SXin Li         public Object invoke(Object self, Method m, Method proceed,
32*f1fbf3c2SXin Li                 Object[] args) throws Exception {
33*f1fbf3c2SXin Li             System.out.println("intercept: " + m + ", proceed: " + proceed);
34*f1fbf3c2SXin Li             System.out.println("     modifier: "
35*f1fbf3c2SXin Li                                + Modifier.toString(proceed.getModifiers()));
36*f1fbf3c2SXin Li             counter++;
37*f1fbf3c2SXin Li             return proceed.invoke(self, args);
38*f1fbf3c2SXin Li         }
39*f1fbf3c2SXin Li     }
40*f1fbf3c2SXin Li 
41*f1fbf3c2SXin Li     static class Interceptor2 implements MethodHandler {
42*f1fbf3c2SXin Li         int counter = 0;
invoke(Object self, Method m, Method proceed, Object[] args)43*f1fbf3c2SXin Li         public Object invoke(Object self, Method m, Method proceed,
44*f1fbf3c2SXin Li                              Object[] args) throws Exception {
45*f1fbf3c2SXin Li             System.out.println("intercept: " + m + ", proceed: " + proceed);
46*f1fbf3c2SXin Li             counter++;
47*f1fbf3c2SXin Li             if (proceed != null)
48*f1fbf3c2SXin Li                 return proceed.invoke(self, args);
49*f1fbf3c2SXin Li             else
50*f1fbf3c2SXin Li                 if (m.getReturnType() == int.class)
51*f1fbf3c2SXin Li                     return Integer.valueOf(3);
52*f1fbf3c2SXin Li                 else
53*f1fbf3c2SXin Li                     return "OK";
54*f1fbf3c2SXin Li         }
55*f1fbf3c2SXin Li     }
56*f1fbf3c2SXin Li 
57*f1fbf3c2SXin Li     static MethodFilter finalizeRemover = new MethodFilter() {
58*f1fbf3c2SXin Li         public boolean isHandled(Method m) {
59*f1fbf3c2SXin Li             return !m.getName().equals("finalize");
60*f1fbf3c2SXin Li         }
61*f1fbf3c2SXin Li     };
62*f1fbf3c2SXin Li 
testTarget()63*f1fbf3c2SXin Li     public void testTarget() throws Exception {
64*f1fbf3c2SXin Li         ProxyFactory f = new ProxyFactory();
65*f1fbf3c2SXin Li         f.setSuperclass(Target.class);
66*f1fbf3c2SXin Li         Interceptor1 interceptor = new Interceptor1();
67*f1fbf3c2SXin Li         // f.setHandler(interceptor);
68*f1fbf3c2SXin Li         f.setFilter(finalizeRemover);
69*f1fbf3c2SXin Li         f.writeDirectory = ".";
70*f1fbf3c2SXin Li         Class c = f.createClass();
71*f1fbf3c2SXin Li         Target obj = (Target)c.getConstructor().newInstance();
72*f1fbf3c2SXin Li         ((Proxy)obj).setHandler(interceptor);
73*f1fbf3c2SXin Li         obj.m();
74*f1fbf3c2SXin Li         assertEquals(true, obj.m(true));
75*f1fbf3c2SXin Li         assertEquals((byte)1, obj.m1((byte)1));
76*f1fbf3c2SXin Li         assertEquals('a', obj.m2('a'));
77*f1fbf3c2SXin Li         assertEquals((short)2, obj.m3((short)2));
78*f1fbf3c2SXin Li         assertEquals(3, obj.m(3));
79*f1fbf3c2SXin Li         assertEquals(4L, obj.m5(4L));
80*f1fbf3c2SXin Li         assertTrue(5.0F == obj.m6(5.0F));
81*f1fbf3c2SXin Li         assertTrue(6.0 == obj.m7(6.0));
82*f1fbf3c2SXin Li         assertEquals("test", obj.m("test"));
83*f1fbf3c2SXin Li         int[] ia = { 1, 2, 3 };
84*f1fbf3c2SXin Li         assertEquals(ia, obj.m7(ia));
85*f1fbf3c2SXin Li         String[] sa = { "1", "2" };
86*f1fbf3c2SXin Li         assertEquals(sa, obj.m8(sa));
87*f1fbf3c2SXin Li         assertEquals(obj, obj.m9(3, obj, null));
88*f1fbf3c2SXin Li         assertEquals(14, interceptor.counter);
89*f1fbf3c2SXin Li     }
90*f1fbf3c2SXin Li 
testTarget1()91*f1fbf3c2SXin Li     public void testTarget1() throws Exception {
92*f1fbf3c2SXin Li         ProxyFactory f = new ProxyFactory();
93*f1fbf3c2SXin Li         f.setSuperclass(Target1.class);
94*f1fbf3c2SXin Li         Interceptor1 interceptor = new Interceptor1();
95*f1fbf3c2SXin Li         // f.setHandler(interceptor);
96*f1fbf3c2SXin Li         f.setFilter(finalizeRemover);
97*f1fbf3c2SXin Li         Class c = f.createClass();
98*f1fbf3c2SXin Li         Target1 obj = (Target1)c.getConstructor().newInstance();
99*f1fbf3c2SXin Li         ((Proxy)obj).setHandler(interceptor);
100*f1fbf3c2SXin Li         assertEquals(null, obj.m(null));
101*f1fbf3c2SXin Li         assertEquals(1, interceptor.counter);
102*f1fbf3c2SXin Li     }
103*f1fbf3c2SXin Li 
testObject()104*f1fbf3c2SXin Li     public void testObject() throws Exception {
105*f1fbf3c2SXin Li         ProxyFactory f = new ProxyFactory();
106*f1fbf3c2SXin Li         Interceptor1 interceptor = new Interceptor1();
107*f1fbf3c2SXin Li         // f.setHandler(interceptor);
108*f1fbf3c2SXin Li         f.setFilter(finalizeRemover);
109*f1fbf3c2SXin Li         Class c = f.createClass();
110*f1fbf3c2SXin Li         Object obj = (Object)c.getConstructor().newInstance();
111*f1fbf3c2SXin Li         ((Proxy)obj).setHandler(interceptor);
112*f1fbf3c2SXin Li         System.out.println(obj.toString());
113*f1fbf3c2SXin Li         assertEquals(2, interceptor.counter);
114*f1fbf3c2SXin Li     }
115*f1fbf3c2SXin Li 
testSetter()116*f1fbf3c2SXin Li     public void testSetter() throws Exception {
117*f1fbf3c2SXin Li         ProxyFactory f = new ProxyFactory();
118*f1fbf3c2SXin Li         f.writeDirectory = ".";
119*f1fbf3c2SXin Li         Interceptor1 interceptor = new Interceptor1();
120*f1fbf3c2SXin Li         // f.setHandler(interceptor);
121*f1fbf3c2SXin Li         f.setFilter(finalizeRemover);
122*f1fbf3c2SXin Li         Class c = f.createClass();
123*f1fbf3c2SXin Li         Object obj = (Object)c.getConstructor().newInstance();
124*f1fbf3c2SXin Li         ((Proxy)obj).setHandler(interceptor);
125*f1fbf3c2SXin Li         System.out.println("setter1: " + obj.toString());
126*f1fbf3c2SXin Li         ((ProxyObject)obj).setHandler(new MethodHandler() {
127*f1fbf3c2SXin Li             public Object invoke(Object self, Method m, Method proceed,
128*f1fbf3c2SXin Li                     Object[] args) throws Exception {
129*f1fbf3c2SXin Li                 System.out.print("intercept: " + m);
130*f1fbf3c2SXin Li                 return "OK";
131*f1fbf3c2SXin Li             }
132*f1fbf3c2SXin Li         });
133*f1fbf3c2SXin Li         assertEquals("OK", obj.toString());
134*f1fbf3c2SXin Li     }
135*f1fbf3c2SXin Li 
testString()136*f1fbf3c2SXin Li     public void testString() throws Exception {
137*f1fbf3c2SXin Li         ProxyFactory f = new ProxyFactory();
138*f1fbf3c2SXin Li         Interceptor1 interceptor = new Interceptor1();
139*f1fbf3c2SXin Li         // f.setHandler(interceptor);
140*f1fbf3c2SXin Li         f.setFilter(finalizeRemover);
141*f1fbf3c2SXin Li         f.setSuperclass(String.class);
142*f1fbf3c2SXin Li         try {
143*f1fbf3c2SXin Li             Class c = f.createClass();
144*f1fbf3c2SXin Li             Assert.fail("String is final!");
145*f1fbf3c2SXin Li         }
146*f1fbf3c2SXin Li         catch (RuntimeException e) {
147*f1fbf3c2SXin Li             System.out.println(e);
148*f1fbf3c2SXin Li         }
149*f1fbf3c2SXin Li     }
150*f1fbf3c2SXin Li 
testConstructor()151*f1fbf3c2SXin Li     public void testConstructor() throws Exception {
152*f1fbf3c2SXin Li         ProxyFactory f = new ProxyFactory();
153*f1fbf3c2SXin Li         Interceptor1 interceptor = new Interceptor1();
154*f1fbf3c2SXin Li         // f.setHandler(interceptor);
155*f1fbf3c2SXin Li         f.setFilter(finalizeRemover);
156*f1fbf3c2SXin Li         f.setSuperclass(Target2.class);
157*f1fbf3c2SXin Li         Class c = f.createClass();
158*f1fbf3c2SXin Li         Constructor[] cons = c.getDeclaredConstructors();
159*f1fbf3c2SXin Li         assertEquals(3, cons.length);
160*f1fbf3c2SXin Li         Constructor con1 = c.getDeclaredConstructor(new Class[] { int.class });
161*f1fbf3c2SXin Li         Constructor con2 = c.getDeclaredConstructor(new Class[] { int.class, int.class });
162*f1fbf3c2SXin Li         Method m1 = c.getDeclaredMethod("get", new Class[0]);
163*f1fbf3c2SXin Li         Method m2 = c.getDeclaredMethod("foo", new Class[0]);
164*f1fbf3c2SXin Li         assertEquals(0, m1.getExceptionTypes().length);
165*f1fbf3c2SXin Li         assertEquals("java.io.IOException", m2.getExceptionTypes()[0].getName());
166*f1fbf3c2SXin Li 
167*f1fbf3c2SXin Li         Target2 t2 = (Target2)con1.newInstance(new Object[] { Integer.valueOf(1) });
168*f1fbf3c2SXin Li         ((Proxy)t2).setHandler(interceptor);
169*f1fbf3c2SXin Li         System.out.println(t2.toString());
170*f1fbf3c2SXin Li         assertEquals(2, interceptor.counter);
171*f1fbf3c2SXin Li 
172*f1fbf3c2SXin Li         interceptor.counter = 0;
173*f1fbf3c2SXin Li         assertEquals(2, t2.foo());
174*f1fbf3c2SXin Li         assertEquals(4, t2._dfoo());
175*f1fbf3c2SXin Li         assertEquals(2, interceptor.counter);
176*f1fbf3c2SXin Li     }
177*f1fbf3c2SXin Li 
testInterface()178*f1fbf3c2SXin Li     public void testInterface() throws Exception {
179*f1fbf3c2SXin Li         ProxyFactory f = new ProxyFactory();
180*f1fbf3c2SXin Li         Interceptor2 interceptor2 = new Interceptor2();
181*f1fbf3c2SXin Li         // f.setHandler(interceptor2);
182*f1fbf3c2SXin Li         f.setFilter(finalizeRemover);
183*f1fbf3c2SXin Li         f.setInterfaces(new Class[] { Target3.class });
184*f1fbf3c2SXin Li         Class c = f.createClass();
185*f1fbf3c2SXin Li         Target3 obj = (Target3)c.getConstructor().newInstance();
186*f1fbf3c2SXin Li         ((Proxy)obj).setHandler(interceptor2);
187*f1fbf3c2SXin Li         assertEquals("OK", obj.m());
188*f1fbf3c2SXin Li         System.out.println(obj.toString());
189*f1fbf3c2SXin Li         assertEquals(3, interceptor2.counter);
190*f1fbf3c2SXin Li     }
191*f1fbf3c2SXin Li 
test2Interfaces()192*f1fbf3c2SXin Li     public void test2Interfaces() throws Exception {
193*f1fbf3c2SXin Li         ProxyFactory f = new ProxyFactory();
194*f1fbf3c2SXin Li         Interceptor2 interceptor2 = new Interceptor2();
195*f1fbf3c2SXin Li         // f.setHandler(interceptor2);
196*f1fbf3c2SXin Li         f.setFilter(finalizeRemover);
197*f1fbf3c2SXin Li         f.setInterfaces(new Class[] { Target3.class, Target4.class });
198*f1fbf3c2SXin Li         Class c = f.createClass();
199*f1fbf3c2SXin Li         Target3 obj = (Target3)c.getConstructor().newInstance();
200*f1fbf3c2SXin Li         ((Proxy)obj).setHandler(interceptor2);
201*f1fbf3c2SXin Li         assertEquals("OK", obj.m());
202*f1fbf3c2SXin Li         System.out.println(obj.toString());
203*f1fbf3c2SXin Li         assertEquals(3, interceptor2.counter);
204*f1fbf3c2SXin Li 
205*f1fbf3c2SXin Li         interceptor2.counter = 0;
206*f1fbf3c2SXin Li         Target4 obj4 = (Target4)c.getConstructor().newInstance();
207*f1fbf3c2SXin Li         ((Proxy)obj4).setHandler(interceptor2);
208*f1fbf3c2SXin Li         assertEquals(3, obj4.bar4());
209*f1fbf3c2SXin Li         assertEquals(3, obj4.foo4());
210*f1fbf3c2SXin Li         assertEquals(2, interceptor2.counter);
211*f1fbf3c2SXin Li     }
212*f1fbf3c2SXin Li 
testFilter()213*f1fbf3c2SXin Li     public void testFilter() throws Exception {
214*f1fbf3c2SXin Li         ProxyFactory f = new ProxyFactory();
215*f1fbf3c2SXin Li         Interceptor2 interceptor2 = new Interceptor2();
216*f1fbf3c2SXin Li         // f.setHandler(interceptor2);
217*f1fbf3c2SXin Li         f.setFilter(finalizeRemover);
218*f1fbf3c2SXin Li         f.setInterfaces(new Class[] { Target3.class });
219*f1fbf3c2SXin Li         f.setFilter(new MethodFilter() {
220*f1fbf3c2SXin Li                 public boolean isHandled(Method m) {
221*f1fbf3c2SXin Li                     return m.getDeclaringClass() != Object.class;
222*f1fbf3c2SXin Li                 }
223*f1fbf3c2SXin Li             });
224*f1fbf3c2SXin Li         Class c = f.createClass();
225*f1fbf3c2SXin Li         Target3 obj = (Target3)c.getConstructor().newInstance();
226*f1fbf3c2SXin Li         ((Proxy)obj).setHandler(interceptor2);
227*f1fbf3c2SXin Li         assertEquals("OK", obj.m());
228*f1fbf3c2SXin Li         System.out.println(obj.toString());
229*f1fbf3c2SXin Li         assertEquals(1, interceptor2.counter);
230*f1fbf3c2SXin Li     }
231*f1fbf3c2SXin Li 
232*f1fbf3c2SXin Li     public static boolean testInitFlag;
233*f1fbf3c2SXin Li 
testInit()234*f1fbf3c2SXin Li     public void testInit() throws Exception {
235*f1fbf3c2SXin Li         ProxyFactory f = new ProxyFactory();
236*f1fbf3c2SXin Li         f.setSuperclass(TargetInit.class);
237*f1fbf3c2SXin Li         MethodHandler handler = new MethodHandler() {
238*f1fbf3c2SXin Li             public Object invoke(Object self, Method m,
239*f1fbf3c2SXin Li                     Method proceed, Object[] args) throws Exception {
240*f1fbf3c2SXin Li                 System.out.println("testInit " + testInitFlag);
241*f1fbf3c2SXin Li                 return proceed.invoke(self, args);
242*f1fbf3c2SXin Li             }
243*f1fbf3c2SXin Li         };
244*f1fbf3c2SXin Li         testInitFlag = false;
245*f1fbf3c2SXin Li         Class c = f.createClass();
246*f1fbf3c2SXin Li         assertTrue(testInitFlag); // since 3.12.  Before then, this line was assertFalse(testInitFlag);
247*f1fbf3c2SXin Li         System.out.println("testInit createClass(): " + testInitFlag);
248*f1fbf3c2SXin Li         TargetInit obj = (TargetInit)c.getConstructor().newInstance();
249*f1fbf3c2SXin Li         assertTrue(testInitFlag);
250*f1fbf3c2SXin Li         System.out.println("testInit newInstance(): " + testInitFlag);
251*f1fbf3c2SXin Li         ((ProxyObject)obj).setHandler(handler);
252*f1fbf3c2SXin Li         assertEquals("OK", obj.m());
253*f1fbf3c2SXin Li     }
254*f1fbf3c2SXin Li 
testCreate()255*f1fbf3c2SXin Li     public void testCreate() throws Exception {
256*f1fbf3c2SXin Li         ProxyFactory f = new ProxyFactory();
257*f1fbf3c2SXin Li         f.setSuperclass(Target5.class);
258*f1fbf3c2SXin Li         Interceptor1 interceptor = new Interceptor1();
259*f1fbf3c2SXin Li         // f.setHandler(interceptor);
260*f1fbf3c2SXin Li         f.setFilter(finalizeRemover);
261*f1fbf3c2SXin Li         Class c = f.createClass();
262*f1fbf3c2SXin Li         Target5 obj = (Target5)f.create(new Class[] { int.class }, new Object[] { Integer.valueOf(3) });
263*f1fbf3c2SXin Li         ((Proxy)obj).setHandler(interceptor);
264*f1fbf3c2SXin Li         assertEquals(3, obj.get());
265*f1fbf3c2SXin Li     }
266*f1fbf3c2SXin Li 
267*f1fbf3c2SXin Li 
testBridgeMethod()268*f1fbf3c2SXin Li     public void testBridgeMethod() throws Exception {
269*f1fbf3c2SXin Li         ProxyFactory f = new ProxyFactory();
270*f1fbf3c2SXin Li         f.writeDirectory = ".";
271*f1fbf3c2SXin Li         f.setSuperclass(BridgeMethod.class);
272*f1fbf3c2SXin Li         Interceptor1 interceptor = new Interceptor1();
273*f1fbf3c2SXin Li         // f.setHandler(interceptor);
274*f1fbf3c2SXin Li         f.setFilter(finalizeRemover);
275*f1fbf3c2SXin Li         Class c = f.createClass();
276*f1fbf3c2SXin Li         BridgeMethod obj = (BridgeMethod)c.getConstructor().newInstance();
277*f1fbf3c2SXin Li         ((Proxy)obj).setHandler(interceptor);
278*f1fbf3c2SXin Li         Integer value = obj.m1();
279*f1fbf3c2SXin Li         assertEquals(7, value.intValue());
280*f1fbf3c2SXin Li         BridgeMethodInf inf = (BridgeMethodInf)obj;
281*f1fbf3c2SXin Li         Number num = inf.m1();
282*f1fbf3c2SXin Li         assertEquals(7, num.intValue());
283*f1fbf3c2SXin Li         BridgeMethodSuper sup = obj;
284*f1fbf3c2SXin Li         try {
285*f1fbf3c2SXin Li             Object x = sup.id(new Object());
286*f1fbf3c2SXin Li             fail("not cast error");
287*f1fbf3c2SXin Li         }
288*f1fbf3c2SXin Li         catch (ClassCastException e) {}
289*f1fbf3c2SXin Li         catch (Exception e) {
290*f1fbf3c2SXin Li             if (e instanceof InvocationTargetException)
291*f1fbf3c2SXin Li                 if (e.getCause() instanceof ClassCastException)
292*f1fbf3c2SXin Li                     return;
293*f1fbf3c2SXin Li 
294*f1fbf3c2SXin Li             throw e;
295*f1fbf3c2SXin Li         }
296*f1fbf3c2SXin Li     }
297*f1fbf3c2SXin Li 
testGetters()298*f1fbf3c2SXin Li     public void testGetters() throws Exception {
299*f1fbf3c2SXin Li         ProxyFactory f = new ProxyFactory();
300*f1fbf3c2SXin Li         Class c = ProxyTester.class;
301*f1fbf3c2SXin Li         f.setSuperclass(c);
302*f1fbf3c2SXin Li         assertEquals(c, f.getSuperclass());
303*f1fbf3c2SXin Li         Class i = java.io.Serializable.class;
304*f1fbf3c2SXin Li         f.setInterfaces(new Class[] { i });
305*f1fbf3c2SXin Li         assertEquals(i, f.getInterfaces()[0]);
306*f1fbf3c2SXin Li     }
307*f1fbf3c2SXin Li 
308*f1fbf3c2SXin Li     static class ProxyFactory2 extends ProxyFactory {
getClassLoader2()309*f1fbf3c2SXin Li         public ClassLoader getClassLoader2() {
310*f1fbf3c2SXin Li             return getClassLoader();
311*f1fbf3c2SXin Li         }
312*f1fbf3c2SXin Li     }
313*f1fbf3c2SXin Li 
testProvider()314*f1fbf3c2SXin Li     public void testProvider() throws Exception {
315*f1fbf3c2SXin Li         ProxyFactory.ClassLoaderProvider cp = ProxyFactory.classLoaderProvider;
316*f1fbf3c2SXin Li         try {
317*f1fbf3c2SXin Li             final ClassLoader cl = Thread.currentThread().getContextClassLoader();
318*f1fbf3c2SXin Li             ProxyFactory.classLoaderProvider = new ProxyFactory.ClassLoaderProvider() {
319*f1fbf3c2SXin Li                 public ClassLoader get(ProxyFactory pf) {
320*f1fbf3c2SXin Li                     return Thread.currentThread().getContextClassLoader();
321*f1fbf3c2SXin Li                 }
322*f1fbf3c2SXin Li             };
323*f1fbf3c2SXin Li 
324*f1fbf3c2SXin Li             ProxyFactory2 pf = new ProxyFactory2();
325*f1fbf3c2SXin Li             assertEquals(cl, pf.getClassLoader2());
326*f1fbf3c2SXin Li         }
327*f1fbf3c2SXin Li         finally {
328*f1fbf3c2SXin Li             ProxyFactory.classLoaderProvider = cp;
329*f1fbf3c2SXin Li         }
330*f1fbf3c2SXin Li     }
331*f1fbf3c2SXin Li 
332*f1fbf3c2SXin Li     @SuppressWarnings("deprecation")
testCache()333*f1fbf3c2SXin Li 	public void testCache() throws Exception {
334*f1fbf3c2SXin Li         boolean prev = ProxyFactory.useCache;
335*f1fbf3c2SXin Li         ProxyFactory.useCache = true;
336*f1fbf3c2SXin Li         ProxyFactory f = new ProxyFactory();
337*f1fbf3c2SXin Li         f.setSuperclass(Cache1.class);
338*f1fbf3c2SXin Li         Class c = f.createClass();
339*f1fbf3c2SXin Li         ProxyFactory f2 = new ProxyFactory();
340*f1fbf3c2SXin Li         f2.setSuperclass(Cache1.class);
341*f1fbf3c2SXin Li         assertEquals(c, f2.createClass());
342*f1fbf3c2SXin Li         ProxyFactory f3 = new ProxyFactory();
343*f1fbf3c2SXin Li         f3.setSuperclass(Cache1.class);
344*f1fbf3c2SXin Li         f3.setHandler(new Interceptor1());	// deprecated
345*f1fbf3c2SXin Li         assertFalse(c == f3.createClass());
346*f1fbf3c2SXin Li         ProxyFactory.useCache = true;
347*f1fbf3c2SXin Li         ProxyFactory f4 = new ProxyFactory();
348*f1fbf3c2SXin Li         f4.setSuperclass(Cache1.class);
349*f1fbf3c2SXin Li         f4.setInterfaces(new Class[] { Cache2.class });
350*f1fbf3c2SXin Li         Class c4 = f4.createClass();
351*f1fbf3c2SXin Li         assertFalse(c == c4);
352*f1fbf3c2SXin Li         ProxyFactory f5 = new ProxyFactory();
353*f1fbf3c2SXin Li         f5.setSuperclass(Cache1.class);
354*f1fbf3c2SXin Li         f5.setInterfaces(new Class[] { Cache2.class });
355*f1fbf3c2SXin Li         assertEquals(c4, f5.createClass());
356*f1fbf3c2SXin Li         ProxyFactory f6 = new ProxyFactory();
357*f1fbf3c2SXin Li         f6.setInterfaces(new Class[] { Cache2.class });
358*f1fbf3c2SXin Li         assertFalse(c4 == f6.createClass());
359*f1fbf3c2SXin Li         ProxyFactory.useCache = prev;
360*f1fbf3c2SXin Li     }
361*f1fbf3c2SXin Li 
362*f1fbf3c2SXin Li     public static class Cache1 {
foo()363*f1fbf3c2SXin Li         public int foo() { return 0; }
364*f1fbf3c2SXin Li     }
365*f1fbf3c2SXin Li 
366*f1fbf3c2SXin Li     public static interface Cache2 {
bar()367*f1fbf3c2SXin Li         public int bar();
368*f1fbf3c2SXin Li     }
369*f1fbf3c2SXin Li 
testReadWrite()370*f1fbf3c2SXin Li     public void testReadWrite() throws Exception {
371*f1fbf3c2SXin Li         final String fileName = "read-write.bin";
372*f1fbf3c2SXin Li         ProxyFactory.ClassLoaderProvider cp = ProxyFactory.classLoaderProvider;
373*f1fbf3c2SXin Li         try {
374*f1fbf3c2SXin Li             ProxyFactory.classLoaderProvider = new ProxyFactory.ClassLoaderProvider() {
375*f1fbf3c2SXin Li                 public ClassLoader get(ProxyFactory pf) {
376*f1fbf3c2SXin Li                     /* If javassist.Loader is returned, the super type of ReadWriteData class,
377*f1fbf3c2SXin Li                      * which is Serializable, is loaded by javassist.Loader as well as ReadWriteData.
378*f1fbf3c2SXin Li                      * This breaks the implementation of the object serializer.
379*f1fbf3c2SXin Li                      */
380*f1fbf3c2SXin Li                     // return new javassist.Loader();
381*f1fbf3c2SXin Li                     return Thread.currentThread().getContextClassLoader();
382*f1fbf3c2SXin Li                 }
383*f1fbf3c2SXin Li             };
384*f1fbf3c2SXin Li             ProxyFactory pf = new ProxyFactory();
385*f1fbf3c2SXin Li             pf.setSuperclass(ReadWriteData.class);
386*f1fbf3c2SXin Li             Object data = pf.createClass().getConstructor().newInstance();
387*f1fbf3c2SXin Li             //Object data = new ReadWriteData();
388*f1fbf3c2SXin Li             ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName));
389*f1fbf3c2SXin Li             oos.writeObject(data);
390*f1fbf3c2SXin Li             oos.close();
391*f1fbf3c2SXin Li         }
392*f1fbf3c2SXin Li         finally {
393*f1fbf3c2SXin Li             ProxyFactory.classLoaderProvider = cp;
394*f1fbf3c2SXin Li         }
395*f1fbf3c2SXin Li 
396*f1fbf3c2SXin Li         ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName));
397*f1fbf3c2SXin Li         Object data2 = ois.readObject();
398*f1fbf3c2SXin Li         ois.close();
399*f1fbf3c2SXin Li         int i = ((ReadWriteData)data2).foo();
400*f1fbf3c2SXin Li         assertEquals(4, i);
401*f1fbf3c2SXin Li     }
402*f1fbf3c2SXin Li 
403*f1fbf3c2SXin Li     public static class ReadWriteData implements Serializable {
404*f1fbf3c2SXin Li         /** default serialVersionUID */
405*f1fbf3c2SXin Li         private static final long serialVersionUID = 1L;
406*f1fbf3c2SXin Li 
foo()407*f1fbf3c2SXin Li         public int foo() { return 4; }
408*f1fbf3c2SXin Li     }
409*f1fbf3c2SXin Li 
testWriteReplace()410*f1fbf3c2SXin Li     public void testWriteReplace() throws Exception {
411*f1fbf3c2SXin Li         ProxyFactory pf = new ProxyFactory();
412*f1fbf3c2SXin Li         pf.setSuperclass(WriteReplace.class);
413*f1fbf3c2SXin Li         Object data = pf.createClass().getConstructor().newInstance();
414*f1fbf3c2SXin Li         assertEquals(data, ((WriteReplace)data).writeReplace());
415*f1fbf3c2SXin Li 
416*f1fbf3c2SXin Li         ProxyFactory pf2 = new ProxyFactory();
417*f1fbf3c2SXin Li         pf2.setSuperclass(WriteReplace2.class);
418*f1fbf3c2SXin Li         Object data2 = pf2.createClass().getConstructor().newInstance();
419*f1fbf3c2SXin Li         Method meth = data2.getClass().getDeclaredMethod("writeReplace", new Class[0]);
420*f1fbf3c2SXin Li         assertEquals("javassist.util.proxy.SerializedProxy",
421*f1fbf3c2SXin Li                     meth.invoke(data2, new Object[0]).getClass().getName());
422*f1fbf3c2SXin Li     }
423*f1fbf3c2SXin Li 
424*f1fbf3c2SXin Li     public static class WriteReplace implements Serializable {
425*f1fbf3c2SXin Li         /** default serialVersionUID */
426*f1fbf3c2SXin Li         private static final long serialVersionUID = 1L;
427*f1fbf3c2SXin Li 
writeReplace()428*f1fbf3c2SXin Li         public Object writeReplace() { return this; }
429*f1fbf3c2SXin Li     }
430*f1fbf3c2SXin Li 
431*f1fbf3c2SXin Li     public static class WriteReplace2 implements Serializable {
432*f1fbf3c2SXin Li         /** default serialVersionUID */
433*f1fbf3c2SXin Li         private static final long serialVersionUID = 1L;
434*f1fbf3c2SXin Li 
writeReplace(int i)435*f1fbf3c2SXin Li         public Object writeReplace(int i) { return Integer.valueOf(i); }
436*f1fbf3c2SXin Li     }
437*f1fbf3c2SXin Li 
testJIRA189()438*f1fbf3c2SXin Li     public static void testJIRA189() throws Exception {
439*f1fbf3c2SXin Li         Class persistentClass = Target189.PublishedArticle.class;
440*f1fbf3c2SXin Li         ProxyFactory factory = new ProxyFactory();
441*f1fbf3c2SXin Li         //factory.writeDirectory = ".";
442*f1fbf3c2SXin Li         factory.setUseCache(false);
443*f1fbf3c2SXin Li         factory.setSuperclass(persistentClass);
444*f1fbf3c2SXin Li         factory.setInterfaces(new Class[] { Target189.TestProxy.class });
445*f1fbf3c2SXin Li         Class cl = factory.createClass();
446*f1fbf3c2SXin Li         Object obj = cl.getConstructor().newInstance();
447*f1fbf3c2SXin Li         System.out.println("JIRA189:" + obj.getClass().getClassLoader() + ", " + obj.getClass().getSuperclass().getName()
448*f1fbf3c2SXin Li                             + ", " + Target189.PublishedArticle.class.getClassLoader());
449*f1fbf3c2SXin Li         Target189.TestProxy proxy = (Target189.TestProxy)cl.getConstructor().newInstance();
450*f1fbf3c2SXin Li         Target189.TestMethodHandler methodHandler = new Target189.TestMethodHandler();
451*f1fbf3c2SXin Li         ((ProxyObject)proxy).setHandler(methodHandler);
452*f1fbf3c2SXin Li         ((Target189.Article)proxy).getIssue();
453*f1fbf3c2SXin Li         assertTrue(methodHandler.wasInvokedOnce());
454*f1fbf3c2SXin Li         methodHandler.reset();
455*f1fbf3c2SXin Li         Target189.PublishedArticle article = (Target189.PublishedArticle)proxy;
456*f1fbf3c2SXin Li         article.getIssue();
457*f1fbf3c2SXin Li         assertTrue(methodHandler.wasInvokedOnce());
458*f1fbf3c2SXin Li     }
459*f1fbf3c2SXin Li 
testJIRA127()460*f1fbf3c2SXin Li     public void testJIRA127() throws Exception {
461*f1fbf3c2SXin Li         ProxyFactory proxyFactory = new ProxyFactory();
462*f1fbf3c2SXin Li         // proxyFactory.writeDirectory = ".";
463*f1fbf3c2SXin Li         proxyFactory.setInterfaces(new Class[]{ Target127.Sub.class });
464*f1fbf3c2SXin Li         Target127.Sub proxy = (Target127.Sub)proxyFactory.create(new Class[0], new Object[0], new MethodHandler() {
465*f1fbf3c2SXin Li             public Object invoke(Object self, Method thisMethod, Method proceed, Object[] args) throws Throwable {
466*f1fbf3c2SXin Li                 return null;
467*f1fbf3c2SXin Li             }
468*f1fbf3c2SXin Li         });
469*f1fbf3c2SXin Li         ((Target127.Super)proxy).item();    // proxyFactory must generate a bridge method.
470*f1fbf3c2SXin Li         ((Target127.Sub)proxy).item();
471*f1fbf3c2SXin Li     }
472*f1fbf3c2SXin Li 
main(String[] args)473*f1fbf3c2SXin Li     public static void main(String[] args) {
474*f1fbf3c2SXin Li         // javassist.bytecode.ClassFile.MAJOR_VERSION = javassist.bytecode.ClassFile.JAVA_6;
475*f1fbf3c2SXin Li         junit.textui.TestRunner.run(ProxyTester.class);
476*f1fbf3c2SXin Li     }
477*f1fbf3c2SXin Li }
478