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 8153654 8176333 27 * @summary Tests for jdeps tool with multi-release jar files 28 * @modules jdk.jdeps/com.sun.tools.jdeps 29 * @library mrjar mrjar/base mrjar/9 mrjar/10 mrjar/v9 mrjar/v10 30 * @build test.* p.* q.* foo/* 31 * @run testng MultiReleaseJar 32 */ 33 34 import org.testng.Assert; 35 import org.testng.annotations.AfterClass; 36 import org.testng.annotations.BeforeClass; 37 import org.testng.annotations.Test; 38 39 import java.io.File; 40 import java.io.InputStream; 41 import java.nio.file.Path; 42 import java.nio.file.Paths; 43 import java.util.stream.Stream; 44 45 public class MultiReleaseJar { 46 Path mrjar; 47 String testJdk; 48 String fileSep; 49 Path cmdPath; 50 51 @BeforeClass 52 public void initialize() throws Exception { 53 String testClassPath = System.getProperty("test.class.path", ""); 54 mrjar = Stream.of(testClassPath.split(File.pathSeparator)) 55 .map(Paths::get) 56 .filter(e -> e.endsWith("mrjar")) 57 .findAny() 58 .orElseThrow(() -> new InternalError("mrjar not found")); 59 testJdk = System.getProperty("test.jdk"); 60 fileSep = System.getProperty("file.separator"); 61 cmdPath = Paths.get(testJdk, "bin"); 62 } 63 64 @Test 65 public void basic() throws Exception { 66 // build Version.jar, Version_9.jar and main.jar 67 Result r = run("jar -cf Version.jar -C base test --release 9 -C 9 test --release 10 -C 10 test"); 68 checkResult(r); 69 70 r = run("jar -cf Version_9.jar -C base test --release 9 -C 9 test"); 71 checkResult(r); 72 73 r = run("jar -cf Main.jar test/Main.class"); 74 checkResult(r); 75 76 // try out a bunch of things 77 r = run("jdeps --multi-release 9 -v missing.jar"); 78 checkResult(r, false, "Warning: Path does not exist: missing.jar"); 79 80 r = run("jdeps -v Version.jar"); 81 checkResult(r, false, "--multi-release option is not set"); 82 83 r = run("jdeps --multi-release base -v Version.jar"); 84 checkResult(r, true, 85 "Version.jar ->", 86 "test.Version", 87 "test.Version" 88 ); 89 90 r = run("jdeps --multi-release 9 -v Version.jar"); 91 checkResult(r, true, 92 "Version.jar ->", 93 "9/test.NonPublic", 94 "9/test.NonPublic", 95 "9/test.Version", 96 "9/test.Version", 97 "9/test.Version", 98 "9/test.Version" 99 ); 100 101 r = run("jdeps --multi-release 10 -v Version.jar"); 102 checkResult(r, true, 103 "Version.jar ->", 104 "10/test.Version", 105 "10/test.Version", 106 "10/test.Version", 107 "10/test.Version", 108 "9/test.NonPublic", 109 "9/test.NonPublic" 110 ); 111 112 r = run("jdeps --multi-release 8 -v Version.jar"); 113 checkResult(r, false, "Error: invalid argument for option: 8"); 114 115 r = run("jdeps --multi-release 9.1 -v Version.jar"); 116 checkResult(r, false, "Error: invalid argument for option: 9.1"); 117 118 runJdeps("test/Main.class"); 119 runJdeps("Main.jar"); 120 } 121 122 123 private void runJdeps(String path) throws Exception { 124 Result r = run("jdeps -v -R -cp Version.jar " + path); 125 checkResult(r, false, "--multi-release option is not set"); 126 127 r = run("jdeps -v -R -cp Version.jar -multi-release 9 " + path); 128 checkResult(r, false, 129 "Error: unknown option: -multi-release", 130 "Usage: jdeps <options> <path", 131 "use --help" 132 ); 133 134 r = run("jdeps -v -R -cp Version.jar --multi-release 9 " + path); 135 136 String name = path; 137 int index = path.lastIndexOf('/'); 138 if (index >= 0) { 139 name = path.substring(index + 1, path.length()); 140 } 141 checkResult(r, true, 142 name + " ->", 143 name + " ->", 144 "test.Main", 145 "test.Main", 146 "test.Main", 147 "Version.jar ->", 148 "9/test.NonPublic", 149 "9/test.NonPublic", 150 "9/test.Version", 151 "9/test.Version", 152 "9/test.Version", 153 "9/test.Version" 154 ); 155 156 r = run("jdeps -v -R -cp Version.jar --multi-release 10 " + path); 157 checkResult(r, true, 158 name + " ->", 159 name + " ->", 160 "test.Main", 161 "test.Main", 162 "test.Main", 163 "Version.jar ->", 164 "10/test.Version", 165 "10/test.Version", 166 "10/test.Version", 167 "10/test.Version", 168 "9/test.NonPublic", 169 "9/test.NonPublic" 170 ); 171 172 r = run("jdeps -v -R -cp Version.jar --multi-release base " + path); 173 checkResult(r, true, 174 name + " ->", 175 name + " ->", 176 "test.Main", 177 "test.Main", 178 "test.Main", 179 "Version.jar ->", 180 "test.Version", 181 "test.Version" 182 ); 183 184 r = run("jdeps -v -R -cp Version.jar --multi-release 9.1 " + path); 185 checkResult(r, false, "Error: invalid argument for option: 9.1"); 186 187 // Version_9.jar does not have any version 10 entry 188 r = run("jdeps -v -R -cp Version_9.jar --multi-release 10 " + path); 189 checkResult(r, true, 190 name + " ->", 191 name + " ->", 192 "test.Main", 193 "test.Main", 194 "test.Main", 195 "Version_9.jar ->", 196 "9/test.NonPublic", 197 "9/test.NonPublic", 198 "9/test.Version", 199 "9/test.Version", 200 "9/test.Version", 201 "9/test.Version" 202 ); 203 } 204 205 @Test 206 public void ps_and_qs() throws Exception { 207 // build the jar file 208 Result r = run("jar -cf PQ.jar -C base p --release 9 -C v9 p -C v9 q --release 10 -C v10 q"); 209 checkResult(r); 210 211 r = run("jdeps -v -R -cp PQ.jar --multi-release base PQ.jar"); 212 checkResult(r, true, 213 "PQ.jar -> java.base", 214 "p.Foo" 215 ); 216 217 r = run("jdeps -v -R -cp PQ.jar --multi-release 9 PQ.jar"); 218 checkResult(r, true, 219 "PQ.jar -> java.base", 220 "9/p.Foo", 221 "9/p.Foo", 222 "9/q.Bar" 223 ); 224 225 226 r = run("jdeps -v -R -cp PQ.jar --multi-release 10 PQ.jar"); 227 checkResult(r, true, 228 "PQ.jar -> java.base", 229 "10/q.Bar", 230 "10/q.Bar", 231 "10/q.Gee", 232 "9/p.Foo", 233 "9/p.Foo" 234 ); 235 } 236 237 @Test 238 public void modularJar() throws Exception { 239 Result r = run("jar -cf foo.jar -C base p"); 240 checkResult(r); 241 242 Path foo = Paths.get(System.getProperty("test.classes")).resolve("modules").resolve("foo"); 243 r = run("jar -uf foo.jar --release 9 -C " + foo.toString() + " module-info.class --release 10 -C v10 q"); 244 checkResult(r); 245 246 r = run("jdeps -v --multi-release 10 --module-path foo.jar -m foo"); 247 checkResult(r, true, 248 "foo", // module name 249 "foo.jar", // the path to foo.jar 250 "requires mandated java.base", // module dependences 251 "foo -> java.base", 252 "10/q.Bar", 253 "10/q.Bar", 254 "10/q.Gee", 255 "p.Foo" 256 ); 257 258 r = run("jdeps --multi-release 9 --module-path foo.jar Main.jar"); 259 checkResult(r, true, 260 "Main.jar ->", 261 "test", 262 "foo", // module name 263 "foo.jar", // the path to foo.jar 264 "requires mandated java.base", // module dependences 265 "foo -> java.base", 266 "p" 267 ); 268 269 r = run("jdeps --multi-release 10 --module-path foo.jar Main.jar"); 270 checkResult(r, true, 271 "Main.jar ->", 272 "test", 273 "foo", // module name 274 "foo.jar", // the path to foo.jar 275 "requires mandated java.base", // module dependences 276 "foo -> java.base", 277 "p", 278 "q" 279 ); 280 } 281 282 static class Result { 283 final String cmd; 284 final int rc; 285 final String out; 286 final String err; 287 Result(String cmd, int rc, String out, String err) { 288 this.cmd = cmd; 289 this.rc = rc; 290 this.out = out; 291 this.err = err; 292 } 293 } 294 295 Result run(String cmd) throws Exception { 296 String[] cmds = cmd.split(" +"); 297 cmds[0] = cmdPath.resolve(cmds[0]).toString(); 298 ProcessBuilder pb = new ProcessBuilder(cmds); | 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 8153654 8176333 27 * @summary Tests for jdeps tool with multi-release jar files 28 * @modules jdk.jdeps/com.sun.tools.jdeps 29 * @library mrjar mrjar/base mrjar/9 mrjar/10 mrjar/v9 mrjar/v10 30 * @build test.* p.* q.* foo/* Main 31 * @run testng MultiReleaseJar 32 */ 33 34 import org.testng.Assert; 35 import org.testng.annotations.AfterClass; 36 import org.testng.annotations.BeforeClass; 37 import org.testng.annotations.Test; 38 39 import java.io.File; 40 import java.io.InputStream; 41 import java.nio.file.Path; 42 import java.nio.file.Paths; 43 import java.util.stream.Stream; 44 45 public class MultiReleaseJar { 46 Path mrjar; 47 String testJdk; 48 String fileSep; 49 Path cmdPath; 50 51 @BeforeClass 52 public void initialize() throws Exception { 53 String testClassPath = System.getProperty("test.class.path", ""); 54 mrjar = Stream.of(testClassPath.split(File.pathSeparator)) 55 .map(Paths::get) 56 .filter(e -> e.endsWith("mrjar")) 57 .findAny() 58 .orElseThrow(() -> new InternalError("mrjar not found")); 59 testJdk = System.getProperty("test.jdk"); 60 fileSep = System.getProperty("file.separator"); 61 cmdPath = Paths.get(testJdk, "bin"); 62 63 // build Version.jar, Version_9.jar and main.jar 64 Result r = run("jar -cf Version.jar -C base test --release 9 -C 9 test --release 10 -C 10 test"); 65 checkResult(r); 66 67 r = run("jar -cf Version_9.jar -C base test --release 9 -C 9 test"); 68 checkResult(r); 69 70 r = run("jar -cf Main.jar Main.class"); 71 checkResult(r); 72 73 r = run("jar -cf Foo.jar -C base p"); 74 checkResult(r); 75 76 Path foo = Paths.get(System.getProperty("test.classes")).resolve("modules").resolve("foo"); 77 r = run("jar -uf Foo.jar --release 9 -C " + foo.toString() + " module-info.class --release 10 -C v10 q"); 78 checkResult(r); 79 } 80 81 @Test 82 public void basic() throws Exception { 83 Result r = run("jdeps --multi-release 9 -v missing.jar"); 84 checkResult(r, false, "Warning: Path does not exist: missing.jar"); 85 86 r = run("jdeps -v Version.jar"); 87 checkResult(r, false, "--multi-release option is not set"); 88 89 r = run("jdeps --multi-release base -v Version.jar"); 90 checkResult(r, true, 91 "Version.jar ->", 92 "test.Version", 93 "test.Version" 94 ); 95 96 r = run("jdeps --multi-release 9 -v Version.jar"); 97 checkResult(r, true, 98 "Version.jar ->", 99 "9/test.NonPublic", 100 "9/test.NonPublic", 101 "9/test.Version", 102 "9/test.Version", 103 "9/test.Version", 104 "9/test.Version" 105 ); 106 107 r = run("jdeps --multi-release 10 -v Version.jar"); 108 checkResult(r, true, 109 "Version.jar ->", 110 "10/test.Version", 111 "10/test.Version", 112 "10/test.Version", 113 "10/test.Version", 114 "9/test.NonPublic", 115 "9/test.NonPublic" 116 ); 117 118 r = run("jdeps --multi-release 8 -v Version.jar"); 119 checkResult(r, false, "Error: invalid argument for option: 8"); 120 121 r = run("jdeps --multi-release 9.1 -v Version.jar"); 122 checkResult(r, false, "Error: invalid argument for option: 9.1"); 123 124 runJdeps("Main.class"); 125 runJdeps("Main.jar"); 126 } 127 128 129 private void runJdeps(String path) throws Exception { 130 Result r = run("jdeps -v -R -cp Version.jar " + path); 131 checkResult(r, false, "--multi-release option is not set"); 132 133 r = run("jdeps -v -R -cp Version.jar --module-path Foo.jar -multi-release 9 " + path); 134 checkResult(r, false, 135 "Error: unknown option: -multi-release", 136 "Usage: jdeps <options> <path", 137 "use --help" 138 ); 139 140 r = run("jdeps -v -R -cp Version.jar --module-path Foo.jar --multi-release 9 " + path); 141 142 String name = path; 143 int index = path.lastIndexOf('/'); 144 if (index >= 0) { 145 name = path.substring(index + 1, path.length()); 146 } 147 checkResult(r, true, 148 name + " -> Version.jar", 149 name + " -> foo", 150 name + " -> java.base", 151 "Main", 152 "Main", 153 "Main", 154 "Main", 155 "Version.jar -> java.base", 156 "9/test.NonPublic", 157 "9/test.NonPublic", 158 "9/test.Version", 159 "9/test.Version", 160 "9/test.Version", 161 "9/test.Version", 162 "foo", 163 "Foo.jar", 164 "requires mandated java.base", 165 "foo -> java.base", 166 "p.Foo" 167 ); 168 169 r = run("jdeps -v -R -cp Version.jar --module-path Foo.jar --multi-release 10 " + path); 170 checkResult(r, true, 171 name + " -> Version.jar", 172 name + " -> foo", 173 name + " -> java.base", 174 "Main", 175 "Main", 176 "Main", 177 "Main", 178 "Version.jar ->", 179 "10/test.Version", 180 "10/test.Version", 181 "10/test.Version", 182 "10/test.Version", 183 "9/test.NonPublic", 184 "9/test.NonPublic", 185 "foo", 186 "Foo.jar", 187 "requires mandated java.base", 188 "foo -> java.base", 189 "p.Foo" 190 ); 191 192 r = run("jdeps -v -R -cp Version.jar --module-path Foo.jar --multi-release base " + path); 193 checkResult(r, true, 194 name + " -> Version.jar", 195 name + " -> foo", 196 name + " -> java.base", 197 "Main", 198 "Main", 199 "Main", 200 "Main", 201 "Version.jar ->", 202 "test.Version", 203 "test.Version", 204 "foo", 205 "Foo.jar", 206 "requires mandated java.base", 207 "foo -> java.base", 208 "p.Foo" 209 ); 210 211 r = run("jdeps -v -R -cp Version.jar --module-path Foo.jar --multi-release 9.1 " + path); 212 checkResult(r, false, "Error: invalid argument for option: 9.1"); 213 214 // Version_9.jar does not have any version 10 entry 215 r = run("jdeps -v -R -cp Version_9.jar --module-path Foo.jar --multi-release 10 " + path); 216 checkResult(r, true, 217 name + " -> Version_9.jar", 218 name + " -> foo", 219 name + " -> java.base", 220 "Main", 221 "Main", 222 "Main", 223 "Main", 224 "Version_9.jar ->", 225 "9/test.NonPublic", 226 "9/test.NonPublic", 227 "9/test.Version", 228 "9/test.Version", 229 "9/test.Version", 230 "9/test.Version", 231 "foo", 232 "Foo.jar", 233 "requires mandated java.base", 234 "foo -> java.base", 235 "p.Foo" 236 ); 237 } 238 239 @Test 240 public void ps_and_qs() throws Exception { 241 // build the jar file 242 Result r = run("jar -cf PQ.jar -C base p --release 9 -C v9 p -C v9 q --release 10 -C v10 q"); 243 checkResult(r); 244 245 r = run("jdeps -v -R -cp PQ.jar --multi-release base PQ.jar"); 246 checkResult(r, true, 247 "PQ.jar -> java.base", 248 "p.Foo" 249 ); 250 251 r = run("jdeps -v -R -cp PQ.jar --multi-release 9 PQ.jar"); 252 checkResult(r, true, 253 "PQ.jar -> java.base", 254 "9/p.Foo", 255 "9/p.Foo", 256 "9/q.Bar" 257 ); 258 259 260 r = run("jdeps -v -R -cp PQ.jar --multi-release 10 PQ.jar"); 261 checkResult(r, true, 262 "PQ.jar -> java.base", 263 "10/q.Bar", 264 "10/q.Bar", 265 "10/q.Gee", 266 "9/p.Foo", 267 "9/p.Foo" 268 ); 269 } 270 271 @Test 272 public void modularJar() throws Exception { 273 Result r = run("jdeps -v --multi-release 10 --module-path Foo.jar -m foo"); 274 checkResult(r, true, 275 "foo", // module name 276 "Foo.jar", // the path to Foo.jar 277 "requires mandated java.base", // module dependences 278 "foo -> java.base", 279 "10/q.Bar", 280 "10/q.Bar", 281 "10/q.Gee", 282 "p.Foo" 283 ); 284 285 r = run("jdeps --multi-release 9 -cp Version.jar --module-path Foo.jar Main.jar"); 286 checkResult(r, true, 287 "Main.jar -> Version.jar", 288 "Main.jar -> foo", 289 "Main.jar -> java.base", 290 "-> java.lang", 291 "-> p", 292 "-> test" 293 ); 294 295 r = run("jdeps --multi-release 10 -cp Version.jar --module-path Foo.jar Main.jar"); 296 checkResult(r, true, 297 "Main.jar -> Version.jar", 298 "Main.jar -> foo", 299 "Main.jar -> java.base", 300 "-> java.lang", 301 "-> p", 302 "-> test" 303 ); 304 } 305 306 static class Result { 307 final String cmd; 308 final int rc; 309 final String out; 310 final String err; 311 Result(String cmd, int rc, String out, String err) { 312 this.cmd = cmd; 313 this.rc = rc; 314 this.out = out; 315 this.err = err; 316 } 317 } 318 319 Result run(String cmd) throws Exception { 320 String[] cmds = cmd.split(" +"); 321 cmds[0] = cmdPath.resolve(cmds[0]).toString(); 322 ProcessBuilder pb = new ProcessBuilder(cmds); |