From 45e7a1faa81a8231bca2d807e3e1748f29d2950d Mon Sep 17 00:00:00 2001 From: Kumar Srinivasan Date: Wed, 7 Sep 2016 10:58:22 -0700 Subject: [PATCH] 8151901: test/tools/pack200/Pack200Test fails on verifying native unpacked JAR Reviewed-by: jrose --- .../com/sun/java/util/jar/pack/Package.java | 5 +-- .../sun/java/util/jar/pack/PackageReader.java | 29 +++++++----------- jdk/test/ProblemList.txt | 2 -- jdk/test/tools/pack200/Pack200Test.java | 28 +++++++++-------- .../pack200/pack200-verifier/data/golden.jar | Bin 433984 -> 448228 bytes 5 files changed, 29 insertions(+), 35 deletions(-) diff --git a/jdk/src/java.base/share/classes/com/sun/java/util/jar/pack/Package.java b/jdk/src/java.base/share/classes/com/sun/java/util/jar/pack/Package.java index 12baf44fe58..1d1a273ef7d 100644 --- a/jdk/src/java.base/share/classes/com/sun/java/util/jar/pack/Package.java +++ b/jdk/src/java.base/share/classes/com/sun/java/util/jar/pack/Package.java @@ -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 @@ -476,7 +476,8 @@ class Package { } else if (localICs.isEmpty()) { // It was a non-empty diff, but the local ICs were absent. actualICs = null; - changed = 0; // [] => null, no tuple change + // [] => null, no tuple change, but attribute deletion. + changed = -1; } else { // Non-trivial diff was transmitted. actualICs = computeICdiff(); diff --git a/jdk/src/java.base/share/classes/com/sun/java/util/jar/pack/PackageReader.java b/jdk/src/java.base/share/classes/com/sun/java/util/jar/pack/PackageReader.java index 1a60f9e1047..bcb6cb1eb4d 100644 --- a/jdk/src/java.base/share/classes/com/sun/java/util/jar/pack/PackageReader.java +++ b/jdk/src/java.base/share/classes/com/sun/java/util/jar/pack/PackageReader.java @@ -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 @@ -1193,18 +1193,21 @@ class PackageReader extends BandStructure { cls.visitRefs(VRM_CLASSIC, cpRefs); ArrayList bsms = new ArrayList<>(); - /* - * BootstrapMethod(BSMs) are added here before InnerClasses(ICs), - * so as to ensure the order. Noting that the BSMs may be - * removed if they are not found in the CP, after the ICs expansion. - */ - cls.addAttribute(Package.attrBootstrapMethodsEmpty.canonicalInstance()); - // flesh out the local constant pool ConstantPool.completeReferencesIn(cpRefs, true, bsms); + // add the bsm and references as required + if (!bsms.isEmpty()) { + cls.addAttribute(Package.attrBootstrapMethodsEmpty.canonicalInstance()); + cpRefs.add(Package.getRefString("BootstrapMethods")); + Collections.sort(bsms); + cls.setBootstrapMethods(bsms); + } + // Now that we know all our local class references, // compute the InnerClasses attribute. + // An InnerClasses attribute usually gets added here, + // although it might already have been present. int changed = cls.expandLocalICs(); if (changed != 0) { @@ -1221,16 +1224,6 @@ class PackageReader extends BandStructure { ConstantPool.completeReferencesIn(cpRefs, true, bsms); } - // remove the attr previously set, otherwise add the bsm and - // references as required - if (bsms.isEmpty()) { - cls.attributes.remove(Package.attrBootstrapMethodsEmpty.canonicalInstance()); - } else { - cpRefs.add(Package.getRefString("BootstrapMethods")); - Collections.sort(bsms); - cls.setBootstrapMethods(bsms); - } - // construct a local constant pool int numDoubles = 0; for (Entry e : cpRefs) { diff --git a/jdk/test/ProblemList.txt b/jdk/test/ProblemList.txt index 38f2392ea0f..83515fad418 100644 --- a/jdk/test/ProblemList.txt +++ b/jdk/test/ProblemList.txt @@ -310,8 +310,6 @@ sanity/client/SwingSet/src/ButtonDemoScreenshotTest.java 8157338 generic- tools/pack200/CommandLineTests.java 7143279,8059906 generic-all -tools/pack200/Pack200Test.java 8059906,8151901 generic-all - tools/launcher/FXLauncherTest.java 8068049 linux-all,macosx-all tools/pack200/Pack200Props.java 8155857 generic-all diff --git a/jdk/test/tools/pack200/Pack200Test.java b/jdk/test/tools/pack200/Pack200Test.java index fb6d9b1f83d..5c50da1e503 100644 --- a/jdk/test/tools/pack200/Pack200Test.java +++ b/jdk/test/tools/pack200/Pack200Test.java @@ -21,6 +21,14 @@ * questions. */ + /* + * @test + * @bug 6521334 6712743 8007902 8151901 + * @summary test general packer/unpacker functionality + * using native and java unpackers + * @compile -XDignore.symbol.file Utils.java Pack200Test.java + * @run main/othervm/timeout=1200 -Xmx1280m -Xshare:off Pack200Test + */ import java.util.*; import java.io.*; @@ -28,17 +36,6 @@ import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; import java.util.jar.*; - /* - * @test - * @bug 6521334 6712743 8007902 - * @key intermittent - * @summary check for memory leaks, test general packer/unpacker functionality\ - * using native and java unpackers - * @compile -XDignore.symbol.file Utils.java Pack200Test.java - * @run main/othervm/timeout=1200 -Xmx1280m -Xshare:off Pack200Test - * @author ksrini - */ - /** * Tests the packing/unpacking via the APIs. */ @@ -48,6 +45,9 @@ public class Pack200Test { static final MemoryMXBean mmxbean = ManagementFactory.getMemoryMXBean(); static final long m0 = getUsedMemory(); static final int LEAK_TOLERANCE = 21000; // OS and GC related variations. + // enable leak checks only if required, GC charecteristics vary on + // platforms and this may not yield consistent results + static final boolean LEAK_CHECK = Boolean.getBoolean("Pack200Test.enableLeakCheck"); /** Creates a new instance of Pack200Test */ private Pack200Test() {} @@ -60,9 +60,11 @@ public class Pack200Test { } private static void leakCheck() throws Exception { + if (!LEAK_CHECK) + return; long diff = getUsedMemory() - m0; System.out.println(" Info: memory diff = " + diff + "K"); - if ( diff > LEAK_TOLERANCE) { + if (diff > LEAK_TOLERANCE) { throw new Exception("memory leak detected " + diff); } } @@ -126,7 +128,7 @@ public class Pack200Test { /** * @param args the command line arguments */ - public static void main(String[] args) throws IOException { + public static void main(String[] args) throws Exception { // select the jars carefully, adding more jars will increase the // testing time, especially for jprt. jarList.add(Utils.createRtJar()); diff --git a/jdk/test/tools/pack200/pack200-verifier/data/golden.jar b/jdk/test/tools/pack200/pack200-verifier/data/golden.jar index 511cc0f43ab044021c1ed5ff60b76f4da4472e0f..a80ea6621a6a1cfc79337de68898596e8d3fd20b 100644 GIT binary patch delta 15078 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 J71$D{e*vx`CIbKf