test/jdk/sun/net/www/protocol/jar/MultiReleaseJarURLConnection.java
author aefimov
Tue, 14 May 2019 13:34:49 +0100
changeset 54841 43439afaab4a
parent 48690 374c63fbe652
permissions -rw-r--r--
8223638: Replace wildcard address with loopback or local host in tests - part 6 Reviewed-by: dfuchs
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
/*
54841
43439afaab4a 8223638: Replace wildcard address with loopback or local host in tests - part 6
aefimov
parents: 48690
diff changeset
     2
 * Copyright (c) 2015, 2019, 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 8159785 8194070
36129
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    27
 * @summary Test that URL connections to multi-release jars can be runtime versioned
54841
43439afaab4a 8223638: Replace wildcard address with loopback or local host in tests - part 6
aefimov
parents: 48690
diff changeset
    28
 * @library /lib/testlibrary/java/util/jar /test/lib
44358
d1d1a888d492 8177383: Wrong @modules in java/io/FilePermission/ReadFileOnPath.java
amlu
parents: 41355
diff changeset
    29
 * @modules jdk.compiler
38557
5c485e1ea6fa 8157635: Fix module dependencies for /sun/* tests
jjiang
parents: 38432
diff changeset
    30
 *          jdk.httpserver
5c485e1ea6fa 8157635: Fix module dependencies for /sun/* tests
jjiang
parents: 38432
diff changeset
    31
 *          jdk.jartool
37785
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
    32
 * @build Compiler JarBuilder CreateMultiReleaseTestJars SimpleHttpServer
36129
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    33
 * @run testng MultiReleaseJarURLConnection
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    34
 */
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    35
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    36
import java.io.IOException;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    37
import java.io.InputStream;
37785
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
    38
import java.lang.invoke.MethodHandle;
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
    39
import java.lang.invoke.MethodHandles;
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
    40
import java.lang.invoke.MethodType;
54841
43439afaab4a 8223638: Replace wildcard address with loopback or local host in tests - part 6
aefimov
parents: 48690
diff changeset
    41
import java.net.InetAddress;
36129
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    42
import java.net.JarURLConnection;
54841
43439afaab4a 8223638: Replace wildcard address with loopback or local host in tests - part 6
aefimov
parents: 48690
diff changeset
    43
import java.net.MalformedURLException;
43439afaab4a 8223638: Replace wildcard address with loopback or local host in tests - part 6
aefimov
parents: 48690
diff changeset
    44
import java.net.URI;
43439afaab4a 8223638: Replace wildcard address with loopback or local host in tests - part 6
aefimov
parents: 48690
diff changeset
    45
import java.net.URISyntaxException;
36129
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    46
import java.net.URL;
37785
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
    47
import java.net.URLClassLoader;
36129
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    48
import java.net.URLConnection;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    49
import java.nio.file.Files;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    50
import java.nio.file.Paths;
39052
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
    51
import java.util.Enumeration;
36129
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    52
import java.util.jar.JarFile;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    53
54841
43439afaab4a 8223638: Replace wildcard address with loopback or local host in tests - part 6
aefimov
parents: 48690
diff changeset
    54
import jdk.test.lib.net.URIBuilder;
43439afaab4a 8223638: Replace wildcard address with loopback or local host in tests - part 6
aefimov
parents: 48690
diff changeset
    55
36129
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    56
import org.testng.Assert;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    57
import org.testng.annotations.AfterClass;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    58
import org.testng.annotations.BeforeClass;
36236
eec5770c5b01 8150679: closed/javax/crypto/CryptoPermission/CallerIdentification.sh fails after fix for JDK-8132734
sdrach
parents: 36129
diff changeset
    59
import org.testng.annotations.DataProvider;
36129
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    60
import org.testng.annotations.Test;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    61
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    62
public class MultiReleaseJarURLConnection {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    63
    String userdir = System.getProperty("user.dir",".");
37785
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
    64
    String unversioned = userdir + "/unversioned.jar";
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
    65
    String unsigned = userdir + "/multi-release.jar";
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
    66
    String signed = userdir + "/signed-multi-release.jar";
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
    67
    SimpleHttpServer server;
36129
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    68
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    69
    @BeforeClass
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    70
    public void initialize() throws Exception {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    71
        CreateMultiReleaseTestJars creator = new CreateMultiReleaseTestJars();
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    72
        creator.compileEntries();
37785
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
    73
        creator.buildUnversionedJar();
36129
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    74
        creator.buildMultiReleaseJar();
36236
eec5770c5b01 8150679: closed/javax/crypto/CryptoPermission/CallerIdentification.sh fails after fix for JDK-8132734
sdrach
parents: 36129
diff changeset
    75
        creator.buildSignedMultiReleaseJar();
37785
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
    76
54841
43439afaab4a 8223638: Replace wildcard address with loopback or local host in tests - part 6
aefimov
parents: 48690
diff changeset
    77
        server = new SimpleHttpServer(InetAddress.getLoopbackAddress());
37785
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
    78
        server.start();
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
    79
36129
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    80
    }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    81
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    82
    @AfterClass
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
    83
    public void close() throws IOException {
37785
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
    84
        // Windows requires server to stop before file is deleted
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
    85
        if (server != null)
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
    86
            server.stop();
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
    87
        Files.delete(Paths.get(unversioned));
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
    88
        Files.delete(Paths.get(unsigned));
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
    89
        Files.delete(Paths.get(signed));
36129
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
36236
eec5770c5b01 8150679: closed/javax/crypto/CryptoPermission/CallerIdentification.sh fails after fix for JDK-8132734
sdrach
parents: 36129
diff changeset
    92
    @DataProvider(name = "data")
eec5770c5b01 8150679: closed/javax/crypto/CryptoPermission/CallerIdentification.sh fails after fix for JDK-8132734
sdrach
parents: 36129
diff changeset
    93
    public Object[][] createData() {
eec5770c5b01 8150679: closed/javax/crypto/CryptoPermission/CallerIdentification.sh fails after fix for JDK-8132734
sdrach
parents: 36129
diff changeset
    94
        return new Object[][]{
37785
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
    95
                {"unversioned", unversioned},
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
    96
                {"unsigned", unsigned},
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
    97
                {"signed", signed}
36236
eec5770c5b01 8150679: closed/javax/crypto/CryptoPermission/CallerIdentification.sh fails after fix for JDK-8132734
sdrach
parents: 36129
diff changeset
    98
        };
eec5770c5b01 8150679: closed/javax/crypto/CryptoPermission/CallerIdentification.sh fails after fix for JDK-8132734
sdrach
parents: 36129
diff changeset
    99
    }
eec5770c5b01 8150679: closed/javax/crypto/CryptoPermission/CallerIdentification.sh fails after fix for JDK-8132734
sdrach
parents: 36129
diff changeset
   100
eec5770c5b01 8150679: closed/javax/crypto/CryptoPermission/CallerIdentification.sh fails after fix for JDK-8132734
sdrach
parents: 36129
diff changeset
   101
    @Test(dataProvider = "data")
37785
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   102
    public void testRuntimeVersioning(String style, String file) throws Exception {
36236
eec5770c5b01 8150679: closed/javax/crypto/CryptoPermission/CallerIdentification.sh fails after fix for JDK-8132734
sdrach
parents: 36129
diff changeset
   103
        String urlFile = "jar:file:" + file + "!/";
37785
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   104
        String baseUrlEntry = urlFile + "version/Version.java";
38432
892603099bb0 8144062: Move jdk.Version to java.lang.Runtime.Version
iris
parents: 37785
diff changeset
   105
        String rtreturn = "return " + Runtime.version().major();
37785
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   106
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   107
        Assert.assertTrue(readAndCompare(new URL(baseUrlEntry), "return 8"));
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   108
        // #runtime is "magic" for a multi-release jar, but not for unversioned jar
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   109
        Assert.assertTrue(readAndCompare(new URL(baseUrlEntry + "#runtime"),
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   110
                style.equals("unversioned") ? "return 8" : rtreturn));
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   111
        // #fragment or any other fragment is not magic
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   112
        Assert.assertTrue(readAndCompare(new URL(baseUrlEntry + "#fragment"), "return 8"));
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   113
        // cached entities not affected
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   114
        Assert.assertTrue(readAndCompare(new URL(baseUrlEntry), "return 8"));
36236
eec5770c5b01 8150679: closed/javax/crypto/CryptoPermission/CallerIdentification.sh fails after fix for JDK-8132734
sdrach
parents: 36129
diff changeset
   115
37785
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   116
        // the following tests will not work with unversioned jars
48690
374c63fbe652 8194070: Update various tests to pass under JDK 11
darcy
parents: 47216
diff changeset
   117
        if (style.equals("unversioned"))
374c63fbe652 8194070: Update various tests to pass under JDK 11
darcy
parents: 47216
diff changeset
   118
            return;
37785
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   119
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   120
        // direct access to versioned entry
38432
892603099bb0 8144062: Move jdk.Version to java.lang.Runtime.Version
iris
parents: 37785
diff changeset
   121
        String versUrlEntry = urlFile + "META-INF/versions/" + Runtime.version().major()
37785
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   122
                + "/version/Version.java";
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   123
        Assert.assertTrue(readAndCompare(new URL(versUrlEntry), rtreturn));
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   124
        // adding any fragment does not change things
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   125
        Assert.assertTrue(readAndCompare(new URL(versUrlEntry + "#runtime"), rtreturn));
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   126
        Assert.assertTrue(readAndCompare(new URL(versUrlEntry + "#fragment"), rtreturn));
36129
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   127
    }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   128
36236
eec5770c5b01 8150679: closed/javax/crypto/CryptoPermission/CallerIdentification.sh fails after fix for JDK-8132734
sdrach
parents: 36129
diff changeset
   129
    @Test(dataProvider = "data")
37785
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   130
    public void testCachedJars(String style, String file) throws Exception {
36236
eec5770c5b01 8150679: closed/javax/crypto/CryptoPermission/CallerIdentification.sh fails after fix for JDK-8132734
sdrach
parents: 36129
diff changeset
   131
        String urlFile = "jar:file:" + file + "!/";
eec5770c5b01 8150679: closed/javax/crypto/CryptoPermission/CallerIdentification.sh fails after fix for JDK-8132734
sdrach
parents: 36129
diff changeset
   132
36129
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   133
        URL rootUrl = new URL(urlFile);
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   134
        JarURLConnection juc = (JarURLConnection)rootUrl.openConnection();
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   135
        JarFile rootJar = juc.getJarFile();
39646
2bf99fe5023b 8150680: JarFile.Release enum needs reconsideration with respect to it's values
sdrach
parents: 39052
diff changeset
   136
        Runtime.Version root = rootJar.getVersion();
36129
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
        URL runtimeUrl = new URL(urlFile + "#runtime");
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   139
        juc = (JarURLConnection)runtimeUrl.openConnection();
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   140
        JarFile runtimeJar = juc.getJarFile();
39646
2bf99fe5023b 8150680: JarFile.Release enum needs reconsideration with respect to it's values
sdrach
parents: 39052
diff changeset
   141
        Runtime.Version runtime = runtimeJar.getVersion();
37785
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   142
        if (style.equals("unversioned")) {
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   143
            Assert.assertEquals(root, runtime);
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   144
        } else {
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   145
            Assert.assertNotEquals(root, runtime);
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   146
        }
36129
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   147
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   148
        juc = (JarURLConnection)rootUrl.openConnection();
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   149
        JarFile jar = juc.getJarFile();
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   150
        Assert.assertEquals(jar.getVersion(), root);
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   151
        Assert.assertEquals(jar, rootJar);
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   152
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   153
        juc = (JarURLConnection)runtimeUrl.openConnection();
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   154
        jar = juc.getJarFile();
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   155
        Assert.assertEquals(jar.getVersion(), runtime);
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   156
        Assert.assertEquals(jar, runtimeJar);
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
        rootJar.close();
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   159
        runtimeJar.close();
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   160
        jar.close(); // probably not needed
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
37785
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   163
    @DataProvider(name = "resourcedata")
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   164
    public Object[][] createResourceData() throws Exception {
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   165
        return new Object[][]{
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   166
                {"unversioned", Paths.get(unversioned).toUri().toURL()},
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   167
                {"unsigned", Paths.get(unsigned).toUri().toURL()},
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   168
                {"signed", Paths.get(signed).toUri().toURL()},
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   169
                {"unversioned", new URL("file:" + unversioned)},
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   170
                {"unsigned", new URL("file:" + unsigned)},
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   171
                {"signed", new URL("file:" + signed)},
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   172
                {"unversioned", new URL("jar:file:" + unversioned + "!/")},
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   173
                {"unsigned", new URL("jar:file:" + unsigned + "!/")},
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   174
                {"signed", new URL("jar:file:" + signed + "!/")},
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   175
                // external jar received via http protocol
54841
43439afaab4a 8223638: Replace wildcard address with loopback or local host in tests - part 6
aefimov
parents: 48690
diff changeset
   176
                {"http", toHttpJarURL(server.getPort(), "/multi-release.jar", "!/")},
43439afaab4a 8223638: Replace wildcard address with loopback or local host in tests - part 6
aefimov
parents: 48690
diff changeset
   177
                {"http", URIBuilder.newBuilder().scheme("http").port(server.getPort())
43439afaab4a 8223638: Replace wildcard address with loopback or local host in tests - part 6
aefimov
parents: 48690
diff changeset
   178
                        .loopback().path("/multi-release.jar").toURL()},
37785
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   179
        };
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   180
    }
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   181
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   182
    @Test(dataProvider = "resourcedata")
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   183
    public void testResources(String style, URL url) throws Throwable {
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   184
        //System.out.println("  testing " + style + " url: " + url);
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   185
        URL[] urls = {url};
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   186
        URLClassLoader cldr = new URLClassLoader(urls);
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   187
        Class<?> vcls = cldr.loadClass("version.Version");
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   188
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   189
        // verify we are loading a runtime versioned class
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   190
        MethodType mt = MethodType.methodType(int.class);
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   191
        MethodHandle mh = MethodHandles.lookup().findVirtual(vcls, "getVersion", mt);
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   192
        Assert.assertEquals((int)mh.invoke(vcls.newInstance()),
38432
892603099bb0 8144062: Move jdk.Version to java.lang.Runtime.Version
iris
parents: 37785
diff changeset
   193
                style.equals("unversioned") ? 8 : Runtime.version().major());
37785
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   194
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   195
        // now get a resource and verify that we don't have a fragment attached
39052
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   196
        Enumeration<URL> vclsUrlEnum = cldr.getResources("version/Version.class");
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   197
        Assert.assertTrue(vclsUrlEnum.hasMoreElements());
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   198
        URL vclsUrls[] = new URL[] {
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   199
            vcls.getResource("/version/Version.class"),
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   200
            vcls.getResource("Version.class"),
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   201
            cldr.getResource("version/Version.class"),
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   202
            vclsUrlEnum.nextElement()
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   203
        };
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   204
        Assert.assertFalse(vclsUrlEnum.hasMoreElements());
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   205
        for (URL vclsUrl : vclsUrls) {
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   206
            String fragment = vclsUrl.getRef();
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   207
            Assert.assertNull(fragment);
37785
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   208
39052
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   209
            // and verify that the the url is a reified pointer to the runtime entry
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   210
            String rep = vclsUrl.toString();
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   211
            //System.out.println("    getResource(\"/version/Version.class\") returned: " + rep);
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   212
            if (style.equals("http")) {
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   213
                Assert.assertTrue(rep.startsWith("jar:http:"));
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   214
            } else {
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   215
                Assert.assertTrue(rep.startsWith("jar:file:"));
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   216
            }
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   217
            String suffix;
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   218
            if (style.equals("unversioned")) {
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   219
                suffix = ".jar!/version/Version.class";
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   220
            } else {
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   221
                suffix = ".jar!/META-INF/versions/" + Runtime.version().major()
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   222
                        + "/version/Version.class";
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   223
            }
6660a4142993 8159785: Add test that tests ClassLoader.getResource/getResources in Multi-Release Jar
mli
parents: 38557
diff changeset
   224
            Assert.assertTrue(rep.endsWith(suffix));
37785
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   225
        }
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   226
        cldr.close();
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   227
    }
daf6dcc73e9d 8151542: URL resources for multi-release jar files have a #runtime fragment appended to them
sdrach
parents: 36236
diff changeset
   228
54841
43439afaab4a 8223638: Replace wildcard address with loopback or local host in tests - part 6
aefimov
parents: 48690
diff changeset
   229
    private static URL toHttpJarURL(int port, String jar, String file)
43439afaab4a 8223638: Replace wildcard address with loopback or local host in tests - part 6
aefimov
parents: 48690
diff changeset
   230
            throws MalformedURLException, URISyntaxException {
43439afaab4a 8223638: Replace wildcard address with loopback or local host in tests - part 6
aefimov
parents: 48690
diff changeset
   231
        assert file.startsWith("!/");
43439afaab4a 8223638: Replace wildcard address with loopback or local host in tests - part 6
aefimov
parents: 48690
diff changeset
   232
        URI httpURI = URIBuilder.newBuilder()
43439afaab4a 8223638: Replace wildcard address with loopback or local host in tests - part 6
aefimov
parents: 48690
diff changeset
   233
                .scheme("http")
43439afaab4a 8223638: Replace wildcard address with loopback or local host in tests - part 6
aefimov
parents: 48690
diff changeset
   234
                .loopback()
43439afaab4a 8223638: Replace wildcard address with loopback or local host in tests - part 6
aefimov
parents: 48690
diff changeset
   235
                .port(port)
43439afaab4a 8223638: Replace wildcard address with loopback or local host in tests - part 6
aefimov
parents: 48690
diff changeset
   236
                .path(jar)
43439afaab4a 8223638: Replace wildcard address with loopback or local host in tests - part 6
aefimov
parents: 48690
diff changeset
   237
                .build();
43439afaab4a 8223638: Replace wildcard address with loopback or local host in tests - part 6
aefimov
parents: 48690
diff changeset
   238
        return new URL("jar:" + httpURI + file);
43439afaab4a 8223638: Replace wildcard address with loopback or local host in tests - part 6
aefimov
parents: 48690
diff changeset
   239
    }
43439afaab4a 8223638: Replace wildcard address with loopback or local host in tests - part 6
aefimov
parents: 48690
diff changeset
   240
36129
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   241
    private boolean readAndCompare(URL url, String match) throws Exception {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   242
        boolean result;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   243
        // necessary to do it this way, instead of openStream(), so we can
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   244
        // close underlying JarFile, otherwise windows can't delete the file
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   245
        URLConnection conn = url.openConnection();
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   246
        try (InputStream is = conn.getInputStream()) {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   247
            byte[] bytes = is.readAllBytes();
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   248
            result = (new String(bytes)).contains(match);
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   249
        }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   250
        if (conn instanceof JarURLConnection) {
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   251
            ((JarURLConnection)conn).getJarFile().close();
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   252
        }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   253
        return result;
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   254
    }
332b49163fc9 8132734: JDK 9 runtime changes to support multi-release jar files
sdrach
parents:
diff changeset
   255
}