File: ProxySerializationTest.java

package info (click to toggle)
mauve 20080616-1
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 26,856 kB
  • ctags: 21,952
  • sloc: java: 234,107; sh: 2,834; xml: 208; makefile: 59
file content (132 lines) | stat: -rw-r--r-- 4,390 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/* ProxySerializationTest.java -- Tests serialization of a Proxy
 Copyright (C) 2006 by Free Software Foundation, Inc. 
 Written by Olivier Jolly <olivier.jolly@pcedev.com>
 This file is part of Mauve.

 Mauve is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2, or (at your option)
 any later version.

 Mauve is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with Mauve; see the file COPYING.  If not, write to the
 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 02110-1301 USA.

 */

// Tags: JDK1.3


package gnu.testlet.java.io.ObjectInputOutput;

import gnu.testlet.TestHarness;
import gnu.testlet.Testlet;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Check that proxies are correctly serialized and doesn't cause reference
 * offset.
 * @author Olivier Jolly <olivier.jolly@pcedev.com>
 */
public class ProxySerializationTest implements Testlet
{

  public void test(TestHarness harness)
  {

    SerBaseInterface proxy = (SerBaseInterface) Proxy.newProxyInstance(
                                                                       SerBaseInterface.class.getClassLoader(),
                                                                       new Class[] { SerBaseInterface.class },
                                                                       new DummyInvocationHandler());
    SerializableLoopA serializableLoopA = new SerializableLoopA();
    SerializableLoopB serializableLoopB = new SerializableLoopB();

    // Create data which will force serialization references to be used
    serializableLoopA.setB(serializableLoopB);
    serializableLoopB.setA(serializableLoopA);

    harness.checkPoint("ProxySerializationTest");

    harness.check(proxy.getA(), -25679, "Proxy interception checking");

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream objectOutputStream = null;
    try
      {
        objectOutputStream = new ObjectOutputStream(baos);
        objectOutputStream.writeObject(proxy);
        objectOutputStream.writeObject(serializableLoopA);
        objectOutputStream.writeObject(serializableLoopB);
      }
    catch (IOException e)
      {
        harness.debug(e);
        harness.fail("Error while serialiazing a proxy");
      }

    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());

    try
      {
        ObjectInputStream objectInputStream = new ObjectInputStream(bais);
        SerBaseInterface serialized = (SerBaseInterface) objectInputStream.readObject();
        harness.check(serialized.getA(), -25679,
                      "Reserialized proxy working checking");

        // Get other object off the object stream and force them to be actually
        // used
        SerializableLoopA serializableLoopA2 = (SerializableLoopA) objectInputStream.readObject();
        SerializableLoopB serializableLoopB2 = (SerializableLoopB) objectInputStream.readObject();

        harness.check(serializableLoopA.getB(), serializableLoopA2.getB());        

      }
    catch (Exception e)
      {
        // If the reference counter got messed up, we should received a
        // ClassCastException or something similar
        harness.debug(e);
        harness.fail("Error while deserialiazing a proxy");
      }

  }

  private static class DummyInvocationHandler implements InvocationHandler,
      Serializable
  {

    private static final long serialVersionUID = -6475900781578075262L;

    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable
    {
      if ("getA".equals(method.getName()))
        {
          return new Integer(-25679);
        }
      return method.invoke(proxy, args);
    }

  }

  private interface SerBaseInterface
  {
    int getA();
  }

}