test/jdk/java/util/jar/JarFile/mrjar/MultiReleaseJarProperties.java
author darcy
Wed, 31 Jan 2018 11:25:34 -0800
changeset 48690 374c63fbe652
parent 47216 71c04702a3d5
permissions -rw-r--r--
8194070: Update various tests to pass under JDK 11 Reviewed-by: alanb, sherman, psandoz
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36129
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
     1
/*
48690
374c63fbe652 8194070: Update various tests to pass under JDK 11
darcy
parents: 47216
diff changeset
     2
 * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
36129
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
     4
 *
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
     7
 * published by the Free Software Foundation.
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
     8
 *
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    13
 * accompanied this code).
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    14
 *
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    18
 *
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    21
 * questions.
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    22
 */
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    23
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    24
/*
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    25
 * @test
48690
374c63fbe652 8194070: Update various tests to pass under JDK 11
darcy
parents: 47216
diff changeset
    26
 * @bug 8132734 8144062 8194070
36129
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    27
 * @summary Test the System properties for JarFile that support multi-release jar files
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    28
 * @library /lib/testlibrary/java/util/jar
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    29
 * @build Compiler JarBuilder CreateMultiReleaseTestJars
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    30
 * @run testng MultiReleaseJarProperties
48690
374c63fbe652 8194070: Update various tests to pass under JDK 11
darcy
parents: 47216
diff changeset
    31
 * @run testng/othervm -Djdk.util.jar.version=0   MultiReleaseJarProperties
374c63fbe652 8194070: Update various tests to pass under JDK 11
darcy
parents: 47216
diff changeset
    32
 * @run testng/othervm -Djdk.util.jar.version=8   MultiReleaseJarProperties
374c63fbe652 8194070: Update various tests to pass under JDK 11
darcy
parents: 47216
diff changeset
    33
 * @run testng/othervm -Djdk.util.jar.version=9   MultiReleaseJarProperties
36129
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    34
 * @run testng/othervm -Djdk.util.jar.version=100 MultiReleaseJarProperties
48690
374c63fbe652 8194070: Update various tests to pass under JDK 11
darcy
parents: 47216
diff changeset
    35
 * @run testng/othervm -Djdk.util.jar.version=8   -Djdk.util.jar.enableMultiRelease=false MultiReleaseJarProperties
374c63fbe652 8194070: Update various tests to pass under JDK 11
darcy
parents: 47216
diff changeset
    36
 * @run testng/othervm -Djdk.util.jar.version=9   -Djdk.util.jar.enableMultiRelease=false MultiReleaseJarProperties
374c63fbe652 8194070: Update various tests to pass under JDK 11
darcy
parents: 47216
diff changeset
    37
 * @run testng/othervm -Djdk.util.jar.version=8   -Djdk.util.jar.enableMultiRelease=force MultiReleaseJarProperties
374c63fbe652 8194070: Update various tests to pass under JDK 11
darcy
parents: 47216
diff changeset
    38
 * @run testng/othervm -Djdk.util.jar.version=9   -Djdk.util.jar.enableMultiRelease=force MultiReleaseJarProperties
36129
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    39
 * @run testng/othervm -Djdk.util.jar.enableMultiRelease=false MultiReleaseJarProperties
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    40
 * @run testng/othervm -Djdk.util.jar.enableMultiRelease=force MultiReleaseJarProperties
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    41
 */
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    42
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    43
import java.io.File;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    44
import java.io.IOException;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    45
import java.io.InputStream;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    46
import java.lang.invoke.MethodHandle;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    47
import java.lang.invoke.MethodHandles;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    48
import java.lang.invoke.MethodType;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    49
import java.net.URL;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    50
import java.net.URLClassLoader;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    51
import java.nio.file.Files;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    52
import java.util.jar.JarEntry;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    53
import java.util.jar.JarFile;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    54
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    55
import org.testng.Assert;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    56
import org.testng.annotations.AfterClass;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    57
import org.testng.annotations.BeforeClass;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    58
import org.testng.annotations.Test;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    59
36219
437e72684a42 8150976: JarFile and MRJAR tests should use the JDK specific Version API
chegar
parents: 36129
diff changeset
    60
39646
2bf99fe5023b 8150680: JarFile.Release enum needs reconsideration with respect to it's values
sdrach
parents: 38432
diff changeset
    61
public class MultiReleaseJarProperties {
2bf99fe5023b 8150680: JarFile.Release enum needs reconsideration with respect to it's values
sdrach
parents: 38432
diff changeset
    62
    final static int BASE_VERSION = JarFile.baseVersion().major();
36219
437e72684a42 8150976: JarFile and MRJAR tests should use the JDK specific Version API
chegar
parents: 36129
diff changeset
    63
36129
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    64
    final static String userdir = System.getProperty("user.dir", ".");
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    65
    final static File multirelease = new File(userdir, "multi-release.jar");
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    66
    protected int rtVersion;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    67
    boolean force;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    68
    protected ClassLoader cldr;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    69
    protected Class<?> rootClass;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    70
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    71
    @BeforeClass
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    72
    public void initialize() throws Exception {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    73
        CreateMultiReleaseTestJars creator =  new CreateMultiReleaseTestJars();
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    74
        creator.compileEntries();
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    75
        creator.buildMultiReleaseJar();
39646
2bf99fe5023b 8150680: JarFile.Release enum needs reconsideration with respect to it's values
sdrach
parents: 38432
diff changeset
    76
        int RUNTIME_VERSION = Runtime.version().major();
2bf99fe5023b 8150680: JarFile.Release enum needs reconsideration with respect to it's values
sdrach
parents: 38432
diff changeset
    77
        rtVersion = Integer.getInteger("jdk.util.jar.version", RUNTIME_VERSION);
36129
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    78
        String mrprop = System.getProperty("jdk.util.jar.enableMultiRelease", "");
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    79
        if (mrprop.equals("false")) {
39646
2bf99fe5023b 8150680: JarFile.Release enum needs reconsideration with respect to it's values
sdrach
parents: 38432
diff changeset
    80
            rtVersion = BASE_VERSION;
2bf99fe5023b 8150680: JarFile.Release enum needs reconsideration with respect to it's values
sdrach
parents: 38432
diff changeset
    81
        } else if (rtVersion < BASE_VERSION) {
2bf99fe5023b 8150680: JarFile.Release enum needs reconsideration with respect to it's values
sdrach
parents: 38432
diff changeset
    82
            rtVersion = BASE_VERSION;
2bf99fe5023b 8150680: JarFile.Release enum needs reconsideration with respect to it's values
sdrach
parents: 38432
diff changeset
    83
        } else if (rtVersion > RUNTIME_VERSION) {
2bf99fe5023b 8150680: JarFile.Release enum needs reconsideration with respect to it's values
sdrach
parents: 38432
diff changeset
    84
            rtVersion = RUNTIME_VERSION;
36129
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    85
        }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    86
        force = mrprop.equals("force");
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    87
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    88
        initializeClassLoader();
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    89
    }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    90
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    91
    protected void initializeClassLoader() throws Exception {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    92
        URL[] urls = new URL[]{multirelease.toURI().toURL()};
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    93
        cldr = new URLClassLoader(urls);
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    94
        // load any class, Main is convenient and in the root entries
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    95
        rootClass = cldr.loadClass("version.Main");
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    96
    }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    97
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    98
    @AfterClass
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    99
    public void close() throws IOException {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   100
        ((URLClassLoader)cldr).close();
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   101
        Files.delete(multirelease.toPath());
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   102
    }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   103
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   104
    /*
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   105
     * jdk.util.jar.enableMultiRelease=force is a no-op for URLClassLoader
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   106
     */
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   107
    @Test
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   108
    public void testURLClassLoader() throws Throwable {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   109
        Class<?> vcls = cldr.loadClass("version.Version");
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   110
        invokeMethod(vcls, rtVersion);
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   111
    }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   112
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   113
    protected void invokeMethod(Class<?> vcls, int expected) throws Throwable {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   114
        MethodType mt = MethodType.methodType(int.class);
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   115
        MethodHandle mh = MethodHandles.lookup().findVirtual(vcls, "getVersion", mt);
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   116
        Assert.assertEquals(expected, (int) mh.invoke(vcls.newInstance()));
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   117
    }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   118
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   119
    /*
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   120
     * jdk.util.jar.enableMultiRelease=force should affect a custom class loader
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   121
     */
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   122
    @Test
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   123
    public void testClassLoader() throws Throwable {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   124
        try (JarFile jf = new JarFile(multirelease)) {  // do not set runtime versioning
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   125
            ClassLoader cldr = new CustomClassLoader(jf);
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   126
            Class<?> vcls = cldr.loadClass("version.Version");
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   127
            if (rtVersion == 9) {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   128
                try {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   129
                    cldr.loadClass("version.PackagePrivate");
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   130
                } catch (ClassNotFoundException x) {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   131
                    if (force) throw x;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   132
                }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   133
            }
39646
2bf99fe5023b 8150680: JarFile.Release enum needs reconsideration with respect to it's values
sdrach
parents: 38432
diff changeset
   134
            invokeMethod(vcls, force ? rtVersion : BASE_VERSION);
36129
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   135
        }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   136
    }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   137
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   138
    private static class CustomClassLoader extends ClassLoader {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   139
        private final JarFile jf;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   140
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   141
        CustomClassLoader(JarFile jf) throws Exception {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   142
            super(null);
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   143
            this.jf = jf;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   144
        }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   145
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   146
        protected Class<?> findClass(String name) throws ClassNotFoundException {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   147
            try {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   148
                byte[] b;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   149
                String entryName = name.replace(".", "/") + ".class";
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   150
                JarEntry je = jf.getJarEntry(entryName);
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   151
                if (je != null) {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   152
                    try (InputStream is = jf.getInputStream(je)) {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   153
                        b = new byte[(int) je.getSize()];
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   154
                        is.read(b);
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   155
                    }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   156
                    return defineClass(name, b, 0, b.length);
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   157
                }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   158
                throw new ClassNotFoundException(name);
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   159
            } catch (IOException x) {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   160
                throw new ClassNotFoundException(x.getMessage());
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   161
            }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   162
        }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   163
    }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   164
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   165
    @Test
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   166
    public void testGetResourceAsStream() throws Exception {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   167
        String resource = rtVersion == 9 ? "/version/PackagePrivate.java" : "/version/Version.java";
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   168
        // use fileRootClass as a base for getting resources
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   169
        getResourceAsStream(rootClass, resource);
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   170
    }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   171
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   172
    protected void getResourceAsStream(Class<?> rootClass, String resource) throws Exception {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   173
        try (InputStream is = rootClass.getResourceAsStream(resource)) {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   174
            byte[] bytes = is.readAllBytes();
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   175
            resource = new String(bytes);
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   176
        }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   177
        String match = "return " + rtVersion + ";";
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   178
        Assert.assertTrue(resource.contains(match));
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   179
    }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   180
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   181
    @Test
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   182
    public void testGetResource() throws Exception {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   183
        String resource = rtVersion == 9 ? "/version/PackagePrivate.java" : "/version/Version.java";
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   184
        // use rootClass as a base for getting resources
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   185
        getResource(rootClass, resource);
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   186
    }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   187
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   188
    protected void getResource(Class<?> rootClass, String resource) throws Exception {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   189
        URL url = rootClass.getResource(resource);
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   190
        try (InputStream is = url.openStream()) {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   191
            byte[] bytes = is.readAllBytes();
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   192
            resource = new String(bytes);
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   193
        }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   194
        String match = "return " + rtVersion + ";";
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   195
        Assert.assertTrue(resource.contains(match));
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   196
    }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   197
}