1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @author Alexey V. Varlamov
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @version $Revision$
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project*/
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.apache.harmony.testframework.serialization;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
259aab36ec35b4591cb9ba9ae0e4586cb642c39587Narayan Kamathimport junit.framework.TestCase;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ByteArrayInputStream;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ByteArrayOutputStream;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.File;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.FileOutputStream;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectInputStream;
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectOutputStream;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.OutputStream;
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.Serializable;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.lang.reflect.Method;
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Permission;
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.PermissionCollection;
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Collection;
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Collections;
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.HashSet;
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Framework for serialization testing. Subclasses only need to override
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * getData() method and, optionally, assertDeserialized() method. The first one
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * returns array of objects to be de/serialized in tests, and the second
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * compares reference and deserialized objects (needed only if tested objects do
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not provide specific method equals()). <br>
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * There are two modes of test run: <b>reference generation mode </b> and
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <b>testing mode </b>. The actual mode is selected via
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <b>&quot;test.mode&quot; </b> system property. The <b>testing mode </b> is
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the default mode. <br>
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * To turn on the <b>reference generation mode </b>, the test.mode property
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * should be set to value &quot;serial.reference&quot;. In this mode, no testing
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is performed but golden files are produced, which contain reference
56f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * serialized objects. This mode should be run on a pure
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Implementation classes, which are targeted for compartibility. <br>
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The location of golden files (in both modes) is controlled via
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <b>&quot;RESOURCE_DIR&quot; </b> system property.
60f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class SerializationTest extends TestCase {
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Key to a system property defining root location of golden files.
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final String GOLDEN_PATH = "RESOURCE_DIR";
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final String outputPath = System.getProperty(GOLDEN_PATH,
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            "src/test/resources/serialization");
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This is the main working method of this framework. Subclasses must
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * override it to provide actual objects for testing.
75f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return array of objects to be de/serialized in tests.
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract Object[] getData();
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Tests that data objects can be serialized and deserialized without
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * exceptions, and that deserialization really produces deeply cloned
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * objects.
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testSelf() throws Throwable {
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this instanceof SerializableAssert) {
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            verifySelf(getData(), (SerializableAssert) this);
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            verifySelf(getData());
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Tests that data objects can be deserialized from golden files, to verify
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * compatibility with Reference Implementation.
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
99f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testGolden() throws Throwable {
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        verifyGolden(this, getData());
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns golden file for an object being tested.
106f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param index array index of tested data (as returned by
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *        {@link #getData() getData()})
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return corresponding golden file
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected File getDataFile(int index) {
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String name = this.getClass().getName();
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int dot = name.lastIndexOf(".");
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String path = name.substring(0, dot).replace('.', File.separatorChar);
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (outputPath != null && outputPath.length() != 0) {
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            path = outputPath + File.separator + path;
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new File(path, name.substring(dot + 1) + "." + index + ".dat");
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Working method for files generation mode. Serializes test objects
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * returned by {@link #getData() getData()}to golden files, each object to
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * a separate file.
126f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void produceGoldenFiles() throws IOException {
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String goldenPath = outputPath + File.separatorChar
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                + getClass().getName().replace('.', File.separatorChar)
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                + ".golden.";
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Object[] data = getData();
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < data.length; i++) {
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            File goldenFile = new File(goldenPath + i + ".ser");
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            goldenFile.getParentFile().mkdirs();
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            goldenFile.createNewFile();
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            putObjectToStream(data[i], new FileOutputStream(goldenFile));
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Serializes specified object to an output stream.
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void putObjectToStream(Object obj, OutputStream os)
15046c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom            throws IOException {
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ObjectOutputStream oos = new ObjectOutputStream(os);
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        oos.writeObject(obj);
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        oos.flush();
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        oos.close();
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Deserializes single object from an input stream.
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
16046c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom    public static Serializable getObjectFromStream(InputStream is)
16146c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom            throws IOException, ClassNotFoundException {
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ObjectInputStream ois = new ObjectInputStream(is);
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Object result = ois.readObject();
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ois.close();
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (Serializable)result;
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
167f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Interface to compare (de)serialized objects
170f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Should be implemented if a class under test does not provide specific
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * equals() method and it's instances should to be compared manually.
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public interface SerializableAssert {
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Compares deserialized and reference objects.
178f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         *
17946c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom         * @param initial - initial object used for creating serialized form
18046c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom         * @param deserialized - deserialized object
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        void assertDeserialized(Serializable initial, Serializable deserialized);
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // default comparator for a class that has equals(Object) method
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final static SerializableAssert DEFAULT_COMPARATOR = new SerializableAssert() {
18746c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom        public void assertDeserialized(Serializable initial, Serializable deserialized) {
18846c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom            assertEquals(initial, deserialized);
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    };
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Comparator for verifying that deserialized object is the same as initial.
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static SerializableAssert SAME_COMPARATOR = new SerializableAssert() {
19646c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom        public void assertDeserialized(Serializable initial, Serializable deserialized) {
19746c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom            assertSame(initial, deserialized);
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    };
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
20246c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * Comparator for Throwable objects
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static SerializableAssert THROWABLE_COMPARATOR = new SerializableAssert() {
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void assertDeserialized(Serializable initial, Serializable deserialized) {
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Throwable initThr = (Throwable) initial;
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Throwable dserThr = (Throwable) deserialized;
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // verify class
21046c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom            assertEquals(initThr.getClass(), dserThr.getClass());
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // verify message
21346c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom            assertEquals(initThr.getMessage(), dserThr.getMessage());
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // verify cause
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (initThr.getCause() == null) {
21746c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom                assertNull(dserThr.getCause());
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
21946c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom                assertNotNull(dserThr.getCause());
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                THROWABLE_COMPARATOR.assertDeserialized(initThr.getCause(),
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        dserThr.getCause());
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    };
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
22746c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * Comparator for PermissionCollection objects
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static SerializableAssert PERMISSION_COLLECTION_COMPARATOR = new SerializableAssert() {
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void assertDeserialized(Serializable initial, Serializable deserialized) {
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            PermissionCollection initPC = (PermissionCollection) initial;
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            PermissionCollection dserPC = (PermissionCollection) deserialized;
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // verify class
23646c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom            assertEquals(initPC.getClass(), dserPC.getClass());
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // verify 'readOnly' field
23946c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom            assertEquals(initPC.isReadOnly(), dserPC.isReadOnly());
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // verify collection of permissions
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Collection<Permission> refCollection = new HashSet<Permission>(
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    Collections.list(initPC.elements()));
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Collection<Permission> tstCollection = new HashSet<Permission>(
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    Collections.list(dserPC.elements()));
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
24746c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom            assertEquals(refCollection, tstCollection);
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    };
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns <code>comparator</code> for provided serializable
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <code>object</code>.
254f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
25546c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * The <code>comparator</code> is searched in the following order: <br>
25646c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * - if <code>test</code> implements SerializableAssert interface then it is
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * selected as </code>comparator</code>.<br>- if passed <code>object</code>
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * has class in its classes hierarchy that overrides <code>equals(Object)</code>
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method then <code>DEFAULT_COMPARATOR</code> is selected.<br> - the
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method tries to select one of known comparators basing on <code>object's</code>
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * class,for example, if passed <code>object</code> is instance of
26246c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * Throwable then <code>THROWABLE_COMPARATOR</code> is used.<br>
26346c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * - otherwise RuntimeException is thrown
264f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
26546c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * @param test - test case
26646c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * @param object - object to be compared
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return object's comparator
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
26946c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom    public static SerializableAssert defineComparator(TestCase test, Object object)
27046c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom            throws Exception {
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (test instanceof SerializableAssert) {
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return (SerializableAssert) test;
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
27646c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom        Method m = object.getClass().getMethod("equals", new Class[] { Object.class });
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (m.getDeclaringClass() != Object.class) {
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // one of classes overrides Object.equals(Object) method
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // use default comparator
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return DEFAULT_COMPARATOR;
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // TODO use generics to detect comparator
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // instead of 'instanceof' for the first element
28546c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom        if (object instanceof Throwable) {
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return THROWABLE_COMPARATOR;
287d7a21ec11a89594497f35f731b42d98af72e1235Brian Carlstrom        }
28846c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom        if (object instanceof PermissionCollection) {
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return PERMISSION_COLLECTION_COMPARATOR;
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new RuntimeException("Failed to detect comparator");
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
293f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Verifies that object deserialized from golden file correctly.
296f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The method invokes <br>
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * verifyGolden(test, object, defineComparator(test, object));
299f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
30046c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * @param test - test case
30146c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * @param object - to be compared
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
30391922d920e0020bde20ef5ae21b66cab847dd58bBrian Carlstrom    public static void verifyGolden(TestCase test, Object object) throws Exception {
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        verifyGolden(test, object, defineComparator(test, object));
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Verifies that object deserialized from golden file correctly.
309f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The method loads "<code>testName</code>.golden.ser" resource file
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * from "<module root>/src/test/resources/serialization/<code>testPackage</code>"
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * folder, reads an object from the loaded file and compares it with
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <code>object</code> using specified <code>comparator</code>.
314f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
31546c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * @param test - test case
31646c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * @param object - to be compared
31746c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * @param comparator - for comparing (de)serialized objects
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
31946c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom    public static void verifyGolden(TestCase test, Object object, SerializableAssert comparator)
32046c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom            throws Exception {
32146c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom        assertNotNull("Null comparator", comparator);
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Serializable deserialized = getObject(test, ".golden.ser");
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        comparator.assertDeserialized((Serializable) object, deserialized);
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Verifies that objects from array deserialized from golden files
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * correctly.
329f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The method invokes <br>
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * verifyGolden(test, objects, defineComparator(test, object[0]));
332f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
33346c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * @param test - test case
33446c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * @param objects - array of objects to be compared
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
33691922d920e0020bde20ef5ae21b66cab847dd58bBrian Carlstrom    public static void verifyGolden(TestCase test, Object[] objects) throws Exception {
33746c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom        assertFalse("Empty array", objects.length == 0);
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        verifyGolden(test, objects, defineComparator(test, objects[0]));
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Verifies that objects from array deserialized from golden files
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * correctly.
344f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The method loads "<code>testName</code>.golden.<code>N</code>.ser"
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * resource files from "<module root>/src/test/resources/serialization/<code>testPackage</code>"
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * folder, from each loaded file it reads an object from and compares it
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * with corresponding object in provided array (i.e. <code>objects[N]</code>)
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * using specified <code>comparator</code>. (<code>N</code> is index
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * in object's array.)
351f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
35246c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * @param test - test case
35346c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * @param objects - array of objects to be compared
35446c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * @param comparator - for comparing (de)serialized objects
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
35646c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom    public static void verifyGolden(TestCase test, Object[] objects, SerializableAssert comparator)
35746c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom            throws Exception {
35846c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom        assertFalse("Empty array", objects.length == 0);
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < objects.length; i++) {
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Serializable deserialized = getObject(test, ".golden." + i + ".ser");
36146c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom            comparator.assertDeserialized((Serializable) objects[i], deserialized);
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
364f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Verifies that object can be smoothly serialized/deserialized.
367f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The method invokes <br>
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * verifySelf(object, defineComparator(null, object));
370f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
37146c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * @param object - to be serialized/deserialized
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
37391922d920e0020bde20ef5ae21b66cab847dd58bBrian Carlstrom    public static void verifySelf(Object object) throws Exception {
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        verifySelf(object, defineComparator(null, object));
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
376f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Verifies that object can be smoothly serialized/deserialized.
379f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The method serialize/deserialize <code>object</code> and compare it
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * with initial <code>object</code>.
382f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
38346c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * @param object - object to be serialized/deserialized
38446c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * @param comparator - for comparing serialized/deserialized object with initial object
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
38691922d920e0020bde20ef5ae21b66cab847dd58bBrian Carlstrom    public static void verifySelf(Object object, SerializableAssert comparator) throws Exception {
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Serializable initial = (Serializable) object;
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        comparator.assertDeserialized(initial, copySerializable(initial));
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Verifies that that objects from array can be smoothly
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * serialized/deserialized.
394f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The method invokes <br>
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * verifySelf(objects, defineComparator(null, object[0]));
397f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
39846c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * @param objects - array of objects to be serialized/deserialized
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
40046c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom    public static void verifySelf(Object[] objects) throws Exception {
40146c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom        assertFalse("Empty array", objects.length == 0);
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        verifySelf(objects, defineComparator(null, objects[0]));
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
404f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Verifies that that objects from array can be smoothly
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * serialized/deserialized.
408f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The method serialize/deserialize each object in <code>objects</code>
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * array and compare it with initial object.
411f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
41246c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * @param objects - array of objects to be serialized/deserialized
41346c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * @param comparator - for comparing serialized/deserialized object with initial object
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void verifySelf(Object[] objects, SerializableAssert comparator)
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws Exception {
41746c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom        assertFalse("Empty array", objects.length == 0);
41846c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom        for (Object entry: objects){
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            verifySelf(entry, comparator);
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
42391922d920e0020bde20ef5ae21b66cab847dd58bBrian Carlstrom    private static Serializable getObject(TestCase test, String toAppend) throws Exception {
424ab28398a565e5ce8a56cdfd50ac6226e5317cf66The Android Open Source Project        StringBuilder path = new StringBuilder("/serialization");
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        path.append(File.separatorChar);
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        path.append(test.getClass().getName().replace('.', File.separatorChar));
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        path.append(toAppend);
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
4299aab36ec35b4591cb9ba9ae0e4586cb642c39587Narayan Kamath        String pathString = path.toString();
4309aab36ec35b4591cb9ba9ae0e4586cb642c39587Narayan Kamath
4319aab36ec35b4591cb9ba9ae0e4586cb642c39587Narayan Kamath        InputStream in = SerializationTest.class.getResourceAsStream(pathString);
43246c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom        assertNotNull("Failed to load serialization resource file: " + path, in);
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getObjectFromStream(in);
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
435f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates golden file.
438f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The folder for created file is: <code>root + test's package name</code>.
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The file name is: <code>test's name + "golden.ser"</code>
441f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
44246c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * @param root - root directory for serialization resource files
44346c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * @param test - test case
44446c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * @param object - to be serialized
44546c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * @throws IOException - if I/O error
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
44746c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom    public static void createGoldenFile(String root, TestCase test, Object object)
44846c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom            throws IOException {
44946c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom        String goldenPath = (test.getClass().getName().replace('.', File.separatorChar)
45046c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom                             + ".golden.ser");
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (root != null) {
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            goldenPath = root + File.separatorChar + goldenPath;
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        File goldenFile = new File(goldenPath);
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        goldenFile.getParentFile().mkdirs();
45746c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom        assertTrue("Could not create " + goldenFile.getParentFile(),
45846c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom                   goldenFile.getParentFile().isDirectory());
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        goldenFile.createNewFile();
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        putObjectToStream(object, new FileOutputStream(goldenFile));
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // don't forget to remove it from test case after using
46346c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom        fail("Generating golden file. Golden file name: " + goldenFile.getAbsolutePath());
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
465f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Copies an object by serializing/deserializing it.
468f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
46946c6fad9fad8f3dbbc82516232a225f37d332ca7Brian Carlstrom     * @param initial - an object to be copied
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return copy of provided object
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Serializable copySerializable(Serializable initial)
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IOException, ClassNotFoundException {
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteArrayOutputStream out = new ByteArrayOutputStream();
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        putObjectToStream(initial, out);
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getObjectFromStream(in);
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
480