/* * (C) Copyright Uwe Schindler (Generics Policeman) and others. * * 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 de.thetaphi.forbiddenapis; import static de.thetaphi.forbiddenapis.Checker.Option.*; import static org.junit.Assert.*; import static org.junit.Assume.assumeTrue; import static org.junit.Assume.assumeNoException; import java.util.Collections; import java.util.EnumSet; import org.junit.Before; import org.junit.Test; public final class CheckerSetupTest { protected Checker checker; @Before public void setUp() { checker = new Checker(StdIoLogger.INSTANCE, ClassLoader.getSystemClassLoader(), FAIL_ON_MISSING_CLASSES, FAIL_ON_VIOLATION, FAIL_ON_UNRESOLVABLE_SIGNATURES); assumeTrue("This test only works with a supported JDK (see docs)", checker.isSupportedJDK); assertEquals(EnumSet.of(FAIL_ON_MISSING_CLASSES, FAIL_ON_VIOLATION, FAIL_ON_UNRESOLVABLE_SIGNATURES), checker.options); } @Test public void testEmpty() { assertEquals(Collections.emptyMap(), checker.forbiddenClasses); assertEquals(Collections.emptySet(), checker.forbiddenClassPatterns); assertEquals(Collections.emptyMap(), checker.forbiddenFields); assertEquals(Collections.emptyMap(), checker.forbiddenMethods); } @Test public void testClassSignature() throws Exception { checker.parseSignaturesString("java.lang.Object @ Foobar"); assertEquals(Collections.singletonMap("java/lang/Object", "java.lang.Object [Foobar]"), checker.forbiddenClasses); assertEquals(Collections.emptySet(), checker.forbiddenClassPatterns); assertEquals(Collections.emptyMap(), checker.forbiddenFields); assertEquals(Collections.emptyMap(), checker.forbiddenMethods); } @Test public void testClassPatternSignature() throws Exception { checker.parseSignaturesString("java.lang.** @ Foobar"); assertEquals(Collections.emptyMap(), checker.forbiddenClasses); assertEquals(Collections.singleton(new ClassPatternRule("java.lang.**", "Foobar")), checker.forbiddenClassPatterns); assertEquals(Collections.emptyMap(), checker.forbiddenFields); assertEquals(Collections.emptyMap(), checker.forbiddenMethods); } @Test public void testFieldSignature() throws Exception { checker.parseSignaturesString("java.lang.String#CASE_INSENSITIVE_ORDER @ Foobar"); assertEquals(Collections.emptyMap(), checker.forbiddenClasses); assertEquals(Collections.emptySet(), checker.forbiddenClassPatterns); assertEquals(Collections.singletonMap("java/lang/String\000CASE_INSENSITIVE_ORDER", "java.lang.String#CASE_INSENSITIVE_ORDER [Foobar]"), checker.forbiddenFields); assertEquals(Collections.emptyMap(), checker.forbiddenMethods); } @Test public void testMethodSignature() throws Exception { checker.parseSignaturesString("java.lang.Object#toString() @ Foobar"); assertEquals(Collections.emptyMap(), checker.forbiddenClasses); assertEquals(Collections.emptySet(), checker.forbiddenClassPatterns); assertEquals(Collections.emptyMap(), checker.forbiddenFields); assertEquals(Collections.singletonMap("java/lang/Object\000toString()Ljava/lang/String;", "java.lang.Object#toString() [Foobar]"), checker.forbiddenMethods); } @Test public void testEmptyCtor() throws Exception { Checker chk = new Checker(StdIoLogger.INSTANCE, ClassLoader.getSystemClassLoader()); assertEquals(EnumSet.noneOf(Checker.Option.class), chk.options); } @Test public void testRuntimeClassSignatures() throws Exception { ClassSignature cs = checker.lookupRelatedClass("java/lang/String"); assertTrue(cs.isRuntimeClass); assertTrue(cs.signaturePolymorphicMethods.isEmpty()); } @Test public void testSignaturePolymorphic() throws Exception { try { ClassSignature cs = checker.lookupRelatedClass("java/lang/invoke/MethodHandle"); assertTrue(cs.signaturePolymorphicMethods.contains("invoke")); assertTrue(cs.signaturePolymorphicMethods.contains("invokeExact")); // System.out.println(cs.signaturePolymorphicMethods); } catch (WrapperRuntimeException we) { assertTrue(we.getCause() instanceof ClassNotFoundException); assumeNoException("This test only works with Java 7+", we); } } }