SerializationTest.java revision 05895faacf43e6fd2bcd57baed31832f6888cb31
11ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson/*
21ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson * Copyright (C) 2011 The Android Open Source Project
31ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson *
41ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License");
51ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson * you may not use this file except in compliance with the License.
61ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson * You may obtain a copy of the License at
71ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson *
81ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson *      http://www.apache.org/licenses/LICENSE-2.0
91ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson *
101ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson * Unless required by applicable law or agreed to in writing, software
111ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
121ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson * See the License for the specific language governing permissions and
141ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson * limitations under the License.
151ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson */
161ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson
171ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilsonpackage libcore.java.io;
181ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson
1947f29998eae296ad812d697c8da12e84e394fee2Jesse Wilsonimport java.io.IOException;
2047f29998eae296ad812d697c8da12e84e394fee2Jesse Wilsonimport java.io.InvalidClassException;
2105895faacf43e6fd2bcd57baed31832f6888cb31Elliott Hughesimport java.io.ObjectStreamClass;
2205895faacf43e6fd2bcd57baed31832f6888cb31Elliott Hughesimport java.io.ObjectStreamField;
231ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilsonimport java.io.Serializable;
241ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilsonimport junit.framework.TestCase;
25b416ef5dc224630af2b9393a15ae120b27e4864aJesse Wilsonimport libcore.util.SerializationTester;
261ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson
271ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilsonpublic final class SerializationTest extends TestCase {
281ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson
291ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson    // http://b/4471249
301ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson    public void testSerializeFieldMadeTransient() throws Exception {
3105895faacf43e6fd2bcd57baed31832f6888cb31Elliott Hughes        // Does ObjectStreamClass have the right idea?
3205895faacf43e6fd2bcd57baed31832f6888cb31Elliott Hughes        ObjectStreamClass osc = ObjectStreamClass.lookup(FieldMadeTransient.class);
3305895faacf43e6fd2bcd57baed31832f6888cb31Elliott Hughes        ObjectStreamField[] fields = osc.getFields();
3405895faacf43e6fd2bcd57baed31832f6888cb31Elliott Hughes        assertEquals(1, fields.length);
3505895faacf43e6fd2bcd57baed31832f6888cb31Elliott Hughes        assertEquals("nonTransientInt", fields[0].getName());
3605895faacf43e6fd2bcd57baed31832f6888cb31Elliott Hughes        assertEquals(int.class, fields[0].getType());
3705895faacf43e6fd2bcd57baed31832f6888cb31Elliott Hughes
388f99aa098c6a06b8be788abbca1c1d1060342709Jesse Wilson        // this was created by serializing a FieldMadeTransient with a non-0 transientInt
391ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson        String s = "aced0005737200346c6962636f72652e6a6176612e696f2e53657269616c697a6174696f6e54657"
401ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson                + "374244669656c644d6164655472616e7369656e74000000000000000002000149000c7472616e736"
411ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson                + "9656e74496e747870abababab";
42b416ef5dc224630af2b9393a15ae120b27e4864aJesse Wilson        FieldMadeTransient deserialized = (FieldMadeTransient) SerializationTester.deserializeHex(s);
431ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson        assertEquals(0, deserialized.transientInt);
441ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson    }
451ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson
461ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson    static class FieldMadeTransient implements Serializable {
471ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson        private static final long serialVersionUID = 0L;
481ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson        private transient int transientInt;
4905895faacf43e6fd2bcd57baed31832f6888cb31Elliott Hughes        private int nonTransientInt;
501ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson    }
5147f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson
5247f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson    public void testSerialVersionUidChange() throws Exception {
5347f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson        // this was created by serializing a SerialVersionUidChanged with serialVersionUID = 0L
5447f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson        String s = "aced0005737200396c6962636f72652e6a6176612e696f2e53657269616c697a6174696f6e54657"
5547f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson                + "3742453657269616c56657273696f6e5569644368616e67656400000000000000000200014900016"
5647f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson                + "1787000000003";
5747f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson        try {
5847f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson            SerializationTester.deserializeHex(s);
5947f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson            fail();
6047f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson        } catch (InvalidClassException expected) {
6147f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson        }
6247f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson    }
6347f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson
6447f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson    static class SerialVersionUidChanged implements Serializable {
6547f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson        private static final long serialVersionUID = 1L; // was 0L
6647f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson        private int a;
6747f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson    }
6847f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson
6947f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson    public void testMissingSerialVersionUid() throws Exception {
7047f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson        // this was created by serializing a FieldsChanged with one int field named 'a'
7147f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson        String s = "aced00057372002f6c6962636f72652e6a6176612e696f2e53657269616c697a6174696f6e54657"
7247f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson                + "374244669656c64734368616e6765643bcfb934e310fa1c02000149000161787000000003";
7347f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson        try {
7447f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson            SerializationTester.deserializeHex(s);
7547f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson            fail();
7647f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson        } catch (InvalidClassException expected) {
7747f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson        }
7847f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson    }
7947f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson
8047f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson    static class FieldsChanged implements Serializable {
8147f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson        private int b; // was 'a'
8247f29998eae296ad812d697c8da12e84e394fee2Jesse Wilson    }
831ffc4b2e242d1ba40ceb30b21510f0f26bd5aaa2Jesse Wilson}
84