comparison tests/OnClientTester.java @ 557:ce2b616ed22e onclient

Add a cancellation callback to UploadHandler
author Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
date Thu, 16 Sep 2021 15:12:26 +0200 (2021-09-16)
parents 87feb93330a6
children 8a4e6c82815a
comparison
equal deleted inserted replaced
556:87feb93330a6 557:ce2b616ed22e
61 public void test_Upload() throws Exception { 61 public void test_Upload() throws Exception {
62 prepare(); 62 prepare();
63 MyUploadHandler handler = new MyUploadHandler(100); 63 MyUploadHandler handler = new MyUploadHandler(100);
64 conn.setUploadHandler(handler); 64 conn.setUploadHandler(handler);
65 update("COPY INTO foo FROM 'banana' ON CLIENT", 100); 65 update("COPY INTO foo FROM 'banana' ON CLIENT", 100);
66 assertEq("handler encountered write error", false, handler.encounteredWriteError()); 66 assertEq("cancellation callback called", false, handler.isCancelled());
67 queryInt("SELECT COUNT(*) FROM foo", 100); 67 queryInt("SELECT COUNT(*) FROM foo", 100);
68 } 68 }
69 69
70 public void test_ClientRefusesUpload() throws Exception { 70 public void test_ClientRefusesUpload() throws Exception {
71 prepare(); 71 prepare();
72 MyUploadHandler handler = new MyUploadHandler("immediate error"); 72 MyUploadHandler handler = new MyUploadHandler("immediate error");
73 conn.setUploadHandler(handler); 73 conn.setUploadHandler(handler);
74 expectError("COPY INTO foo FROM 'banana' ON CLIENT", "immediate error"); 74 expectError("COPY INTO foo FROM 'banana' ON CLIENT", "immediate error");
75 assertEq("handler encountered write error", false, handler.encounteredWriteError()); 75 assertEq("cancellation callback called", false, handler.isCancelled());
76 queryInt("SELECT COUNT(*) FROM foo", 0); 76 queryInt("SELECT COUNT(*) FROM foo", 0);
77 } 77 }
78 78
79 public void test_Offset0() throws SQLException, Failure { 79 public void test_Offset0() throws SQLException, Failure {
80 prepare(); 80 prepare();
81 MyUploadHandler handler = new MyUploadHandler(100); 81 MyUploadHandler handler = new MyUploadHandler(100);
82 conn.setUploadHandler(handler); 82 conn.setUploadHandler(handler);
83 update("COPY OFFSET 0 INTO foo FROM 'banana' ON CLIENT", 100); 83 update("COPY OFFSET 0 INTO foo FROM 'banana' ON CLIENT", 100);
84 assertEq("handler encountered write error", false, handler.encounteredWriteError()); 84 assertEq("cancellation callback called", false, handler.isCancelled());
85 queryInt("SELECT MIN(i) FROM foo", 1); 85 queryInt("SELECT MIN(i) FROM foo", 1);
86 queryInt("SELECT MAX(i) FROM foo", 100); 86 queryInt("SELECT MAX(i) FROM foo", 100);
87 } 87 }
88 88
89 public void test_Offset1() throws SQLException, Failure { 89 public void test_Offset1() throws SQLException, Failure {
90 prepare(); 90 prepare();
91 MyUploadHandler handler = new MyUploadHandler(100); 91 MyUploadHandler handler = new MyUploadHandler(100);
92 conn.setUploadHandler(handler); 92 conn.setUploadHandler(handler);
93 update("COPY OFFSET 1 INTO foo FROM 'banana' ON CLIENT", 100); 93 update("COPY OFFSET 1 INTO foo FROM 'banana' ON CLIENT", 100);
94 assertEq("handler encountered write error", false, handler.encounteredWriteError()); 94 assertEq("cancellation callback called", false, handler.isCancelled());
95 queryInt("SELECT MIN(i) FROM foo", 1); 95 queryInt("SELECT MIN(i) FROM foo", 1);
96 queryInt("SELECT MAX(i) FROM foo", 100); 96 queryInt("SELECT MAX(i) FROM foo", 100);
97 } 97 }
98 98
99 public void test_Offset5() throws SQLException, Failure { 99 public void test_Offset5() throws SQLException, Failure {
100 prepare(); 100 prepare();
101 MyUploadHandler handler = new MyUploadHandler(100); 101 MyUploadHandler handler = new MyUploadHandler(100);
102 conn.setUploadHandler(handler); 102 conn.setUploadHandler(handler);
103 update("COPY OFFSET 5 INTO foo FROM 'banana' ON CLIENT", 96); 103 update("COPY OFFSET 5 INTO foo FROM 'banana' ON CLIENT", 96);
104 assertEq("handler encountered write error", false, handler.encounteredWriteError()); 104 assertEq("cancellation callback called", false, handler.isCancelled());
105 queryInt("SELECT MIN(i) FROM foo", 5); 105 queryInt("SELECT MIN(i) FROM foo", 5);
106 queryInt("SELECT MAX(i) FROM foo", 100); 106 queryInt("SELECT MAX(i) FROM foo", 100);
107 } 107 }
108 108
109 public void test_ServerStopsReading() throws SQLException, Failure { 109 public void test_ServerStopsReading() throws SQLException, Failure {
110 prepare(); 110 prepare();
111 MyUploadHandler handler = new MyUploadHandler(100); 111 MyUploadHandler handler = new MyUploadHandler(100);
112 conn.setUploadHandler(handler); 112 conn.setUploadHandler(handler);
113 update("COPY 10 RECORDS INTO foo FROM 'banana' ON CLIENT", 10); 113 update("COPY 10 RECORDS INTO foo FROM 'banana' ON CLIENT", 10);
114 assertEq("cancellation callback called", true, handler.isCancelled());
114 assertEq("handler encountered write error", true, handler.encounteredWriteError()); 115 assertEq("handler encountered write error", true, handler.encounteredWriteError());
115 // Server stopped reading after 10 rows. Will we stay in sync? 116 // Server stopped reading after 10 rows. Will we stay in sync?
116 queryInt("SELECT COUNT(i) FROM foo", 10); 117 queryInt("SELECT COUNT(i) FROM foo", 10);
117 } 118 }
118 119
147 int n = 4_000_000; 148 int n = 4_000_000;
148 MyUploadHandler handler = new MyUploadHandler(n); 149 MyUploadHandler handler = new MyUploadHandler(n);
149 conn.setUploadHandler(handler); 150 conn.setUploadHandler(handler);
150 handler.setChunkSize(1024 * 1024); 151 handler.setChunkSize(1024 * 1024);
151 update("COPY INTO foo FROM 'banana' ON CLIENT", n); 152 update("COPY INTO foo FROM 'banana' ON CLIENT", n);
152 assertEq("handler encountered write error", false, handler.encounteredWriteError()); 153 assertEq("cancellation callback called", false, handler.isCancelled());
153 queryInt("SELECT COUNT(DISTINCT i) FROM foo", n); 154 queryInt("SELECT COUNT(DISTINCT i) FROM foo", n);
154 } 155 }
155 156
156 public void test_LargeDownload() throws SQLException, Failure { 157 public void test_LargeDownload() throws SQLException, Failure {
157 watchDog.setDuration(25_000); 158 watchDog.setDuration(25_000);
211 public void test_FailUploadLate() throws SQLException, Failure { 212 public void test_FailUploadLate() throws SQLException, Failure {
212 prepare(); 213 prepare();
213 MyUploadHandler handler = new MyUploadHandler(100, 50, "i don't like line 50"); 214 MyUploadHandler handler = new MyUploadHandler(100, 50, "i don't like line 50");
214 conn.setUploadHandler(handler); 215 conn.setUploadHandler(handler);
215 expectError("COPY INTO foo FROM 'banana' ON CLIENT", "i don't like"); 216 expectError("COPY INTO foo FROM 'banana' ON CLIENT", "i don't like");
216 assertEq("handler encountered write error", false, handler.encounteredWriteError()); 217 assertEq("cancellation callback called", false, handler.isCancelled());
217 assertEq("connection is closed", true, conn.isClosed()); 218 assertEq("connection is closed", true, conn.isClosed());
218 } 219 }
219 220
220 221
221 public void test_FailUploadLate2() throws SQLException, Failure { 222 public void test_FailUploadLate2() throws SQLException, Failure {
252 253
253 static class MyUploadHandler implements UploadHandler { 254 static class MyUploadHandler implements UploadHandler {
254 private final long rows; 255 private final long rows;
255 private final long errorAt; 256 private final long errorAt;
256 private final String errorMessage; 257 private final String errorMessage;
257 private boolean encounteredWriteError; 258 private boolean encounteredWriteError = false;
259 private boolean cancelled = false;
258 260
259 private int chunkSize = 100; // small number to trigger more bugs 261 private int chunkSize = 100; // small number to trigger more bugs
260 262
261 MyUploadHandler(long rows, long errorAt, String errorMessage) { 263 MyUploadHandler(long rows, long errorAt, String errorMessage) {
262 this.rows = rows; 264 this.rows = rows;
272 this(0, -1, errorMessage); 274 this(0, -1, errorMessage);
273 } 275 }
274 276
275 public void setChunkSize(int chunkSize) { 277 public void setChunkSize(int chunkSize) {
276 this.chunkSize = chunkSize; 278 this.chunkSize = chunkSize;
279 }
280
281 @Override
282 public void uploadCancelled() {
283 cancelled = true;
277 } 284 }
278 285
279 @Override 286 @Override
280 public void handleUpload(MonetConnection.Upload handle, String name, boolean textMode, long linesToSkip) throws IOException { 287 public void handleUpload(MonetConnection.Upload handle, String name, boolean textMode, long linesToSkip) throws IOException {
281 if (errorAt == -1 && errorMessage != null) { 288 if (errorAt == -1 && errorMessage != null) {
296 } 303 }
297 } 304 }
298 305
299 public Object encounteredWriteError() { 306 public Object encounteredWriteError() {
300 return encounteredWriteError; 307 return encounteredWriteError;
308 }
309
310 public boolean isCancelled() {
311 return cancelled;
301 } 312 }
302 } 313 }
303 314
304 static class MyDownloadHandler implements DownloadHandler { 315 static class MyDownloadHandler implements DownloadHandler {
305 private final int errorAtByte; 316 private final int errorAtByte;