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