/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import junit.framework.TestCase; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.ObjectStreamClass; import java.io.Serializable; import java.util.Arrays; /** * Basic tests to verify serialization support. * * @author Tom Ball */ public class SerializationTest extends TestCase { private static final String TEST_FILE_NAME = "serialization-test.bin"; static class Greeting implements Serializable { private String greeting; private String name; private transient int n; // A default constructor. This should not be called during deserialization. public Greeting() { n = 1; } public Greeting(String greeting, String name, int n) { this.greeting = greeting; this.name = name; this.n = n; } @Override public String toString() { return String.format("%s, %s!", greeting, name); } } static class SerializableClass implements Serializable {} static class NotSerializableClass {} @Override protected void tearDown() throws Exception { //new File(TEST_FILE_NAME).delete(); super.tearDown(); } public void testSerialization() throws IOException, ClassNotFoundException { Greeting greeting = new Greeting("hello", "world", 42); assertEquals("hello, world!", greeting.toString()); assertEquals(42, greeting.n); // Save the greeting to a file. ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(TEST_FILE_NAME)); out.writeObject(greeting); out.close(); File binFile = new File(TEST_FILE_NAME); assertTrue(binFile.exists()); // Read back the greeting. ObjectInputStream in = new ObjectInputStream(new FileInputStream(TEST_FILE_NAME)); Greeting greeting2 = (Greeting) in.readObject(); in.close(); assertEquals("hello, world!", greeting.toString()); assertEquals(0, greeting2.n); // 0 because n is transient. } public void testArraySerialization() throws Exception { String[] names = new String[] { "tom", "dick", "harry" }; assertTrue("array is not Serializable", names instanceof Serializable); assertTrue("array is not instance of Serializable", Serializable.class.isInstance(names)); assertTrue("array cannot be assigned to Serializable", Serializable.class.isAssignableFrom(names.getClass())); ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(out); oos.writeObject(names); oos.close(); ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); ObjectInputStream ois = new ObjectInputStream(in); String[] result = (String[]) ois.readObject(); ois.close(); assertTrue("arrays not equal", Arrays.equals(names, result)); } // Regression test for https://github.com/google/j2objc/issues/496. @SuppressWarnings("resource") public void testSerializingObjectClass() throws Exception { File tmpFile = File.createTempFile("filea", "object"); try { FileOutputStream fileOut = new FileOutputStream(tmpFile); new ObjectOutputStream(fileOut).writeObject(Object.class); FileInputStream fileIn = new FileInputStream(tmpFile); assertEquals(Object.class, new ObjectInputStream(fileIn).readObject()); } finally { tmpFile.delete(); } } // Regression test for https://github.com/google/j2objc/issues/496. @SuppressWarnings("resource") public void testSerializingSerializableClass() throws Exception { File tmpFile = File.createTempFile("fileb", "object"); try { FileOutputStream fileOut = new FileOutputStream(tmpFile); new ObjectOutputStream(fileOut).writeObject(SerializableClass.class); FileInputStream fileIn = new FileInputStream(tmpFile); assertEquals(SerializableClass.class, new ObjectInputStream(fileIn).readObject()); } finally { tmpFile.delete(); } } // Regression test for https://github.com/google/j2objc/issues/496. @SuppressWarnings("resource") public void testSerializingNotSerializableClass() throws Exception { File tmpFile = File.createTempFile("filec", "object"); try { FileOutputStream fileOut = new FileOutputStream(tmpFile); new ObjectOutputStream(fileOut).writeObject(NotSerializableClass.class); FileInputStream fileIn = new FileInputStream(tmpFile); assertEquals(NotSerializableClass.class, new ObjectInputStream(fileIn).readObject()); } finally { tmpFile.delete(); } } // Verify that the serialVersionUID values for arrays are the same as the JVM returns. public void testArraySerialVersionUIDs() throws Exception { ObjectStreamClass osc = ObjectStreamClass.lookupAny(new int[0].getClass()); assertEquals(5600894804908749477L, osc.getSerialVersionUID()); osc = ObjectStreamClass.lookupAny(new int[0][0].getClass()); assertEquals(1727100010502261052L, osc.getSerialVersionUID()); osc = ObjectStreamClass.lookupAny(new double[0].getClass()); assertEquals(4514449696888150558L, osc.getSerialVersionUID()); osc = ObjectStreamClass.lookupAny(new String[0].getClass()); assertEquals(-5921575005990323385L, osc.getSerialVersionUID()); osc = ObjectStreamClass.lookupAny(new Thread[0].getClass()); assertEquals(-6192713741133905679L, osc.getSerialVersionUID()); } }