@Test public void testPropertyDataPortType() { Properties props = new Properties(); props.setProperty(Options.PROP_DATA_PORT_TYPE, CloseOnUpgradeAttempt.class.getCanonicalName()); Options o = new Options.Builder(props).build(); assertEquals("default verbose", false, o.isVerbose()); // One from a different type assertEquals("property data port class", CloseOnUpgradeAttempt.class.getCanonicalName(), o.buildDataPort().getClass().getCanonicalName()); }
@Test public void testServerInProperties() { Properties props = new Properties(); String url = "nats://localhost:8080"; props.setProperty(Options.PROP_URL, url); Options o = new Options.Builder(props).build(); Collection<URI> servers = o.getServers(); URI[] serverArray = servers.toArray(new URI[0]); assertEquals(1, serverArray.length); assertEquals("property server", url, serverArray[0].toString()); }
@Test(expected=IllegalArgumentException.class) public void testThrowOnEmptyServersProp() { Properties props = new Properties(); props.setProperty(Options.PROP_SERVERS, ""); new Options.Builder(props).build(); assertFalse(true); }
@Test(expected=IllegalArgumentException.class) public void testThrowOnNoProps() throws NoSuchAlgorithmException { new Options.Builder(null); assertFalse(true); }
@Test public void testTokenInURL() { String serverURI = "nats://alberto@localhost:2222"; Options o = new Options.Builder().server(serverURI).build(); String connectString = o.buildProtocolConnectOptionsString(serverURI, true, null); assertTrue(connectString.contains("\"auth_token\":\"alberto\"")); assertFalse(connectString.contains("\"user\":")); assertFalse(connectString.contains("\"pass\":")); }
@Test public void testChainedErrorHandler() { TestHandler handler = new TestHandler(); Options o = new Options.Builder().errorListener(handler).build(); assertEquals("default verbose", false, o.isVerbose()); // One from a different type assertEquals("chained error handler", handler, o.getErrorListener()); }
@Test(expected=IllegalArgumentException.class) public void testThrowOnAsyncWithoutListener() throws IOException, InterruptedException { try (NatsTestServer ts = new NatsTestServer(false)) { Options options = new Options.Builder(). server(ts.getURI()). build(); Nats.connectAsynchronously(options, false); } }
@Test public void testAuthConnectOptions() { Options o = new Options.Builder().userInfo("hello", "world").build(); String expectedNoAuth = "{\"lang\":\"java\",\"version\":\"" + Nats.CLIENT_VERSION + "\"" + ",\"protocol\":1,\"verbose\":false,\"pedantic\":false,\"tls_required\":false,\"echo\":true}"; String expectedWithAuth = "{\"lang\":\"java\",\"version\":\"" + Nats.CLIENT_VERSION + "\"" + ",\"protocol\":1,\"verbose\":false,\"pedantic\":false,\"tls_required\":false,\"echo\":true" + ",\"user\":\"hello\",\"pass\":\"world\"}"; assertEquals("no auth connect options", expectedNoAuth, o.buildProtocolConnectOptionsString("nats://localhost:4222", false, null)); assertEquals("auth connect options", expectedWithAuth, o.buildProtocolConnectOptionsString("nats://localhost:4222", true, null)); }
@Test public void testChainOverridesProperties() throws NoSuchAlgorithmException { Properties props = new Properties(); props.setProperty(Options.PROP_TOKEN, "token"); props.setProperty(Options.PROP_CONNECTION_NAME, "name"); Options o = new Options.Builder(props).connectionName("newname").build(); assertEquals("default verbose", false, o.isVerbose()); // One from a different type assertEquals("property token", "token", o.getToken()); assertEquals("property connection name", "newname", o.getConnectionName()); }
@Test public void testPropertyErrorHandler() { Properties props = new Properties(); props.setProperty(Options.PROP_ERROR_LISTENER, TestHandler.class.getCanonicalName()); Options o = new Options.Builder(props).build(); assertEquals("default verbose", false, o.isVerbose()); // One from a different type assertNotNull("property error handler", o.getErrorListener()); o.getErrorListener().errorOccurred(null, "bad subject"); assertEquals("property error handler class", ((TestHandler) o.getErrorListener()).getCount(), 1); }
@Test public void testChainedStringOptions() throws NoSuchAlgorithmException { Options o = new Options.Builder().userInfo("hello", "world").connectionName("name").build(); assertEquals("default verbose", false, o.isVerbose()); // One from a different type assertEquals("chained username", "hello", o.getUsername()); assertEquals("chained password", "world", o.getPassword()); assertEquals("chained connection name", "name", o.getConnectionName()); }
@Test public void testChainedBooleanOptions() throws NoSuchAlgorithmException { Options o = new Options.Builder().verbose().pedantic().noRandomize().supportUTF8Subjects().noEcho().oldRequestStyle().build(); assertNull("default username", o.getUsername()); assertEquals("chained verbose", true, o.isVerbose()); assertEquals("chained pedantic", true, o.isPedantic()); assertEquals("chained norandomize", true, o.isNoRandomize()); assertEquals("chained oldstyle", true, o.isOldRequestStyle()); assertEquals("chained noecho", true, o.isNoEcho()); assertEquals("chained utf8", true, o.supportUTF8Subjects()); }
@Test(expected=IllegalArgumentException.class) public void testThrowOnBadServersURI() { String url1 = "nats://localhost:8080"; String url2 = "foo:/bar\\:blammer"; String[] serverUrls = {url1, url2}; new Options.Builder().servers(serverUrls).build(); assertFalse(true); }
@Test public void testEmptyStringInServers() { String url1 = "nats://localhost:8080"; String url2 = ""; String[] serverUrls = {url1, url2}; Options o = new Options.Builder().servers(serverUrls).build(); Collection<URI> servers = o.getServers(); URI[] serverArray = servers.toArray(new URI[0]); assertEquals(1, serverArray.length); assertEquals("property server", url1, serverArray[0].toString()); }
@Test public void testServers() { String url1 = "nats://localhost:8080"; String url2 = "nats://localhost:8081"; String[] serverUrls = {url1, url2}; Options o = new Options.Builder().servers(serverUrls).build(); Collection<URI> servers = o.getServers(); URI[] serverArray = servers.toArray(new URI[0]); assertEquals(2, serverArray.length); assertEquals("property server", url1, serverArray[0].toString()); assertEquals("property server", url2, serverArray[1].toString()); }
@Test public void testUserPassInURL() { String serverURI = "nats://derek:password@localhost:2222"; Options o = new Options.Builder().server(serverURI).build(); String connectString = o.buildProtocolConnectOptionsString(serverURI, true, null); assertTrue(connectString.contains("\"user\":\"derek\"")); assertTrue(connectString.contains("\"pass\":\"password\"")); assertFalse(connectString.contains("\"token\":")); }
@Test public void testPropertiesSSLOptions() throws Exception { // don't use default for tests, issues with forcing algorithm exception in other tests break it SSLContext.setDefault(TestSSLUtils.createTestSSLContext()); Properties props = new Properties(); props.setProperty(Options.PROP_SECURE, "true"); Options o = new Options.Builder(props).build(); assertEquals("default verbose", false, o.isVerbose()); // One from a different type assertNotNull("property context", o.getSslContext()); }
@Test public void testChainedDurationOptions() { Options o = new Options.Builder().reconnectWait(Duration.ofMillis(101)) .connectionTimeout(Duration.ofMillis(202)).pingInterval(Duration.ofMillis(303)) .requestCleanupInterval(Duration.ofMillis(404)).build(); assertEquals("default verbose", false, o.isVerbose()); // One from a different type assertEquals("chained reconnect wait", Duration.ofMillis(101), o.getReconnectWait()); assertEquals("chained connection timeout", Duration.ofMillis(202), o.getConnectionTimeout()); assertEquals("chained ping interval", Duration.ofMillis(303), o.getPingInterval()); assertEquals("chained cleanup interval", Duration.ofMillis(404), o.getRequestCleanupInterval()); }
@Test public void testChainedIntOptions() { Options o = new Options.Builder().maxReconnects(100).maxPingsOut(200).reconnectBufferSize(300).build(); assertEquals("default verbose", false, o.isVerbose()); // One from a different type assertEquals("chained max reconnect", 100, o.getMaxReconnect()); assertEquals("chained ping max", 200, o.getMaxPingsOut()); assertEquals("chained reconnect buffer size", 300, o.getReconnectBufferSize()); }
private Connection initConnection() throws IOException { Options options = new Options.Builder() .errorCb(this::connectionError) .disconnectedCb(this::disconnected) .reconnectedCb(this::reconnected) .build(); return Nats.connect(this.server, options); }