8222391: javax/net/ssl/compatibility/Compatibility.java should be more flexible
authorjjiang
Tue, 23 Apr 2019 10:08:52 +0800
changeset 54588 f203906d0dde
parent 54587 b4d37cf7b90e
child 54589 3babb3ed24c6
child 54593 f0cec8e8d2ab
8222391: javax/net/ssl/compatibility/Compatibility.java should be more flexible Reviewed-by: xuelei
test/jdk/javax/net/ssl/compatibility/Client.java
test/jdk/javax/net/ssl/compatibility/Compatibility.java
test/jdk/javax/net/ssl/compatibility/JdkInfo.java
test/jdk/javax/net/ssl/compatibility/Server.java
test/jdk/javax/net/ssl/compatibility/UseCase.java
test/jdk/javax/net/ssl/compatibility/Utils.java
--- a/test/jdk/javax/net/ssl/compatibility/Client.java	Mon Apr 22 07:13:18 2019 -0400
+++ b/test/jdk/javax/net/ssl/compatibility/Client.java	Tue Apr 23 10:08:52 2019 +0800
@@ -118,15 +118,15 @@
         String serverName = System.getProperty(Utils.PROP_SERVER_NAME);
         String appProtocols = System.getProperty(Utils.PROP_APP_PROTOCOLS);
         boolean supportsSNIOnServer
-                = Utils.getBoolProperty(Utils.PROP_SUPPORTS_SNI_ON_SERVER);
+                = Boolean.getBoolean(Utils.PROP_SUPPORTS_SNI_ON_SERVER);
         boolean supportsSNIOnClient
-                = Utils.getBoolProperty(Utils.PROP_SUPPORTS_SNI_ON_CLIENT);
+                = Boolean.getBoolean(Utils.PROP_SUPPORTS_SNI_ON_CLIENT);
         boolean supportsALPNOnServer
-                = Utils.getBoolProperty(Utils.PROP_SUPPORTS_ALPN_ON_SERVER);
+                = Boolean.getBoolean(Utils.PROP_SUPPORTS_ALPN_ON_SERVER);
         boolean supportsALPNOnClient
-                = Utils.getBoolProperty(Utils.PROP_SUPPORTS_ALPN_ON_CLIENT);
+                = Boolean.getBoolean(Utils.PROP_SUPPORTS_ALPN_ON_CLIENT);
         boolean negativeCase
-                = Utils.getBoolProperty(Utils.PROP_NEGATIVE_CASE_ON_CLIENT);
+                = Boolean.getBoolean(Utils.PROP_NEGATIVE_CASE_ON_CLIENT);
         System.out.println(Utils.join(Utils.PARAM_DELIMITER,
                 "ClientJDK=" + System.getProperty(Utils.PROP_CLIENT_JDK),
                 "Protocol=" + protocol,
--- a/test/jdk/javax/net/ssl/compatibility/Compatibility.java	Mon Apr 22 07:13:18 2019 -0400
+++ b/test/jdk/javax/net/ssl/compatibility/Compatibility.java	Tue Apr 23 10:08:52 2019 +0800
@@ -57,20 +57,33 @@
 
 public class Compatibility {
 
-    public static void main(String[] args) throws Throwable {
-        String javaSecurityFile
-                = System.getProperty("test.src") + "/java.security";
-        boolean debug = Utils.getBoolProperty("debug");
+    protected List<UseCase> getUseCases() {
+        return UseCase.getAllUseCases();
+    }
 
-        Set<JdkInfo> jdkInfos = jdkInfoList();
+    protected Set<JdkInfo> getJdkInfos() {
+        return jdkInfoList();
+    }
 
-        System.out.println("Test start");
+    protected List<TestCase> runTest() throws Exception {
+        Set<JdkInfo> jdkInfos = getJdkInfos();
 
         List<TestCase> testCases = new ArrayList<>();
         ExecutorService executor = Executors.newCachedThreadPool();
         PrintStream origStdOut = System.out;
         PrintStream origStdErr = System.err;
 
+        boolean debug = Boolean.getBoolean("debug");
+
+        String securityPropertiesFile = System.getProperty(
+                "test.security.properties",
+                System.getProperty("test.src") + "/java.security");
+        System.out.println("security properties: " + securityPropertiesFile);
+
+        // If true, server and client CANNOT be a same JDK
+        boolean disallowSameEndpoint = Boolean.getBoolean("disallowSameEndpoint");
+        System.out.println("disallowSameEndpoint: " + disallowSameEndpoint);
+
         try (PrintStream printStream = new PrintStream(
                 new FileOutputStream(Utils.TEST_LOG, true))) {
             System.setOut(printStream);
@@ -79,13 +92,13 @@
             System.out.println(Utils.startHtml());
             System.out.println(Utils.startPre());
 
-            for (UseCase useCase : UseCase.getAllUseCases()) {
+            for (UseCase useCase : getUseCases()) {
                 for (JdkInfo serverJdk : jdkInfos) {
                     Map<String, String> props = new LinkedHashMap<>();
                     if (debug) {
                         props.put("javax.net.debug", "all");
                     }
-                    props.put("java.security.properties", javaSecurityFile);
+                    props.put("java.security.properties", securityPropertiesFile);
 
                     props.put(Utils.PROP_PROTOCOL, useCase.protocol.name);
                     props.put(Utils.PROP_CIPHER_SUITE, useCase.cipherSuite.name());
@@ -105,6 +118,10 @@
                             serverJdk.supportsALPN + "");
 
                     for (JdkInfo clientJdk : jdkInfos) {
+                        if (disallowSameEndpoint && clientJdk == serverJdk) {
+                            continue;
+                        }
+
                         TestCase testCase = new TestCase(serverJdk, clientJdk,
                                 useCase);
                         System.out.println(Utils.anchorName(testCase.toString(),
@@ -162,119 +179,11 @@
         System.setErr(origStdErr);
         executor.shutdown();
 
-        System.out.println("Test end");
-        System.out.println("Report is being generated...");
-        boolean failed = generateReport(testCases);
-        System.out.println("Report is generated.");
-        if (failed) {
-            throw new RuntimeException("At least one case failed. "
-                    + "Please check logs for more details.");
-        }
-    }
-
-    private static Status getStatus(String log) {
-        if (log.contains(Status.UNEXPECTED_SUCCESS.name())) {
-            return Status.UNEXPECTED_SUCCESS;
-        } else if (log.contains(Status.SUCCESS.name())) {
-            return Status.SUCCESS;
-        } else if (log.contains(Status.EXPECTED_FAIL.name())) {
-            return Status.EXPECTED_FAIL;
-        } else if (log.contains(Status.TIMEOUT.name())) {
-            return Status.TIMEOUT;
-        } else {
-            return Status.FAIL;
-        }
-    }
-
-    private static Status caseStatus(Status serverStatus, Status clientStatus) {
-        if (clientStatus == null || clientStatus == Status.TIMEOUT) {
-            return serverStatus == Status.EXPECTED_FAIL
-                   ? Status.EXPECTED_FAIL
-                   : Status.FAIL;
-        } else if (serverStatus == Status.TIMEOUT) {
-            return clientStatus == Status.EXPECTED_FAIL
-                   ? Status.EXPECTED_FAIL
-                   : Status.FAIL;
-        } else {
-            return serverStatus == clientStatus
-                   ? serverStatus
-                   : Status.FAIL;
-        }
-    }
-
-    // Retrieves JDK info from the file which is specified by jdkListFile.
-    // If no such file or no JDK is specified by the file, the current testing
-    // JDK will be used.
-    private static Set<JdkInfo> jdkInfoList() throws Throwable {
-        List<String> jdkList = jdkList("jdkListFile");
-        if (jdkList.size() == 0) {
-            jdkList.add(System.getProperty("test.jdk"));
-        }
-
-        Set<JdkInfo> jdkInfoList = new LinkedHashSet<>();
-        for (String jdkPath : jdkList) {
-            JdkInfo jdkInfo = new JdkInfo(jdkPath);
-            // JDK version must be unique.
-            if (!jdkInfoList.add(jdkInfo)) {
-                System.out.println("The JDK version is duplicate: " + jdkPath);
-            }
-        }
-        return jdkInfoList;
-    }
-
-    private static List<String> jdkList(String listFileProp) throws IOException {
-        String listFile = System.getProperty(listFileProp);
-        System.out.println(listFileProp + "=" + listFile);
-        if (listFile != null && Files.exists(Paths.get(listFile))) {
-            try (Stream<String> lines = Files.lines(Paths.get(listFile))) {
-                return lines.filter(line -> {
-                    return !line.trim().isEmpty();
-                }).collect(Collectors.toList());
-            }
-        } else {
-            return new ArrayList<>();
-        }
-    }
-
-    // Checks if server is already launched, and returns server port.
-    private static int waitForServerStarted()
-            throws IOException, InterruptedException {
-        System.out.print("Waiting for server");
-        long deadline = System.currentTimeMillis() + Utils.TIMEOUT;
-        int port;
-        while ((port = getServerPort()) == -1
-                && System.currentTimeMillis() < deadline) {
-            System.out.print(".");
-            TimeUnit.SECONDS.sleep(1);
-        }
-        System.out.println();
-
-        return port;
-    }
-
-    // Retrieves the latest server port from port.log.
-    private static int getServerPort() throws IOException {
-        if (!Files.exists(Paths.get(Utils.PORT_LOG))) {
-            return -1;
-        }
-
-        try (Stream<String> lines = Files.lines(Paths.get(Utils.PORT_LOG))) {
-            return Integer.valueOf(lines.findFirst().get());
-        }
-    }
-
-    private static OutputAnalyzer runServer(String jdkPath,
-            Map<String, String> props) {
-        return ProcessUtils.java(jdkPath, props, Server.class);
-    }
-
-    private static OutputAnalyzer runClient(String jdkPath,
-            Map<String, String> props) {
-        return ProcessUtils.java(jdkPath, props, Client.class);
+        return testCases;
     }
 
     // Generates the test result report.
-    private static boolean generateReport(List<TestCase> testCases)
+    protected boolean generateReport(List<TestCase> testCases)
             throws IOException {
         boolean failed = false;
         StringBuilder report = new StringBuilder();
@@ -321,6 +230,124 @@
         return failed;
     }
 
+    protected void run() throws Exception {
+        System.out.println("Test start");
+        List<TestCase> testCases= runTest();
+        System.out.println("Test end");
+
+        boolean failed = generateReport(testCases);
+        System.out.println("Report was generated.");
+
+        if (failed) {
+            throw new RuntimeException("At least one case failed. "
+                    + "Please check logs for more details.");
+        }
+    }
+
+    public static void main(String[] args) throws Throwable {
+        new Compatibility().run();;
+    }
+
+    private static Status getStatus(String log) {
+        if (log.contains(Status.UNEXPECTED_SUCCESS.name())) {
+            return Status.UNEXPECTED_SUCCESS;
+        } else if (log.contains(Status.SUCCESS.name())) {
+            return Status.SUCCESS;
+        } else if (log.contains(Status.EXPECTED_FAIL.name())) {
+            return Status.EXPECTED_FAIL;
+        } else if (log.contains(Status.TIMEOUT.name())) {
+            return Status.TIMEOUT;
+        } else {
+            return Status.FAIL;
+        }
+    }
+
+    private static Status caseStatus(Status serverStatus, Status clientStatus) {
+        if (clientStatus == null || clientStatus == Status.TIMEOUT) {
+            return serverStatus == Status.EXPECTED_FAIL
+                   ? Status.EXPECTED_FAIL
+                   : Status.FAIL;
+        } else if (serverStatus == Status.TIMEOUT) {
+            return clientStatus == Status.EXPECTED_FAIL
+                   ? Status.EXPECTED_FAIL
+                   : Status.FAIL;
+        } else {
+            return serverStatus == clientStatus
+                   ? serverStatus
+                   : Status.FAIL;
+        }
+    }
+
+    // Retrieves JDK info from the file which is specified by jdkListFile.
+    // And the current testing JDK, which is specified by test.jdk, always be used.
+    private static Set<JdkInfo> jdkInfoList() {
+        List<String> jdkList = jdkList();
+        jdkList.add(System.getProperty("test.jdk"));
+
+        Set<JdkInfo> jdkInfoList = new LinkedHashSet<>();
+        for (String jdkPath : jdkList) {
+            JdkInfo jdkInfo = new JdkInfo(jdkPath);
+            // JDK version must be unique.
+            if (!jdkInfoList.add(jdkInfo)) {
+                System.out.println("The JDK version is duplicate: " + jdkPath);
+            }
+        }
+        return jdkInfoList;
+    }
+
+    private static List<String> jdkList() {
+        String listFile = System.getProperty("jdkListFile");
+        System.out.println("jdk list file: " + listFile);
+        if (listFile != null && Files.exists(Paths.get(listFile))) {
+            try (Stream<String> lines = Files.lines(Paths.get(listFile))) {
+                return lines.filter(line -> {
+                    return !line.trim().isEmpty();
+                }).collect(Collectors.toList());
+            } catch (IOException e) {
+                throw new RuntimeException("Cannot get jdk list", e);
+            }
+        } else {
+            return new ArrayList<>();
+        }
+    }
+
+    // Checks if server is already launched, and returns server port.
+    private static int waitForServerStarted()
+            throws IOException, InterruptedException {
+        System.out.print("Waiting for server");
+        long deadline = System.currentTimeMillis() + Utils.TIMEOUT;
+        int port;
+        while ((port = getServerPort()) == -1
+                && System.currentTimeMillis() < deadline) {
+            System.out.print(".");
+            TimeUnit.SECONDS.sleep(1);
+        }
+        System.out.println();
+
+        return port;
+    }
+
+    // Retrieves the latest server port from port.log.
+    private static int getServerPort() throws IOException {
+        if (!Files.exists(Paths.get(Utils.PORT_LOG))) {
+            return -1;
+        }
+
+        try (Stream<String> lines = Files.lines(Paths.get(Utils.PORT_LOG))) {
+            return Integer.valueOf(lines.findFirst().get());
+        }
+    }
+
+    private static OutputAnalyzer runServer(String jdkPath,
+            Map<String, String> props) {
+        return ProcessUtils.java(jdkPath, props, Server.class);
+    }
+
+    private static OutputAnalyzer runClient(String jdkPath,
+            Map<String, String> props) {
+        return ProcessUtils.java(jdkPath, props, Client.class);
+    }
+
     private static void generateFile(String path, String content)
             throws IOException {
         try(FileWriter writer = new FileWriter(new File(path))) {
--- a/test/jdk/javax/net/ssl/compatibility/JdkInfo.java	Mon Apr 22 07:13:18 2019 -0400
+++ b/test/jdk/javax/net/ssl/compatibility/JdkInfo.java	Tue Apr 23 10:08:52 2019 +0800
@@ -36,7 +36,7 @@
     public final boolean supportsSNI;
     public final boolean supportsALPN;
 
-    public JdkInfo(String jdkPath) throws Throwable {
+    public JdkInfo(String jdkPath) {
         this.jdkPath = jdkPath;
 
         String output = jdkAttributes(jdkPath);
@@ -54,7 +54,7 @@
     }
 
     // Determines the specific attributes for the specified JDK.
-    private static String jdkAttributes(String jdkPath) throws Throwable {
+    private static String jdkAttributes(String jdkPath) {
         return ProcessUtils.java(jdkPath, null, JdkUtils.class).getOutput();
     }
 
--- a/test/jdk/javax/net/ssl/compatibility/Server.java	Mon Apr 22 07:13:18 2019 -0400
+++ b/test/jdk/javax/net/ssl/compatibility/Server.java	Tue Apr 23 10:08:52 2019 +0800
@@ -103,12 +103,12 @@
         String protocol = System.getProperty(Utils.PROP_PROTOCOL);
         String cipherSuite = System.getProperty(Utils.PROP_CIPHER_SUITE);
         boolean clientAuth
-                = Utils.getBoolProperty(Utils.PROP_CLIENT_AUTH);
+                = Boolean.getBoolean(Utils.PROP_CLIENT_AUTH);
         String appProtocols = System.getProperty(Utils.PROP_APP_PROTOCOLS);
         boolean supportsALPN
-                = Utils.getBoolProperty(Utils.PROP_SUPPORTS_ALPN_ON_SERVER);
+                = Boolean.getBoolean(Utils.PROP_SUPPORTS_ALPN_ON_SERVER);
         boolean negativeCase
-                = Utils.getBoolProperty(Utils.PROP_NEGATIVE_CASE_ON_SERVER);
+                = Boolean.getBoolean(Utils.PROP_NEGATIVE_CASE_ON_SERVER);
 
         System.out.println(Utils.join(Utils.PARAM_DELIMITER,
                 "ServerJDK=" + System.getProperty(Utils.PROP_SERVER_JDK),
--- a/test/jdk/javax/net/ssl/compatibility/UseCase.java	Mon Apr 22 07:13:18 2019 -0400
+++ b/test/jdk/javax/net/ssl/compatibility/UseCase.java	Tue Apr 23 10:08:52 2019 +0800
@@ -30,10 +30,10 @@
 public class UseCase {
 
     private static final boolean FULL_CASES
-            = Utils.getBoolProperty("fullCases");
+            = Boolean.getBoolean("fullCases");
 
     public static final boolean FULL_CIPHER_SUITES
-            = Utils.getBoolProperty("fullCipherSuites");
+            = Boolean.getBoolean("fullCipherSuites");
 
     public static final Protocol[] PROTOCOLS = new Protocol[] {
             Protocol.TLSV1,
@@ -129,7 +129,7 @@
     }
 
     private static final Object[][] PARAMS = new Object[][] {
-            FULL_CASES ? PROTOCOLS : PROTOCOLS,
+            PROTOCOLS,
             FULL_CASES ? CIPHER_SUITES : MANDATORY_CIPHER_SUITES,
             FULL_CASES ? new Boolean[] { false, true } : new Boolean[] { true },
             FULL_CASES
--- a/test/jdk/javax/net/ssl/compatibility/Utils.java	Mon Apr 22 07:13:18 2019 -0400
+++ b/test/jdk/javax/net/ssl/compatibility/Utils.java	Tue Apr 23 10:08:52 2019 +0800
@@ -166,10 +166,6 @@
         return bool ? "Y" : "N";
     }
 
-    public static boolean getBoolProperty(String prop) {
-        return Boolean.valueOf(System.getProperty(prop));
-    }
-
     public static Status handleException(Exception exception,
             boolean negativeCase) {
         Status status;