8156807: Pack200 must support v53.0 class files
authorksrini
Wed, 18 May 2016 11:31:23 -0700
changeset 38421 f75f729fdc5c
parent 38420 bd42ddec1aaa
child 38422 638589997770
8156807: Pack200 must support v53.0 class files Reviewed-by: mchung, shade
jdk/src/java.base/share/classes/com/sun/java/util/jar/pack/Constants.java
jdk/src/jdk.pack200/share/native/common-unpack/constants.h
jdk/test/ProblemList.txt
jdk/test/tools/pack200/TestNormal.java
jdk/test/tools/pack200/Utils.java
--- a/jdk/src/java.base/share/classes/com/sun/java/util/jar/pack/Constants.java	Wed May 18 16:36:52 2016 -0700
+++ b/jdk/src/java.base/share/classes/com/sun/java/util/jar/pack/Constants.java	Wed May 18 11:31:23 2016 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2016, 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
@@ -43,9 +43,10 @@
         1.0 to 1.3.X 45,3
         1.4 to 1.4.X 46,0
         1.5 to 1.5.X 49,0
-        1.6 to 1.5.x 50,0
-        1.7 to 1.6.x 51,0
-        1.8 to 1.7.x 52,0
+        1.6 to 1.6.X 50,0
+        1.7 to 1.7.X 51,0
+        1.8 to 1.8.X 52,0
+        1.9 to 1.9.X 53,0
     */
 
     public static final Package.Version JAVA_MIN_CLASS_VERSION =
@@ -63,6 +64,9 @@
     public static final Package.Version JAVA8_MAX_CLASS_VERSION =
             Package.Version.of(52, 00);
 
+    public static final Package.Version JAVA9_MAX_CLASS_VERSION =
+            Package.Version.of(53, 00);
+
     public static final int JAVA_PACKAGE_MAGIC = 0xCAFED00D;
 
     public static final Package.Version JAVA5_PACKAGE_VERSION =
@@ -79,7 +83,7 @@
 
     // upper limit, should point to the latest class version
     public static final Package.Version JAVA_MAX_CLASS_VERSION =
-            JAVA8_MAX_CLASS_VERSION;
+            JAVA9_MAX_CLASS_VERSION;
 
     // upper limit should point to the latest package version, for version info!.
     public static final Package.Version MAX_PACKAGE_VERSION =
--- a/jdk/src/jdk.pack200/share/native/common-unpack/constants.h	Wed May 18 16:36:52 2016 -0700
+++ b/jdk/src/jdk.pack200/share/native/common-unpack/constants.h	Wed May 18 11:31:23 2016 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2016, 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
@@ -23,30 +23,10 @@
  * questions.
  */
 
-/*
-  Java Class Version numbers history
-  1.0 to 1.3.X 45,3
-  1.4 to 1.4.X 46,0
-  1.5 to 1.5.X 49,0
-  1.6 to 1.5.x 50,0 NOTE Assumed for now
-*/
-
 // classfile constants
 #define JAVA_MAGIC 0xCAFEBABE
-#define JAVA_MIN_MAJOR_VERSION 45
-#define JAVA_MIN_MINOR_VERSION 3
 
-#define JAVA5_MAX_MAJOR_VERSION 49
-#define JAVA5_MAX_MINOR_VERSION 0
-
-#define JAVA6_MAX_MAJOR_VERSION 50
-#define JAVA6_MAX_MINOR_VERSION 0
-
-#define JAVA7_MAX_MAJOR_VERSION 51
-#define JAVA7_MAX_MINOR_VERSION 0
-
-#define JAVA8_MAX_MAJOR_VERSION 52
-#define JAVA8_MAX_MINOR_VERSION 0
+// Class version history, refer to Constants.java
 
 // package file constants
 #define JAVA_PACKAGE_MAGIC 0xCAFED00D
--- a/jdk/test/ProblemList.txt	Wed May 18 16:36:52 2016 -0700
+++ b/jdk/test/ProblemList.txt	Wed May 18 11:31:23 2016 -0700
@@ -332,8 +332,6 @@
 
 tools/pack200/Pack200Props.java                                 8155857 generic-all
 
-tools/pack200/TestNormal.java                                   8156807 windows-all
-
 ############################################################################
 
 # jdk_jdi
--- a/jdk/test/tools/pack200/TestNormal.java	Wed May 18 16:36:52 2016 -0700
+++ b/jdk/test/tools/pack200/TestNormal.java	Wed May 18 11:31:23 2016 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2016, 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
@@ -25,85 +25,37 @@
 /*
  * @test
  * @run main/timeout=600 TestNormal
- * @bug 8020802
+ * @bug 8020802 8156807
  * @summary Need an ability to create jar files that are invariant to the pack200 packing/unpacking
  * @author Alexander Zuev
  */
 
 import java.io.*;
-import java.util.Collections;
-import java.util.Properties;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
 
 public class TestNormal {
     private static String FS = File.separator;
 
     public static void main(String args[]) throws Exception {
-        Properties p = System.getProperties();
-        String java_home = p.getProperty("test.jdk");
         String testdir = Utils.TEST_CLS_DIR.getAbsolutePath();
 
         try {
-            execJavaCommand(java_home, "jar cnf normalized.jar -C " + testdir + " .");
-            execJavaCommand(java_home, "jar cf original.jar -C " + testdir + " .");
-            execJavaCommand(java_home, "pack200 -r repacked.jar original.jar");
-            compareJars(new JarFile("normalized.jar"), new JarFile("repacked.jar"));
-        } finally {
-            String[] cleanupList = {"normalized.jar", "original.jar", "repacked.jar"};
-            for (String s : cleanupList) {
-                delete(new File(s));
-            }
-        }
-    }
+            String jarCmd = Utils.getJarCmd();
+            String packCmd = Utils.getPack200Cmd();
 
-    public static void execJavaCommand(String java_home, String cmd) throws Exception {
-        Process proc = Runtime.getRuntime().exec(java_home + FS + "bin" + FS + cmd);
-        String s;
-        BufferedReader stdInput =
-                new BufferedReader(new InputStreamReader(proc.getInputStream()));
-        BufferedReader stdError =
-                new BufferedReader(new InputStreamReader(proc.getErrorStream()));
-        while ((s = stdInput.readLine()) != null) {
-            System.out.println(s);
-        }
-        while ((s = stdError.readLine()) != null) {
-            System.err.println(s);
-        }
-    }
+            // create the original jar
+            Utils.runExec(jarCmd, "cf", "original.jar", "-C", testdir, ".");
+
+            // create the reference jar
+            Utils.runExec(packCmd, "-r", "repacked.jar", "original.jar");
 
-    public static void compareJars(JarFile jf1, JarFile jf2) throws Exception {
-        try {
-            if (jf1.size() != jf2.size()) {
-                throw new Exception("Jars " + jf1.getName() + " and " + jf2.getName()
-                        + " have different number of entries");
-            }
-            for (JarEntry elem1 : Collections.list(jf1.entries())) {
-                JarEntry elem2 = jf2.getJarEntry(elem1.getName());
-                if (elem2 == null) {
-                    throw new Exception("Element " + elem1.getName() + " is missing from " + jf2.getName());
-                }
-                if (!elem1.isDirectory() && elem1.getCrc() != elem2.getCrc()) {
-                    throw new Exception("The crc of " + elem1.getName() + " is different.");
-                }
-            }
+            // create the normalized jar using jar(1)
+            Utils.runExec(jarCmd, "cnf", "normalized.jar", "-C", testdir, ".");
+
+            // compare archive contents bit wise, these should be identical!
+            Utils.doCompareBitWise(new File("repacked.jar"),
+                    new File("normalized.jar"));
         } finally {
-            jf1.close();
-            jf2.close();
-        }
-    }
-
-    static void delete(File f) throws IOException {
-        if (!f.exists()) {
-            return;
-        }
-        if (f.isDirectory()) {
-            for (File c : f.listFiles()) {
-                delete(c);
-            }
-        }
-        if (!f.delete()) {
-            throw new FileNotFoundException("Failed to delete file: " + f);
+           Utils.cleanup();
         }
     }
 }
--- a/jdk/test/tools/pack200/Utils.java	Wed May 18 16:36:52 2016 -0700
+++ b/jdk/test/tools/pack200/Utils.java	Wed May 18 11:31:23 2016 -0700
@@ -33,7 +33,6 @@
 import java.io.InputStreamReader;
 import java.io.PrintStream;
 import java.net.URI;
-import java.net.URL;
 import java.nio.charset.Charset;
 import java.nio.file.attribute.BasicFileAttributes;
 import java.nio.file.FileSystem;
@@ -483,9 +482,15 @@
         }
         return out;
     }
+
+    static List<String> runExec(String... cmds) {
+        return runExec(Arrays.asList(cmds));
+    }
+
     static List<String> runExec(List<String> cmdsList) {
         return runExec(cmdsList, null);
     }
+
     static List<String> runExec(List<String> cmdsList, Map<String, String> penv) {
         ArrayList<String> alist = new ArrayList<String>();
         ProcessBuilder pb =