test/jdk/java/util/jar/JarFile/mrjar/TestVersionedStream.java
author darcy
Wed, 27 Jun 2018 21:01:12 -0700
changeset 50892 a5557f24b4d4
parent 47987 85ea7e83af30
child 52046 2a85adf3c330
permissions -rw-r--r--
8205615: Start of release updates for JDK 12 8205621: Increment JDK version for JDK 12 8193292: Add SourceVersion.RELEASE_12 8193290: Add source 12 and target 12 to javac 8205619: Bump maximum recognized class file version to 56 for JDK 12 Reviewed-by: alanb, smarks, jjg, mr, erikj, psandoz, dholmes Contributed-by: erik.joelsson@oracle.com, mikael.vidstedt@oracle.com, joe.darcy@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
47987
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
     1
/*
50892
a5557f24b4d4 8205615: Start of release updates for JDK 12
darcy
parents: 47987
diff changeset
     2
 * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
47987
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
     4
 *
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
     7
 * published by the Free Software Foundation.
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
     8
 *
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    13
 * accompanied this code).
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    14
 *
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    18
 *
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    21
 * questions.
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    22
 */
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    23
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    24
/*
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    25
 * @test
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    26
 * @bug 8163798 8189611
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    27
 * @summary basic tests for multi-release jar versioned streams
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    28
 * @library /test/lib
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    29
 * @modules jdk.jartool/sun.tools.jar java.base/jdk.internal.util.jar
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    30
 * @build jdk.test.lib.Platform
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    31
 *        jdk.test.lib.util.FileUtils
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    32
 * @run testng TestVersionedStream
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    33
 */
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    34
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    35
import org.testng.Assert;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    36
import org.testng.annotations.AfterClass;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    37
import org.testng.annotations.DataProvider;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    38
import org.testng.annotations.Test;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    39
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    40
import java.io.File;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    41
import java.io.IOException;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    42
import java.io.InputStream;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    43
import java.io.UncheckedIOException;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    44
import java.nio.file.Files;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    45
import java.nio.file.Path;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    46
import java.nio.file.Paths;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    47
import java.util.ArrayList;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    48
import java.util.Arrays;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    49
import java.util.HashMap;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    50
import java.util.Iterator;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    51
import java.util.LinkedHashSet;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    52
import java.util.List;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    53
import java.util.Map;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    54
import java.util.Set;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    55
import java.util.jar.JarEntry;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    56
import java.util.jar.JarFile;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    57
import java.util.stream.Collectors;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    58
import java.util.stream.Stream;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    59
import java.util.zip.ZipFile;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    60
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    61
import jdk.test.lib.util.FileUtils;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    62
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    63
public class TestVersionedStream {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    64
    private final Path userdir;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    65
    private final Set<String> unversionedEntryNames;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    66
50892
a5557f24b4d4 8205615: Start of release updates for JDK 12
darcy
parents: 47987
diff changeset
    67
    private static final int LATEST_VERSION = Runtime.version().feature();
a5557f24b4d4 8205615: Start of release updates for JDK 12
darcy
parents: 47987
diff changeset
    68
47987
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    69
    public TestVersionedStream() throws IOException {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    70
        userdir = Paths.get(System.getProperty("user.dir", "."));
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    71
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    72
        // These are not real class files even though they end with .class.
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    73
        // They are resource files so jar tool validation won't reject them.
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    74
        // But they are what we want to test, especially q/Bar.class that
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    75
        // could be in a concealed package if this was a modular multi-release
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    76
        // jar.
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    77
        createFiles(
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    78
                "base/p/Bar.class",
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    79
                "base/p/Foo.class",
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    80
                "base/p/Main.class",
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    81
                "v9/p/Foo.class",
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    82
                "v10/p/Foo.class",
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    83
                "v10/q/Bar.class",
50892
a5557f24b4d4 8205615: Start of release updates for JDK 12
darcy
parents: 47987
diff changeset
    84
                "v" + LATEST_VERSION + "/p/Bar.class",
a5557f24b4d4 8205615: Start of release updates for JDK 12
darcy
parents: 47987
diff changeset
    85
                "v" + LATEST_VERSION + "/p/Foo.class"
47987
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    86
        );
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    87
50892
a5557f24b4d4 8205615: Start of release updates for JDK 12
darcy
parents: 47987
diff changeset
    88
        jar("cf mmr.jar -C base . " +
a5557f24b4d4 8205615: Start of release updates for JDK 12
darcy
parents: 47987
diff changeset
    89
            "--release 9 -C v9 . " +
a5557f24b4d4 8205615: Start of release updates for JDK 12
darcy
parents: 47987
diff changeset
    90
            "--release 10 -C v10 . " +
a5557f24b4d4 8205615: Start of release updates for JDK 12
darcy
parents: 47987
diff changeset
    91
            "--release " + LATEST_VERSION + " -C v" + LATEST_VERSION + " .");
47987
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    92
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    93
        System.out.println("Contents of mmr.jar\n=======");
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    94
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    95
        try(JarFile jf = new JarFile("mmr.jar")) {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    96
            unversionedEntryNames = jf.stream()
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    97
                    .map(je -> je.getName())
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    98
                    .peek(System.out::println)
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
    99
                    .map(nm -> nm.startsWith("META-INF/versions/")
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   100
                            ? nm.replaceFirst("META-INF/versions/\\d+/", "")
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   101
                            : nm)
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   102
                    .collect(Collectors.toCollection(LinkedHashSet::new));
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   103
        }
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   104
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   105
        System.out.println("=======");
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   106
    }
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   107
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   108
    @AfterClass
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   109
    public void close() throws IOException {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   110
        Files.walk(userdir, 1)
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   111
                .filter(p -> !p.equals(userdir))
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   112
                .forEach(p -> {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   113
                    try {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   114
                        if (Files.isDirectory(p)) {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   115
                            FileUtils.deleteFileTreeWithRetry(p);
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   116
                        } else {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   117
                            FileUtils.deleteFileIfExistsWithRetry(p);
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   118
                        }
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   119
                    } catch (IOException x) {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   120
                        throw new UncheckedIOException(x);
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   121
                    }
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   122
                });
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   123
    }
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   124
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   125
    @DataProvider
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   126
    public Object[][] data() {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   127
        return new Object[][] {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   128
            {Runtime.Version.parse("8")},
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   129
            {Runtime.Version.parse("9")},
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   130
            {Runtime.Version.parse("10")},
50892
a5557f24b4d4 8205615: Start of release updates for JDK 12
darcy
parents: 47987
diff changeset
   131
            {Runtime.Version.parse(Integer.toString(LATEST_VERSION))},
47987
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   132
            {JarFile.baseVersion()},
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   133
            {JarFile.runtimeVersion()}
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   134
        };
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   135
    }
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   136
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   137
    @Test(dataProvider="data")
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   138
    public void test(Runtime.Version version) throws Exception {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   139
        try (JarFile jf = new JarFile(new File("mmr.jar"), false, ZipFile.OPEN_READ, version);
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   140
             Stream<JarEntry> jes = jf.versionedStream())
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   141
        {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   142
            Assert.assertNotNull(jes);
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   143
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   144
            // put versioned entries in list so we can reuse them
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   145
            List<JarEntry> versionedEntries = jes.collect(Collectors.toList());
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   146
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   147
            Assert.assertTrue(versionedEntries.size() > 0);
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   148
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   149
            // also keep the names
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   150
            List<String> versionedNames = new ArrayList<>(versionedEntries.size());
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   151
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   152
            // verify the correct order while building enames
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   153
            Iterator<String> allIt = unversionedEntryNames.iterator();
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   154
            Iterator<JarEntry> verIt = versionedEntries.iterator();
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   155
            boolean match = false;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   156
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   157
            while (verIt.hasNext()) {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   158
                match = false;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   159
                if (!allIt.hasNext()) break;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   160
                String name = verIt.next().getName();
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   161
                versionedNames.add(name);
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   162
                while (allIt.hasNext()) {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   163
                    if (name.equals(allIt.next())) {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   164
                        match = true;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   165
                        break;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   166
                    }
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   167
                }
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   168
            }
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   169
            if (!match) {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   170
                Assert.fail("versioned entries not in same order as unversioned entries");
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   171
            }
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   172
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   173
            // verify the contents:
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   174
            // value.[0] end of the path
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   175
            // value.[1] versioned path/real name
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   176
            Map<String,String[]> expected = new HashMap<>();
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   177
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   178
            expected.put("p/Bar.class", new String[] { "base/p/Bar.class", "p/Bar.class" });
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   179
            expected.put("p/Main.class", new String[] { "base/p/Main.class", "p/Main.class" });
50892
a5557f24b4d4 8205615: Start of release updates for JDK 12
darcy
parents: 47987
diff changeset
   180
            int majorVersion  = version.major();
a5557f24b4d4 8205615: Start of release updates for JDK 12
darcy
parents: 47987
diff changeset
   181
            switch (majorVersion) {
47987
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   182
                case 8:
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   183
                    expected.put("p/Foo.class", new String[]
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   184
                        { "base/p/Foo.class", "p/Foo.class" });
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   185
                    break;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   186
                case 9:
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   187
                    expected.put("p/Foo.class", new String[]
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   188
                        { "v9/p/Foo.class", "META-INF/versions/9/p/Foo.class" });
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   189
                    break;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   190
                case 10:
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   191
                    expected.put("p/Foo.class", new String[]
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   192
                        { "v10/p/Foo.class", "META-INF/versions/10/p/Foo.class" });
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   193
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   194
                    expected.put("q/Bar.class", new String[]
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   195
                        { "v10/q/Bar.class", "META-INF/versions/10/q/Bar.class" });
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   196
                    break;
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   197
                default:
50892
a5557f24b4d4 8205615: Start of release updates for JDK 12
darcy
parents: 47987
diff changeset
   198
                    if (majorVersion == LATEST_VERSION) {
a5557f24b4d4 8205615: Start of release updates for JDK 12
darcy
parents: 47987
diff changeset
   199
                        expected.put("p/Bar.class",
a5557f24b4d4 8205615: Start of release updates for JDK 12
darcy
parents: 47987
diff changeset
   200
                                     new String[] { "v" + LATEST_VERSION + "/p/Bar.class",
a5557f24b4d4 8205615: Start of release updates for JDK 12
darcy
parents: 47987
diff changeset
   201
                                                    "META-INF/versions/" + LATEST_VERSION + "/p/Bar.class"});
a5557f24b4d4 8205615: Start of release updates for JDK 12
darcy
parents: 47987
diff changeset
   202
                        expected.put("p/Foo.class",
a5557f24b4d4 8205615: Start of release updates for JDK 12
darcy
parents: 47987
diff changeset
   203
                                     new String[]{ "v" + LATEST_VERSION + "/p/Foo.class",
a5557f24b4d4 8205615: Start of release updates for JDK 12
darcy
parents: 47987
diff changeset
   204
                                                   "META-INF/versions/" + LATEST_VERSION + "/p/Foo.class"});
a5557f24b4d4 8205615: Start of release updates for JDK 12
darcy
parents: 47987
diff changeset
   205
                        expected.put("q/Bar.class",
a5557f24b4d4 8205615: Start of release updates for JDK 12
darcy
parents: 47987
diff changeset
   206
                                     new String[] { "q/Bar.class", "META-INF/versions/10/q/Bar.class"});
a5557f24b4d4 8205615: Start of release updates for JDK 12
darcy
parents: 47987
diff changeset
   207
                    } else {
a5557f24b4d4 8205615: Start of release updates for JDK 12
darcy
parents: 47987
diff changeset
   208
                        Assert.fail("Test out of date, please add more cases");
a5557f24b4d4 8205615: Start of release updates for JDK 12
darcy
parents: 47987
diff changeset
   209
                    }
47987
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   210
            }
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   211
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   212
            expected.entrySet().stream().forEach(e -> {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   213
                String name = e.getKey();
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   214
                int i = versionedNames.indexOf(name);
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   215
                Assert.assertTrue(i != -1, name + " not in enames");
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   216
                JarEntry je = versionedEntries.get(i);
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   217
                try (InputStream is = jf.getInputStream(je)) {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   218
                    String s = new String(is.readAllBytes()).replaceAll(System.lineSeparator(), "");
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   219
                    // end of the path
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   220
                    Assert.assertTrue(s.endsWith(e.getValue()[0]), s);
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   221
                    // getRealName()
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   222
                    Assert.assertTrue(je.getRealName().equals(e.getValue()[1]));
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   223
                } catch (IOException x) {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   224
                    throw new UncheckedIOException(x);
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   225
                }
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   226
            });
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   227
        }
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   228
    }
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   229
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   230
    private void createFiles(String... files) {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   231
        ArrayList<String> list = new ArrayList();
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   232
        Arrays.stream(files)
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   233
                .map(f -> Paths.get(userdir.toAbsolutePath().toString(), f))
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   234
                .forEach(p -> {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   235
                    try {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   236
                        Files.createDirectories(p.getParent());
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   237
                        Files.createFile(p);
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   238
                        list.clear();
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   239
                        list.add(p.toString().replace(File.separatorChar, '/'));
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   240
                        Files.write(p, list);
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   241
                    } catch (IOException x) {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   242
                        throw new UncheckedIOException(x);
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   243
                    }});
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   244
    }
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   245
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   246
    private void jar(String args) {
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   247
        new sun.tools.jar.Main(System.out, System.err, "jar")
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   248
                .run(args.split(" +"));
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   249
    }
85ea7e83af30 8189611: JarFile versioned stream and real name support
sherman
parents:
diff changeset
   250
}