8209772: Refactor shell test java/util/ServiceLoader/basic/basic.sh to java
authoramlu
Fri, 14 Sep 2018 13:18:52 +0800
changeset 51735 6ebcec186980
parent 51734 e6b524cdcc34
child 51736 42d99cb7f50f
8209772: Refactor shell test java/util/ServiceLoader/basic/basic.sh to java Reviewed-by: alanb
test/jdk/java/util/ServiceLoader/basic/ServiceLoaderBasicTest.java
test/jdk/java/util/ServiceLoader/basic/basic.sh
--- /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