Mercurial > hg > monetdb-java
diff tests/OnClientTester.java @ 533:b75464874130 onclient
Keep better track of whether the server has cancelled the upload
IOExceptions are suppressed by PrintStreams print/println methods.
This means the client may not realize the server cancelled
and we must suppress all further attempts to write.
Also, the end of upload handshake is different if a cancellation occurred.
author | Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com> |
---|---|
date | Fri, 27 Aug 2021 13:45:38 +0200 (2021-08-27) |
parents | 53dc4349ace9 |
children | b437529144f1 |
line wrap: on
line diff
--- a/tests/OnClientTester.java +++ b/tests/OnClientTester.java @@ -49,46 +49,58 @@ public final class OnClientTester extend public void test_Upload() throws Exception { prepare(); - conn.setUploadHandler(new MyUploadHandler(100)); + MyUploadHandler handler = new MyUploadHandler(100); + conn.setUploadHandler(handler); update("COPY INTO foo FROM 'banana' ON CLIENT", 100); + assertEq("handler encountered write error", false, handler.encounteredWriteError()); queryInt("SELECT COUNT(*) FROM foo", 100); } public void test_ClientRefusesUpload() throws Exception { prepare(); - conn.setUploadHandler(new MyUploadHandler("immediate error")); + MyUploadHandler handler = new MyUploadHandler("immediate error"); + conn.setUploadHandler(handler); expectError("COPY INTO foo FROM 'banana' ON CLIENT", "immediate error"); + assertEq("handler encountered write error", false, handler.encounteredWriteError()); queryInt("SELECT COUNT(*) FROM foo", 0); } public void test_Offset0() throws SQLException, Failure { prepare(); - conn.setUploadHandler(new MyUploadHandler(100)); + MyUploadHandler handler = new MyUploadHandler(100); + conn.setUploadHandler(handler); update("COPY OFFSET 0 INTO foo FROM 'banana' ON CLIENT", 100); + assertEq("handler encountered write error", false, handler.encounteredWriteError()); queryInt("SELECT MIN(i) FROM foo", 1); queryInt("SELECT MAX(i) FROM foo", 100); } public void test_Offset1() throws SQLException, Failure { prepare(); - conn.setUploadHandler(new MyUploadHandler(100)); + MyUploadHandler handler = new MyUploadHandler(100); + conn.setUploadHandler(handler); update("COPY OFFSET 1 INTO foo FROM 'banana' ON CLIENT", 100); + assertEq("handler encountered write error", false, handler.encounteredWriteError()); queryInt("SELECT MIN(i) FROM foo", 1); queryInt("SELECT MAX(i) FROM foo", 100); } public void test_Offset5() throws SQLException, Failure { prepare(); - conn.setUploadHandler(new MyUploadHandler(100)); + MyUploadHandler handler = new MyUploadHandler(100); + conn.setUploadHandler(handler); update("COPY OFFSET 5 INTO foo FROM 'banana' ON CLIENT", 96); + assertEq("handler encountered write error", false, handler.encounteredWriteError()); queryInt("SELECT MIN(i) FROM foo", 5); queryInt("SELECT MAX(i) FROM foo", 100); } public void test_ServerStopsReading() throws SQLException, Failure { prepare(); - conn.setUploadHandler(new MyUploadHandler(100)); - update("COPY 10 RECORDS INTO foo FROM 'banana' ON CLIENT", 96); + MyUploadHandler handler = new MyUploadHandler(100); + conn.setUploadHandler(handler); + update("COPY 10 RECORDS INTO foo FROM 'banana' ON CLIENT", 10); + assertEq("handler encountered write error", true, handler.encounteredWriteError()); // Server stopped reading after 10 rows. Will we stay in sync? queryInt("SELECT COUNT(i) FROM foo", 10); } @@ -125,6 +137,7 @@ public final class OnClientTester extend conn.setUploadHandler(handler); handler.setChunkSize(1024 * 1024); update("COPY INTO foo FROM 'banana' ON CLIENT", n); + assertEq("handler encountered write error", false, handler.encounteredWriteError()); queryInt("SELECT COUNT(DISTINCT i) FROM foo", n); } @@ -183,8 +196,10 @@ public final class OnClientTester extend public void test_FailUploadLate() throws SQLException, Failure { prepare(); - conn.setUploadHandler(new MyUploadHandler(100, 50, "i don't like line 50")); + MyUploadHandler handler = new MyUploadHandler(100, 50, "i don't like line 50"); + conn.setUploadHandler(handler); expectError("COPY INTO foo FROM 'banana' ON CLIENT", "i don't like"); + assertEq("handler encountered write error", false, handler.encounteredWriteError()); assertEq("connection is closed", true, conn.isClosed()); } @@ -202,6 +217,7 @@ public final class OnClientTester extend private final int rows; private final int errorAt; private final String errorMessage; + private boolean encounteredWriteError; private int chunkSize = 100; // small number to trigger more bugs @@ -237,9 +253,16 @@ public final class OnClientTester extend throw new IOException(errorMessage); } stream.printf("%d|%d%n", i + 1, i + 1); + if (i % 25 == 0 && stream.checkError()) { + encounteredWriteError = true; + break; + } } } + public Object encounteredWriteError() { + return encounteredWriteError; + } } static class MyDownloadHandler implements MonetDownloadHandler {