8156807: Pack200 must support v53.0 class files

Reviewed-by: mchung, shade
This commit is contained in:
Kumar Srinivasan 2016-05-18 11:31:23 -07:00
parent 4dcf9fd923
commit ca98819c49
5 changed files with 35 additions and 96 deletions

View File

@ -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 @@ class Constants {
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 @@ class Constants {
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 @@ class Constants {
// 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 =

View File

@ -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

View File

@ -332,8 +332,6 @@ tools/launcher/FXLauncherTest.java 8068049 linux-al
tools/pack200/Pack200Props.java 8155857 generic-all
tools/pack200/TestNormal.java 8156807 windows-all
############################################################################
# jdk_jdi

View File

@ -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"));
String jarCmd = Utils.getJarCmd();
String packCmd = Utils.getPack200Cmd();
// create the original jar
Utils.runExec(jarCmd, "cf", "original.jar", "-C", testdir, ".");
// create the reference jar
Utils.runExec(packCmd, "-r", "repacked.jar", "original.jar");
// 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 {
String[] cleanupList = {"normalized.jar", "original.jar", "repacked.jar"};
for (String s : cleanupList) {
delete(new File(s));
}
}
}
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);
}
}
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.");
}
}
} 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();
}
}
}

View File

@ -33,7 +33,6 @@ import java.io.InputStream;
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 @@ class Utils {
}
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 =