Mercurial > hg > monetdb-java
changeset 689:4d3b2cf24b30
Store retrieved rdbms version info in JDBC_API_Tester object, so it can be used by all tests, when they need it.
Approve two tests which have different output on Jul2021 and older servers.
Prevent calling str.substring(-1, -1) (which throws an StringIndexOutOfBoundsException) when comparing with empty strings.
author | Martin van Dinther <martin.van.dinther@monetdbsolutions.com> |
---|---|
date | Wed, 16 Nov 2022 19:59:46 +0100 (2022-11-16) |
parents | 761f406f4713 |
children | f7946d36d1dd |
files | tests/JDBC_API_Tester.java |
diffstat | 1 files changed, 50 insertions(+), 29 deletions(-) [+] |
line wrap: on
line diff
--- a/tests/JDBC_API_Tester.java +++ b/tests/JDBC_API_Tester.java @@ -41,6 +41,8 @@ final public class JDBC_API_Tester { StringBuilder sb; // buffer to collect the test output final static int sbInitLen = 3712; Connection con; // main connection shared by all tests + int dbmsMajorVersion; + int dbmsMinorVersion; boolean foundDifferences = false; public static void main(String[] args) throws Exception { @@ -50,6 +52,9 @@ final public class JDBC_API_Tester { jt.sb = new StringBuilder(sbInitLen); jt.con = DriverManager.getConnection(con_URL); // we are now connected + DatabaseMetaData dbmd = jt.con.getMetaData(); + jt.dbmsMajorVersion = dbmd.getDatabaseMajorVersion(); + jt.dbmsMinorVersion = dbmd.getDatabaseMinorVersion(); // run the tests jt.Test_Cautocommit(con_URL); @@ -114,11 +119,8 @@ final public class JDBC_API_Tester { ConnectionTests.runTests(con_URL); - // invoke running OnClientTester only on Jan2022 (11.43) or older servers - DatabaseMetaData dbmd = jt.con.getMetaData(); - int dbmsMajorVersion = dbmd.getDatabaseMajorVersion(); - int dbmsMinorVersion = dbmd.getDatabaseMinorVersion(); - if (dbmsMajorVersion == 11 && dbmsMinorVersion <= 43) { + // invoke running OnClientTester only on Oct2020 (11.39) or older servers + if (jt.dbmsMajorVersion == 11 && jt.dbmsMinorVersion <= 39) { OnClientTester oct = new OnClientTester(con_URL, 0); int failures = oct.runTests(); if (failures > 0) @@ -1590,6 +1592,8 @@ final public class JDBC_API_Tester { Statement stmt = null; ResultSet rs = null; try { + boolean isPreJan2022 = (dbmsMajorVersion == 11 && dbmsMinorVersion <= 41); + stmt = con.createStatement(); String qry = "SELECT 1;"; rs = stmt.executeQuery(qry); @@ -1605,12 +1609,20 @@ final public class JDBC_API_Tester { qry = "plan SELECT 2;"; rs = stmt.executeQuery(qry); compareResultSet(rs, qry, + ! isPreJan2022 ? "Resultset with 1 columns\n" + "rel\n" + "clob(37)\n" + "project (\n" + "| [ boolean(1) \"true\" as \"%1\".\"%1\" ]\n" + - ") [ tinyint(2) \"2\" ]\n"); + ") [ tinyint(2) \"2\" ]\n" + : + "Resultset with 1 columns\n" + + "rel\n" + + "clob(21)\n" + + "project (\n" + + "| [ boolean \"true\" ]\n" + + ") [ tinyint \"2\" ]\n"); rs.close(); rs = null; sb.setLength(0); // clear the output log buffer @@ -1648,10 +1660,16 @@ final public class JDBC_API_Tester { rs.close(); rs = null; compareExpectedOutput("Test_PlanExplainTraceDebugCmds: " + qry, + ! isPreJan2022 ? "4\n" + "Another resultset\n" + " X_1=0@0:void := querylog.define(\"trace select 4;\":str, \"default_pipe\":str, 6:int);\n" + - " X_10=0:int := sql.resultSet(\".%2\":str, \"%2\":str, \"tinyint\":str, 3:int, 0:int, 7:int, 4:bte);\n"); + " X_10=0:int := sql.resultSet(\".%2\":str, \"%2\":str, \"tinyint\":str, 3:int, 0:int, 7:int, 4:bte);\n" + : + "4\n" + + "Another resultset\n" + + "X_0=0@0:void := querylog.define(\"trace select 4;\":str, \"default_pipe\":str, 6:int);\n" + + "X_1=0:int := sql.resultSet(\".%2\":str, \"%2\":str, \"tinyint\":str, 3:int, 0:int, 7:int, 4:bte);\n"); sb.setLength(0); // clear the output log buffer // debug statements are NOT supported via JDBC driver, so the execution should throw an SQLException @@ -6142,28 +6160,31 @@ final public class JDBC_API_Tester { System.err.println("' produced different output!"); int expLen = expected.length(); int prodLen = produced.length(); - int max_pos = expLen; - if (prodLen > max_pos) - max_pos = prodLen; - int line = 1; - int rowpos = 0; - for (int pos = 0; pos < max_pos; pos++) { - char a = (pos < expLen ? expected.charAt(pos) : '~'); - char b = (pos < prodLen ? produced.charAt(pos) : '~'); - if (a == '\n') { - line++; - rowpos = 0; - } - rowpos++; - if (a != b) { - if (pos + 30 < expLen) - expLen = pos + 30; - if (pos + 30 < prodLen) - prodLen = pos + 30; - System.err.println("Difference found at line " + line + " position " + rowpos - + ": Expected \"" + expected.substring(pos < expLen ? pos : expLen-1, expLen-1) - + "\" but gotten \"" + produced.substring(pos < prodLen ? pos : prodLen-1, prodLen-1) + "\""); - pos = max_pos; + if (expLen > 0 && prodLen > 0) { + int max_pos = expLen; + if (prodLen > max_pos) + max_pos = prodLen; + int line = 1; + int rowpos = 0; + for (int pos = 0; pos < max_pos; pos++) { + char a = (pos < expLen ? expected.charAt(pos) : '~'); + char b = (pos < prodLen ? produced.charAt(pos) : '~'); + if (a == '\n') { + line++; + rowpos = 0; + } else { + rowpos++; + } + if (a != b) { + if (pos + 40 < expLen) + expLen = pos + 40; + if (pos + 40 < prodLen) + prodLen = pos + 40; + System.err.println("Difference found at line " + line + " position " + rowpos + + ". Expected:\n\"" + expected.substring(pos < expLen ? pos : expLen-1, expLen-1) + + "\"\nbut gotten:\n\"" + produced.substring(pos < prodLen ? pos : prodLen-1, prodLen-1) + "\""); + pos = max_pos; + } } } System.err.println();