ModuleInfoPatchPath.java revision 4054:24fa5d195595
1/* 2 * Copyright (c) 2017, 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 * @bug 8175057 27 * @summary Verify that having module-info on patch path works correctly. 28 * @library /tools/lib 29 * @modules 30 * jdk.compiler/com.sun.tools.javac.api 31 * jdk.compiler/com.sun.tools.javac.code 32 * jdk.compiler/com.sun.tools.javac.main 33 * jdk.compiler/com.sun.tools.javac.processing 34 * jdk.compiler/com.sun.tools.javac.util 35 * @build toolbox.ToolBox toolbox.JarTask toolbox.JavacTask ModuleTestBase 36 * @run main ModuleInfoPatchPath 37 */ 38 39import java.nio.file.Files; 40import java.nio.file.Path; 41import java.util.List; 42 43import toolbox.JavacTask; 44import toolbox.Task.OutputKind; 45 46public class ModuleInfoPatchPath extends ModuleTestBase { 47 48 public static void main(String... args) throws Exception { 49 new ModuleInfoPatchPath().runTests(); 50 } 51 52 @Test 53 public void testModuleInfoToModulePath(Path base) throws Exception { 54 Path src = base.resolve("src"); 55 tb.writeJavaFiles(src, 56 "module m { exports api; }", 57 "package api; public class Api {}"); 58 Path patch = base.resolve("patch"); 59 tb.writeJavaFiles(patch, 60 "module m { requires java.compiler; exports api; }", 61 "package api; public class Api { public static javax.lang.model.element.Element element; }"); 62 Path classes = base.resolve("classes"); 63 Path mClasses = classes.resolve("m"); 64 tb.createDirectories(mClasses); 65 66 System.err.println("Building the vanilla module..."); 67 68 new JavacTask(tb) 69 .outdir(mClasses) 70 .files(findJavaFiles(src)) 71 .run() 72 .writeAll(); 73 74 Path test = base.resolve("test"); 75 tb.writeJavaFiles(test, 76 "module test { requires m; }", 77 "package test; public class Test { private void test() { api.Api.element = null; } }"); 78 79 Path testClasses = classes.resolve("test"); 80 tb.createDirectories(testClasses); 81 82 System.err.println("Building patched module..."); 83 84 new JavacTask(tb) 85 .options("--module-path", mClasses.toString(), 86 "--patch-module", "m=" + patch.toString()) 87 .outdir(testClasses) 88 .files(findJavaFiles(test)) 89 .run() 90 .writeAll(); 91 92 Path patchClasses = classes.resolve("patch"); 93 tb.createDirectories(patchClasses); 94 95 System.err.println("Building patch..."); 96 97 new JavacTask(tb) 98 .outdir(patchClasses) 99 .files(findJavaFiles(patch)) 100 .run() 101 .writeAll(); 102 103 tb.cleanDirectory(testClasses); 104 105 Files.delete(patch.resolve("module-info.java")); 106 Files.copy(patchClasses.resolve("module-info.class"), patch.resolve("module-info.class")); 107 108 System.err.println("Building patched module against binary patch..."); 109 110 new JavacTask(tb) 111 .options("--module-path", mClasses.toString(), 112 "--patch-module", "m=" + patch.toString()) 113 .outdir(testClasses) 114 .files(findJavaFiles(test)) 115 .run() 116 .writeAll(); 117 } 118 119 @Test 120 public void testModuleInfoToSourcePath(Path base) throws Exception { 121 Path src = base.resolve("src"); 122 tb.writeJavaFiles(src, 123 "module m { exports api; }", 124 "package api; public class Api {}", 125 "package test; public class Test { private void test() { api.Api.element = null; } }"); 126 Path patch = base.resolve("patch"); 127 tb.writeJavaFiles(patch, 128 "module m { requires java.compiler; exports api; }", 129 "package api; public class Api { public static javax.lang.model.element.Element element; }"); 130 Path classes = base.resolve("classes"); 131 Path mClasses = classes.resolve("m"); 132 tb.createDirectories(mClasses); 133 134 System.err.println("Building patched module against source patch..."); 135 136 new JavacTask(tb) 137 .options("--patch-module", "m=" + patch.toString(), 138 "-sourcepath", src.toString()) 139 .outdir(mClasses) 140 .files(findJavaFiles(src.resolve("test"))) 141 .run() 142 .writeAll(); 143 144 //incremental compilation: 145 List<String> log; 146 147 System.err.println("Incremental building of patched module against source patch, no module-info..."); 148 149 log = new JavacTask(tb) 150 .options("--patch-module", "m=" + patch.toString(), 151 "-sourcepath", src.toString(), 152 "-verbose") 153 .outdir(mClasses) 154 .files(findJavaFiles(src.resolve("test"))) 155 .run() 156 .writeAll() 157 .getOutputLines(OutputKind.DIRECT); 158 159 if (log.stream().filter(line -> line.contains("[parsing started")).count() != 1) { 160 throw new AssertionError("incorrect number of parsing events."); 161 } 162 163 System.err.println("Incremental building of patched module against source patch, with module-info..."); 164 165 log = new JavacTask(tb) 166 .options("--patch-module", "m=" + patch.toString(), 167 "-sourcepath", src.toString(), 168 "-verbose") 169 .outdir(mClasses) 170 .files(findJavaFiles(patch.resolve("module-info.java"), src.resolve("test"))) 171 .run() 172 .writeAll() 173 .getOutputLines(OutputKind.DIRECT); 174 175 if (log.stream().filter(line -> line.contains("[parsing started")).count() != 2) { 176 throw new AssertionError("incorrect number of parsing events."); 177 } 178 179 tb.cleanDirectory(mClasses); 180 181 System.err.println("Building patched module against source patch with source patch on patch path..."); 182 183 new JavacTask(tb) 184 .options("--patch-module", "m=" + patch.toString(), 185 "-sourcepath", src.toString()) 186 .outdir(mClasses) 187 .files(findJavaFiles(src.resolve("test"), patch)) 188 .run() 189 .writeAll(); 190 191 Path patchClasses = classes.resolve("patch"); 192 tb.createDirectories(patchClasses); 193 194 System.err.println("Building patch..."); 195 196 new JavacTask(tb) 197 .outdir(patchClasses) 198 .files(findJavaFiles(patch)) 199 .run() 200 .writeAll(); 201 202 tb.cleanDirectory(mClasses); 203 204 Files.delete(patch.resolve("module-info.java")); 205 Files.copy(patchClasses.resolve("module-info.class"), patch.resolve("module-info.class")); 206 207 System.err.println("Building patched module against binary patch..."); 208 209 new JavacTask(tb) 210 .options("--patch-module", "m=" + patch.toString(), 211 "-sourcepath", src.toString()) 212 .outdir(mClasses) 213 .files(findJavaFiles(src.resolve("test"))) 214 .run() 215 .writeAll(); 216 217 tb.cleanDirectory(mClasses); 218 219 System.err.println("Building patched module against binary patch with source patch on patch path..."); 220 221 new JavacTask(tb) 222 .options("--patch-module", "m=" + patch.toString(), 223 "-sourcepath", src.toString()) 224 .outdir(mClasses) 225 .files(findJavaFiles(src.resolve("test"), patch)) 226 .run() 227 .writeAll(); 228 } 229 230 @Test 231 public void testModuleInfoToModuleSourcePath(Path base) throws Exception { 232 Path src = base.resolve("src"); 233 Path m = src.resolve("m"); 234 tb.writeJavaFiles(m, 235 "module m { exports api; }", 236 "package api; public class Api {}", 237 "package test; public class Test { private void test() { api.Api.element = null; } }"); 238 Path patch = base.resolve("patch"); 239 tb.writeJavaFiles(patch, 240 "module m { requires java.compiler; exports api; }", 241 "package api; public class Api { public static javax.lang.model.element.Element element; }"); 242 Path classes = base.resolve("classes"); 243 Path mClasses = classes.resolve("m"); 244 tb.createDirectories(mClasses); 245 246 System.err.println("Building patched module against source patch..."); 247 248 new JavacTask(tb) 249 .options("--patch-module", "m=" + patch.toString(), 250 "--module-source-path", src.toString()) 251 .outdir(mClasses) 252 .files(findJavaFiles(m.resolve("test"))) 253 .run() 254 .writeAll(); 255 256 //incremental compilation: 257 258 System.err.println("Incremental building of patched module against source patch..."); 259 260 List<String> log = new JavacTask(tb) 261 .options("--patch-module", "m=" + patch.toString(), 262 "--module-source-path", src.toString(), 263 "-verbose") 264 .outdir(mClasses) 265 .files(findJavaFiles(m.resolve("test"))) 266 .run() 267 .writeAll() 268 .getOutputLines(OutputKind.DIRECT); 269 270 if (log.stream().filter(line -> line.contains("[parsing started")).count() != 1) { 271 throw new AssertionError("incorrect number of parsing events."); 272 } 273 274 tb.cleanDirectory(mClasses); 275 276 System.err.println("Building patched module against source patch with source patch on patch path..."); 277 278 new JavacTask(tb) 279 .options("--patch-module", "m=" + patch.toString(), 280 "--module-source-path", src.toString()) 281 .outdir(mClasses) 282 .files(findJavaFiles(m.resolve("test"), patch)) 283 .run() 284 .writeAll(); 285 286 Path patchClasses = classes.resolve("patch"); 287 tb.createDirectories(patchClasses); 288 289 System.err.println("Building patch..."); 290 291 new JavacTask(tb) 292 .outdir(patchClasses) 293 .files(findJavaFiles(patch)) 294 .run() 295 .writeAll(); 296 297 tb.cleanDirectory(mClasses); 298 299 Files.delete(patch.resolve("module-info.java")); 300 Files.copy(patchClasses.resolve("module-info.class"), patch.resolve("module-info.class")); 301 302 System.err.println("Building patched module against binary patch..."); 303 304 new JavacTask(tb) 305 .options("--patch-module", "m=" + patch.toString(), 306 "--module-source-path", src.toString()) 307 .outdir(mClasses) 308 .files(findJavaFiles(m.resolve("test"))) 309 .run() 310 .writeAll(); 311 312 tb.cleanDirectory(mClasses); 313 314 System.err.println("Building patched module against binary patch with source patch on patch path..."); 315 316 new JavacTask(tb) 317 .options("--patch-module", "m=" + patch.toString(), 318 "--module-source-path", src.toString()) 319 .outdir(mClasses) 320 .files(findJavaFiles(m.resolve("test"), patch)) 321 .run() 322 .writeAll(); 323 } 324 325} 326