--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/util/ServiceLoader/basic/ServiceLoaderBasicTest.java Fri Sep 14 13:18:52 2018 +0800
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 2018, 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.
+ */
+
+/*
+ * @test
+ * @bug 4640520 6354623 7198496
+ * @summary Unit test for java.util.ServiceLoader
+ * @library /lib/testlibrary /test/lib
+ * @build JarUtils jdk.test.lib.process.*
+ * Basic Load FooService FooProvider1 FooProvider2 FooProvider3 BarProvider
+ * @run testng ServiceLoaderBasicTest
+ */
+
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+
+import jdk.test.lib.JDKToolFinder;
+import jdk.test.lib.Utils;
+import jdk.test.lib.process.ProcessTools;
+
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import static java.nio.file.StandardOpenOption.CREATE;
+import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
+import static java.util.Arrays.asList;
+
+public class ServiceLoaderBasicTest {
+
+ private static final String METAINFO = "META-INF/services/FooService";
+ private static final Path XTEST_CONFIG = Path.of("x.test").resolve(METAINFO);
+ private static final Path XMETA_CONFIG = Path.of("x.meta").resolve(METAINFO);
+ private static final Path P2JAR = Path.of("p2.jar");
+ private static final Path P2DUPJAR = Path.of("p2dup.jar");
+ private static final Path P3JAR = Path.of("x.ext", "p3.jar");
+
+ private static final String XTEST = File.pathSeparator + "x.test";
+ private static final String XMETA = File.pathSeparator + "x.meta";
+ private static final String P2 = File.pathSeparator + P2JAR.toString();
+ private static final String P2DUP = File.pathSeparator + P2DUPJAR.toString();
+ private static final String P3 = File.pathSeparator + P3JAR.toString();
+
+ private static final String XTEST_CP = Utils.TEST_CLASS_PATH + XTEST;
+ private static final String P2_CP = Utils.TEST_CLASS_PATH + P2;
+ private static final String P2DUP_CP = P2_CP + P2DUP;
+ private static final String P3P2_CP = Utils.TEST_CLASS_PATH + P3 + P2;
+ private static final String XTESTP2_CP = XTEST_CP + P2;
+ private static final String P3XTEST_CP = Utils.TEST_CLASS_PATH + P3 + XTEST;
+ private static final String P3XTESTP2_CP = P3XTEST_CP + P2;
+ private static final String XMETA_CP = Utils.TEST_CLASS_PATH + XMETA;
+ private static final String XMETAXTEST_CP = XMETA_CP + XTEST;
+ private static final String XTESTXMETA_CP = XTEST_CP + XMETA;
+ private static final String XTESTXMETAP2_CP = XTESTXMETA_CP + P2;
+
+ @BeforeClass
+ public void initialize() throws Exception {
+ createProviderConfig(XTEST_CONFIG, "FooProvider1");
+ createProviderConfig(XMETA_CONFIG, "FooProvider42");
+ createJar(P2JAR, "FooProvider2", List.of("FooProvider2"));
+ createJar(P3JAR, "FooProvider3", List.of("FooProvider3", "FooService"));
+ Files.copy(P2JAR, P2DUPJAR, REPLACE_EXISTING);
+ }
+
+ @DataProvider
+ public Object[][] testCases() {
+ return new Object[][]{
+ // CLI options, Test, Runtime arguments
+ // Success cases
+ {List.of("-cp", XTESTP2_CP, "Basic")},
+ {List.of("-cp", XTEST_CP, "Load", "FooProvider1")},
+ {List.of("-cp", P2_CP, "Load", "FooProvider2")},
+ {List.of("-cp", P2DUP_CP, "Load", "FooProvider2")},
+ {List.of("-cp", P3P2_CP, "Load", "FooProvider3", "FooProvider2")},
+ {List.of("-cp", XTESTP2_CP, "Load", "FooProvider1", "FooProvider2")},
+ {List.of("-cp", P3XTEST_CP, "Load", "FooProvider3", "FooProvider1")},
+ {List.of("-cp", P3XTESTP2_CP, "Load", "FooProvider3",
+ "FooProvider1",
+ "FooProvider2")},
+ // Failures followed by successes
+ {List.of("-cp", XTESTXMETA_CP, "Load", "FooProvider1", "fail")},
+ {List.of("-cp", XMETAXTEST_CP, "Load", "fail", "FooProvider1")},
+ {List.of("-cp", XTESTXMETAP2_CP, "Load", "FooProvider1", "fail", "FooProvider2")}
+ };
+ }
+
+ @DataProvider
+ public Object[][] negativeTestCases() {
+ return new Object[][]{
+ {"blah blah"},
+ {"9234"},
+ {"X!"},
+ {"BarProvider"},
+ {"FooProvider42"}
+ };
+ }
+
+ @Test(dataProvider = "testCases")
+ public void testProvider(List<String> args) throws Throwable {
+ runJava(args);
+ }
+
+ @Test(dataProvider = "negativeTestCases")
+ public void testBadProvider(String providerName) throws Throwable {
+ Files.write(XMETA_CONFIG, providerName.getBytes());
+ runJava(List.of("-cp", XMETA_CP, "Load", "fail"));
+ }
+
+ private void runJava(List<String> opts) throws Throwable {
+ List<String> cmds = new ArrayList<>();
+ cmds.add(JDKToolFinder.getJDKTool("java"));
+ cmds.addAll(asList(Utils.getTestJavaOpts()));
+ cmds.addAll(opts);
+
+ ProcessTools.executeCommand(cmds.stream()
+ .filter(t -> !t.isEmpty())
+ .toArray(String[]::new))
+ .shouldHaveExitValue(0);
+ }
+
+ private void createProviderConfig(Path config, String providerName) throws Exception {
+ Files.createDirectories(config.getParent());
+ Files.write(config, providerName.getBytes(), CREATE);
+ }
+
+ private void createJar(Path jar, String provider, List<String> files) throws Exception {
+ Path xdir = Path.of(provider);
+ createProviderConfig(xdir.resolve(METAINFO), provider);
+
+ for (String f : files) {
+ Path source = Path.of(Utils.TEST_CLASSES, f + ".class");
+ Path target = xdir.resolve(source.getFileName());
+ Files.copy(source, target, REPLACE_EXISTING);
+ }
+ JarUtils.createJarFile(jar, xdir);
+ }
+
+}
--- a/test/jdk/java/util/ServiceLoader/basic/basic.sh Thu Sep 13 15:29:44 2018 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,156 +0,0 @@
-#
-# Copyright (c) 2005, 2013, 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.
-#
-
-# @test
-# @bug 4640520 6354623 7198496
-# @summary Unit test for java.util.ServiceLoader
-#
-# @build Basic Load FooService FooProvider1 FooProvider2 FooProvider3 BarProvider
-# @run shell basic.sh
-
-# Command-line usage: sh basic.sh /path/to/build
-
-if [ -z "$TESTJAVA" ]; then
- if [ $# -lt 1 ]; then exit 1; fi
- TESTJAVA="$1"; shift
- COMPILEJAVA="${TESTJAVA}"
- TESTSRC="`pwd`"
- TESTCLASSES="`pwd`"
-fi
-
-JAVA="$TESTJAVA/bin/java"
-JAR="$COMPILEJAVA/bin/jar"
-
-OS=`uname -s`
-case "$OS" in
- SunOS | Darwin | AIX )
- FS='/'
- SEP=':' ;;
- Linux )
- FS='/'
- SEP=':' ;;
- * )
- FS='\\'
- SEP='\;' ;;
-esac
-
-JARD=x.jar
-EXTD=x.ext
-TESTD=x.test
-P3JAR=${EXTD}${FS}p3.jar
-
-if [ \! -d $EXTD ]; then
- # Initialize
- echo Initializing...
- rm -rf $JARD $EXTD $TESTD
- mkdir -p $JARD $EXTD $TESTD
-
- for n in 2 3; do
- rm -rf $JARD/*; mkdir -p $JARD/META-INF/services
- echo FooProvider$n \
- >$JARD/META-INF/services/FooService
- cp $TESTCLASSES/FooProvider$n.class $JARD
- if [ $n = 3 ]; then
- cp $TESTCLASSES/FooService.class $JARD
- fi
- (cd $JARD; "$JAR" ${TESTTOOLVMOPTS} -cf ../p$n.jar *)
- done
-
- cp p2.jar p2dup.jar
- mv p3.jar $EXTD
-
- cp $TESTCLASSES/Load.class $TESTD
- cp $TESTCLASSES/FooService.class $TESTD
- cp $TESTCLASSES/FooProvider1.class $TESTD
- mkdir -p $TESTD/META-INF/services
- echo FooProvider1 \
- >$TESTD/META-INF/services/FooService
-
- # This gives us:
- # $TESTD: FooProvider1
- # . : FooProvider2, in p2.jar
- # $EXTD: FooProvider3, in p3.jar
-
-fi
-
-failures=0
-
-go() {
- echo ''
- cp="$1"; shift
- if [ -z "$cp" ]; then cp="$TESTCLASSES"; else cp="$TESTCLASSES$SEP$cp"; fi
- vmargs="$1"; shift
- sh -xc "'$JAVA' ${TESTVMOPTS} -cp $cp $vmargs $T $*" 2>&1
- if [ $? != 0 ]; then failures=`expr $failures + 1`; fi
-}
-
-
-# Java-level tests
-
-T=Basic
-go ".${SEP}$TESTD${SEP}p2.jar" ""
-
-# Success cases
-
-T=Load
-
-go "$TESTD" "" FooProvider1
-
-go ".${SEP}p2.jar" "" FooProvider2
-
-go ".${SEP}p2.jar${SEP}p2dup.jar" "" FooProvider2
-
-go "${P3JAR}${SEP}p2.jar" "" FooProvider3 FooProvider2
-
-go "$TESTD${SEP}p2.jar" "" FooProvider1 FooProvider2
-
-go "${P3JAR}${SEP}$TESTD" "" FooProvider3 FooProvider1
-
-go "${P3JAR}${SEP}$TESTD${SEP}p2.jar" "" \
- FooProvider3 FooProvider1 FooProvider2
-
-# Failure cases
-
-mkdir -p x.meta/META-INF/services
-
-# Simple failures
-for p in FooProvider42 'blah blah' 9234 'X!' BarProvider; do
- echo $p >x.meta/META-INF/services/FooService
- go ".${SEP}x.meta" "" fail
-done
-
-# Failures followed by successes
-echo FooProvider42 >x.meta/META-INF/services/FooService
-go "$TESTD${SEP}x.meta" "" FooProvider1 fail
-go "x.meta${SEP}$TESTD" "" fail FooProvider1
-go "$TESTD${SEP}x.meta${SEP}${SEP}p2.jar" "" \
- FooProvider1 fail FooProvider2
-
-
-# Summary
-
-echo ''
-if [ $failures -gt 0 ];
- then echo "$failures case(s) failed";
- else echo "All cases passed"; fi
-exit $failures