/* * Copyright (C) 2017 Gson Authors * * 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. */ package com.google.gson.internal.bind; import com.google.gson.Gson; import com.google.gson.TypeAdapter; import com.google.gson.internal.$Gson$Types; import junit.framework.TestCase; /** * Test fixes for infinite recursion on {@link $Gson$Types#resolve(java.lang.reflect.Type, Class, * java.lang.reflect.Type)}, described at Issue #440 * and similar issues. *

* These tests originally caused {@link StackOverflowError} because of infinite recursion on attempts to * resolve generics on types, with an intermediate types like 'Foo2<? extends ? super ? extends ... ? extends A>' */ public class RecursiveTypesResolveTest extends TestCase { @SuppressWarnings("unused") private static class Foo1 { public Foo2 foo2; } @SuppressWarnings("unused") private static class Foo2 { public Foo1 foo1; } /** * Test simplest case of recursion. */ public void testRecursiveResolveSimple() { @SuppressWarnings("rawtypes") TypeAdapter adapter = new Gson().getAdapter(Foo1.class); assertNotNull(adapter); } /** * Tests belows check the behaviour of the methods changed for the fix. */ public void testDoubleSupertype() { assertEquals($Gson$Types.supertypeOf(Number.class), $Gson$Types.supertypeOf($Gson$Types.supertypeOf(Number.class))); } public void testDoubleSubtype() { assertEquals($Gson$Types.subtypeOf(Number.class), $Gson$Types.subtypeOf($Gson$Types.subtypeOf(Number.class))); } public void testSuperSubtype() { assertEquals($Gson$Types.subtypeOf(Object.class), $Gson$Types.supertypeOf($Gson$Types.subtypeOf(Number.class))); } public void testSubSupertype() { assertEquals($Gson$Types.subtypeOf(Object.class), $Gson$Types.subtypeOf($Gson$Types.supertypeOf(Number.class))); } /** * Tests for recursion while resolving type variables. */ @SuppressWarnings("unused") private static class TestType { TestType superType; } @SuppressWarnings("unused") private static class TestType2 { TestType2 superReversedType; } public void testRecursiveTypeVariablesResolve1() throws Exception { @SuppressWarnings("rawtypes") TypeAdapter adapter = new Gson().getAdapter(TestType.class); assertNotNull(adapter); } public void testRecursiveTypeVariablesResolve12() throws Exception { @SuppressWarnings("rawtypes") TypeAdapter adapter = new Gson().getAdapter(TestType2.class); assertNotNull(adapter); } }