private static void validationTests(Configuration configuration, Test.BackgroundPrx background, Test.BackgroundControllerPrx ctl) { try { background.op(); } catch (Ice.LocalException) { test(false); } closeConnection(background); try { // Get the read() of connection validation to throw right away. configuration.readException(new Ice.SocketException()); background.op(); test(false); } catch (Ice.SocketException) { configuration.readException(null); } for (int i = 0; i < 2; ++i) { configuration.readException(new Ice.SocketException()); BackgroundPrx prx = i == 0 ? background : (BackgroundPrx)background.ice_oneway(); Ice.AsyncResult r = prx.begin_op(); test(!r.sentSynchronously()); try { prx.end_op(r); test(false); } catch (Ice.SocketException) { } test(r.IsCompleted); configuration.readException(null); } if (!background.ice_getCommunicator().getProperties().getProperty("Ice.Default.Protocol").Equals("test-ssl") && !background.ice_getCommunicator().getProperties().getProperty("Ice.Default.Protocol").Equals("test-wss")) { try { // Get the read() of the connection validation to return "would block" configuration.readReady(false); background.op(); configuration.readReady(true); } catch (Ice.LocalException ex) { Console.Error.WriteLine(ex); test(false); } closeConnection(background); try { // Get the read() of the connection validation to return "would block" and then throw. configuration.readReady(false); configuration.readException(new Ice.SocketException()); background.op(); test(false); } catch (Ice.SocketException) { configuration.readException(null); configuration.readReady(true); } for (int i = 0; i < 2; ++i) { configuration.readReady(false); configuration.readException(new Ice.SocketException()); Ice.AsyncResult r = background.begin_op(); test(!r.sentSynchronously()); try { background.end_op(r); test(false); } catch (Ice.SocketException) { } test(r.IsCompleted); configuration.readException(null); configuration.readReady(true); } } { ctl.holdAdapter(); // Hold to block in connection validation Ice.AsyncResult r = background.begin_op(); Ice.AsyncResult r2 = background.begin_op(); test(!r.sentSynchronously() && !r2.sentSynchronously()); test(!r.IsCompleted && !r2.IsCompleted); ctl.resumeAdapter(); background.end_op(r); background.end_op(r2); test(r.IsCompleted && r2.IsCompleted); } try { // Get the write() of connection validation to throw right away. ctl.writeException(true); background.op(); test(false); } catch (Ice.ConnectionLostException) { ctl.writeException(false); } try { // Get the write() of the connection validation to return "would block" ctl.writeReady(false); background.op(); ctl.writeReady(true); } catch (Ice.LocalException ex) { Console.Error.WriteLine(ex); test(false); } closeConnection(background); try { // Get the write() of the connection validation to return "would block" and then throw. ctl.writeReady(false); ctl.writeException(true); background.op(); test(false); } catch (Ice.ConnectionLostException) { ctl.writeException(false); ctl.writeReady(true); } byte[] seq = new byte[512 * 1024]; BackgroundPrx backgroundBatchOneway = BackgroundPrxHelper.uncheckedCast(background.ice_batchOneway()); // // First send small requests to test without auto-flushing. // ctl.holdAdapter(); backgroundBatchOneway.op(); backgroundBatchOneway.op(); backgroundBatchOneway.op(); backgroundBatchOneway.op(); ctl.resumeAdapter(); backgroundBatchOneway.ice_flushBatchRequests(); // // Send bigger requests to test with auto-flushing. // ctl.holdAdapter(); backgroundBatchOneway.opWithPayload(seq); backgroundBatchOneway.opWithPayload(seq); backgroundBatchOneway.opWithPayload(seq); backgroundBatchOneway.opWithPayload(seq); ctl.resumeAdapter(); backgroundBatchOneway.ice_flushBatchRequests(); // // Then try the same thing with async flush. // ctl.holdAdapter(); backgroundBatchOneway.op(); backgroundBatchOneway.op(); backgroundBatchOneway.op(); backgroundBatchOneway.op(); ctl.resumeAdapter(); backgroundBatchOneway.begin_ice_flushBatchRequests(); closeConnection(backgroundBatchOneway); ctl.holdAdapter(); backgroundBatchOneway.opWithPayload(seq); backgroundBatchOneway.opWithPayload(seq); backgroundBatchOneway.opWithPayload(seq); backgroundBatchOneway.opWithPayload(seq); ctl.resumeAdapter(); Ice.AsyncResult r3 = backgroundBatchOneway.begin_ice_flushBatchRequests(); // // We can't close the connection before ensuring all the batches have been sent since // with auto-flushing the close connection message might be sent once the first call // opWithPayload is sent and before the flushBatchRequests (this would therefore result // in the flush to report a CloseConnectionException). Instead we flush a second time // with the same callback to wait for the first flush to complete. // //backgroundBatchOneway.ice_getConnection().close(false); backgroundBatchOneway.end_ice_flushBatchRequests(r3); closeConnection(backgroundBatchOneway); }