@Test(expected=IllegalStateException.class) public void testThrowIfClosing() throws Exception { try (NatsTestServer ts = new NatsTestServer(false); Connection subCon = Nats.connect(new Options.Builder().server(ts.getURI()).maxReconnects(0).build())) { assertTrue("Connected Status", Connection.Status.CONNECTED == subCon.getStatus()); subCon.close(); subCon.drain(Duration.ofSeconds(1)); } } }
@Test(expected=TimeoutException.class) public void testThrowIfCantFlush() throws Exception { TestHandler handler = new TestHandler(); try (NatsTestServer ts = new NatsTestServer(false); Connection subCon = Nats.connect(new Options.Builder().connectionListener(handler).server(ts.getURI()).build())) { assertTrue("Connected Status", Connection.Status.CONNECTED == subCon.getStatus()); subCon.flush(Duration.ofSeconds(1)); // Get the sub to the server handler.prepForStatusChange(Events.DISCONNECTED); ts.close(); // make the drain flush fail handler.waitForStatusChange(2, TimeUnit.SECONDS); // make sure the connection is down subCon.drain(Duration.ofSeconds(1)); //should throw } }
CompletableFuture<Boolean> tracker = subCon.drain(Duration.ofSeconds(4));
CompletableFuture<Boolean> tracker = subCon.drain(Duration.ofSeconds(5));
CompletableFuture<Boolean> tracker = subCon.drain(Duration.ofSeconds(5));
CompletableFuture<Boolean> tracker = subCon.drain(null);
@Test(expected = IllegalStateException.class) public void testSubDuringDrainThrows() throws Exception { try (NatsTestServer ts = new NatsTestServer(false); Connection subCon = Nats.connect(new Options.Builder().server(ts.getURI()).maxReconnects(0).build()); Connection pubCon = Nats.connect(new Options.Builder().server(ts.getURI()).maxReconnects(0).build())) { assertTrue("Connected Status", Connection.Status.CONNECTED == subCon.getStatus()); assertTrue("Connected Status", Connection.Status.CONNECTED == pubCon.getStatus()); subCon.subscribe("draintest"); subCon.flush(Duration.ofSeconds(1)); // Get the sub to the server pubCon.publish("draintest", null); pubCon.publish("draintest", null); pubCon.flush(Duration.ofSeconds(1)); subCon.flush(Duration.ofSeconds(1)); CompletableFuture<Boolean> tracker = subCon.drain(Duration.ofSeconds(500)); // Try to subscribe while we are draining the sub subCon.subscribe("another"); // Should throw assertTrue(tracker.get(1000, TimeUnit.SECONDS)); } }
@Test(expected = IllegalStateException.class) public void testCreateDispatcherDuringDrainThrows() throws Exception { try (NatsTestServer ts = new NatsTestServer(false); Connection subCon = Nats.connect(new Options.Builder().server(ts.getURI()).maxReconnects(0).build()); Connection pubCon = Nats.connect(new Options.Builder().server(ts.getURI()).maxReconnects(0).build())) { assertTrue("Connected Status", Connection.Status.CONNECTED == subCon.getStatus()); assertTrue("Connected Status", Connection.Status.CONNECTED == pubCon.getStatus()); subCon.subscribe("draintest"); subCon.flush(Duration.ofSeconds(1)); // Get the sub to the server pubCon.publish("draintest", null); pubCon.publish("draintest", null); pubCon.flush(Duration.ofSeconds(1)); subCon.flush(Duration.ofSeconds(1)); CompletableFuture<Boolean> tracker = subCon.drain(Duration.ofSeconds(500)); subCon.createDispatcher((msg) -> { }); assertTrue(tracker.get(1000, TimeUnit.SECONDS)); } }
assertNotNull(response.get(1, TimeUnit.SECONDS)); CompletableFuture<Boolean> tracker = subCon.drain(Duration.ofSeconds(1));
CompletableFuture<Boolean> tracker = subCon.drain(Duration.ofSeconds(2));
@Test(expected=IllegalStateException.class) public void testFirstTimeRequestReplyDuringDrain() throws Exception { try (NatsTestServer ts = new NatsTestServer(false); Connection subCon = Nats.connect(new Options.Builder().server(ts.getURI()).maxReconnects(0).build()); Connection pubCon = Nats.connect(new Options.Builder().server(ts.getURI()).maxReconnects(0).build())) { assertTrue("Connected Status", Connection.Status.CONNECTED == subCon.getStatus()); assertTrue("Connected Status", Connection.Status.CONNECTED == pubCon.getStatus()); Subscription sub = subCon.subscribe("draintest"); subCon.flush(Duration.ofSeconds(1)); // Get the sub to the server Dispatcher d = pubCon.createDispatcher((msg) -> { pubCon.publish(msg.getReplyTo(), null); }); d.subscribe("reply"); pubCon.flush(Duration.ofSeconds(1)); // Get the sub to the server pubCon.publish("draintest", null); pubCon.publish("draintest", null); pubCon.flush(Duration.ofSeconds(1)); CompletableFuture<Boolean> tracker = subCon.drain(Duration.ofSeconds(500)); Message msg = sub.nextMessage(Duration.ofSeconds(1)); // read 1 assertNotNull(msg); CompletableFuture<Message> response = subCon.request("reply", null); subCon.flush(Duration.ofSeconds(1)); // Get the sub to the server assertNotNull(response.get(200, TimeUnit.SECONDS)); msg = sub.nextMessage(Duration.ofSeconds(1)); // read 1 assertNotNull(msg); assertTrue(tracker.get(500, TimeUnit.SECONDS)); // wait for the drain to complete assertTrue(Connection.Status.CLOSED == subCon.getStatus()); } }