test/tools/jmod/JmodTest.java

Print this page
rev 16200 : 8166568: jmod tool needs extract option
8169492: jdk.internal.jmod.JmodFile.JMOD_MAGIC_NUMBER is a mutable array
Reviewed-by:

@@ -133,10 +133,33 @@
                 assertContains(r.output, CLASSES_PREFIX + "jdk/test/foo/resources/foo.properties");
             });
     }
 
     @Test
+    public void testExtract() throws IOException {
+        Path cp = EXPLODED_DIR.resolve("foo").resolve("classes");
+        jmod("create",
+             "--class-path", cp.toString(),
+             MODS_DIR.resolve("fooExtract.jmod").toString())
+            .assertSuccess();
+
+        jmod("extract",
+             MODS_DIR.resolve("fooExtract.jmod").toString())
+            .assertSuccess()
+            .resultChecker(r -> {
+                // module-info should exist, but jmod will have added its Packages attr.
+                assertTrue(Files.exists(Paths.get("classes/module-info.class")));
+                assertSameContent(cp.resolve("jdk/test/foo/Foo.class"),
+                                  Paths.get("classes/jdk/test/foo/Foo.class"));
+                assertSameContent(cp.resolve("jdk/test/foo/internal/Message.class"),
+                                  Paths.get("classes/jdk/test/foo/internal/Message.class"));
+                assertSameContent(cp.resolve("jdk/test/foo/resources/foo.properties"),
+                                  Paths.get("classes/jdk/test/foo/resources/foo.properties"));
+            });
+    }
+
+    @Test
     public void testMainClass() throws IOException {
         Path jmod = MODS_DIR.resolve("fooMainClass.jmod");
         FileUtils.deleteFileIfExistsWithRetry(jmod);
         String cp = EXPLODED_DIR.resolve("foo").resolve("classes").toString();
 

@@ -530,10 +553,20 @@
                 sb.append("\t" + s + "\n");
             assertTrue(false, "Jmod content check failed.\n" + sb.toString());
         }
     }
 
+    static void assertSameContent(Path p1, Path p2) {
+        try {
+            byte[] ba1 = Files.readAllBytes(p1);
+            byte[] ba2 = Files.readAllBytes(p2);
+            assertEquals(ba1, ba2);
+        } catch (IOException x) {
+            throw new UncheckedIOException(x);
+        }
+    }
+
     static JmodResult jmod(String... args) {
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         PrintStream ps = new PrintStream(baos);
         System.out.println("jmod " + Arrays.asList(args));
         int ec = JMOD_TOOL.run(ps, ps, args);