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