1 /* 2 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /** 25 * @test 26 * @library ../../lib /lib/testlibrary 27 * @modules jdk.compiler 28 * @build PatchTest CompilerUtils jdk.testlibrary.* 29 * @run testng PatchTest 30 * @summary Basic test for -Xpatch 31 */ 32 33 import java.io.File; 34 import java.nio.file.Files; 35 import java.nio.file.Path; 36 import java.nio.file.Paths; 37 import java.util.stream.Collectors; 38 import java.util.stream.Stream; 39 40 import static jdk.testlibrary.ProcessTools.*; 41 42 import org.testng.annotations.BeforeTest; 43 import org.testng.annotations.Test; 44 import static org.testng.Assert.*; 45 46 47 /** 48 * Compiles and launches a test that uses -Xpatch with two directories of 49 * classes to override existing and add new classes to modules in the 50 * boot layer. 51 * 52 * The classes overridden or added via -Xpatch all define a public no-arg 53 * constructor and override toString to return "hi". This allows the launched 54 * test to check that the overridden classes are loaded. 55 */ 56 57 @Test 58 public class PatchTest { 59 60 // top-level source directory 61 private static final String TEST_SRC = System.getProperty("test.src"); 62 63 // source/destination tree for the test module 64 private static final Path SRC_DIR = Paths.get(TEST_SRC, "src"); 65 private static final Path MODS_DIR = Paths.get("mods"); 66 67 // source/destination tree for patch tree 1 68 private static final Path SRC1_DIR = Paths.get(TEST_SRC, "src1"); 69 private static final Path PATCHES1_DIR = Paths.get("patches1"); 70 71 // source/destination tree for patch tree 2 72 private static final Path SRC2_DIR = Paths.get(TEST_SRC, "src2"); 73 private static final Path PATCHES2_DIR = Paths.get("patches2"); 74 75 76 // the classes overridden or added with -Xpatch 77 private static final String[] CLASSES = { 78 79 // java.base = boot loader 80 "java.base/java.text.Annotation", // override class 81 "java.base/java.text.AnnotationBuddy", // add class to package 82 "java.base/java.lang2.Object", // new package 83 84 // jdk.naming.dns = extension class loader 85 "jdk.naming.dns/com.sun.jndi.dns.DnsClient", 86 "jdk.naming.dns/com.sun.jndi.dns.DnsClientBuddy", 87 "jdk.naming.dns/com.sun.jndi.dns2.Zone", 88 89 // jdk.compiler = application class loaded 90 "jdk.compiler/com.sun.tools.javac.Main", 91 "jdk.compiler/com.sun.tools.javac.MainBuddy", 92 "jdk.compiler/com.sun.tools.javac2.Main", 93 94 }; 95 96 97 @BeforeTest 98 public void compile() throws Exception { 99 100 // javac -d mods/test src/test/** 101 boolean compiled= CompilerUtils.compile(SRC_DIR.resolve("test"), 102 MODS_DIR.resolve("test")); 103 assertTrue(compiled, "classes did not compile"); 104 105 // javac -Xmodule:$MODULE -d patches1/$MODULE patches1/$MODULE/** 106 for (Path src : Files.newDirectoryStream(SRC1_DIR)) { 107 Path output = PATCHES1_DIR.resolve(src.getFileName()); 108 String mn = src.getFileName().toString(); 109 compiled = CompilerUtils.compile(src, output, "-Xmodule:" + mn); 110 assertTrue(compiled, "classes did not compile"); 111 } 112 113 // javac -Xmodule:$MODULE -d patches2/$MODULE patches2/$MODULE/** 114 for (Path src : Files.newDirectoryStream(SRC2_DIR)) { 115 Path output = PATCHES2_DIR.resolve(src.getFileName()); 116 String mn = src.getFileName().toString(); 117 compiled = CompilerUtils.compile(src, output, "-Xmodule:" + mn); 118 assertTrue(compiled, "classes did not compile"); 119 } 120 121 } 122 123 /** 124 * Run the test with -Xpatch 125 */ 126 public void testRunWithXPatch() throws Exception { 127 128 // value for -Xpatch 129 String patchPath = PATCHES1_DIR + File.pathSeparator + PATCHES2_DIR; 130 131 // value for -XaddExports 132 String addExportsValue = "java.base/java.lang2=test" 133 + ",jdk.naming.dns/com.sun.jndi.dns=test" 134 + ",jdk.naming.dns/com.sun.jndi.dns2=test" 135 + ",jdk.compiler/com.sun.tools.javac2=test"; 136 137 // the argument to the test is the list of classes overridden or added 138 String arg = Stream.of(CLASSES).collect(Collectors.joining(",")); 139 140 int exitValue 141 = executeTestJava("-Xpatch:" + patchPath, 142 "-XaddExports:" + addExportsValue, 143 "-addmods", "jdk.naming.dns,jdk.compiler", 144 "-mp", MODS_DIR.toString(), 145 "-m", "test/jdk.test.Main", arg) 146 .outputTo(System.out) 147 .errorTo(System.out) 148 .getExitValue(); 149 150 assertTrue(exitValue == 0); 151 152 } 153 154 }