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