changeset 797:9f6fe96c0ead monetdbs

Arrange testing
author Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
date Thu, 07 Dec 2023 10:25:16 +0100 (16 months ago)
parents d2f14f2b28b3
children 895429110b7b
files tests/JDBC_API_Tester.java tests/UrlTester.java tests/build.xml tests/javaspecific.md tests/tests.md
diffstat 5 files changed, 187 insertions(+), 109 deletions(-) [+]
line wrap: on
line diff
--- a/tests/JDBC_API_Tester.java
+++ b/tests/JDBC_API_Tester.java
@@ -48,6 +48,9 @@ final public class JDBC_API_Tester {
 	public static void main(String[] args) throws Exception {
 		String con_URL = args[0];
 
+		// Test this before trying to connect
+		UrlTester.runAllTests();
+
 		JDBC_API_Tester jt = new JDBC_API_Tester();
 		jt.sb = new StringBuilder(sbInitLen);
 		jt.con = DriverManager.getConnection(con_URL);
--- a/tests/UrlTester.java
+++ b/tests/UrlTester.java
@@ -2,40 +2,107 @@ import org.monetdb.mcl.net.*;
 
 import java.io.*;
 import java.net.URISyntaxException;
+import java.util.ArrayList;
 
 public class UrlTester {
-    String filename = null;
-    int verbose = 0;
-    BufferedReader reader = null;
+    final String filename;
+    final int verbose;
+    final BufferedReader reader;
     int lineno = 0;
     int testCount = 0;
     Target target = null;
     Target.Validated validated = null;
 
-    public UrlTester() {
+    public UrlTester(String filename, BufferedReader reader, int verbose) {
+        this.filename = filename;
+        this.verbose = verbose;
+        this.reader = reader;
     }
 
-    public UrlTester(String filename) {
+    public UrlTester(String filename, int verbose) throws IOException {
         this.filename = filename;
+        this.verbose = verbose;
+        this.reader = new BufferedReader(new FileReader(filename));
     }
 
-    public static void main(String[] args) throws Exception {
-        checkDefaults();
-        checkParameters();
+    public static void main(String[] args) throws IOException {
+        ArrayList<String> filenames = new ArrayList<>();
+        int verbose = 0;
+        for (String arg : args) {
+            switch (arg) {
+                case "-vvv":
+                    verbose++;
+                case "-vv":
+                    verbose++;
+                case "-v":
+                    verbose++;
+                    break;
+                case "-h":
+                case "--help":
+                    exitUsage(null);
+                    break;
+                default:
+                    if (!arg.startsWith("-")) {
+                        filenames.add(arg);
+                    } else {
+                        exitUsage("Unexpected argument: " + arg);
+                    }
+                    break;
+            }
+        }
 
-        int exitcode;
-        UrlTester tester = new UrlTester();
-        exitcode = tester.parseArgs(args);
-        if (exitcode == 0)
-            exitcode = tester.run();
-        System.exit(exitcode);
+        runUnitTests();
+
+        try {
+            if (filenames.isEmpty()) {
+                runAllTests();
+            } else {
+                for (String filename : filenames) {
+                    new UrlTester(filename, verbose).run();
+                }
+            }
+        } catch (Failure e) {
+            System.err.println("Test failed: " + e.getMessage());
+            System.exit(1);
+        }
     }
 
+    private static void exitUsage(String message) {
+        if (message != null) {
+            System.err.println(message);
+        }
+        System.err.println("Usage: UrlTester OPTIONS [FILENAME..]");
+        System.err.println("Options:");
+        System.err.println("   -v        Be more verbose");
+        System.err.println("   -h --help Show this help");
+        int status = message == null ? 0 : 1;
+        System.exit(status);
+    }
 
-    private static void checkDefaults() {
+    public static UrlTester forResource(String resourceName, int verbose) throws FileNotFoundException {
+        InputStream stream = UrlTester.class.getResourceAsStream(resourceName);
+        if (stream == null) {
+            throw new FileNotFoundException("Resource " + resourceName);
+        }
+        BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
+        return new UrlTester(resourceName, reader, verbose);
+    }
+
+    public static void runAllTests() throws IOException, Failure {
+        runUnitTests();
+        UrlTester.forResource("/tests.md", 0).run();
+        UrlTester.forResource("/javaspecific.md", 0).run();
+    }
+
+    public static void runUnitTests() {
+        testDefaults();
+        testParameters();
+    }
+
+    private static void testDefaults() {
         Target target = new Target();
 
-        for (Parameter parm: Parameter.values()) {
+        for (Parameter parm : Parameter.values()) {
             Object expected = parm.getDefault();
             if (expected == null)
                 continue;
@@ -46,8 +113,8 @@ public class UrlTester {
         }
     }
 
-    private static void checkParameters() {
-        for (Parameter parm: Parameter.values()) {
+    private static void testParameters() {
+        for (Parameter parm : Parameter.values()) {
             Parameter found = Parameter.forName(parm.name);
             if (parm != found) {
                 String foundStr = found != null ? found.name : "null";
@@ -56,66 +123,16 @@ public class UrlTester {
         }
     }
 
-    private int parseArgs(String[] args) {
-        for (int i = 0; i < args.length; i++) {
-            String arg = args[i];
-            if (arg.startsWith("-")) {
-                int result = handleFlags(arg);
-                if (result != 0)
-                    return result;
-            } else if (filename == null) {
-                filename = arg;
-            } else {
-                System.err.println("Unexpected argument: " + arg);
-                return 1;
-            }
-        }
-        return 0;
-    }
-
-    private int run() throws IOException {
-        if (filename != null) {
-            reader = new BufferedReader(new FileReader(filename));
-        } else {
-            String resourceName = "/tests.md";
-            InputStream stream = this.getClass().getResourceAsStream(resourceName);
-            if (stream == null) {
-                System.err.println("Resource " + resourceName + " not found");
-                return 1;
-            }
-            reader = new BufferedReader(new InputStreamReader(stream));
-            filename = "tests/tests.md";
-        }
-
+    public void run() throws Failure, IOException {
         try {
             processFile();
         } catch (Failure e) {
-            System.err.println("" + filename + ":" + lineno + ": " + e.getMessage());
-            return 1;
-        }
-        return 0;
-    }
-
-    private int handleFlags(String arg) {
-        if (!arg.startsWith("-") || arg.equals("-")) {
-            System.err.println("Invalid flag: " + arg);
-        }
-        String a = arg.substring(1);
-
-        while (!a.isEmpty()) {
-            char letter = a.charAt(0);
-            a = a.substring(1);
-            switch (letter) {
-                case 'v':
-                    verbose++;
-                    break;
-                default:
-                    System.err.println("Unexpected flag " + letter + " in " + arg);
-                    return -1;
+            if (e.getFilename() == null) {
+                e.setFilename(filename);
+                e.setLineno(lineno);
+                throw e;
             }
         }
-
-        return 0;
     }
 
     private void processFile() throws IOException, Failure {
@@ -198,7 +215,7 @@ public class UrlTester {
 
     private void handleOnly(boolean mustBePresent, String rest) throws Failure {
         boolean found = false;
-        for (String part: rest.split("\\s+")) {
+        for (String part : rest.split("\\s+")) {
             if (part.equals("jdbc")) {
                 found = true;
                 break;
@@ -329,10 +346,14 @@ public class UrlTester {
                 return tryValidate().connectTcp();
             case "connect_tls_verify":
                 switch (tryValidate().connectVerify()) {
-                    case None: return "";
-                    case Cert: return "cert";
-                    case Hash: return "hash";
-                    case System: return "system";
+                    case None:
+                        return "";
+                    case Cert:
+                        return "cert";
+                    case Hash:
+                        return "hash";
+                    case System:
+                        return "system";
                     default:
                         throw new IllegalStateException("unreachable");
                 }
@@ -354,9 +375,40 @@ public class UrlTester {
         }
     }
 
-    private class Failure extends Exception {
+    public static class Failure extends Exception {
+        private String filename = null;
+        private int lineno = -1;
+
         public Failure(String message) {
             super(message);
         }
+
+        @Override
+        public String getMessage() {
+            StringBuilder buffer = new StringBuilder();
+            if (filename != null) {
+                buffer.append(filename).append(":");
+                if (lineno >= 0)
+                    buffer.append(lineno).append(":");
+            }
+            buffer.append(super.getMessage());
+            return buffer.toString();
+        }
+
+        public String getFilename() {
+            return filename;
+        }
+
+        public void setFilename(String filename) {
+            this.filename = filename;
+        }
+
+        public int getLineno() {
+            return lineno;
+        }
+
+        public void setLineno(int lineno) {
+            this.lineno = lineno;
+        }
     }
 }
--- a/tests/build.xml
+++ b/tests/build.xml
@@ -72,11 +72,17 @@ Copyright 1997 - July 2008 CWI, August 2
     <jar jarfile="${jdbctests-jar}">
       <fileset dir="${builddir}">
         <include name="JDBC_API_Tester.class" />
+        <include name="UrlTester.class" />
+        <include name="UrlTester$*.class" />
         <include name="OnClientTester.class" />
         <include name="OnClientTester$*.class" />
         <include name="ConnectionTests.class" />
         <include name="ConnectionTests$*.class" />
       </fileset>
+      <fileset dir="${srcdir}">
+        <include name="tests.md" />
+        <include name="javaspecific.md" />
+      </fileset>
     </jar>
   </target>
 
new file mode 100644
--- /dev/null
+++ b/tests/javaspecific.md
@@ -0,0 +1,31 @@
+
+# Java-specific tests
+
+Test settings that are only in monetdb-java.
+
+```test
+ONLY jdbc
+EXPECT so_timeout=0
+SET so_timeout=42
+EXPECT so_timeout=42
+ACCEPT monetdb://?so_timeout=99
+EXPECT so_timeout=99
+```
+
+```test
+ONLY jdbc
+EXPECT treat_clob_as_varchar=true
+SET treat_clob_as_varchar=off
+EXPECT treat_clob_as_varchar=false
+ACCEPT monetdb://?treat_clob_as_varchar=yes
+EXPECT treat_clob_as_varchar=on
+```
+
+```test
+ONLY jdbc
+EXPECT treat_blob_as_binary=true
+SET treat_blob_as_binary=off
+EXPECT treat_blob_as_binary=false
+ACCEPT monetdb://?treat_blob_as_binary=yes
+EXPECT treat_blob_as_binary=on
+```
--- a/tests/tests.md
+++ b/tests/tests.md
@@ -1476,12 +1476,28 @@ EXPECT port=123
 EXPECT tls=on
 EXPECT sock=/tmp/sock
 EXPECT database=dummy
+```
+
+```test
+SET host=banana
+SET port=123
+SET tls=on
+SET sock=/tmp/sock
+SET database=dummy
 PARSE mapi:merovingian://proxy?
 EXPECT host=banana
 EXPECT port=123
 EXPECT tls=on
 EXPECT sock=/tmp/sock
 EXPECT database=dummy
+```
+
+```test
+SET host=banana
+SET port=123
+SET tls=on
+SET sock=/tmp/sock
+SET database=dummy
 PARSE mapi:merovingian://proxy?database=yeah&unknown=unknown
 EXPECT host=banana
 EXPECT port=123
@@ -1489,33 +1505,3 @@ EXPECT tls=on
 EXPECT sock=/tmp/sock
 EXPECT database=yeah
 ```
-
-
-# lalala Java
-
-```test
-ONLY jdbc
-EXPECT so_timeout=0
-SET so_timeout=42
-EXPECT so_timeout=42
-ACCEPT monetdb://?so_timeout=99
-EXPECT so_timeout=99
-```
-
-```test
-ONLY jdbc
-EXPECT treat_clob_as_varchar=true
-SET treat_clob_as_varchar=off
-EXPECT treat_clob_as_varchar=false
-ACCEPT monetdb://?treat_clob_as_varchar=yes
-EXPECT treat_clob_as_varchar=on
-```
-
-```test
-ONLY jdbc
-EXPECT treat_blob_as_binary=true
-SET treat_blob_as_binary=off
-EXPECT treat_blob_as_binary=false
-ACCEPT monetdb://?treat_blob_as_binary=yes
-EXPECT treat_blob_as_binary=on
-```