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>"test.mode" </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 "serial.reference". 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>"RESOURCE_DIR" </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