test/langtools/tools/jdeps/jdkinternals/RemovedJDKInternals.java
changeset 47216 71c04702a3d5
parent 43772 4e5350b7be75
child 48477 b7af6f568d00
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/jdeps/jdkinternals/RemovedJDKInternals.java	Tue Sep 12 19:03:39 2017 +0200
@@ -0,0 +1,149 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8153042
+ * @summary Tests JDK internal APIs that have been removed.
+ * @library ../lib
+ * @build CompilerUtils JdepsRunner JdepsUtil ModuleMetaData
+ * @modules jdk.jdeps/com.sun.tools.jdeps
+ * @run testng RemovedJDKInternals
+ */
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Map;
+
+import com.sun.tools.jdeps.DepsAnalyzer;
+import com.sun.tools.jdeps.Graph;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+public class RemovedJDKInternals {
+    private static final String TEST_SRC = System.getProperty("test.src");
+
+    private static final Path CLASSES_DIR = Paths.get("classes");
+    private static final Path PATCHES_DIR = Paths.get("patches");
+
+    private static final String JDK_UNSUPPORTED = "jdk.unsupported";
+    /**
+     * Compiles classes used by the test
+     */
+    @BeforeTest
+    public void compileAll() throws Exception {
+        CompilerUtils.cleanDir(PATCHES_DIR);
+        CompilerUtils.cleanDir(CLASSES_DIR);
+
+        // compile sun.misc types
+        Path sunMiscSrc = Paths.get(TEST_SRC, "patches", JDK_UNSUPPORTED);
+        Path patchDir = PATCHES_DIR.resolve(JDK_UNSUPPORTED);
+        assertTrue(CompilerUtils.compile(sunMiscSrc, patchDir,
+                                         "--patch-module", JDK_UNSUPPORTED + "=" + sunMiscSrc.toString()));
+
+        // compile com.sun.image.codec.jpeg types
+        Path codecSrc = Paths.get(TEST_SRC, "patches", "java.desktop");
+        Path codecDest = PATCHES_DIR;
+        assertTrue(CompilerUtils.compile(codecSrc, codecDest));
+
+        // patch jdk.unsupported and set -cp to codec types
+        assertTrue(CompilerUtils.compile(Paths.get(TEST_SRC, "src", "p"),
+                                         CLASSES_DIR,
+                                         "--patch-module", "jdk.unsupported=" + patchDir,
+                                         "-cp", codecDest.toString()));
+    }
+
+    @DataProvider(name = "deps")
+    public Object[][] deps() {
+        return new Object[][] {
+            { "classes", new ModuleMetaData("classes", false)
+                .reference("p.Main", "java.lang.Class", "java.base")
+                .reference("p.Main", "java.lang.Object", "java.base")
+                .reference("p.Main", "java.util.Iterator", "java.base")
+                .reference("p.S", "java.lang.Object", "java.base")
+                .jdkInternal("p.Main", "sun.reflect.Reflection", "jdk.unsupported")
+                .removedJdkInternal("p.Main", "com.sun.image.codec.jpeg.JPEGCodec")
+                .removedJdkInternal("p.Main", "sun.misc.Service")
+                .removedJdkInternal("p.Main", "sun.misc.SoftCache")
+            },
+        };
+    }
+
+    @Test(dataProvider = "deps")
+    public void runTest(String name, ModuleMetaData data) throws Exception {
+        String cmd = String.format("jdeps -verbose:class %s%n", CLASSES_DIR);
+        try (JdepsUtil.Command jdeps = JdepsUtil.newCommand(cmd)) {
+            jdeps.verbose("-verbose:class")
+                .addRoot(CLASSES_DIR);
+
+            DepsAnalyzer analyzer = jdeps.getDepsAnalyzer();
+            assertTrue(analyzer.run());
+            jdeps.dumpOutput(System.err);
+
+            Graph<DepsAnalyzer.Node> g = analyzer.dependenceGraph();
+            // there are two node with p.Main as origin
+            // one for exported API and one for removed JDK internal
+            g.nodes().stream()
+                .filter(u -> u.source.equals(data.moduleName))
+                .forEach(u -> g.adjacentNodes(u).stream()
+                    .forEach(v -> data.checkDependence(u.name, v.name, v.source, v.info)));
+        }
+    }
+
+    private static final Map<String, String> REPLACEMENTS = Map.of(
+        "com.sun.image.codec.jpeg.JPEGCodec", "Use javax.imageio @since 1.4",
+        "sun.misc.Service", "Use java.util.ServiceLoader @since 1.6",
+        "sun.misc.SoftCache", "Removed. See http://openjdk.java.net/jeps/260",
+        "sun.reflect.Reflection", "Use java.lang.StackWalker @since 9"
+    );
+
+    @Test
+    public void checkReplacement() {
+        JdepsRunner jdeps = JdepsRunner.run("-jdkinternals", CLASSES_DIR.toString());
+        String[] output = jdeps.output();
+        int i = 0;
+        while (!output[i].contains("Suggested Replacement")) {
+            i++;
+        }
+
+        // must match the number of JDK internal APIs
+        int count = output.length-i-2;
+        assertEquals(count, REPLACEMENTS.size());
+
+        for (int j=i+2; j < output.length; j++) {
+            String line = output[j];
+            int pos = line.indexOf("Use ");
+            if (pos < 0)
+                pos = line.indexOf("Removed. ");
+
+            assertTrue(pos > 0);
+            String name = line.substring(0, pos).trim();
+            String repl = line.substring(pos, line.length()).trim();
+            assertEquals(REPLACEMENTS.get(name), repl);
+        }
+    }
+}