1 /* 2 * Copyright (c) 2015, 2016, 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/testlibrary 27 * @modules jdk.compiler 28 * @build PatchTest CompilerUtils JarUtils 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.Arrays; 38 import java.util.stream.Collectors; 39 import java.util.stream.Stream; 40 41 import static jdk.testlibrary.ProcessTools.*; 42 43 import org.testng.annotations.BeforeTest; 44 import org.testng.annotations.Test; 45 import static org.testng.Assert.*; 46 47 48 /** 49 * Compiles and launches a test that uses -Xpatch with two directories of 50 * classes to override existing and add new classes to modules in the 51 * boot layer. 52 * 53 * The classes overridden or added via -Xpatch all define a public no-arg 54 * constructor and override toString to return "hi". This allows the launched 55 * test to check that the overridden classes are loaded. 56 */ 57 58 @Test 59 public class PatchTest { 60 61 // top-level source directory 62 private static final String TEST_SRC = System.getProperty("test.src"); 63 64 // source/destination tree for the test module 65 private static final Path SRC_DIR = Paths.get(TEST_SRC, "src"); 66 private static final Path MODS_DIR = Paths.get("mods"); 67 68 // source/destination tree for patch tree 1 69 private static final Path SRC1_DIR = Paths.get(TEST_SRC, "src1"); 70 private static final Path PATCHES1_DIR = Paths.get("patches1"); 71 72 // source/destination tree for patch tree 2 73 private static final Path SRC2_DIR = Paths.get(TEST_SRC, "src2"); 74 private static final Path PATCHES2_DIR = Paths.get("patches2"); 75 76 // destination directory for patches packaged as JAR files 77 private static final Path PATCHES_DIR = Paths.get("patches"); 78 79 80 // the classes overridden or added with -Xpatch 81 private static final String[] CLASSES = { 82 83 // java.base = boot loader 84 "java.base/java.text.Annotation", // override class 85 "java.base/java.text.AnnotationBuddy", // add class to package 86 "java.base/java.lang2.Object", // new package 87 88 // jdk.naming.dns = platform class loader 89 "jdk.naming.dns/com.sun.jndi.dns.DnsClient", 90 "jdk.naming.dns/com.sun.jndi.dns.DnsClientBuddy", 91 "jdk.naming.dns/com.sun.jndi.dns2.Zone", 92 93 // jdk.compiler = application class loaded 94 "jdk.compiler/com.sun.tools.javac.Main", 95 "jdk.compiler/com.sun.tools.javac.MainBuddy", 96 "jdk.compiler/com.sun.tools.javac2.Main", 97 98 }; 99 100 101 @BeforeTest 102 public void setup() throws Exception { 103 104 // javac -d mods/test src/test/** 105 boolean compiled= CompilerUtils.compile(SRC_DIR.resolve("test"), 106 MODS_DIR.resolve("test")); 107 assertTrue(compiled, "classes did not compile"); 108 109 // javac -Xmodule:$MODULE -d patches1/$MODULE patches1/$MODULE/** 110 // jar cf patches/$MODULE-1.jar -C patches1/$MODULE . 111 for (Path src : Files.newDirectoryStream(SRC1_DIR)) { 112 Path output = PATCHES1_DIR.resolve(src.getFileName()); 113 String mn = src.getFileName().toString(); 114 compiled = CompilerUtils.compile(src, output, "-Xmodule:" + mn); 115 assertTrue(compiled, "classes did not compile"); 116 JarUtils.createJarFile(PATCHES_DIR.resolve(mn + "-1.jar"), output); 117 } 118 119 // javac -Xmodule:$MODULE -d patches2/$MODULE patches2/$MODULE/** 120 // jar cf patches/$MODULE-2.jar -C patches2/$MODULE . 121 for (Path src : Files.newDirectoryStream(SRC2_DIR)) { 122 Path output = PATCHES2_DIR.resolve(src.getFileName()); 123 String mn = src.getFileName().toString(); 124 compiled = CompilerUtils.compile(src, output, "-Xmodule:" + mn); 125 assertTrue(compiled, "classes did not compile"); 126 JarUtils.createJarFile(PATCHES_DIR.resolve(mn + "-2.jar"), output); 127 } 128 129 } 130 131 /** 132 * Run test with patches to java.base, jdk.naming.dns and jdk.compiler 133 */ 134 void runTest(String basePatches, String dnsPatches, String compilerPatches) 135 throws Exception 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 = executeModularTest("test", "jdk.test.Main", 142 Arrays.asList("-Xpatch:java.base=" + basePatches, 143 "-Xpatch:jdk.naming.dns=" + dnsPatches, 144 "-Xpatch:jdk.compiler=" + compilerPatches, 145 "-XaddExports:java.base/java.lang2=test", 146 "-XaddExports:jdk.naming.dns/com.sun.jndi.dns=test", 147 "-XaddExports:jdk.naming.dns/com.sun.jndi.dns2=test", 148 "-XaddExports:jdk.compiler/com.sun.tools.javac2=test"), 149 null, Arrays.asList(MODS_DIR), Arrays.asList("jdk.naming.dns", "jdk.compiler"), 150 arg) 151 .getExitValue(); 152 153 assertTrue(exitValue == 0); 154 } 155 156 157 /** 158 * Run test with -Xpatch and exploded patches 159 */ 160 public void testWithExplodedPatches() throws Exception { 161 162 // patches1/java.base:patches2/java.base 163 String basePatches = PATCHES1_DIR.resolve("java.base") 164 + File.pathSeparator + PATCHES2_DIR.resolve("java.base"); 165 166 String dnsPatches = PATCHES1_DIR.resolve("jdk.naming.dns") 167 + File.pathSeparator + PATCHES2_DIR.resolve("jdk.naming.dns"); 168 169 String compilerPatches = PATCHES1_DIR.resolve("jdk.compiler") 170 + File.pathSeparator + PATCHES2_DIR.resolve("jdk.compiler"); 171 172 runTest(basePatches, dnsPatches, compilerPatches); 173 } 174 175 176 /** 177 * Run test with -Xpatch and patches in JAR files 178 */ 179 public void testWithJarPatches() throws Exception { 180 181 // patches/java.base-1.jar:patches/java-base-2.jar 182 String basePatches = PATCHES_DIR.resolve("java.base-1.jar") 183 + File.pathSeparator + PATCHES_DIR.resolve("java.base-2.jar"); 184 185 String dnsPatches = PATCHES_DIR.resolve("jdk.naming.dns-1.jar") 186 + File.pathSeparator + PATCHES_DIR.resolve("jdk.naming.dns-2.jar"); 187 188 String compilerPatches = PATCHES_DIR.resolve("jdk.compiler-1.jar") 189 + File.pathSeparator + PATCHES_DIR.resolve("jdk.compiler-2.jar"); 190 191 runTest(basePatches, dnsPatches, compilerPatches); 192 193 } 194 195 196 /** 197 * Run test with -Xpatch and patches in JAR files and exploded patches 198 */ 199 public void testWithJarAndExplodedPatches() throws Exception { 200 201 // patches/java.base-1.jar:patches2/java.base 202 String basePatches = PATCHES_DIR.resolve("java.base-1.jar") 203 + File.pathSeparator + PATCHES2_DIR.resolve("java.base"); 204 205 // patches1/jdk.naming.dns:patches/jdk.naming.dns-2.jar 206 String dnsPatches = PATCHES1_DIR.resolve("jdk.naming.dns") 207 + File.pathSeparator + PATCHES_DIR.resolve("jdk.naming.dns-2.jar"); 208 209 String compilerPatches = PATCHES1_DIR.resolve("jdk.compiler") 210 + File.pathSeparator + PATCHES_DIR.resolve("jdk.compiler-2.jar"); 211 212 runTest(basePatches, dnsPatches, compilerPatches); 213 214 } 215 }