test/runtime/classFileParserBug/TestEmptyBootstrapMethodsAttr.java

Thu, 15 May 2014 09:25:27 -0400

author
lfoltan
date
Thu, 15 May 2014 09:25:27 -0400
changeset 6677
366c198c896d
parent 0
f90c822e73f8
permissions
-rw-r--r--

8041918: BootstrapMethods attribute cannot be empty.
Summary: Allow a BootstrapMethods attribute that contains an empty bootstrap_methods table where num_bootstrap_methods is equal to zero.
Reviewed-by: coleenp, hseigel

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 4 *
aoqi@0 5 * This code is free software; you can redistribute it and/or modify it
aoqi@0 6 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 7 * published by the Free Software Foundation.
aoqi@0 8 *
aoqi@0 9 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 12 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 13 * accompanied this code).
aoqi@0 14 *
aoqi@0 15 * You should have received a copy of the GNU General Public License version
aoqi@0 16 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 18 *
aoqi@0 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 20 * or visit www.oracle.com if you need additional information or have any
aoqi@0 21 * questions.
aoqi@0 22 */
aoqi@0 23
aoqi@0 24 /*
aoqi@0 25 * @test TestEmptyBootstrapMethodsAttr
aoqi@0 26 * @bug 8041918
aoqi@0 27 * @library /testlibrary
aoqi@0 28 * @summary Test empty bootstrap_methods table within BootstrapMethods attribute
aoqi@0 29 * @compile TestEmptyBootstrapMethodsAttr.java
aoqi@0 30 * @run main TestEmptyBootstrapMethodsAttr
aoqi@0 31 */
aoqi@0 32
aoqi@0 33 import java.io.File;
aoqi@0 34 import com.oracle.java.testlibrary.*;
aoqi@0 35
aoqi@0 36 public class TestEmptyBootstrapMethodsAttr {
aoqi@0 37
aoqi@0 38 public static void main(String args[]) throws Throwable {
aoqi@0 39 System.out.println("Regression test for bug 8041918");
aoqi@0 40 String jarFile = System.getProperty("test.src") + File.separator + "emptynumbootstrapmethods.jar";
aoqi@0 41
aoqi@0 42 // ====== extract the test case
aoqi@0 43 ProcessBuilder pb = new ProcessBuilder(new String[] { JDKToolFinder.getJDKTool("jar"), "xvf", jarFile } );
aoqi@0 44 OutputAnalyzer output = new OutputAnalyzer(pb.start());
aoqi@0 45 output.shouldHaveExitValue(0);
aoqi@0 46
aoqi@0 47 // Test case #1:
aoqi@0 48 // Try loading class with empty bootstrap_methods table where no
aoqi@0 49 // other attributes are following BootstrapMethods in attribute table.
aoqi@0 50 String className = "emptynumbootstrapmethods1";
aoqi@0 51
aoqi@0 52 // ======= execute test case #1
aoqi@0 53 // Expect a lack of main method, this implies that the class loaded correctly
aoqi@0 54 // with an empty bootstrap_methods and did not generate a ClassFormatError.
aoqi@0 55 pb = ProcessTools.createJavaProcessBuilder("-cp", ".", className);
aoqi@0 56 output = new OutputAnalyzer(pb.start());
aoqi@0 57 output.shouldNotContain("java.lang.ClassFormatError");
aoqi@0 58 output.shouldContain("Main method not found in class " + className);
aoqi@0 59 output.shouldHaveExitValue(1);
aoqi@0 60
aoqi@0 61 // Test case #2:
aoqi@0 62 // Try loading class with empty bootstrap_methods table where an
aoqi@0 63 // AnnotationDefault attribute follows the BootstrapMethods in the attribute table.
aoqi@0 64 className = "emptynumbootstrapmethods2";
aoqi@0 65
aoqi@0 66 // ======= execute test case #2
aoqi@0 67 // Expect a lack of main method, this implies that the class loaded correctly
aoqi@0 68 // with an empty bootstrap_methods and did not generate ClassFormatError.
aoqi@0 69 pb = ProcessTools.createJavaProcessBuilder("-cp", ".", className);
aoqi@0 70 output = new OutputAnalyzer(pb.start());
aoqi@0 71 output.shouldNotContain("java.lang.ClassFormatError");
aoqi@0 72 output.shouldContain("Main method not found in class " + className);
aoqi@0 73 output.shouldHaveExitValue(1);
aoqi@0 74 }
aoqi@0 75 }

mercurial