changeset 400:20bdae942f99

Implemented some more tests
author Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
date Wed, 02 Dec 2020 22:21:25 +0100 (2020-12-02)
parents addb345e4fa8
children 1850e0dfb5f7
files tests/JDBC_API_Tester.java
diffstat 1 files changed, 363 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/tests/JDBC_API_Tester.java
+++ b/tests/JDBC_API_Tester.java
@@ -11,6 +11,9 @@ import java.util.*;
 import java.io.StringReader;
 import java.nio.charset.Charset;
 
+import org.monetdb.jdbc.types.INET;
+import org.monetdb.jdbc.types.URL;
+
 /**
  * class to test JDBC Driver API methods and behavior of MonetDB server.
  *
@@ -28,13 +31,14 @@ import java.nio.charset.Charset;
  */
 final public class JDBC_API_Tester {
 	StringBuilder sb;	// buffer to collect the test output
+	static int sbInitLen = 3266;
 	Connection con;	// main connection shared by all tests
 
 	public static void main(String[] args) throws Exception {
 		String con_URL = args[0];
 
 		JDBC_API_Tester jt = new JDBC_API_Tester();
-		jt.sb = new StringBuilder(4200);
+		jt.sb = new StringBuilder(sbInitLen);
 		jt.con = DriverManager.getConnection(con_URL);
 		// we are now connected
 
@@ -1157,44 +1161,382 @@ final public class JDBC_API_Tester {
 
 		Statement stmt = null;
 		try {
+			con.setAutoCommit(false);
+			// >> false: auto commit was just switched off
+			sb.append("0. false\t" + con.getAutoCommit()).append("\n");
+
 			stmt = con.createStatement();
+			int updates = 0;
+			updates = stmt.executeUpdate("CREATE TABLE table_Test_PSmetadata ( myint int, mydouble double, mybool boolean, myvarchar varchar(15), myclob clob )");
+			if (updates != -2)
+				sb.append("1. Expected -2 got ").append(updates).append(" instead\n");
+
+			// all NULLs
+			updates = stmt.executeUpdate("INSERT INTO table_Test_PSmetadata VALUES (NULL, NULL,            NULL,           NULL,                  NULL)");
+			if (updates != 1)
+				sb.append("2a. Expected 1 got ").append(updates).append(" instead\n");
+
+			// all filled in
+			updates = stmt.executeUpdate("INSERT INTO table_Test_PSmetadata VALUES (2   , 3.0,             true,           'A string',            'bla bla bla')");
+			if (updates != 1)
+				sb.append("2b. Expected 1 got ").append(updates).append(" instead\n");
+		} catch (SQLException e) {
+			sb.append("FAILED: ").append(e.getMessage()).append("\n");
+		}
+		closeStmtResSet(stmt, null);
+
+		PreparedStatement pstmt = null;
+		try {
+			pstmt = con.prepareStatement("SELECT CASE WHEN myint IS NULL THEN 0 ELSE 1 END AS intnull, * FROM table_Test_PSmetadata WHERE myint = ?");
+
+			// testing and showing result set meta data
+			ResultSetMetaData rsmd = pstmt.getMetaData();
+			sb.append("rsmd. ").append(rsmd.getColumnCount()).append(" columns:\n");
+			for (int col = 1; col <= rsmd.getColumnCount(); col++) {
+				sb.append("RCol ").append(col).append("\n");
+				sb.append("  classname     ").append(rsmd.getColumnClassName(col)).append("\n");
+				sb.append("  displaysize   ").append(rsmd.getColumnDisplaySize(col)).append("\n");
+				sb.append("  label         ").append(rsmd.getColumnLabel(col)).append("\n");
+				sb.append("  name          ").append(rsmd.getColumnName(col)).append("\n");
+				sb.append("  type          ").append(rsmd.getColumnType(col)).append("\n");
+				sb.append("  typename      ").append(rsmd.getColumnTypeName(col)).append("\n");
+				sb.append("  precision     ").append(rsmd.getPrecision(col)).append("\n");
+				sb.append("  scale         ").append(rsmd.getScale(col)).append("\n");
+				sb.append("  catalogname   ").append(rsmd.getCatalogName(col)).append("\n");
+				sb.append("  schemaname    ").append(rsmd.getSchemaName(col)).append("\n");
+				sb.append("  tablename     ").append(rsmd.getTableName(col)).append("\n");
+				sb.append("  autoincrement ").append(rsmd.isAutoIncrement(col)).append("\n");
+				sb.append("  casesensitive ").append(rsmd.isCaseSensitive(col)).append("\n");
+				sb.append("  currency      ").append(rsmd.isCurrency(col)).append("\n");
+				sb.append("  defwritable   ").append(rsmd.isDefinitelyWritable(col)).append("\n");
+				sb.append("  nullable      ").append(rsmd.isNullable(col)).append("\n");
+				sb.append("  readonly      ").append(rsmd.isReadOnly(col)).append("\n");
+				sb.append("  searchable    ").append(rsmd.isSearchable(col)).append("\n");
+				sb.append("  signed        ").append(rsmd.isSigned(col)).append("\n");
+				sb.append("  writable      ").append(rsmd.isWritable(col)).append("\n");
+			}
+
+			// testing and showing parameter meta data
+			ParameterMetaData pmd = pstmt.getParameterMetaData();
+			sb.append("pmd. ").append(pmd.getParameterCount()).append(" parameters:\n");
+			for (int parm = 1; parm <= pmd.getParameterCount(); parm++) {
+				sb.append("Param ").append(parm).append("\n");
+				int nullable = pmd.isNullable(parm);
+				sb.append("  nullable  ").append(nullable).append(" (");
+				switch (nullable) {
+					case ParameterMetaData.parameterNoNulls:	sb.append("NO"); break;
+					case ParameterMetaData.parameterNullable:	sb.append("YA"); break;
+					case ParameterMetaData.parameterNullableUnknown:	sb.append("UNKNOWN"); break;
+					// default:	sb.append("INVALID " + nullable); break;
+				}
+				sb.append(")\n");
+				sb.append("  signed    ").append(pmd.isSigned(parm)).append("\n");
+				sb.append("  precision ").append(pmd.getPrecision(parm)).append("\n");
+				sb.append("  scale     ").append(pmd.getScale(parm)).append("\n");
+				sb.append("  type      ").append(pmd.getParameterType(parm)).append("\n");
+				sb.append("  typename  ").append(pmd.getParameterTypeName(parm)).append("\n");
+				sb.append("  classname ").append(pmd.getParameterClassName(parm)).append("\n");
+				int mode = pmd.getParameterMode(parm);
+				sb.append("  mode      ").append(mode).append(" (");
+				switch (mode) {
+					case ParameterMetaData.parameterModeIn:	sb.append("IN"); break;
+					case ParameterMetaData.parameterModeInOut:	sb.append("INOUT"); break;
+					case ParameterMetaData.parameterModeOut:	sb.append("OUT"); break;
+					case ParameterMetaData.parameterModeUnknown:	sb.append("UNKNOWN"); break;
+					// default:	sb.append("INVALID " + mode); break;
+				}
+				sb.append(")\n");
+			}
+
+			con.rollback();
+			con.setAutoCommit(true);
+			// >> true: auto commit was just switched on
+			sb.append("0. true\t" + con.getAutoCommit()).append("\n");
 		} catch (SQLException e) {
 			sb.append("FAILED: ").append(e.getMessage()).append("\n");
 		}
+		closeStmtResSet(pstmt, null);
 
-		closeStmtResSet(stmt, null);
-
-		compareExpectedOutput("Test_PSmetadata", "");
+		compareExpectedOutput("Test_PSmetadata",
+			"0. false\tfalse\n" +
+			"rsmd. 6 columns:\n" +
+			"RCol 1\n" +
+			"  classname     java.lang.Short\n" +
+			"  displaysize   8\n" +
+			"  label         intnull\n" +
+			"  name          intnull\n" +
+			"  type          -6\n" +
+			"  typename      tinyint\n" +
+			"  precision     8\n" +
+			"  scale         0\n" +
+			"  catalogname   null\n" +
+			"  schemaname    \n" +
+			"  tablename     \n" +
+			"  autoincrement false\n" +
+			"  casesensitive false\n" +
+			"  currency      false\n" +
+			"  defwritable   false\n" +
+			"  nullable      2\n" +
+			"  readonly      true\n" +
+			"  searchable    true\n" +
+			"  signed        true\n" +
+			"  writable      false\n" +
+			"RCol 2\n" +
+			"  classname     java.lang.Integer\n" +
+			"  displaysize   32\n" +
+			"  label         myint\n" +
+			"  name          myint\n" +
+			"  type          4\n" +
+			"  typename      int\n" +
+			"  precision     32\n" +
+			"  scale         0\n" +
+			"  catalogname   null\n" +
+			"  schemaname    \n" +
+			"  tablename     table_test_psmetadata\n" +
+			"  autoincrement false\n" +
+			"  casesensitive false\n" +
+			"  currency      false\n" +
+			"  defwritable   false\n" +
+			"  nullable      2\n" +
+			"  readonly      true\n" +
+			"  searchable    true\n" +
+			"  signed        true\n" +
+			"  writable      false\n" +
+			"RCol 3\n" +
+			"  classname     java.lang.Double\n" +
+			"  displaysize   53\n" +
+			"  label         mydouble\n" +
+			"  name          mydouble\n" +
+			"  type          8\n" +
+			"  typename      double\n" +
+			"  precision     53\n" +
+			"  scale         0\n" +
+			"  catalogname   null\n" +
+			"  schemaname    \n" +
+			"  tablename     table_test_psmetadata\n" +
+			"  autoincrement false\n" +
+			"  casesensitive false\n" +
+			"  currency      false\n" +
+			"  defwritable   false\n" +
+			"  nullable      2\n" +
+			"  readonly      true\n" +
+			"  searchable    true\n" +
+			"  signed        true\n" +
+			"  writable      false\n" +
+			"RCol 4\n" +
+			"  classname     java.lang.Boolean\n" +
+			"  displaysize   1\n" +
+			"  label         mybool\n" +
+			"  name          mybool\n" +
+			"  type          16\n" +
+			"  typename      boolean\n" +
+			"  precision     1\n" +
+			"  scale         0\n" +
+			"  catalogname   null\n" +
+			"  schemaname    \n" +
+			"  tablename     table_test_psmetadata\n" +
+			"  autoincrement false\n" +
+			"  casesensitive false\n" +
+			"  currency      false\n" +
+			"  defwritable   false\n" +
+			"  nullable      2\n" +
+			"  readonly      true\n" +
+			"  searchable    true\n" +
+			"  signed        false\n" +
+			"  writable      false\n" +
+			"RCol 5\n" +
+			"  classname     java.lang.String\n" +
+			"  displaysize   15\n" +
+			"  label         myvarchar\n" +
+			"  name          myvarchar\n" +
+			"  type          12\n" +
+			"  typename      varchar\n" +
+			"  precision     15\n" +
+			"  scale         0\n" +
+			"  catalogname   null\n" +
+			"  schemaname    \n" +
+			"  tablename     table_test_psmetadata\n" +
+			"  autoincrement false\n" +
+			"  casesensitive true\n" +
+			"  currency      false\n" +
+			"  defwritable   false\n" +
+			"  nullable      2\n" +
+			"  readonly      true\n" +
+			"  searchable    true\n" +
+			"  signed        false\n" +
+			"  writable      false\n" +
+			"RCol 6\n" +
+			"  classname     java.lang.String\n" +
+			"  displaysize   0\n" +
+			"  label         myclob\n" +
+			"  name          myclob\n" +
+			"  type          12\n" +
+			"  typename      clob\n" +
+			"  precision     0\n" +
+			"  scale         0\n" +
+			"  catalogname   null\n" +
+			"  schemaname    \n" +
+			"  tablename     table_test_psmetadata\n" +
+			"  autoincrement false\n" +
+			"  casesensitive true\n" +
+			"  currency      false\n" +
+			"  defwritable   false\n" +
+			"  nullable      2\n" +
+			"  readonly      true\n" +
+			"  searchable    true\n" +
+			"  signed        false\n" +
+			"  writable      false\n" +
+			"pmd. 1 parameters:\n" +
+			"Param 1\n" +
+			"  nullable  2 (UNKNOWN)\n" +
+			"  signed    true\n" +
+			"  precision 32\n" +
+			"  scale     0\n" +
+			"  type      4\n" +
+			"  typename  int\n" +
+			"  classname java.lang.Integer\n" +
+			"  mode      1 (IN)\n" +
+			"0. true\ttrue\n");
 	}
 
 	private void Test_PSsomeamount() {
 		sb.setLength(0);	// clear the output log buffer
 
-		Statement stmt = null;
+		PreparedStatement pstmt = null;
+		ResultSet rs = null;
 		try {
-			stmt = con.createStatement();
+			// >> true: auto commit should be on
+			sb.append("0. true\t" + con.getAutoCommit()).append("\n");
+
+			sb.append("1. Preparing and executing a unique statement").append("\n");
+			for (int i = 0; i < 120; i++) {
+				pstmt = con.prepareStatement("select " + i + ", " + i + " = ?");
+				pstmt.setInt(1, i);
+				rs = pstmt.executeQuery();
+				if (rs.next() && i % 20 == 0) {
+					sb.append(rs.getInt(1)).append(", ").append(rs.getBoolean(2)).append("\n");
+				}
+				/* next call should cause resources on the server to be freed */
+				pstmt.close();
+			}
 		} catch (SQLException e) {
 			sb.append("FAILED: ").append(e.getMessage()).append("\n");
 		}
 
-		closeStmtResSet(stmt, null);
+		closeStmtResSet(pstmt, rs);
 
-		compareExpectedOutput("Test_PSsomeamount", "");
+		compareExpectedOutput("Test_PSsomeamount",
+			"0. true	true\n" +
+			"1. Preparing and executing a unique statement\n" +
+			"0, true\n" +
+			"20, true\n" +
+			"40, true\n" +
+			"60, true\n" +
+			"80, true\n" +
+			"100, true\n");
 	}
 
 	private void Test_PSsqldata() {
 		sb.setLength(0);	// clear the output log buffer
 
 		Statement stmt = null;
+		PreparedStatement pstmt = null;
+		ResultSet rs = null;
 		try {
+			con.setAutoCommit(false);
+			// >> false: auto commit should be off now
+			sb.append("0. false\t" + con.getAutoCommit()).append("\n");
+
 			stmt = con.createStatement();
+			int updates = stmt.executeUpdate("CREATE TABLE table_Test_PSsqldata ( myinet inet, myurl url )");
+			if (updates != -2)
+				sb.append("1. Expected -2 got ").append(updates).append(" instead\n");
+
+			pstmt = con.prepareStatement("INSERT INTO table_Test_PSsqldata VALUES (?, ?)");
+			ParameterMetaData pmd = pstmt.getParameterMetaData();
+			sb.append(pmd.getParameterCount()).append(" parameters:\n");
+			for (int parm = 1; parm <= pmd.getParameterCount(); parm++) {
+				sb.append("Parm ").append(parm).append("\n");
+				sb.append("  type      ").append(pmd.getParameterType(parm)).append("\n");
+				sb.append("  typename  ").append(pmd.getParameterTypeName(parm)).append("\n");
+				sb.append("  classname ").append(pmd.getParameterClassName(parm)).append("\n");
+			}
+
+			INET tinet = new INET();
+			tinet.fromString("172.5.5.5/24");
+
+			URL turl = new URL();
+			try {
+				turl.fromString("http://www.monetdb.org/");
+			} catch (Exception e) {
+				sb.append("conversion failed: ").append(e.getMessage()).append("\n");
+			}
+			pstmt.setObject(1, tinet);
+			pstmt.setObject(2, turl);
+			// insert first record
+			pstmt.execute();
+
+			try {
+				tinet.setNetmaskBits(16);
+			} catch (Exception e) {
+				sb.append("setNetmaskBits failed: ").append(e.getMessage()).append("\n");
+			}
+			// insert second record
+			pstmt.execute();
+
+			rs = stmt.executeQuery("SELECT * FROM table_Test_PSsqldata");
+			ResultSetMetaData rsmd = rs.getMetaData();
+			for (int i = 1; rs.next(); i++) {
+				for (int col = 1; col <= rsmd.getColumnCount(); col++) {
+					Object x = rs.getObject(col);
+					if (x == null || rs.wasNull()) {
+						sb.append(i).append(".\t<null>").append("\n");
+					} else {
+						sb.append(i).append(".\t").append(x.toString()).append("\n");
+						if (x instanceof INET) {
+							INET inet = (INET)x;
+							sb.append("  ").append(inet.getAddress()).append("/").append(inet.getNetmaskBits()).append("\n");
+							sb.append("  ").append(inet.getInetAddress().toString()).append("\n");
+						} else if (x instanceof URL) {
+							URL url = (URL)x;
+							sb.append("  ").append(url.getURL().toString()).append("\n");
+						}
+					}
+				}
+			}
+			con.rollback();
+			con.setAutoCommit(true);
+			// >> true: auto commit was just switched on
+			sb.append("0. true\t" + con.getAutoCommit()).append("\n");
 		} catch (SQLException e) {
 			sb.append("FAILED: ").append(e.getMessage()).append("\n");
 		}
 
-		closeStmtResSet(stmt, null);
+		closeStmtResSet(stmt, rs);
+		closeStmtResSet(pstmt, null);
 
-		compareExpectedOutput("Test_PSsqldata", "");
+		compareExpectedOutput("Test_PSsqldata",
+			"0. false	false\n" +
+			"2 parameters:\n" +
+			"Parm 1\n" +
+			"  type      12\n" +
+			"  typename  inet\n" +
+			"  classname org.monetdb.jdbc.types.INET\n" +
+			"Parm 2\n" +
+			"  type      12\n" +
+			"  typename  url\n" +
+			"  classname org.monetdb.jdbc.types.URL\n" +
+			"1.	172.5.5.5/24\n" +
+			"  172.5.5.5/24\n" +
+			"  /172.5.5.5\n" +
+			"1.	http://www.monetdb.org/\n" +
+			"  http://www.monetdb.org/\n" +
+			"2.	172.5.5.5/24\n" +
+			"  172.5.5.5/24\n" +
+			"  /172.5.5.5\n" +
+			"2.	http://www.monetdb.org/\n" +
+			"  http://www.monetdb.org/\n" +
+			"0. true	true\n");
 	}
 
 	private void Test_PStimedate() {
@@ -1520,16 +1862,23 @@ final public class JDBC_API_Tester {
 	}
 
 	private void compareExpectedOutput(String testname, String expected) {
-		if (expected == null || sb == null) {
-			System.out.println("Cannot compare for " + testname + ": expected == null || sb == null");
-		} else
 		if (!expected.equals(sb.toString())) {
-			System.out.println("Test '" + testname + "()' produced different output! Expected:");
+			System.out.print("Test '");
+			System.out.print(testname);
+			if (!testname.endsWith(")"))
+				System.out.print("()");
+			System.out.println("' produced different output!");
+			System.out.println("Expected:");
 			System.out.println(expected);
 			System.out.println("Gotten:");
 			System.out.println(sb);
 			System.out.println();
 		}
+		if (sb.length() > sbInitLen) {
+			System.out.println("Test '" + testname
+				+ "' produced output > " + sbInitLen
+				+ " chars! Enlarge sbInitLen to: " + sb.length());
+		}
 	}
 
 	private void closeConx(Connection cn) {