Changeset: b885de91095d for monetdb-java
URL: https://dev.monetdb.org/hg/monetdb-java/rev/b885de91095d
Added Files:
tests/ConnectionTests.java
Modified Files:
tests/JDBC_API_Tester.java
Branch: default
Log Message:
Add tests for autocommit and timezone handshake options
The other options are hard to test
diffs (206 lines):
diff --git a/tests/ConnectionTests.java b/tests/ConnectionTests.java
new file mode 100644
--- /dev/null
+++ b/tests/ConnectionTests.java
@@ -0,0 +1,189 @@
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Properties;
+import java.util.SimpleTimeZone;
+import java.util.TimeZone;
+
+public class ConnectionTests {
+
+ private final String url;
+ private final Properties connProps;
+ private final TimeZone timeZone;
+
+ public ConnectionTests(String url, Properties props, TimeZone timeZone)
{
+ this.url = url;
+ Properties myProps = null;
+ if (props != null) {
+ myProps = new Properties();
+ myProps.putAll(props);
+ }
+ this.connProps = myProps;
+ this.timeZone = timeZone;
+ }
+
+ public ConnectionTests(String url) {
+ this(url, null, null);
+ }
+
+ public ConnectionTests withSuffix(String suffix) {
+ String newUrl = url;
+
+ if (newUrl.contains("?")) {
+ newUrl += "&";
+ } else {
+ newUrl += "?";
+ }
+ newUrl += suffix;
+
+ return new ConnectionTests(newUrl, this.connProps,
this.timeZone);
+ }
+
+ public ConnectionTests withProp(String key, String value) {
+ ConnectionTests sub = new ConnectionTests(this.url, new
Properties(), this.timeZone);
+ if (this.connProps != null)
+ sub.connProps.putAll(this.connProps);
+ sub.connProps.setProperty(key, value);
+ return sub;
+ }
+
+ public ConnectionTests withTimeZone(int offsetMinutes) {
+ TimeZone tz = new SimpleTimeZone(offsetMinutes * 60 * 1000,
"Custom" + offsetMinutes);
+ return new ConnectionTests(this.url, this.connProps, tz);
+ }
+
+ public static void main(String[] args) throws SQLException, Failure {
+ String url = args[0];
+ runTests(url);
+ }
+
+ public static void runTests(String url) throws SQLException, Failure {
+ ConnectionTests tester = new ConnectionTests(url);
+
+ tester.checkAutoCommit(true);
+ tester.withSuffix("autocommit=true").checkAutoCommit(true);
+ tester.withSuffix("autocommit=false").checkAutoCommit(false);
+ tester.withProp("autocommit", "true").checkAutoCommit(true);
+ tester.withProp("autocommit", "false").checkAutoCommit(false);
+
+ tester.testTimeZone();
+ }
+
+ Connection connect() throws SQLException {
+ TimeZone restore = null;
+ try {
+ if (this.timeZone != null) {
+ restore = TimeZone.getDefault();
+ TimeZone.setDefault(this.timeZone);
+ }
+ if (connProps != null) {
+ return DriverManager.getConnection(url,
connProps);
+ } else {
+ return DriverManager.getConnection(url);
+ }
+ } finally {
+ if (restore != null) {
+ TimeZone.setDefault(restore);
+ }
+ }
+ }
+
+ private void checkAutoCommit(boolean expectAutocommit) throws
SQLException, Failure {
+ // Create and fill the table, leave one row uncommitted.
+ try (Connection conn = connect(); Statement stmt =
conn.createStatement()) {
+ // Does the connection itself believe to be in the
correct mode?
+ boolean autocommitEnabled = conn.getAutoCommit();
+ if (autocommitEnabled != expectAutocommit) {
+ throw new Failure("Expected autocommit to start
as " + expectAutocommit + ", got " + autocommitEnabled);
+ }
+
+ // Let's test how it works out in practice
+ stmt.execute("DROP TABLE IF EXISTS connectiontests");
+ stmt.execute("CREATE TABLE connectiontests(i INT)");
+ stmt.execute("INSERT INTO connectiontests VALUES (42)");
+ if (!expectAutocommit)
+ conn.commit();
+ // This will only be committed in autocommit mode
+ stmt.execute("INSERT INTO connectiontests VALUES (99)");
+ }
+
+ // Check whether the uncommitted row is there or not
+ try (Connection conn = connect(); Statement stmt =
conn.createStatement()) {
+ try (ResultSet rs = stmt.executeQuery("SELECT COUNT(i)
FROM connectiontests")) {
+ rs.next();
+ int n = rs.getInt(1);
+ if (expectAutocommit) {
+ if (n != 2) {
+ throw new Failure("Expected 2
rows because autocommit should be on, got " + n);
+ }
+ } else {
+ if (n != 1) {
+ throw new Failure("Expected 1
row because autocommit should be off, got " + n);
+ }
+ }
+ }
+ }
+ }
+
+ private void testTimeZone() throws SQLException, Failure {
+ try (Connection conn = connect(); Statement stmt =
conn.createStatement()) {
+ stmt.execute("DROP TABLE IF EXISTS connectiontests_ts");
+ stmt.execute("CREATE TABLE connectiontests_ts(ts
TIMESTAMP WITH TIME ZONE)");
+ stmt.execute("INSERT INTO connectiontests_ts VALUES
(str_to_timestamp(100, '%s'))");
+ }
+
+ this.withTimeZone(0).verifyTimeZoneSuffix("+00:00");
+ this.withTimeZone(240).verifyTimeZoneSuffix("+04:00");
+ this.withTimeZone(270).verifyTimeZoneSuffix("+04:30");
+ }
+
+ private void verifyTimeZoneSuffix(String suffix) throws SQLException,
Failure {
+ try (Connection conn = connect(); Statement stmt =
conn.createStatement()) {
+ ResultSet rs = stmt.executeQuery("SELECT * FROM
connectiontests_ts");
+ rs.next();
+ String s = rs.getString(1);
+ if (!s.endsWith(suffix)) {
+ String msg = String.format("Expected suffix
'%s', got timestamp '%s'", suffix, s);
+ throw new Failure(msg);
+ }
+ }
+ }
+
+ public class Failure extends Exception {
+ public Failure(String msg) {
+ super(msg);
+ }
+
+ @Override
+ public String getMessage() {
+ StringBuilder msg = new StringBuilder();
+ msg.append("When connected to ");
+ msg.append(url);
+ if (timeZone != null) {
+ msg.append(", in time zone ");
+ msg.append(timeZone.getID());
+ msg.append(" (");
+ msg.append(timeZone.getDisplayName());
+ msg.append(")");
+ } else {
+ msg.append(", in the default time zone");
+ }
+ if (connProps != null) {
+ msg.append(", with ");
+ msg.append(connProps.size());
+ msg.append(" properties");
+ connProps.forEach((k, v) -> {
+ msg.append(", ");
+ msg.append(k);
+ msg.append("=");
+ msg.append(v);
+ });
+ }
+ msg.append(": ");
+ msg.append(super.getMessage());
+ return msg.toString();
+ }
+ }
+}
diff --git a/tests/JDBC_API_Tester.java b/tests/JDBC_API_Tester.java
--- a/tests/JDBC_API_Tester.java
+++ b/tests/JDBC_API_Tester.java
@@ -108,6 +108,8 @@ final public class JDBC_API_Tester {
if (jt.foundDifferences)
System.exit(-1);
+ ConnectionTests.runTests(con_URL);
+
OnClientTester oct = new OnClientTester(con_URL, 0);
int failures = oct.runTests();
if (failures > 0)
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]