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