11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 The Guava Authors 31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); 51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License. 61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at 71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software 111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS, 121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and 141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License. 151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.testing; 181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.Beta; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible; 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.Assert; 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.AssertionFailedError; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests serialization and deserialization of an object, optionally asserting 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * that the resulting object is equal to the original. 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>GWT warning:</b> Under GWT, both methods simply returns their input, 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * as proper GWT serialization tests require more setup. This no-op behavior 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * allows test authors to intersperse {@code SerializableTester} calls with 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * other, GWT-compatible tests. 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Mike Bostock 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 10.0 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@Beta 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible // but no-op! 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic final class SerializableTester { 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private SerializableTester() {} 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Serializes and deserializes the specified object. 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>GWT warning:</b> Under GWT, this method simply returns its input, as 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * proper GWT serialization tests require more setup. This no-op behavior 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * allows test authors to intersperse {@code SerializableTester} calls with 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * other, GWT-compatible tests. 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Note that the specified object may not be known by the compiler to be a 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link java.io.Serializable} instance, and is thus declared an 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code Object}. For example, it might be declared as a {@code List}. 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return the re-serialized object 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws RuntimeException if the specified object was not successfully 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * serialized or deserialized 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <T> T reserialize(T object) { 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Platform.reserialize(object); 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Serializes and deserializes the specified object and verifies that the 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * re-serialized object is equal to the provided object, that the hashcodes 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * are identical, and that the class of the re-serialized object is identical 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * to that of the original. 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>GWT warning:</b> Under GWT, this method simply returns its input, as 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * proper GWT serialization tests require more setup. This no-op behavior 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * allows test authors to intersperse {@code SerializableTester} calls with 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * other, GWT-compatible tests. 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Note that the specified object may not be known by the compiler to be a 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link java.io.Serializable} instance, and is thus declared an 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code Object}. For example, it might be declared as a {@code List}. 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Note also that serialization is not in general required to return an 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * object that is {@linkplain Object#equals equal} to the original, nor is it 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * required to return even an object of the same class. For example, if 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * sublists of {@code MyList} instances were serializable, those sublists 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * might implement a private {@code MySubList} type but serialize as a plain 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code MyList} to save space. So long as {@code MyList} has all the public 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * supertypes of {@code MySubList}, this is safe. For these cases, for which 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code reserializeAndAssert} is too strict, use {@link #reserialize}. 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return the re-serialized object 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws RuntimeException if the specified object was not successfully 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * serialized or deserialized 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws AssertionFailedError if the re-serialized object is not equal to 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * the original object, or if the hashcodes are different. 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <T> T reserializeAndAssert(T object) { 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert T copy = reserialize(object); 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert new EqualsTester() 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .addEqualityGroup(object, copy) 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .testEquals(); 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Assert.assertEquals(object.getClass(), copy.getClass()); 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return copy; 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 103