< prev index next >

test/tools/jimage/VerifyJimage.java

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.

@@ -47,11 +47,11 @@
 
 /*
  * @test
  * @summary Verify jimage
  * @modules java.base/jdk.internal.jimage
- * @run main/othervm --add-modules=ALL-SYSTEM,jdk.incubator.httpclient VerifyJimage
+ * @run main/othervm --add-modules ALL-SYSTEM VerifyJimage
  */
 
 /**
  * This test runs in two modes:
  * (1) No argument: it verifies the jimage by loading all classes in the runtime

@@ -74,12 +74,12 @@
              return;
         }
 
         long start = System.nanoTime();
         int numThreads = Integer.getInteger("jdk.test.threads", 1);
-        List<JImageReader> readers = newJImageReaders();
-        VerifyJimage verify = new VerifyJimage(readers, numThreads);
+        JImageReader reader = newJImageReader();
+        VerifyJimage verify = new VerifyJimage(reader, numThreads);
         if (args.length == 0) {
             // load classes from jimage
             verify.loadClasses();
         } else {
             Path dir = Paths.get(args[0]);

@@ -88,13 +88,11 @@
             }
             verify.compareExplodedModules(dir);
         }
         verify.waitForCompletion();
         long end = System.nanoTime();
-        int entries = readers.stream()
-                             .mapToInt(JImageReader::entries)
-                             .sum();
+        int entries = reader.entries();
         System.out.format("%d entries %d files verified: %d ms %d errors%n",
                           entries, verify.count.get(),
                           TimeUnit.NANOSECONDS.toMillis(end - start), failed.size());
         for (String f : failed) {
             System.err.println(f);

@@ -103,15 +101,15 @@
             throw new AssertionError("Test failed");
         }
     }
 
     private final AtomicInteger count = new AtomicInteger(0);
-    private final List<JImageReader> readers;
+    private final JImageReader reader;
     private final ExecutorService pool;
 
-    VerifyJimage(List<JImageReader> readers, int numThreads) {
-        this.readers = readers;
+    VerifyJimage(JImageReader reader, int numThreads) {
+        this.reader = reader;
         this.pool = Executors.newFixedThreadPool(numThreads);
     }
 
     private void waitForCompletion() throws InterruptedException {
         pool.shutdown();

@@ -130,11 +128,11 @@
                             try {
                                 Files.find(mdir, Integer.MAX_VALUE, (Path p, BasicFileAttributes attr)
                                            -> !Files.isDirectory(p) &&
                                               !mdir.relativize(p).toString().startsWith("_") &&
                                               !p.getFileName().toString().equals("MANIFEST.MF"))
-                                     .forEach(p -> compare(mdir, p, readers));
+                                     .forEach(p -> compare(mdir, p, reader));
                             } catch (IOException e) {
                                 throw new UncheckedIOException(e);
                             }
                         }
                     });

@@ -152,11 +150,11 @@
     private final List<String> APP_RESOURCES = Arrays.asList(
         "jdk.hotspot.agent/META-INF/services/com.sun.jdi.connect.Connector",
         "jdk.jdi/META-INF/services/com.sun.jdi.connect.Connector"
     );
 
-    private void compare(Path mdir, Path p, List<JImageReader> readers) {
+    private void compare(Path mdir, Path p, JImageReader reader) {
         String entry = p.getFileName().toString().equals(MODULE_INFO)
                 ? mdir.getFileName().toString() + "/" + MODULE_INFO
                 : mdir.relativize(p).toString().replace(File.separatorChar, '/');
 
         count.incrementAndGet();

@@ -165,29 +163,21 @@
             // skip until the service config file is merged
             System.out.println("Skipped " + file);
             return;
         }
 
-        String jimage = "modules";
-        JImageReader reader = readers.stream()
-                .filter(r -> r.findLocation(entry) != null)
-                .filter(r -> jimage.isEmpty() || r.imageName().equals(jimage))
-                .findFirst().orElse(null);
-        if (reader == null) {
-            failed.add(entry + " not found: " + p.getFileName().toString());
-        } else {
+        if (reader.findLocation(entry) != null) {
             reader.compare(entry, p);
         }
     }
 
     private void loadClasses() {
         ClassLoader loader = ClassLoader.getSystemClassLoader();
-        for (JImageReader reader : readers) {
-            Arrays.stream(reader.getEntryNames())
-                    .filter(n -> n.endsWith(".class") && !n.endsWith(MODULE_INFO))
-                    .forEach(n -> {
-                        String cn = removeModule(n).replaceAll("\\.class$", "").replace('/', '.');
+        Stream.of(reader.getEntryNames())
+              .filter(this::accept)
+              .map(this::toClassName)
+              .forEach(cn -> {
                         count.incrementAndGet();
                         try {
                             System.out.println("Loading " + cn);
                             Class.forName(cn, false, loader);
                         } catch (VerifyError ve) {

@@ -196,25 +186,36 @@
                         } catch (ClassNotFoundException e) {
                             failed.add(reader.imageName() + ": " + cn + " not found");
                         }
                     });
         }
+
+    private String toClassName(String entry) {
+        int index = entry.indexOf('/', 1);
+        return entry.substring(index + 1, entry.length())
+                    .replaceAll("\\.class$", "").replace('/', '.');
     }
 
-    private String removeModule(String path) {
-        int index = path.indexOf('/', 1);
-        return path.substring(index + 1, path.length());
+    private static Set<String> DEPLOY_MODULES =
+        Set.of("javafx.deploy", "jdk.deploy", "jdk.plugin", "jdk.javaws");
+
+    private boolean accept(String entry) {
+        int index = entry.indexOf('/', 1);
+        String mn = index > 1 ? entry.substring(1, index) : "";
+        // filter deployment modules
+
+        if (mn.isEmpty() || DEPLOY_MODULES.contains(mn)) {
+            return false;
+        }
+        return entry.endsWith(".class") && !entry.endsWith(MODULE_INFO);
     }
 
-    private static List<JImageReader> newJImageReaders() throws IOException {
+    private static JImageReader newJImageReader() throws IOException {
         String home = System.getProperty("java.home");
         Path jimage = Paths.get(home, "lib", "modules");
-        JImageReader reader = new JImageReader(jimage);
-        List<JImageReader> result = new ArrayList<>();
         System.out.println("opened " + jimage);
-        result.add(reader);
-        return result;
+        return new JImageReader(jimage);
     }
 
     static class JImageReader extends BasicImageReader {
         final Path jimage;
         JImageReader(Path p) throws IOException {
< prev index next >