@Test(expected = IllegalStateException.class) public void testAutoUnsubscribe() throws IOException, InterruptedException { try (NatsTestServer ts = new NatsTestServer(false); Connection nc = Nats.connect(ts.getURI())) { assertTrue("Connected Status", Connection.Status.CONNECTED == nc.getStatus()); Subscription sub = nc.subscribe("subject").unsubscribe(1); nc.publish("subject", new byte[16]); Message msg = sub.nextMessage(Duration.ofMillis(500)); // should get 1 assertNotNull(msg); msg = sub.nextMessage(Duration.ofMillis(500)); // Will throw an exception assertFalse(true); } }
@Test(expected = IllegalStateException.class) public void testUnsubscribeInAnotherThread() throws IOException, InterruptedException { try (NatsTestServer ts = new NatsTestServer(false); Connection nc = Nats.connect(ts.getURI())) { assertTrue("Connected Status", Connection.Status.CONNECTED == nc.getStatus()); Subscription sub = nc.subscribe("subject"); Thread t = new Thread(() -> { sub.unsubscribe(); }); t.start(); sub.nextMessage(Duration.ofMillis(5000)); // throw assertFalse(true); } }
@Test(expected = IllegalStateException.class) public void testUnsubscribeWhileWaiting() throws Exception { try (NatsTestServer ts = new NatsTestServer(false); Connection nc = Nats.connect(ts.getURI())) { assertTrue("Connected Status", Connection.Status.CONNECTED == nc.getStatus()); Subscription sub = nc.subscribe("subject"); nc.flush(Duration.ofMillis(1000)); Thread t = new Thread(()->{ try { Thread.sleep(100); }catch(Exception e){} sub.unsubscribe(); }); t.start(); sub.nextMessage(Duration.ofMillis(5000)); // Should throw assertTrue(false); } } }
@Test(expected = IllegalStateException.class) public void testMultiAutoUnsubscribe() throws IOException, InterruptedException { try (NatsTestServer ts = new NatsTestServer(false); Connection nc = Nats.connect(ts.getURI())) { int msgCount = 10; Message msg = null; assertTrue("Connected Status", Connection.Status.CONNECTED == nc.getStatus()); Subscription sub = nc.subscribe("subject").unsubscribe(msgCount); for (int i = 0; i < msgCount; i++) { nc.publish("subject", new byte[16]); } for (int i = 0; i < msgCount; i++) { msg = sub.nextMessage(Duration.ofMillis(500)); // should get 1 assertNotNull(msg); } msg = sub.nextMessage(Duration.ofMillis(500)); // Will throw an exception assertFalse(true); } }
@Test public void testWithEcho() throws Exception { try (NatsTestServer ts = new NatsTestServer()) { Options options = new Options.Builder().server(ts.getURI()).noReconnect().build(); try (Connection nc1 = Nats.connect(options); Connection nc2 = Nats.connect(options);) { // Echo is on so both sub should get messages from both pub Subscription sub1 = nc1.subscribe("test"); nc1.flush(Duration.ofSeconds(1)); Subscription sub2 = nc2.subscribe("test"); nc2.flush(Duration.ofSeconds(1)); // Pub from connect 1 nc1.publish("test", null); nc1.flush(Duration.ofSeconds(1)); Message msg = sub1.nextMessage(Duration.ofSeconds(1)); assertNotNull(msg); msg = sub2.nextMessage(Duration.ofSeconds(1)); assertNotNull(msg); // Pub from connect 2 nc2.publish("test", null); nc2.flush(Duration.ofSeconds(1)); msg = sub1.nextMessage(Duration.ofSeconds(1)); assertNotNull(msg); msg = sub2.nextMessage(Duration.ofSeconds(1)); assertNotNull(msg); } } }
@Test(expected = IllegalStateException.class) public void testAutoUnsubAfterMaxIsReached() throws IOException, InterruptedException, TimeoutException { try (NatsTestServer ts = new NatsTestServer(false); Connection nc = Nats.connect(ts.getURI())) { int msgCount = 10; assertTrue("Connected Status", Connection.Status.CONNECTED == nc.getStatus()); Subscription sub = nc.subscribe("subject"); for (int i = 0; i < msgCount; i++) { nc.publish("subject", new byte[16]); } nc.flush(Duration.ofMillis(1000)); // Slow things down so we have time to unsub for (int i = 0; i < msgCount; i++) { sub.nextMessage(null); } sub.unsubscribe(msgCount); // we already have that many sub.nextMessage(Duration.ofMillis(500)); // Will throw an exception assertFalse(true); } }
@Test(expected = IllegalStateException.class) public void testUnsubscribe() throws IOException, InterruptedException { try (NatsTestServer ts = new NatsTestServer(false); Connection nc = Nats.connect(ts.getURI())) { assertTrue("Connected Status", Connection.Status.CONNECTED == nc.getStatus()); Subscription sub = nc.subscribe("subject"); nc.publish("subject", new byte[16]); Message msg = sub.nextMessage(Duration.ofMillis(500)); assertNotNull(msg); sub.unsubscribe(); assertFalse(sub.isActive()); msg = sub.nextMessage(Duration.ofMillis(500)); // Will throw an exception assertFalse(true); } }
Message msg = sub1.nextMessage(Duration.ofSeconds(1)); msg = sub2.nextMessage(Duration.ofSeconds(1)); assertNotNull(msg); msg = sub1.nextMessage(Duration.ofSeconds(1)); assertNotNull(msg); msg = sub2.nextMessage(Duration.ofSeconds(1));
@Test public void testMultiMessage() throws IOException, InterruptedException { try (NatsTestServer ts = new NatsTestServer(false); Connection nc = Nats.connect(ts.getURI())) { assertTrue("Connected Status", Connection.Status.CONNECTED == nc.getStatus()); Subscription sub = nc.subscribe("subject"); nc.publish("subject", new byte[16]); nc.publish("subject", new byte[16]); nc.publish("subject", new byte[16]); Message msg = sub.nextMessage(Duration.ofMillis(500)); assertEquals("subject", msg.getSubject()); assertEquals(sub, msg.getSubscription()); assertNull(msg.getReplyTo()); assertEquals(16, msg.getData().length); msg = sub.nextMessage(Duration.ofMillis(100)); assertNotNull(msg); msg = sub.nextMessage(Duration.ofMillis(100)); assertNotNull(msg); msg = sub.nextMessage(Duration.ofMillis(100)); assertNull(msg); } }
sub.nextMessage(Duration.ofMillis(1000)); // only 1 to get
@Test public void testManualRequestReply() throws IOException, ExecutionException, TimeoutException, InterruptedException { try (NatsTestServer ts = new NatsTestServer(false); Connection nc = Nats.connect(ts.getURI())) { assertTrue("Connected Status", Connection.Status.CONNECTED == nc.getStatus()); Dispatcher d = nc.createDispatcher((msg) -> { nc.publish(msg.getReplyTo(), msg.getData()); }); d.subscribe("request"); Subscription sub = nc.subscribe("reply"); nc.publish("request", "reply", "hello".getBytes(StandardCharsets.UTF_8)); Message msg = sub.nextMessage(Duration.ofMillis(400)); assertNotNull(msg); assertEquals("hello", new String(msg.getData(), StandardCharsets.UTF_8)); } }
Message msg = sub.nextMessage(Duration.ofSeconds(1)); assertNotNull(msg); msg = sub.nextMessage(Duration.ofSeconds(1)); assertNotNull(msg);
Message msg = sub.nextMessage(Duration.ofSeconds(1)); assertNotNull(msg); msg = sub.nextMessage(Duration.ofSeconds(1)); assertNotNull(msg);
@Test public void testSimpleSubDrain() 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 pubCon.publish("draintest", null); pubCon.publish("draintest", null); // publish 2 pubCon.flush(Duration.ofSeconds(1)); Message msg = sub.nextMessage(Duration.ofSeconds(1)); // read 1 assertNotNull(msg); subCon.flush(Duration.ofSeconds(1)); CompletableFuture<Boolean> tracker = sub.drain(Duration.ofSeconds(1)); msg = sub.nextMessage(Duration.ofSeconds(1)); // read the second one, should be there because we drained assertNotNull(msg); assertTrue(tracker.get(1, TimeUnit.SECONDS)); assertFalse(sub.isActive()); assertEquals(((NatsConnection) subCon).getConsumerCount(), 0); } }
@Test(expected = IllegalStateException.class) public void testOnlyOneAutoUnsubscribe() throws IOException, InterruptedException { try (NatsTestServer ts = new NatsTestServer(false); Connection nc = Nats.connect(ts.getURI())) { assertTrue("Connected Status", Connection.Status.CONNECTED == nc.getStatus()); Subscription sub = nc.subscribe("subject").unsubscribe(1); nc.publish("subject", new byte[16]); Message msg = sub.nextMessage(Duration.ofMillis(500)); // should get 1 assertNotNull(msg); sub.unsubscribe(); // Will throw an exception assertFalse(true); } }
@Test public void testDrainWithZeroTimeout() 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 pubCon.publish("draintest", null); pubCon.publish("draintest", null); // publish 2 pubCon.flush(Duration.ofSeconds(1)); Message msg = sub.nextMessage(Duration.ofSeconds(1)); // read 1 assertNotNull(msg); subCon.flush(Duration.ofSeconds(1)); CompletableFuture<Boolean> tracker = sub.drain(Duration.ZERO); msg = sub.nextMessage(Duration.ofSeconds(1)); // read the second one, should be there because we drained assertNotNull(msg); assertTrue(tracker.get(1, TimeUnit.SECONDS)); assertFalse(sub.isActive()); } }
@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()); } }
Message msg = sub.nextMessage(Duration.ofSeconds(1)); // read 1 assertNotNull(msg); assertNotNull(response.get(200, TimeUnit.SECONDS)); msg = sub.nextMessage(Duration.ofSeconds(1)); // read 1 assertNotNull(msg);
@Test public void testSingleMessage() throws IOException, InterruptedException { try (NatsTestServer ts = new NatsTestServer(false); Connection nc = Nats.connect(ts.getURI())) { assertTrue("Connected Status", Connection.Status.CONNECTED == nc.getStatus()); Subscription sub = nc.subscribe("subject"); nc.publish("subject", new byte[16]); Message msg = sub.nextMessage(Duration.ofMillis(500)); assertTrue(sub.isActive()); assertEquals("subject", msg.getSubject()); assertEquals(sub, msg.getSubscription()); assertNull(msg.getReplyTo()); assertEquals(16, msg.getData().length); } }
@Test public void testUTF8Subjects() throws IOException, TimeoutException, InterruptedException { try (NatsTestServer ts = new NatsTestServer(false); Connection nc = Nats.connect( new Options.Builder().server(ts.getURI()).supportUTF8Subjects().noReconnect().build())) { assertTrue("Connected Status", Connection.Status.CONNECTED == nc.getStatus()); // Some UTF8 from http://www.columbia.edu/~fdc/utf8/ String[] subjects = {"Τη γλώσσα μου έδωσαν ελληνική", "На берегу пустынных волн", "ვეპხის ტყაოსანი შოთა რუსთაველი", "Je peux manger du verre, ça ne me fait pas mal", "⠊⠀⠉⠁⠝⠀⠑⠁⠞⠀⠛⠇⠁⠎⠎⠀⠁⠝⠙⠀⠊⠞⠀⠙⠕⠑⠎⠝⠞⠀⠓⠥⠗⠞⠀⠍⠑", "أنا قادر على أكل الزجاج و هذا لا يؤلمني", "私はガラスを食べられます。それは私を傷つけません"}; for (String subject : subjects) { subject = subject.replace(" ",""); // get rid of spaces Subscription sub = nc.subscribe(subject); nc.flush(Duration.ofSeconds(5)); nc.publish(subject, new byte[16]); Message msg = sub.nextMessage(Duration.ofSeconds(5)); assertNotNull(subject, msg); assertEquals(subject, msg.getSubject()); assertEquals(sub, msg.getSubscription()); assertNull(msg.getReplyTo()); assertEquals(16, msg.getData().length); sub.unsubscribe(); } } }