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