Return-Path: Delivered-To: apmail-db-derby-commits-archive@www.apache.org Received: (qmail 75612 invoked from network); 24 Apr 2010 17:34:10 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 24 Apr 2010 17:34:10 -0000 Received: (qmail 94449 invoked by uid 500); 24 Apr 2010 17:34:10 -0000 Delivered-To: apmail-db-derby-commits-archive@db.apache.org Received: (qmail 94421 invoked by uid 500); 24 Apr 2010 17:34:10 -0000 Mailing-List: contact derby-commits-help@db.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: Reply-To: "Derby Development" List-Id: Delivered-To: mailing list derby-commits@db.apache.org Received: (qmail 94414 invoked by uid 99); 24 Apr 2010 17:34:10 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 24 Apr 2010 17:34:10 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 24 Apr 2010 17:34:06 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 7E0DB238897F; Sat, 24 Apr 2010 17:33:22 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r937655 - in /db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests: jdbc4/Derby2017LayerBTest.java jdbc4/_Suite.java jdbcapi/Derby2017LayerATest.java jdbcapi/_Suite.java Date: Sat, 24 Apr 2010 17:33:22 -0000 To: derby-commits@db.apache.org From: kristwaa@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20100424173322.7E0DB238897F@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: kristwaa Date: Sat Apr 24 17:33:22 2010 New Revision: 937655 URL: http://svn.apache.org/viewvc?rev=937655&view=rev Log: DERBY-2017: Client driver can insert and commit partial data when a LOB stream throws IOException or does not match the specified length Enabled tests as part of the suites. Added tests for binary data. Patch file: derby-2017-5a-binary_tests.diff Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/Derby2017LayerBTest.java db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/_Suite.java db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/Derby2017LayerATest.java db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/_Suite.java Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/Derby2017LayerBTest.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/Derby2017LayerBTest.java?rev=937655&r1=937654&r2=937655&view=diff ============================================================================== --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/Derby2017LayerBTest.java (original) +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/Derby2017LayerBTest.java Sat Apr 24 17:33:22 2010 @@ -21,9 +21,9 @@ limitations under the License. package org.apache.derbyTesting.functionTests.tests.jdbc4; +import java.io.ByteArrayInputStream; import junit.framework.Test; -import org.apache.derbyTesting.functionTests.tests.jdbcapi.Derby2017LayerATest.FailingReader; import org.apache.derbyTesting.functionTests.util.streams.LoopingAlphabetReader; import org.apache.derbyTesting.junit.BaseJDBCTestCase; @@ -31,6 +31,7 @@ import org.apache.derbyTesting.junit.JDB import org.apache.derbyTesting.junit.TestConfiguration; import java.io.IOException; +import java.io.InputStream; import java.io.Reader; import java.io.StringReader; @@ -39,13 +40,13 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; +import static org.apache.derbyTesting.functionTests.tests.jdbcapi.Derby2017LayerATest.*; + /** * Tests that inserts with streams that throws an {@code IOException} don't * insert data into the database when they shouldn't. *

* The test uses various combinations of auto-commit and rollback. - *

- * TODO: Enable this test as part of the JDBC4 suite when DERBY-2017 is fixed. */ public class Derby2017LayerBTest extends BaseJDBCTestCase { @@ -64,7 +65,7 @@ public class Derby2017LayerBTest return TestConfiguration.defaultSuite(Derby2017LayerBTest.class); } - public void testStreamInsertBufferBoundary() + public void testStreamInsertCharBufferBoundary() throws IOException, SQLException { // NOTE: Many of these lengths are implementation dependent, and the // code paths in LayerBStreamedEXTDTAReaderInputStream may change @@ -118,7 +119,7 @@ public class Derby2017LayerBTest * None of the inserts should be successful, as an {@code IOException} is * thrown by all of the streams. */ - public void testFailedStreamInsertBufferBoundariesImpl() + public void testFailedStreamInsertCharBufferBoundariesImpl() throws IOException, SQLException { // NOTE: Many of these lengths are implementation dependent, and the // code paths in LayerBStreamedEXTDTAReaderInputStream may change @@ -194,7 +195,7 @@ public class Derby2017LayerBTest assertEquals(0, rs.getInt(1)); } - public void testFailedStreamInsert() + public void testFailedStreamInsertChar() throws IOException, SQLException { String[] INSERT = new String[] { "This is row 1", @@ -217,7 +218,7 @@ public class Derby2017LayerBTest doInsertTest(INSERT, MASTER, false, false); } - public void testFailedStreamInsertAutoCommit() + public void testFailedStreamInsertCharAutoCommit() throws IOException, SQLException { String[] INSERT = new String[] { "This is row 1", @@ -240,7 +241,7 @@ public class Derby2017LayerBTest doInsertTest(INSERT, MASTER, true, false); } - public void testFailedStreamInsertRollbackOnError() + public void testFailedStreamInsertCharRollbackOnError() throws IOException, SQLException { String[] INSERT = new String[] { "This is row 1", @@ -263,7 +264,7 @@ public class Derby2017LayerBTest doInsertTest(INSERT, MASTER, false, true); } - public void testFailedStreamInsertAutoCommitRollbackOnError() + public void testFailedStreamInsertCharAutoCommitRollbackOnError() throws IOException, SQLException { String[] INSERT = new String[] { "This is row 1", @@ -286,6 +287,34 @@ public class Derby2017LayerBTest doInsertTest(INSERT, MASTER, true, true); } + public void testFailedStreamInsertBinary() + throws IOException, SQLException { + byte[][] INSERT = generateDefaultInsert(); + String[][] MASTER = generateMaster(INSERT, new int[] {3, 4}); + doInsertTest(INSERT, MASTER, false, false); + } + + public void testFailedStreamInsertBinaryAutoCommit() + throws IOException, SQLException { + byte[][] INSERT = generateDefaultInsert(); + String[][] MASTER = generateMaster(INSERT, new int[] {3, 4}); + doInsertTest(INSERT, MASTER, true, false); + } + + public void testFailedStreamInsertBinaryRollbackOnError() + throws IOException, SQLException { + byte[][] INSERT = generateDefaultInsert(); + String[][] MASTER = generateMaster(INSERT, new int[] {0, 1, 2, 3, 4}); + doInsertTest(INSERT, MASTER, false, true); + } + + public void testFailedStreamInsertBinaryAutoCommitRollbackOnError() + throws IOException, SQLException { + byte[][] INSERT = generateDefaultInsert(); + String[][] MASTER = generateMaster(INSERT, new int[] {3, 4}); + doInsertTest(INSERT, MASTER, true, true); + } + /** * Performs the base test cycle; insert 3 valid rows, try to insert 2 * invalid rows, insert 2 valid rows. @@ -373,4 +402,114 @@ public class Derby2017LayerBTest ResultSet rs = stmt.executeQuery("select * from t2017"); JDBC.assertFullResultSet(rs, MASTER); } + + /** + * Performs the base test cycle; insert 3 valid rows, try to insert 2 + * invalid rows, insert 2 valid rows. + *

+ * The outcome depends on whether auto-commit is on, and whether a rollback + * is issued when an insert fails. + * + * @param INSERT the data to insert + * @param MASTER the expected outcome + * @param autoCommit the auto-commit state to use + * @param rollbackOnError whether or not to issue a rollback if an insert + * fails + * + * @throws IOException if something goes wrong + * @throws SQLException if something goes wrong + */ + private void doInsertTest(byte[][] INSERT, String[][] MASTER, + boolean autoCommit, boolean rollbackOnError) + throws IOException, SQLException { + // A few sanity checks. + assertEquals("Expects 7 rows", 7, INSERT.length); + assertTrue(MASTER.length < INSERT.length); + + rollback(); + Statement stmt = createStatement(); + try { + stmt.executeUpdate("create table t2017_binary (b blob)"); + } catch (SQLException sqle) { + assertSQLState("X0Y32", sqle); + stmt.executeUpdate("delete from t2017_binary"); + } + commit(); + + setAutoCommit(autoCommit); + PreparedStatement ps = prepareStatement( + "insert into t2017_binary values (?)"); + // Insert the 3 first rows. + for (int i=0; i < 3; i++) { + ps.setBinaryStream(1, new ByteArrayInputStream(INSERT[i])); + assertEquals(1, ps.executeUpdate()); + } + + // Insert the 4th and 5th row with a stream that throws an exception. + // Partial data read shouldn't be inserted into the database. + + InputStream r4 = new FailingInputStream(new FailingReader(10, 3)); + ps.setBinaryStream(1, r4); + try { + ps.executeUpdate(); + fail("Insert should have failed"); + } catch (SQLException sqle) { + // TODO: Check when exception handling has been settled. + // The states are different between client and embedded. + //assertSQLState(usingEmbedded() ? "XSDA4" : "XJ001", sqle); + if (rollbackOnError) { + rollback(); + } + } + + InputStream r5 = new FailingInputStream( + new FailingReader(35002, 35001)); + ps.setBinaryStream(1, r5); + try { + ps.executeUpdate(); + fail("Insert should have failed"); + } catch (SQLException sqle) { + // TODO: Check when exception handling has been settled. + // The states are different between client and embedded. + //assertSQLState(usingEmbedded() ? "XSDA4" : "XJ001", sqle); + if (rollbackOnError) { + rollback(); + } + } + + // The errors above should have statement severity. Insert the last + // two rows and commit. + for (int i=5; i < INSERT.length; i++) { + ps.setBinaryStream(1, new ByteArrayInputStream(INSERT[i])); + assertEquals(1, ps.executeUpdate()); + } + + if (!autoCommit) { + commit(); + } + + // Select data in the table, compare to MASTER + ResultSet rs = stmt.executeQuery("select * from t2017_binary"); + JDBC.assertFullResultSet(rs, MASTER); + } + + /** + * Simple and non-conforming input stream that will fail after a + * specified number of bytes read. + */ + private static class FailingInputStream + extends InputStream { + + private final FailingReader in; + + public FailingInputStream(FailingReader in) { + this.in = in; + } + + public int read() + throws IOException { + int c = in.read(); + return (byte)c; + } + } } Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/_Suite.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/_Suite.java?rev=937655&r1=937654&r2=937655&view=diff ============================================================================== --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/_Suite.java (original) +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/_Suite.java Sat Apr 24 17:33:22 2010 @@ -74,6 +74,7 @@ public class _Suite extends BaseTestCase suite.addTest (BlobSetMethodsTest.suite()); suite.addTest (JDBC4FromJDBC3DataSourceTest.suite()); suite.addTest(Derby3650Test.suite()); + suite.addTest(Derby2017LayerBTest.suite()); return suite; } Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/Derby2017LayerATest.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/Derby2017LayerATest.java?rev=937655&r1=937654&r2=937655&view=diff ============================================================================== --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/Derby2017LayerATest.java (original) +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/Derby2017LayerATest.java Sat Apr 24 17:33:22 2010 @@ -30,26 +30,34 @@ import org.apache.derbyTesting.junit.Bas import org.apache.derbyTesting.junit.JDBC; import org.apache.derbyTesting.junit.TestConfiguration; +import java.io.ByteArrayInputStream; import java.io.IOException; +import java.io.InputStream; import java.io.Reader; import java.io.StringReader; +import java.io.UnsupportedEncodingException; + +import java.math.BigInteger; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; +import java.util.Arrays; + /** * Tests that inserts with streams whose lengths differs from the the length * specified don't insert data into the database when they shouldn't. *

* The test uses various combinations of auto-commit and rollback. - *

- * TODO: Enable this test as part of the JDBCAPI suite when DERBY-2017 is fixed. */ public class Derby2017LayerATest extends BaseJDBCTestCase { + /** The encoding used when generating a byte array from a string. */ + public static final String UTF8 = "UTF-8"; + public Derby2017LayerATest(String name) { super(name); } @@ -68,9 +76,9 @@ public class Derby2017LayerATest // Run the tests below with the client driver only. TestSuite clientSuite = new TestSuite("Client only tests"); clientSuite.addTest(new Derby2017LayerATest( - "cs_FailedStreamInsertBufferBoundaries")); + "cs_FailedStreamInsertCharBufferBoundaries")); clientSuite.addTest(new Derby2017LayerATest( - "cs_StreamInsertBufferBoundary")); + "cs_StreamInsertCharBufferBoundary")); ts.addTest(TestConfiguration.clientServerDecorator(clientSuite)); return ts; @@ -82,7 +90,7 @@ public class Derby2017LayerATest * lengths. It will work also before the fix for DERBY-2017, but will fail * if an incorrect fix is applied. */ - public void cs_StreamInsertBufferBoundary() + public void cs_StreamInsertCharBufferBoundary() throws IOException, SQLException { rollback(); Statement stmt = createStatement(); @@ -141,7 +149,7 @@ public class Derby2017LayerATest /** * Runs some failing inserts around buffer boundaries. */ - public void cs_FailedStreamInsertBufferBoundaries() + public void cs_FailedStreamInsertCharBufferBoundaries() throws IOException, SQLException { int[] INSERT; for (int i=0; i < 1024; i++) { @@ -155,11 +163,11 @@ public class Derby2017LayerATest 0+i, }; // We test only one combination of auto-commit and rollback here. - doInsertTest(INSERT, true, false); + doInsertTest(INSERT, false, false); } } - public void testFailedStreamInsertLong() + public void testFailedStreamInsertCharLong() throws IOException, SQLException { int[] INSERT = new int[] { 10*1024+1, @@ -180,7 +188,7 @@ public class Derby2017LayerATest * Inserts data by reading from streams, where two of these will thrown * an {@code IOException}. Data from these streams should not be committed. */ - public void testFailedStreamInsertIOException() + public void testFailedStreamInsertCharIOException() throws IOException, SQLException { String[] INSERT = new String[] { "row 1", "row 2", "row 3", @@ -247,7 +255,7 @@ public class Derby2017LayerATest JDBC.assertFullResultSet(rs, MASTER); } - public void testFailedStreamInsert() + public void testFailedStreamInsertChar() throws IOException, SQLException { String[] INSERT = new String[] { "This is row 1", @@ -271,7 +279,7 @@ public class Derby2017LayerATest doInsertTest(INSERT, MASTER, false, false); } - public void testFailedStreamInsertAutoCommit() + public void testFailedStreamInsertCharAutoCommit() throws IOException, SQLException { String[] INSERT = new String[] { "This is row 1", @@ -294,7 +302,7 @@ public class Derby2017LayerATest doInsertTest(INSERT, MASTER, true, false); } - public void testFailedStreamInsertRollbackOnError() + public void testFailedStreamInsertCharRollbackOnError() throws IOException, SQLException { String[] INSERT = new String[] { "This is row 1", @@ -317,7 +325,7 @@ public class Derby2017LayerATest doInsertTest(INSERT, MASTER, false, true); } - public void testFailedStreamInsertAutoCommitRollbackOnError() + public void testFailedStreamInsertCharAutoCommitRollbackOnError() throws IOException, SQLException { String[] INSERT = new String[] { "This is row 1", @@ -340,6 +348,34 @@ public class Derby2017LayerATest doInsertTest(INSERT, MASTER, true, true); } + public void testFailedStreamInsertBinary() + throws IOException, SQLException { + byte[][] INSERT = generateDefaultInsert(); + String[][] MASTER = generateMaster(INSERT, new int[] {3, 4}); + doInsertTest(INSERT, MASTER, false, false); + } + + public void testFailedStreamInsertBinaryAutoCommit() + throws IOException, SQLException { + byte[][] INSERT = generateDefaultInsert(); + String[][] MASTER = generateMaster(INSERT, new int[] {3, 4}); + doInsertTest(INSERT, MASTER, true, false); + } + + public void testFailedStreamInsertBinaryRollbackOnError() + throws IOException, SQLException { + byte[][] INSERT = generateDefaultInsert(); + String[][] MASTER = generateMaster(INSERT, new int[] {0, 1, 2, 3, 4}); + doInsertTest(INSERT, MASTER, false, true); + } + + public void testFailedStreamInsertBinaryAutoCommitRollbackOnError() + throws IOException, SQLException { + byte[][] INSERT = generateDefaultInsert(); + String[][] MASTER = generateMaster(INSERT, new int[] {3, 4}); + doInsertTest(INSERT, MASTER, true, true); + } + /** * Performs the base test cycle; insert 3 valid rows, try to insert 2 * invalid rows, insert 2 valid rows. @@ -544,6 +580,94 @@ public class Derby2017LayerATest } /** + * Performs the base test cycle; insert 3 valid rows, try to insert 2 + * invalid rows, insert 2 valid rows. + *

+ * The outcome depends on whether auto-commit is on, and whether a rollback + * is issued when an insert fails. + * + * @param INSERT the data to insert + * @param MASTER the expected outcome + * @param autoCommit the auto-commit state to use + * @param rollbackOnError whether or not to issue a rollback if an insert + * fails + * + * @throws IOException if something goes wrong + * @throws SQLException if something goes wrong + */ + private void doInsertTest(byte[][] INSERT, String[][] MASTER, + boolean autoCommit, boolean rollbackOnError) + throws IOException, SQLException { + // A few sanity checks. + assertEquals("Expects 7 rows", 7, INSERT.length); + assertTrue(MASTER.length < INSERT.length); + + rollback(); + Statement stmt = createStatement(); + try { + stmt.executeUpdate("create table t2017_binary (b blob)"); + } catch (SQLException sqle) { + assertSQLState("X0Y32", sqle); + stmt.executeUpdate("delete from t2017_binary"); + } + commit(); + + setAutoCommit(autoCommit); + PreparedStatement ps = prepareStatement( + "insert into t2017_binary values (?)"); + // Insert the 3 first rows. + for (int i=0; i < 3; i++) { + ps.setBytes(1, INSERT[i]); + assertEquals(1, ps.executeUpdate()); + } + + // Insert the 4th row with a stream that's longer than the specified + // length, then the 5th row that's shorter. Both should fail, and the + // data shouldn't be inserted into the database. + + InputStream r4 = new ByteArrayInputStream(INSERT[3]); + ps.setBinaryStream(1, r4, INSERT[3].length - 5); + try { + ps.executeUpdate(); + fail("Insert should have failed, stream too long"); + } catch (SQLException sqle) { + // The states are different between client and embedded. + assertSQLState(usingEmbedded() ? "XSDA4" : "XN015", sqle); + if (rollbackOnError) { + rollback(); + } + } + + InputStream r5 = new ByteArrayInputStream(INSERT[4]); + ps.setBinaryStream(1, r5, INSERT[4].length + 5); + try { + ps.executeUpdate(); + fail("Insert should have failed, stream too short"); + } catch (SQLException sqle) { + // The states are different between client and embedded. + assertSQLState(usingEmbedded() ? "XSDA4" : "XN017", sqle); + if (rollbackOnError) { + rollback(); + } + } + + // The errors above should have statement severity. Insert the last + // two rows and make sure the transaction commits. + for (int i=5; i < INSERT.length; i++) { + ps.setBytes(1, INSERT[i]); + assertEquals(1, ps.executeUpdate()); + } + + if (!autoCommit) { + commit(); + } + + // Select data in the table, compare to MASTER + ResultSet rs = stmt.executeQuery("select * from t2017_binary"); + JDBC.assertFullResultSet(rs, MASTER); + } + + /** * WARNING: This reader is not a general purpose reader!!! *

* Reader thrown an exception when a certain amount of characters has been @@ -600,4 +724,61 @@ public class Derby2017LayerATest in.close(); } } + + /** + * Helper method returning the default bytes used for testing binary data. + * + * @return A byte array with byte arrays ("rows"). + */ + public static byte[][] generateDefaultInsert() { + try { + byte[][] INSERT = new byte[][] { + "This is row 1".getBytes(UTF8), + "This is row 2".getBytes(UTF8), + "This is row 3".getBytes(UTF8), + "This is row 4, a bit too long".getBytes(UTF8), + "This is row 5, a bit too short".getBytes(UTF8), + "This is row 6".getBytes(UTF8), + "This is row 7".getBytes(UTF8), + }; + return INSERT; + } catch (UnsupportedEncodingException uuee) { + // Just return null, should never happen if UTF-8 is used. + return null; + } + } + + /** + * Helper method returning a string array with the expected values from the + * database (based on the values inserted). + *

+ * The purpose of this method is to convert from byte[] to String (as + * done by {@code ResultSet.getString()} when invoked on a column with + * binary data). + * + * @param insert the data inserted + * @param excludes the rows that is expected to fail, will be ignored + * @return A string array with expected strings. + */ + public static String[][] generateMaster(byte[][] insert, int[] excludes) { + Arrays.sort(excludes); + int exIx = 0; + String[][] res = new String[insert.length - excludes.length][]; + int resIx = 0; + for (int i=0; i < insert.length; i++) { + if (i == excludes[exIx]) { + if (exIx < excludes.length -1) { + exIx++; + } + continue; + } + String str = new BigInteger(1, insert[i]).toString(16); + // Pad if there are missing nulls. + while (str.length() < insert[i].length *2) { + str = "0" + str; + } + res[resIx++] = new String[] {str}; + } + return res; + } } Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/_Suite.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/_Suite.java?rev=937655&r1=937654&r2=937655&view=diff ============================================================================== --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/_Suite.java (original) +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/_Suite.java Sat Apr 24 17:33:22 2010 @@ -88,7 +88,8 @@ public class _Suite extends BaseTestCase suite.addTest(RelativeTest.suite()); suite.addTest(metadataMultiConnTest.suite()); suite.addTest(ResultSetStreamTest.suite()); - suite.addTest(InternationalConnectSimpleDSTest.suite()); + suite.addTest(InternationalConnectSimpleDSTest.suite()); + suite.addTest(Derby2017LayerATest.suite()); // Old harness .java tests that run using the HarnessJavaTest // adapter and continue to use a single master file.