8211171: move JarUtils to top-level testlibrary

Reviewed-by: alanb
This commit is contained in:
Igor Ignatyev 2018-10-01 14:54:46 -07:00
parent b0ea3a49d2
commit ab8c7f710c
42 changed files with 300 additions and 416 deletions

View File

@ -26,9 +26,9 @@
* @bug 8151486
* @summary Call Class.forName() on the system classloader from a class loaded
* from a custom classloader, using the current class's protection domain.
* @library /test/jdk/lib/testlibrary
* @library /test/lib
* @build jdk.test.lib.Utils JarUtils
* @build jdk.test.lib.Utils
* jdk.test.lib.util.JarUtils
* @build ClassForName ProtectionDomainCacheTest
* @run main/othervm/policy=test.policy -XX:+UnlockDiagnosticVMOptions -XX:VerifySubSet=dictionary -XX:+VerifyAfterGC -Xlog:gc+verify=debug,protectiondomain=trace,class+unload:gc.log -Djava.security.manager ProtectionDomainCacheTest
*/
@ -41,6 +41,7 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import jdk.test.lib.Utils;
import jdk.test.lib.util.JarUtils;
/*
* Create .jar, load ClassForName from .jar using a URLClassLoader

View File

@ -1,141 +0,0 @@
/*
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jaxp.library;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* This class consists exclusively of static utility methods that are useful
* for creating and manipulating JAR files.
*/
public final class JarUtils {
private JarUtils() { }
/**
* Creates a JAR file.
*
* Equivalent to {@code jar cfm <jarfile> <manifest> -C <dir> file...}
*
* The input files are resolved against the given directory. Any input
* files that are directories are processed recursively.
*/
public static void createJarFile(Path jarfile, Manifest man, Path dir, Path... file)
throws IOException
{
// create the target directory
Path parent = jarfile.getParent();
if (parent != null)
Files.createDirectories(parent);
List<Path> entries = new ArrayList<>();
for (Path entry : file) {
Files.find(dir.resolve(entry), Integer.MAX_VALUE,
(p, attrs) -> attrs.isRegularFile())
.map(e -> dir.relativize(e))
.forEach(entries::add);
}
try (OutputStream out = Files.newOutputStream(jarfile);
JarOutputStream jos = new JarOutputStream(out))
{
if (man != null) {
JarEntry je = new JarEntry(JarFile.MANIFEST_NAME);
jos.putNextEntry(je);
man.write(jos);
jos.closeEntry();
}
for (Path entry : entries) {
String name = toJarEntryName(entry);
jos.putNextEntry(new JarEntry(name));
Files.copy(dir.resolve(entry), jos);
jos.closeEntry();
}
}
}
/**
* Creates a JAR file.
*
* Equivalent to {@code jar cf <jarfile> -C <dir> file...}
*
* The input files are resolved against the given directory. Any input
* files that are directories are processed recursively.
*/
public static void createJarFile(Path jarfile, Path dir, Path... file)
throws IOException
{
createJarFile(jarfile, null, dir, file);
}
/**
* Creates a JAR file.
*
* Equivalent to {@code jar cf <jarfile> -C <dir> file...}
*
* The input files are resolved against the given directory. Any input
* files that are directories are processed recursively.
*/
public static void createJarFile(Path jarfile, Path dir, String... input)
throws IOException
{
Path[] paths = Stream.of(input).map(Paths::get).toArray(Path[]::new);
createJarFile(jarfile, dir, paths);
}
/**
* Creates a JAR file from the contents of a directory.
*
* Equivalent to {@code jar cf <jarfile> -C <dir> .}
*/
public static void createJarFile(Path jarfile, Path dir) throws IOException {
createJarFile(jarfile, dir, Paths.get("."));
}
/**
* Map a file path to the equivalent name in a JAR file
*/
private static String toJarEntryName(Path file) {
Path normalized = file.normalize();
return normalized.subpath(0, normalized.getNameCount()) // drop root
.toString()
.replace(File.separatorChar, '/');
}
}

View File

@ -42,9 +42,11 @@ import javax.xml.catalog.CatalogException;
import javax.xml.catalog.CatalogFeatures;
import javax.xml.catalog.CatalogManager;
import javax.xml.catalog.CatalogResolver;
import static jaxp.library.JAXPTestUtilities.getSystemProperty;
import jaxp.library.JarUtils;
import jaxp.library.SimpleHttpServer;
import jdk.test.lib.util.JarUtils;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
@ -56,10 +58,10 @@ import org.xml.sax.InputSource;
/*
* @test
* @bug 8151154 8171243
* @library /javax/xml/jaxp/libs /javax/xml/jaxp/unittest
* @library /javax/xml/jaxp/libs /javax/xml/jaxp/unittest /test/lib
* @run testng/othervm catalog.CatalogFileInputTest
* @summary Verifies that the Catalog API accepts valid URIs only;
Verifies that the CatalogFeatures' builder throws
* Verifies that the CatalogFeatures' builder throws
* IllegalArgumentException on invalid file inputs.
* This test was splitted from CatalogTest.java due to
* JDK-8168968, it has to only run without SecurityManager

View File

@ -24,7 +24,7 @@
/*
* @test
* @bug 8164705
* @library /lib/testlibrary /test/lib
* @library /test/lib
* @modules java.base/jdk.internal.misc
* jdk.compiler
* @build jdk.test.lib.compiler.CompilerUtils
@ -34,12 +34,14 @@
* jdk.test.lib.JDKToolLauncher
* jdk.test.lib.Platform
* jdk.test.lib.process.*
* jdk.test.lib.util.JarUtils
* @run main ReadFileOnPath
* @summary Still able to read file on the same path
*/
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.compiler.CompilerUtils;
import jdk.test.lib.util.JarUtils;
import java.nio.file.Files;
import java.nio.file.Path;

View File

@ -24,8 +24,8 @@
/*
* @test
* @bug 4765255
* @library /lib/testlibrary
* @build JarUtils A B C D PackageAccessTest
* @library /test/lib
* @build jdk.test.lib.util.JarUtils A B C D PackageAccessTest
* @run main PackageAccessTest
* @summary Verify proper functioning of package equality checks used to
* determine accessibility of superclass constructor and inherited
@ -46,6 +46,8 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import jdk.test.lib.util.JarUtils;
public class PackageAccessTest {
static Class bcl;

View File

@ -24,8 +24,8 @@
/*
* @test
* @bug 4413434
* @library /lib/testlibrary
* @build JarUtils SetupJar Boot
* @library /test/lib
* @build jdk.test.lib.util.JarUtils SetupJar Boot
* @run driver SetupJar
* @run main/othervm -Xbootclasspath/a:boot.jar ConsTest
* @summary Verify that generated java.lang.reflect implementation classes do
@ -39,6 +39,8 @@ import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.lang.reflect.Constructor;
import jdk.test.lib.util.JarUtils;
public class ConsTest implements Serializable {
public static void main(String[] args) throws Exception {
Constructor cons = Boot.class.getConstructor(

View File

@ -24,6 +24,8 @@
import java.nio.file.Path;
import java.nio.file.Paths;
import jdk.test.lib.util.JarUtils;
public class SetupJar {
public static void main(String args[]) throws Exception {

View File

@ -24,8 +24,8 @@
/*
* @test
* @bug 4413434
* @library /lib/testlibrary
* @build JarUtils Foo
* @library /test/lib
* @build jdk.test.lib.util.JarUtils Foo
* @run main DeserializeButtonTest
* @summary Verify that class loaded outside of application class loader is
* correctly resolved during deserialization when read in by custom
@ -38,6 +38,8 @@ import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;
import jdk.test.lib.util.JarUtils;
public class DeserializeButtonTest {
public static void main(String[] args) throws Exception {
setup();

View File

@ -24,8 +24,8 @@
/*
* @test
* @bug 4325590
* @library /lib/testlibrary
* @build JarUtils A B
* @library /test/lib
* @build jdk.test.lib.util.JarUtils A B
* @run main SuperclassDataLossTest
* @summary Verify that superclass data is not lost when incoming superclass
* descriptor is matched with local class that is not a superclass of
@ -47,6 +47,8 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import jdk.test.lib.util.JarUtils;
class MixedSuperclassStream extends ObjectInputStream {
private boolean ldr12A;
private URLClassLoader ldr1;

View File

@ -26,9 +26,9 @@
* @bug 8151486
* @summary Call Class.forName() on the system classloader from a class loaded
* from a custom classloader.
* @library /lib/testlibrary
* @library /test/lib
* @build jdk.test.lib.Utils JarUtils
* @build jdk.test.lib.Utils
* jdk.test.lib.util.JarUtils
* @build ClassForName ClassForNameLeak
* @run main/othervm/policy=test.policy -Djava.security.manager ClassForNameLeak
*/
@ -49,7 +49,9 @@ import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import jdk.test.lib.Utils;
import jdk.test.lib.util.JarUtils;
/*
* Create .jar, load ClassForName from .jar using a URLClassLoader

View File

@ -23,8 +23,9 @@
/**
* @test
* @library /lib/testlibrary /test/lib
* @build Driver Main JarUtils
* @library /test/lib
* @build Driver Main
* jdk.test.lib.util.JarUtils
* @run main Driver
* @summary Test ClassLoader.getResourceXXX to locate resources in an automatic
* module
@ -39,6 +40,7 @@ import java.util.jar.Attributes;
import java.util.jar.Manifest;
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.util.JarUtils;
/**
* The driver creates a JAR file containing p/Foo.class, p/foo.properties,

View File

@ -26,10 +26,9 @@
* @bug 8168423
* @summary Different types of ClassLoader running with(out) SecurityManager and
* (in)valid security policy file.
* @library /lib/testlibrary
* @library /test/lib
* @modules java.base/jdk.internal.module
* @build JarUtils
* @build jdk.test.lib.util.JarUtils
* @build TestClassLoader TestClient
* @run main ClassLoaderTest -noPolicy
* @run main ClassLoaderTest -validPolicy
@ -51,6 +50,7 @@ import java.util.LinkedList;
import java.util.List;
import jdk.internal.module.ModuleInfoWriter;
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.util.JarUtils;
public class ClassLoaderTest {

View File

@ -25,10 +25,9 @@
* @test
* @bug 4227825 4785473
* @summary Test behaviour of Package.isCompatibleWith().
* @library /lib/testlibrary
* @library /test/lib
* @build A IsCompatibleWith
* JarUtils
* jdk.test.lib.util.JarUtils
* jdk.test.lib.process.*
* @run main IsCompatibleWithDriver
*/
@ -44,6 +43,7 @@ import java.nio.file.Files;
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.util.JarUtils;
public class IsCompatibleWithDriver {
public static void main(String args[]) throws Throwable {

View File

@ -27,7 +27,6 @@
* @summary The test will create JAR file(s) with the manifest file
* that customized package versioning information (different info for
* same package if multiple jars). Then verify package versioning info
* @library /lib/testlibrary
* @library /test/lib
* @modules jdk.compiler
* @run main PackageFromManifest setup test
@ -42,6 +41,7 @@
import jdk.test.lib.compiler.CompilerUtils;
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.util.FileUtils;
import jdk.test.lib.util.JarUtils;
import java.io.File;
import java.io.IOException;

View File

@ -23,9 +23,9 @@
/**
* @test
* @library /lib/testlibrary
* @library /test/lib
* @build ExecJarWithAgent Main Agent AgentHelper JarUtils jdk.testlibrary.*
* @build ExecJarWithAgent Main Agent AgentHelper
* jdk.test.lib.util.JarUtils
* @run testng ExecJarWithAgent
* @summary Test starting agents in executable JAR files
*/
@ -41,6 +41,7 @@ import static org.testng.Assert.*;
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.util.JarUtils;
@Test
public class ExecJarWithAgent {

View File

@ -23,8 +23,9 @@
/**
* @test
* @library /lib/testlibrary
* @build AutomaticModulesTest ModuleUtils JarUtils
* @library /lib/testlibrary /test/lib
* @build AutomaticModulesTest ModuleUtils
* jdk.test.lib.util.JarUtils
* @run testng AutomaticModulesTest
* @summary Basic tests for automatic modules
*/
@ -48,6 +49,8 @@ import java.util.jar.Manifest;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import jdk.test.lib.util.JarUtils;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import static org.testng.Assert.*;

View File

@ -23,11 +23,13 @@
/**
* @test
* @library /lib/testlibrary /test/lib
* @library /test/lib
* @modules java.base/jdk.internal.module
* jdk.compiler
* jdk.jlink
* @build ModuleReaderTest jdk.test.lib.compiler.CompilerUtils JarUtils
* @build ModuleReaderTest
* jdk.test.lib.compiler.CompilerUtils
* jdk.test.lib.util.JarUtils
* @run testng ModuleReaderTest
* @summary Basic tests for java.lang.module.ModuleReader
*/
@ -55,6 +57,7 @@ import java.util.spi.ToolProvider;
import jdk.internal.module.ModulePath;
import jdk.test.lib.compiler.CompilerUtils;
import jdk.test.lib.util.JarUtils;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

View File

@ -23,9 +23,9 @@
/**
* @test
* @library /lib/testlibrary
* @library /test/lib
* @modules java.base/jdk.internal.module
* @build MultiReleaseJarTest JarUtils
* @build MultiReleaseJarTest jdk.test.lib.util.JarUtils
* @run testng MultiReleaseJarTest
* @run testng/othervm -Djdk.util.jar.enableMultiRelease=false MultiReleaseJarTest
* @summary Basic test of modular JARs as multi-release JARs
@ -55,6 +55,7 @@ import java.util.jar.Attributes;
import java.util.jar.Manifest;
import jdk.internal.module.ModuleInfoWriter;
import jdk.test.lib.util.JarUtils;
import org.testng.annotations.Test;
import static org.testng.Assert.*;

View File

@ -24,8 +24,9 @@
/**
* @test
* @modules jdk.zipfs
* @library /lib/testlibrary
* @build ModulesInCustomFileSystem JarUtils m1/* m2/*
* @library /test/lib
* @build ModulesInCustomFileSystem m1/* m2/*
* jdk.test.lib.util.JarUtils
* @run testng/othervm ModulesInCustomFileSystem
* @summary Test ModuleFinder to find modules in a custom file system
*/
@ -43,6 +44,8 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Set;
import jdk.test.lib.util.JarUtils;
import org.testng.annotations.Test;
import static org.testng.Assert.*;

View File

@ -28,12 +28,12 @@
* jdk.httpserver
* jdk.compiler
* @library ../../../../com/sun/net/httpserver
* /lib/testlibrary
* /test/lib
* @build jdk.test.lib.compiler.CompilerUtils
* jdk.test.lib.util.FileUtils
* jdk.test.lib.util.JarUtils
* jdk.test.lib.Platform
* FileServerHandler JarUtils
* FileServerHandler
* @run main/othervm CloseTest
* @summary URL-downloaded jar files can consume all available file descriptors
*/
@ -49,6 +49,7 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import jdk.test.lib.compiler.CompilerUtils;
import jdk.test.lib.util.JarUtils;
import com.sun.net.httpserver.HttpContext;
import com.sun.net.httpserver.HttpServer;

View File

@ -24,12 +24,12 @@
/**
* @test
* @bug 6899919
* @library /lib/testlibrary /test/lib
* @library /test/lib
* @modules jdk.compiler
* @build jdk.test.lib.compiler.CompilerUtils
* jdk.test.lib.util.FileUtils
* jdk.test.lib.util.JarUtils
* jdk.test.lib.Platform
* JarUtils
* @run main/othervm GetResourceAsStream
*/
@ -44,6 +44,7 @@ import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.nio.file.StandardOpenOption;
import jdk.test.lib.compiler.CompilerUtils;
import jdk.test.lib.util.JarUtils;
public class GetResourceAsStream extends Common {
private static final String WORK_DIR = System.getProperty("user.dir");

View File

@ -25,8 +25,9 @@
* @test
* @bug 4607272
* @summary tests tasks can be submitted to a channel group's thread pool.
* @library /lib/testlibrary bootlib
* @build JarUtils PrivilegedThreadFactory Attack
* @library /test/lib bootlib
* @build PrivilegedThreadFactory Attack
* jdk.test.lib.util.JarUtils
* @run driver SetupJar
* @run main/othervm -Xbootclasspath/a:privileged.jar AsExecutor
*/

View File

@ -26,6 +26,8 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
import jdk.test.lib.util.JarUtils;
public class SetupJar {
public static void main(String args[]) throws Exception {
String cp = System.getProperty("test.class.path");

View File

@ -26,14 +26,13 @@
* @bug 4429040 4591027 4814743
* @summary Unit test for charset providers
* @library /test/lib
* /lib/testlibrary
* @build jdk.test.lib.Utils
* jdk.test.lib.Asserts
* jdk.test.lib.JDKToolFinder
* jdk.test.lib.JDKToolLauncher
* jdk.test.lib.Platform
* jdk.test.lib.process.*
* JarUtils
* jdk.test.lib.util.JarUtils
* FooCharset FooProvider CharsetTest
* @run driver SetupJar
* @run testng CharsetProviderBasicTest

View File

@ -28,6 +28,8 @@ import java.nio.file.Paths;
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
import static java.nio.file.StandardOpenOption.CREATE;
import jdk.test.lib.util.JarUtils;
public class SetupJar {
private static final String PROVIDER

View File

@ -23,9 +23,11 @@
/**
* @test
* @library /lib/testlibrary /test/lib
* @library /test/lib
* @build jdk.test.lib.process.ProcessTools
* ModuleTest jdk.test.lib.compiler.CompilerUtils JarUtils
* jdk.test.lib.compiler.CompilerUtils
* jdk.test.lib.util.JarUtils
* ModuleTest
* @run testng ModuleTest
* @summary Basic tests for using rmi in module world
*/
@ -37,6 +39,7 @@ import static org.testng.Assert.assertTrue;
import java.io.File;
import java.nio.file.Paths;
import jdk.test.lib.compiler.CompilerUtils;
import jdk.test.lib.util.JarUtils;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

View File

@ -40,6 +40,7 @@ import java.lang.module.ModuleDescriptor;
import java.lang.module.ModuleDescriptor.Builder;
import jdk.internal.module.ModuleInfoWriter;
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.util.JarUtils;
/*
@ -47,9 +48,9 @@ import jdk.test.lib.process.ProcessTools;
* @bug 8130360 8183310
* @summary Test security provider in different combination of modular option
* defined with(out) service description.
* @library /lib/testlibrary /test/lib
* @library /test/lib
* @modules java.base/jdk.internal.module
* @build JarUtils TestProvider TestClient
* @build jdk.test.lib.util.JarUtils TestProvider TestClient
* @run main SecurityProviderModularTest CL true
* @run main SecurityProviderModularTest CL false
* @run main SecurityProviderModularTest SL true

View File

@ -24,9 +24,9 @@
/**
* @test
* @modules java.scripting
* @library modules /lib/testlibrary
* @library modules /test/lib
* @build bananascript/*
* @build JarUtils
* @build jdk.test.lib.util.JarUtils
* @compile classpath/pearscript/org/pear/PearScriptEngineFactory.java
* classpath/pearscript/org/pear/PearScript.java
* @run testng/othervm ModulesTest
@ -53,6 +53,8 @@ import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.script.ScriptEngineFactory;
import jdk.test.lib.util.JarUtils;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeTest;
import static org.testng.Assert.*;

View File

@ -25,8 +25,9 @@
* @test
* @bug 4640520 6354623 7198496
* @summary Unit test for java.util.ServiceLoader
* @library /lib/testlibrary /test/lib
* @build JarUtils jdk.test.lib.process.*
* @library /test/lib
* @build jdk.test.lib.process.*
* jdk.test.lib.util.JarUtils
* Basic Load FooService FooProvider1 FooProvider2 FooProvider3 BarProvider
* @run testng ServiceLoaderBasicTest
*/
@ -41,6 +42,7 @@ import java.util.List;
import jdk.test.lib.JDKToolFinder;
import jdk.test.lib.Utils;
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.util.JarUtils;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;

View File

@ -37,15 +37,15 @@ import jdk.internal.module.ModuleInfoWriter;
import java.util.stream.Stream;
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.util.JarUtils;
/*
* @test
* @bug 8078813 8183310
* @summary Test custom JAAS login module with all possible modular option.
* @library /lib/testlibrary /test/lib
* @library /test/lib
* @modules java.base/jdk.internal.module
* @build JarUtils
* @build jdk.test.lib.util.JarUtils
* @build TestLoginModule JaasClient
* @run main JaasModularClientTest false
* @run main JaasModularClientTest true

View File

@ -36,14 +36,15 @@ import jdk.internal.module.ModuleInfoWriter;
import java.util.stream.Stream;
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.util.JarUtils;
/*
* @test
* @bug 8151654 8183310
* @summary Test default callback handler with all possible modular option.
* @library /lib/testlibrary /test/lib
* @library /test/lib
* @modules java.base/jdk.internal.module
* @build JarUtils
* @build jdk.test.lib.util.JarUtils
* @build TestCallbackHandler TestLoginModule JaasClientWithDefaultHandler
* @run main JaasModularDefaultHandlerTest
*/

View File

@ -23,11 +23,13 @@
/**
* @test
* @library /lib/testlibrary /test/lib
* @library /test/lib
* @modules jdk.compiler
* java.scripting
* jdk.zipfs
* @build RunWithAutomaticModules jdk.test.lib.compiler.CompilerUtils JarUtils
* @build RunWithAutomaticModules
* jdk.test.lib.compiler.CompilerUtils
* jdk.test.lib.util.JarUtils
* jdk.test.lib.process.ProcessTools
* @run testng RunWithAutomaticModules
* @summary Runs tests that make use of automatic modules
@ -38,6 +40,7 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import jdk.test.lib.compiler.CompilerUtils;
import jdk.test.lib.util.JarUtils;
import static jdk.test.lib.process.ProcessTools.*;
import org.testng.annotations.Test;

View File

@ -1,202 +0,0 @@
/*
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* This class consists exclusively of static utility methods that are useful
* for creating and manipulating JAR files.
*/
public final class JarUtils {
private JarUtils() { }
/**
* Creates a JAR file.
*
* Equivalent to {@code jar cfm <jarfile> <manifest> -C <dir> file...}
*
* The input files are resolved against the given directory. Any input
* files that are directories are processed recursively.
*/
public static void createJarFile(Path jarfile, Manifest man, Path dir, Path... file)
throws IOException
{
// create the target directory
Path parent = jarfile.getParent();
if (parent != null)
Files.createDirectories(parent);
List<Path> entries = new ArrayList<>();
for (Path entry : file) {
Files.find(dir.resolve(entry), Integer.MAX_VALUE,
(p, attrs) -> attrs.isRegularFile())
.map(e -> dir.relativize(e))
.forEach(entries::add);
}
try (OutputStream out = Files.newOutputStream(jarfile);
JarOutputStream jos = new JarOutputStream(out))
{
if (man != null) {
JarEntry je = new JarEntry(JarFile.MANIFEST_NAME);
jos.putNextEntry(je);
man.write(jos);
jos.closeEntry();
}
for (Path entry : entries) {
String name = toJarEntryName(entry);
jos.putNextEntry(new JarEntry(name));
Files.copy(dir.resolve(entry), jos);
jos.closeEntry();
}
}
}
/**
* Creates a JAR file.
*
* Equivalent to {@code jar cf <jarfile> -C <dir> file...}
*
* The input files are resolved against the given directory. Any input
* files that are directories are processed recursively.
*/
public static void createJarFile(Path jarfile, Path dir, Path... file)
throws IOException
{
createJarFile(jarfile, null, dir, file);
}
/**
* Creates a JAR file.
*
* Equivalent to {@code jar cf <jarfile> -C <dir> file...}
*
* The input files are resolved against the given directory. Any input
* files that are directories are processed recursively.
*/
public static void createJarFile(Path jarfile, Path dir, String... input)
throws IOException
{
Path[] paths = Stream.of(input).map(Paths::get).toArray(Path[]::new);
createJarFile(jarfile, dir, paths);
}
/**
* Creates a JAR file from the contents of a directory.
*
* Equivalent to {@code jar cf <jarfile> -C <dir> .}
*/
public static void createJarFile(Path jarfile, Path dir) throws IOException {
createJarFile(jarfile, dir, Paths.get("."));
}
/**
* Update a JAR file.
*
* Equivalent to {@code jar uf <jarfile> -C <dir> file...}
*
* The input files are resolved against the given directory. Any input
* files that are directories are processed recursively.
*/
public static void updateJarFile(Path jarfile, Path dir, Path... file)
throws IOException
{
List<Path> entries = new ArrayList<>();
for (Path entry : file) {
Files.find(dir.resolve(entry), Integer.MAX_VALUE,
(p, attrs) -> attrs.isRegularFile())
.map(e -> dir.relativize(e))
.forEach(entries::add);
}
Set<String> names = entries.stream()
.map(JarUtils::toJarEntryName)
.collect(Collectors.toSet());
Path tmpfile = Files.createTempFile("jar", "jar");
try (OutputStream out = Files.newOutputStream(tmpfile);
JarOutputStream jos = new JarOutputStream(out))
{
// copy existing entries from the original JAR file
try (JarFile jf = new JarFile(jarfile.toString())) {
Enumeration<JarEntry> jentries = jf.entries();
while (jentries.hasMoreElements()) {
JarEntry jentry = jentries.nextElement();
if (!names.contains(jentry.getName())) {
jos.putNextEntry(jentry);
jf.getInputStream(jentry).transferTo(jos);
}
}
}
// add the new entries
for (Path entry : entries) {
String name = toJarEntryName(entry);
jos.putNextEntry(new JarEntry(name));
Files.copy(dir.resolve(entry), jos);
}
}
// replace the original JAR file
Files.move(tmpfile, jarfile, StandardCopyOption.REPLACE_EXISTING);
}
/**
* Update a JAR file.
*
* Equivalent to {@code jar uf <jarfile> -C <dir> .}
*/
public static void updateJarFile(Path jarfile, Path dir) throws IOException {
updateJarFile(jarfile, dir, Paths.get("."));
}
/**
* Map a file path to the equivalent name in a JAR file
*/
private static String toJarEntryName(Path file) {
Path normalized = file.normalize();
return normalized.subpath(0, normalized.getNameCount()) // drop root
.toString()
.replace(File.separatorChar, '/');
}
}

View File

@ -25,7 +25,6 @@
* @test
* @bug 4361044 4388202 4418643 4523159 4730642
* @library /test/lib
* /lib/testlibrary
* @modules jdk.compiler
* @build jdk.test.lib.compiler.CompilerUtils
* jdk.test.lib.Utils
@ -34,7 +33,8 @@
* jdk.test.lib.JDKToolLauncher
* jdk.test.lib.Platform
* jdk.test.lib.process.*
* src.test.src.TestDriver JarUtils
* jdk.test.lib.util.JarUtils
* src.test.src.TestDriver
* @summary various resource and classloading bugs related to jar files
* @run main/othervm TestDriver
*/
@ -42,6 +42,7 @@
import jdk.test.lib.JDKToolFinder;
import jdk.test.lib.compiler.CompilerUtils;
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.util.JarUtils;
import java.io.File;
import java.nio.file.Files;

View File

@ -25,13 +25,14 @@
* @test
* @summary Basic test of jlink to create jmods and images
* @author Andrei Eremeev
* @library /lib/testlibrary /test/lib
* @library /test/lib
* @modules java.base/jdk.internal.module
* jdk.jlink
* jdk.compiler
* @build jdk.test.lib.process.ProcessTools
* jdk.test.lib.process.OutputAnalyzer
* JarUtils jdk.test.lib.compiler.CompilerUtils
* jdk.test.lib.compiler.CompilerUtils
* jdk.test.lib.util.JarUtils
* @run main BasicTest
*/
@ -48,6 +49,7 @@ import java.util.spi.ToolProvider;
import jdk.test.lib.compiler.CompilerUtils;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.util.JarUtils;
public class BasicTest {
static final ToolProvider JMOD_TOOL = ToolProvider.findFirst("jmod")

View File

@ -23,10 +23,10 @@
/**
* @test
* @library /lib/testlibrary
* @library /test/lib
* @modules jdk.compiler
* @build AddExportsAndOpensInManifest Test2 JarUtils jdk.testlibrary.*
* @build AddExportsAndOpensInManifest Test2
* jdk.test.lib.util.JarUtils
* @compile --add-exports=java.base/jdk.internal.misc=ALL-UNNAMED Test1.java
* @run testng AddExportsAndOpensInManifest
* @summary Basic test for Add-Exports and Add-Opens attributes in the
@ -42,6 +42,7 @@ import java.util.jar.Manifest;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.util.JarUtils;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

View File

@ -23,10 +23,11 @@
/**
* @test
* @library /lib/testlibrary /test/lib
* @library /test/lib
* @modules jdk.compiler
* @build AddReadsTest JarUtils
* @build AddReadsTest
* jdk.test.lib.compiler.CompilerUtils
* jdk.test.lib.util.JarUtils
* @run testng AddReadsTest
* @summary Basic tests for java --add-reads
*/
@ -36,6 +37,7 @@ import java.nio.file.Paths;
import jdk.test.lib.compiler.CompilerUtils;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.util.JarUtils;
import static jdk.test.lib.process.ProcessTools.*;
import org.testng.annotations.BeforeTest;

View File

@ -26,9 +26,10 @@
* @requires vm.compMode != "Xcomp"
* @modules java.base/jdk.internal.misc
* java.base/sun.security.x509
* @library /test/lib /lib/testlibrary modules
* @build IllegalAccessTest TryAccess JarUtils
* @library /test/lib modules
* @build IllegalAccessTest TryAccess
* jdk.test.lib.compiler.CompilerUtils
* jdk.test.lib.util.JarUtils
* @build m/*
* @run testng/othervm/timeout=180 IllegalAccessTest
* @summary Basic test for java --illegal-access=$VALUE
@ -46,6 +47,7 @@ import java.util.stream.Stream;
import jdk.test.lib.compiler.CompilerUtils;
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.util.JarUtils;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

View File

@ -23,11 +23,12 @@
/**
* @test
* @library /lib/testlibrary /test/lib
* @library /test/lib
* @modules jdk.compiler
* jdk.naming.dns
* @build PatchTest JarUtils
* @build PatchTest
* jdk.test.lib.compiler.CompilerUtils
* jdk.test.lib.util.JarUtils
* @run testng PatchTest
* @summary Basic test for --patch-module
*/
@ -40,6 +41,7 @@ import java.util.stream.Collectors;
import java.util.stream.Stream;
import jdk.test.lib.compiler.CompilerUtils;
import jdk.test.lib.util.JarUtils;
import static jdk.test.lib.process.ProcessTools.*;
import org.testng.annotations.BeforeTest;

View File

@ -25,10 +25,11 @@
* @test
* @bug 8168836
* @summary Basic argument validation for --patch-module
* @library /lib/testlibrary /test/lib
* @library /test/lib
* @modules jdk.compiler
* @build PatchTestWarningError JarUtils
* @build PatchTestWarningError
* jdk.test.lib.compiler.CompilerUtils
* jdk.test.lib.util.JarUtils
* @run testng PatchTestWarningError
*/
@ -40,6 +41,7 @@ import java.util.stream.Collectors;
import java.util.stream.Stream;
import jdk.test.lib.compiler.CompilerUtils;
import jdk.test.lib.util.JarUtils;
import static jdk.test.lib.process.ProcessTools.*;
import org.testng.annotations.BeforeTest;

View File

@ -25,8 +25,8 @@
* @test
* @bug 8178380 8194937
* @modules java.xml
* @library src /lib/testlibrary /test/lib
* @build ValidateModulesTest hello/* JarUtils
* @library src /test/lib
* @build ValidateModulesTest hello/* jdk.test.lib.util.JarUtils
* @run testng ValidateModulesTest
* @summary Basic test for java --validate-modules
*/
@ -38,6 +38,7 @@ import java.nio.file.Path;
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.util.JarUtils;
import org.testng.annotations.Test;
import static org.testng.Assert.*;

View File

@ -23,31 +23,173 @@
package jdk.test.lib.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.InvalidPathException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* Common library for various test jar file utility functions.
* This class consists exclusively of static utility methods that are useful
* for creating and manipulating JAR files.
*/
public final class JarUtils {
private JarUtils() { }
/**
* Creates a JAR file.
*
* Equivalent to {@code jar cfm <jarfile> <manifest> -C <dir> file...}
*
* The input files are resolved against the given directory. Any input
* files that are directories are processed recursively.
*/
public static void createJarFile(Path jarfile, Manifest man, Path dir, Path... files)
throws IOException
{
// create the target directory
Path parent = jarfile.getParent();
if (parent != null) {
Files.createDirectories(parent);
}
List<Path> entries = findAllRegularFiles(dir, files);
try (OutputStream out = Files.newOutputStream(jarfile);
JarOutputStream jos = new JarOutputStream(out)) {
if (man != null) {
JarEntry je = new JarEntry(JarFile.MANIFEST_NAME);
jos.putNextEntry(je);
man.write(jos);
jos.closeEntry();
}
for (Path entry : entries) {
String name = toJarEntryName(entry);
jos.putNextEntry(new JarEntry(name));
Files.copy(dir.resolve(entry), jos);
jos.closeEntry();
}
}
}
/**
* Creates a JAR file.
*
* Equivalent to {@code jar cf <jarfile> -C <dir> file...}
*
* The input files are resolved against the given directory. Any input
* files that are directories are processed recursively.
*/
public static void createJarFile(Path jarfile, Path dir, Path... files)
throws IOException
{
createJarFile(jarfile, null, dir, files);
}
/**
* Creates a JAR file from the contents of a directory.
*
* Equivalent to {@code jar cf <jarfile> -C <dir> .}
*/
public static void createJarFile(Path jarfile, Path dir) throws IOException {
createJarFile(jarfile, dir, Paths.get("."));
}
/**
* Creates a JAR file.
*
* Equivalent to {@code jar cf <jarfile> -C <dir> file...}
*
* The input files are resolved against the given directory. Any input
* files that are directories are processed recursively.
*/
public static void createJarFile(Path jarfile, Path dir, String... input)
throws IOException
{
Path[] paths = Stream.of(input).map(Paths::get).toArray(Path[]::new);
createJarFile(jarfile, dir, paths);
}
/**
* Updates a JAR file.
*
* Equivalent to {@code jar uf <jarfile> -C <dir> file...}
*
* The input files are resolved against the given directory. Any input
* files that are directories are processed recursively.
*/
public static void updateJarFile(Path jarfile, Path dir, Path... files)
throws IOException
{
List<Path> entries = findAllRegularFiles(dir, files);
Set<String> names = entries.stream()
.map(JarUtils::toJarEntryName)
.collect(Collectors.toSet());
Path tmpfile = Files.createTempFile("jar", "jar");
try (OutputStream out = Files.newOutputStream(tmpfile);
JarOutputStream jos = new JarOutputStream(out)) {
// copy existing entries from the original JAR file
try (JarFile jf = new JarFile(jarfile.toString())) {
Enumeration<JarEntry> jentries = jf.entries();
while (jentries.hasMoreElements()) {
JarEntry jentry = jentries.nextElement();
if (!names.contains(jentry.getName())) {
jos.putNextEntry(jentry);
jf.getInputStream(jentry).transferTo(jos);
}
}
}
// add the new entries
for (Path entry : entries) {
String name = toJarEntryName(entry);
jos.putNextEntry(new JarEntry(name));
Files.copy(dir.resolve(entry), jos);
}
}
// replace the original JAR file
Files.move(tmpfile, jarfile, StandardCopyOption.REPLACE_EXISTING);
}
/**
* Updates a JAR file.
*
* Equivalent to {@code jar uf <jarfile> -C <dir> .}
*/
public static void updateJarFile(Path jarfile, Path dir) throws IOException {
updateJarFile(jarfile, dir, Paths.get("."));
}
/**
* Create jar file with specified files. If a specified file does not exist,
* a new jar entry will be created with the file name itself as the content.
*/
@Deprecated
public static void createJar(String dest, String... files)
throws IOException {
try (JarOutputStream jos = new JarOutputStream(
@ -81,6 +223,7 @@ public final class JarUtils {
* will be removed. If no "-" exists, all files belong to
* the 1st group.
*/
@Deprecated
public static void updateJar(String src, String dest, String... files)
throws IOException {
Map<String,Object> changes = new HashMap<>();
@ -118,6 +261,7 @@ public final class JarUtils {
* Existing entries in src not a key is unmodified.
* @throws IOException
*/
@Deprecated
public static void updateJar(String src, String dest,
Map<String,Object> changes)
throws IOException {
@ -172,4 +316,26 @@ public final class JarUtils {
}
}
}
/**
* Maps a file path to the equivalent name in a JAR file
*/
private static String toJarEntryName(Path file) {
Path normalized = file.normalize();
return normalized.subpath(0, normalized.getNameCount()) // drop root
.toString()
.replace(File.separatorChar, '/');
}
private static List<Path> findAllRegularFiles(Path dir, Path[] files) throws IOException {
List<Path> entries = new ArrayList<>();
for (Path file : files) {
try (Stream<Path> stream = Files.find(dir.resolve(file), Integer.MAX_VALUE,
(p, attrs) -> attrs.isRegularFile())) {
stream.map(dir::relativize)
.forEach(entries::add);
}
}
return entries;
}
}