1e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes/*
2e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *  Licensed to the Apache Software Foundation (ASF) under one or more
3e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *  contributor license agreements.  See the NOTICE file distributed with
4e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *  this work for additional information regarding copyright ownership.
5e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *  The ASF licenses this file to You under the Apache License, Version 2.0
6e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *  (the "License"); you may not use this file except in compliance with
7e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *  the License.  You may obtain a copy of the License at
8e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *
9e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
10e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *
11e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *  Unless required by applicable law or agreed to in writing, software
12e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *  distributed under the License is distributed on an "AS IS" BASIS,
13e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *  See the License for the specific language governing permissions and
15e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *  limitations under the License.
16e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes */
17e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
18e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes/**
19e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes* @author Alexey V. Varlamov
20e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes*/
21e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
22e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughespackage org.apache.harmony.testframework.serialization;
23e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
24e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.io.ByteArrayInputStream;
25e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.io.ByteArrayOutputStream;
26e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.io.File;
27e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.io.FileOutputStream;
28e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.io.IOException;
29e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.io.InputStream;
30e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.io.ObjectInputStream;
31e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.io.ObjectOutputStream;
32e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.io.OutputStream;
33e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.io.Serializable;
34e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.lang.reflect.Method;
35e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.security.Permission;
36e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.security.PermissionCollection;
37e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.security.UnresolvedPermission;
38e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.util.ArrayList;
39e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.util.Collection;
40e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.util.Collections;
41e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.util.HashSet;
42e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
43e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport junit.framework.Assert;
44e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport junit.framework.TestCase;
45e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
46e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes/**
47e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * Framework for serialization testing. Subclasses only need to override
48e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * getData() method and, optionally, assertDeserialized() method. The first one
49e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * returns array of objects to be de/serialized in tests, and the second
50e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * compares reference and deserialized objects (needed only if tested objects do
51e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * not provide specific method equals()). <br>
52e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * There are two modes of test run: <b>reference generation mode </b> and
53e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * <b>testing mode </b>. The actual mode is selected via
54e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * <b>&quot;test.mode&quot; </b> system property. The <b>testing mode </b> is
55e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * the default mode. <br>
56e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * To turn on the <b>reference generation mode </b>, the test.mode property
57e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * should be set to value &quot;serial.reference&quot;. In this mode, no testing
58e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * is performed but golden files are produced, which contain reference
59e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * serialized objects. This mode should be run on a pure
60e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * Implementation classes, which are targeted for compartibility. <br>
61e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * The location of golden files (in both modes) is controlled via
62e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * <b>&quot;RESOURCE_DIR&quot; </b> system property.
63e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *
64e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes */
65e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughespublic abstract class SerializationTest extends TestCase {
66e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
67e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
68e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Property name for the testing mode.
69e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
70e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public static final String MODE_KEY = "test.mode";
71e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
72e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
73e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
74e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Testing mode.
75e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
76e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public static String mode = System.getProperty(MODE_KEY);
77e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
78e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
79e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Reference files generation mode switch.
80e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
81e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public static final String SERIAL_REFERENCE_MODE = "serial.reference";
82e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
83e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
84e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Key to a system property defining root location of golden files.
85e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
86e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public static final String GOLDEN_PATH = "RESOURCE_DIR";
87e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
88e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    private static final String outputPath = System.getProperty(GOLDEN_PATH,
89e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            "src/test/resources/serialization");
90e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
91e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
92e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Parameterized c-tor inherited from superclass.
93e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
94e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public SerializationTest(String name) {
95e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        super(name);
96e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
97e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
98e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
99e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Default c-tor inherited from superclass.
100e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
101e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public SerializationTest() {
102e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        super();
103e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
104e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
105e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
106e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Depending on testing mode, produces golden files or performs testing.
107e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
108e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    @Override
109e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public void runBare() throws Throwable {
110e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
111e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        if (mode != null && mode.equals(SERIAL_REFERENCE_MODE)) {
112e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            produceGoldenFiles();
113e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        } else {
114e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            super.runBare();
115e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
116e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
117e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
118e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
119e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * This is the main working method of this framework. Subclasses must
120e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * override it to provide actual objects for testing.
121e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
122e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @return array of objects to be de/serialized in tests.
123e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
124e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    protected abstract Object[] getData();
125e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
126e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
127e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Tests that data objects can be serialized and deserialized without
128e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * exceptions, and that deserialization really produces deeply cloned
129e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * objects.
130e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
131e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public void testSelf() throws Throwable {
132e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
133e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        if (this instanceof SerializableAssert) {
134e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            verifySelf(getData(), (SerializableAssert) this);
135e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        } else {
136e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            verifySelf(getData());
137e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
138e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
139e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
140e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
141e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
142e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Tests that data objects can be deserialized from golden files, to verify
143e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * compartibility with Reference Implementation.
144e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
145e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public void testGolden() throws Throwable {
146e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
147e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        verifyGolden(this, getData());
148e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
149e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
150e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
151e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Returns golden file for an object being tested.
152e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
153e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @param index array index of tested data (as returned by
154e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *        {@link #getData() getData()})
155e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @return corresponding golden file
156e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
157e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    protected File getDataFile(int index) {
158e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        String name = this.getClass().getName();
159e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        int dot = name.lastIndexOf('.');
160e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        String path = name.substring(0, dot).replace('.', File.separatorChar);
161e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        if (outputPath != null && outputPath.length() != 0) {
162e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            path = outputPath + File.separator + path;
163e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
164e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
165e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        return new File(path, name.substring(dot + 1) + "." + index + ".dat");
166e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
167e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
168e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
169e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Working method for files generation mode. Serializes test objects
170e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * returned by {@link #getData() getData()}to golden files, each object to
171e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * a separate file.
172e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
173e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @throws IOException
174e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
175e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    protected void produceGoldenFiles() throws IOException {
176e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
177e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        String goldenPath = outputPath + File.separatorChar
178e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                + getClass().getName().replace('.', File.separatorChar)
179e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                + ".golden.";
180e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
181e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        Object[] data = getData();
182e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        for (int i = 0; i < data.length; i++) {
183e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
184e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            File goldenFile = new File(goldenPath + i + ".ser");
185e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            goldenFile.getParentFile().mkdirs();
186e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            goldenFile.createNewFile();
187e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
188e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            putObjectToStream(data[i], new FileOutputStream(goldenFile));
189e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
190e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
191e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
192e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
193e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Serializes specified object to an output stream.
194e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
195e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public static void putObjectToStream(Object obj, OutputStream os)
196e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        throws IOException {
197e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        ObjectOutputStream oos = new ObjectOutputStream(os);
198e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        oos.writeObject(obj);
199e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        oos.flush();
200e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        oos.close();
201e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
202e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
203e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
204e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Deserializes single object from an input stream.
205e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
206e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public static Serializable getObjectFromStream(InputStream is) throws IOException,
207e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        ClassNotFoundException {
208e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        ObjectInputStream ois = new ObjectInputStream(is);
209e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        Object result = ois.readObject();
210e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        ois.close();
211e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        return (Serializable)result;
212e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
213e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
214e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
215e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Interface to compare (de)serialized objects
216e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
217e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Should be implemented if a class under test does not provide specific
218e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * equals() method and it's instances should to be compared manually.
219e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
220e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public interface SerializableAssert {
221e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
222e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        /**
223e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes         * Compares deserialized and reference objects.
224e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes         *
225e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes         * @param initial -
226e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes         *            initial object used for creating serialized form
227e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes         * @param deserialized -
228e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes         *            deserialized object
229e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes         */
230e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        void assertDeserialized(Serializable initial, Serializable deserialized);
231e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
232e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
233e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    // default comparator for a class that has equals(Object) method
234e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    private final static SerializableAssert DEFAULT_COMPARATOR = new SerializableAssert() {
235e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        public void assertDeserialized(Serializable initial,
236e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                Serializable deserialized) {
237e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
238e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            Assert.assertEquals(initial, deserialized);
239e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
240e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    };
241e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
242e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
243e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Comparator for verifying that deserialized object is the same as initial.
244e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
245e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public final static SerializableAssert SAME_COMPARATOR = new SerializableAssert() {
246e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        public void assertDeserialized(Serializable initial,
247e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                Serializable deserialized) {
248e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
249e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            Assert.assertSame(initial, deserialized);
250e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
251e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    };
252e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
253e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
254e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Comparator for java.lang.Throwable objects
255e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
256e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public final static SerializableAssert THROWABLE_COMPARATOR = new SerializableAssert() {
257e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        public void assertDeserialized(Serializable initial, Serializable deserialized) {
258e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
259e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            Throwable initThr = (Throwable) initial;
260e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            Throwable dserThr = (Throwable) deserialized;
261e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
262e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            // verify class
263e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            Assert.assertEquals(initThr.getClass(), dserThr.getClass());
264e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
265e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            // verify message
266e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            Assert.assertEquals(initThr.getMessage(), dserThr.getMessage());
267e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
268e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            // verify cause
269e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            if (initThr.getCause() == null) {
270e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                Assert.assertNull(dserThr.getCause());
271e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            } else {
272e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                Assert.assertNotNull(dserThr.getCause());
273e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
274e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                THROWABLE_COMPARATOR.assertDeserialized(initThr.getCause(),
275e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                        dserThr.getCause());
276e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            }
277e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
278e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    };
279e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
280e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
281e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Comparator for java.security.PermissionCollection objects
282e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
283e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public final static SerializableAssert PERMISSION_COLLECTION_COMPARATOR = new SerializableAssert() {
284e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        public void assertDeserialized(Serializable initial, Serializable deserialized) {
285e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
286e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            PermissionCollection initPC = (PermissionCollection) initial;
287e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            PermissionCollection dserPC = (PermissionCollection) deserialized;
288e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
289e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            // verify class
290e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            Assert.assertEquals(initPC.getClass(), dserPC.getClass());
291e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
292e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            // verify 'readOnly' field
293e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            Assert.assertEquals(initPC.isReadOnly(), dserPC.isReadOnly());
294e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
295e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            // verify collection of permissions
296e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            Collection<Permission> refCollection = new HashSet<Permission>(
297e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                    Collections.list(initPC.elements()));
298e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            Collection<Permission> tstCollection = new HashSet<Permission>(
299e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                    Collections.list(dserPC.elements()));
300e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
301e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            Assert.assertEquals(refCollection.size(), tstCollection.size());
302e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            int size = refCollection.size();
303e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            if (size > 0) {
304e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes				ArrayList<Permission> refList = Collections.list(initPC
305e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes						.elements());
306e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes				ArrayList<Permission> tstList = Collections.list(dserPC
307e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes						.elements());
308e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes				if (refList.get(0) instanceof UnresolvedPermission
309e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes						&& tstList.get(0) instanceof UnresolvedPermission) {
310e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes					boolean found;
311e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes					UnresolvedPermission refPerm, tstPerm;
312e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes					for (int i = 0; i < size; i++) {
313e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes						found = false;
314e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes						refPerm = (UnresolvedPermission) refList.get(i);
315e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes						for (int j = 0; j < size; j++) {
316e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes							tstPerm = (UnresolvedPermission) tstList.get(i);
317e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes							if (equalsUnresolvedPermission(refPerm, tstPerm)) {
318e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes								found = true;
319e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes								break;
320e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes							}
321e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes						}
322e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
323e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes						Assert.assertTrue(found);
324e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes					}
325e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes				} else {
326e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes					Assert.assertEquals(refCollection, tstCollection);
327e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes				}
328e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes			}
329e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
330e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
331e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        /*
332e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes		 * check whether the given two UnresolvedPermission objects equal to
333e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes		 * each other
334e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes		 */
335e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes		private boolean equalsUnresolvedPermission(UnresolvedPermission up1,
336e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes				UnresolvedPermission up2) {
337e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes			java.security.cert.Certificate[] certs = up1.getUnresolvedCerts();
338e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes			if (certs != null && certs.length == 0) {
339e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes				if (null == up2.getUnresolvedCerts()) {
340e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes					if (up1.getName().equals(up2.getName())) {
341e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes						String up1Name = up1.getUnresolvedName();
342e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes						String up2Name = up2.getUnresolvedName();
343e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes						if (up1Name == null ? up2Name == null : up1Name
344e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes								.equals(up2Name)) {
345e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes							String up1Actions = up1.getUnresolvedActions();
346e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes							String up2Actions = up2.getUnresolvedActions();
347e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes							return up1Actions == null ? up2Actions == null
348e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes									: up1Actions.equals(up2Actions);
349e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes						}
350e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes					}
351e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes				}
352e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes				return false;
353e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes			}
354e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes			return up1.equals(up2);
355e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes		}
356e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    };
357e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
358e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
359e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes	 * Comparator for java.security.UnresolvedPermission objects
360e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes	 */
361e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes	public final static SerializableAssert UNRESOLVED_PERMISSION_COMPARATOR = new SerializableAssert() {
362e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes		public void assertDeserialized(Serializable initial,
363e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes				Serializable deserialized) {
364e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes			UnresolvedPermission initPerm = (UnresolvedPermission) initial;
365e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes			UnresolvedPermission dserPerm = (UnresolvedPermission) deserialized;
366e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes			java.security.cert.Certificate[] certs = initPerm
367e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes					.getUnresolvedCerts();
368e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes			if (certs != null && certs.length == 0) {
369e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes				Assert.assertEquals(initPerm.getUnresolvedType(), dserPerm
370e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes						.getUnresolvedType());
371e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes				Assert.assertEquals(initPerm.getUnresolvedName(), dserPerm
372e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes						.getUnresolvedName());
373e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes				Assert.assertEquals(initPerm.getUnresolvedActions(), dserPerm
374e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes						.getUnresolvedActions());
375e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes				Assert.assertNull(dserPerm.getUnresolvedCerts());
376e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes			} else {
377e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes				Assert.assertEquals(initPerm, dserPerm);
378e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes			}
379e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes		}
380e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes	};
381e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
382e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
383e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Returns <code>comparator</code> for provided serializable
384e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * <code>object</code>.
385e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
386e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * The <code>comparator</code> is searched in the following order: <br>-
387e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * if <code>test</code> implements SerializableAssert interface then it is
388e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * selected as </code>comparator</code>.<br>- if passed <code>object</code>
389e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * has class in its classes hierarchy that overrides <code>equals(Object)</code>
390e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * method then <code>DEFAULT_COMPARATOR</code> is selected.<br> - the
391e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * method tries to select one of known comparators basing on <code>object's</code>
392e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * class,for example, if passed <code>object</code> is instance of
393e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * java.lang.Throwable then <code>THROWABLE_COMPARATOR</code> is used.<br>-
394e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * otherwise RuntimeException is thrown
395e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
396e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @param test -
397e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *            test case
398e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @param object -
399e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *            object to be compared
400e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @return object's comparator
401e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
402e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public static SerializableAssert defineComparator(TestCase test,
403e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            Object object) throws Exception {
404e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
405e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        if (test instanceof SerializableAssert) {
406e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            return (SerializableAssert) test;
407e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
408e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
409e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        Method m = object.getClass().getMethod("equals",
410e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                new Class[] { Object.class });
411e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
412e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        if (m.getDeclaringClass() != Object.class) {
413e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        	if (object instanceof UnresolvedPermission) {
414e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes				// object is an instance of UnresolvedPermission, use
415e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes				// UNRESOLVED_PERMISSION_COMPARATOR
416e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes				return UNRESOLVED_PERMISSION_COMPARATOR;
417e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes			}
418e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            // one of classes overrides Object.equals(Object) method
419e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            // use default comparator
420e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            return DEFAULT_COMPARATOR;
421e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
422e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
423e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        // TODO use generics to detect comparator
424e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        // instead of 'instanceof' for the first element
425e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        if (object instanceof java.lang.Throwable) {
426e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            return THROWABLE_COMPARATOR;
427e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        } else if (object instanceof java.security.PermissionCollection) {
428e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            return PERMISSION_COLLECTION_COMPARATOR;
429e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
430e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
431e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        throw new RuntimeException("Failed to detect comparator");
432e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
433e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
434e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
435e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Verifies that object deserialized from golden file correctly.
436e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
437e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * The method invokes <br>
438e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * verifyGolden(test, object, defineComparator(test, object));
439e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
440e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @param test -
441e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *            test case
442e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @param object -
443e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *            to be compared
444e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
445e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public static void verifyGolden(TestCase test, Object object)
446e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            throws Exception {
447e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
448e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        verifyGolden(test, object, defineComparator(test, object));
449e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
450e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
451e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
452e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Verifies that object deserialized from golden file correctly.
453e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
454e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * The method loads "<code>testName</code>.golden.ser" resource file
455e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * from "<module root>/src/test/resources/serialization/<code>testPackage</code>"
456e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * folder, reads an object from the loaded file and compares it with
457e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * <code>object</code> using specified <code>comparator</code>.
458e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
459e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @param test-
460e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *            test case
461e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @param object-
462e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *            to be compared
463e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @param comparator -
464e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *            for comparing (de)serialized objects
465e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
466e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public static void verifyGolden(TestCase test, Object object,
467e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            SerializableAssert comparator) throws Exception {
468e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
469e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        Assert.assertNotNull("Null comparator", comparator);
470e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
471e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        Serializable deserialized = getObject(test, ".golden.ser");
472e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
473e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        comparator.assertDeserialized((Serializable) object, deserialized);
474e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
475e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
476e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
477e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Verifies that objects from array deserialized from golden files
478e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * correctly.
479e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
480e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * The method invokes <br>
481e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * verifyGolden(test, objects, defineComparator(test, object[0]));
482e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
483e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @param test -
484e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *            test case
485e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @param objects -
486e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *            array of objects to be compared
487e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
488e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public static void verifyGolden(TestCase test, Object[] objects)
489e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            throws Exception {
490e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
491e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        Assert.assertFalse("Empty array", objects.length == 0);
492e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        verifyGolden(test, objects, defineComparator(test, objects[0]));
493e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
494e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
495e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
496e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Verifies that objects from array deserialized from golden files
497e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * correctly.
498e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
499e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * The method loads "<code>testName</code>.golden.<code>N</code>.ser"
500e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * resource files from "<module root>/src/test/resources/serialization/<code>testPackage</code>"
501e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * folder, from each loaded file it reads an object from and compares it
502e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * with corresponding object in provided array (i.e. <code>objects[N]</code>)
503e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * using specified <code>comparator</code>. (<code>N</code> is index
504e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * in object's array.)
505e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
506e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @param test-
507e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *            test case
508e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @param objects -
509e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *            array of objects to be compared
510e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @param comparator -
511e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *            for comparing (de)serialized objects
512e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
513e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public static void verifyGolden(TestCase test, Object[] objects,
514e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            SerializableAssert comparator) throws Exception {
515e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
516e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        Assert.assertFalse("Empty array", objects.length == 0);
517e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        for (int i = 0; i < objects.length; i++) {
518e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            Serializable deserialized = getObject(test, ".golden." + i + ".ser");
519e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            comparator.assertDeserialized((Serializable) objects[i],
520e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                    deserialized);
521e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
522e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
523e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
524e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
525e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Verifies that object can be smoothly serialized/deserialized.
526e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
527e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * The method invokes <br>
528e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * verifySelf(object, defineComparator(null, object));
529e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
530e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @param object -
531e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *            to be serialized/deserialized
532e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
533e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public static void verifySelf(Object object)
534e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            throws Exception {
535e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
536e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        verifySelf(object, defineComparator(null, object));
537e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
538e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
539e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
540e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Verifies that object can be smoothly serialized/deserialized.
541e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
542e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * The method serialize/deserialize <code>object</code> and compare it
543e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * with initial <code>object</code>.
544e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
545e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @param object -
546e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *            object to be serialized/deserialized
547e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @param comparator -
548e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *            for comparing serialized/deserialized object with initial
549e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *            object
550e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
551e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public static void verifySelf(Object object, SerializableAssert comparator)
552e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            throws Exception {
553e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
554e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        Serializable initial = (Serializable) object;
555e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
556e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        comparator.assertDeserialized(initial, copySerializable(initial));
557e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
558e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
559e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
560e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Verifies that that objects from array can be smoothly
561e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * serialized/deserialized.
562e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
563e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * The method invokes <br>
564e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * verifySelf(objects, defineComparator(null, object[0]));
565e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
566e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @param objects -
567e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *            array of objects to be serialized/deserialized
568e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
569e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public static void verifySelf(Object[] objects)
570e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            throws Exception {
571e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
572e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        Assert.assertFalse("Empty array", objects.length == 0);
573e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        verifySelf(objects, defineComparator(null, objects[0]));
574e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
575e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
576e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
577e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Verifies that that objects from array can be smoothly
578e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * serialized/deserialized.
579e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
580e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * The method serialize/deserialize each object in <code>objects</code>
581e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * array and compare it with initial object.
582e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
583e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @param objects -
584e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *            array of objects to be serialized/deserialized
585e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @param comparator -
586e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *            for comparing serialized/deserialized object with initial
587e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *            object
588e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
589e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public static void verifySelf(Object[] objects, SerializableAssert comparator)
590e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            throws Exception {
591e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
592e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        Assert.assertFalse("Empty array", objects.length == 0);
593e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        for(Object entry: objects){
594e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            verifySelf(entry, comparator);
595e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
596e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
597e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
598e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    private static Serializable getObject(TestCase test, String toAppend)
599e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            throws Exception {
600e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
601e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        StringBuilder path = new StringBuilder("serialization");
602e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
603e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        path.append(File.separatorChar);
604e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        path.append(test.getClass().getName().replace('.', File.separatorChar));
605e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        path.append(toAppend);
606e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
607e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        InputStream in = ClassLoader.getSystemClassLoader()
608e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                .getResourceAsStream(path.toString());
609e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
610e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        Assert.assertNotNull("Failed to load serialization resource file: "
611e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                + path, in);
612e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
613e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        return getObjectFromStream(in);
614e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
615e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
616e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
617e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Creates golden file.
618e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
619e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * The folder for created file is: <code>root + test's package name</code>.
620e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * The file name is: <code>test's name + "golden.ser"</code>
621e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
622e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @param root -
623e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *            root directory for serialization resource files
624e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @param test -
625e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *            test case
626e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @param object -
627e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *            object to be serialized
628e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @throws IOException -
629e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *             if I/O error
630e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
631e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public static void createGoldenFile(String root, TestCase test,
632e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            Object object) throws IOException {
633e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
634e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        String goldenPath = test.getClass().getName().replace('.',
635e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                File.separatorChar)
636e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                + ".golden.ser";
637e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
638e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        if (root != null) {
639e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            goldenPath = root + File.separatorChar + goldenPath;
640e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
641e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
642e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
643e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        File goldenFile = new File(goldenPath);
644e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        goldenFile.getParentFile().mkdirs();
645e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        goldenFile.createNewFile();
646e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
647e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        putObjectToStream(object, new FileOutputStream(goldenFile));
648e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
649e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        // don't forget to remove it from test case after using
650e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        Assert.fail("Generating golden file.\nGolden file name:"
651e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                + goldenFile.getAbsolutePath());
652e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
653e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
654e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
655e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Copies an object by serializing/deserializing it.
656e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *
657e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @param initial -
658e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     *            an object to be copied
659e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * @return copy of provided object
660e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
661e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public static Serializable copySerializable(Serializable initial)
662e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            throws IOException, ClassNotFoundException {
663e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
664e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        ByteArrayOutputStream out = new ByteArrayOutputStream();
665e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        putObjectToStream(initial, out);
666e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
667e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
668e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        return getObjectFromStream(in);
669e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
670e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes}
671