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