From 46e760f0d9fcefc3269d92d110bdd994ed2a1a8f Mon Sep 17 00:00:00 2001 From: BrennanConroy Date: Mon, 20 Jul 2020 10:38:29 -0700 Subject: [PATCH 1/7] stash --- .../com/microsoft/signalr/HubConnection.java | 2 +- .../microsoft/signalr/HubConnectionTest.java | 17 ++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java b/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java index 12349152dc1e..3f3d64be45a1 100644 --- a/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java +++ b/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java @@ -342,7 +342,7 @@ public void setBaseUrl(String url) { */ public Completable start() { if (hubConnectionState != HubConnectionState.DISCONNECTED) { - return Completable.complete(); + return Completable.error(new RuntimeException("The HubConnection cannot be started if it is not in the 'Disconnected' state.")); } handshakeResponseSubject = CompletableSubject.create(); diff --git a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java index efee55e3ef3a..516b04c18a4f 100644 --- a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java +++ b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java @@ -2647,15 +2647,20 @@ public void hubConnectionClosesAndRunsOnClosedCallbackAfterCloseMessageWithError } @Test - public void callingStartOnStartedHubConnectionNoOps() { + public void callingStartOnStartedHubConnectionThrows() { HubConnection hubConnection = TestUtils.createHubConnection("http://example.com"); hubConnection.start().timeout(1, TimeUnit.SECONDS).blockingAwait(); assertEquals(HubConnectionState.CONNECTED, hubConnection.getConnectionState()); - hubConnection.start().timeout(1, TimeUnit.SECONDS).blockingAwait(); + try { + hubConnection.start().timeout(1, TimeUnit.SECONDS).blockingAwait(); + assertTrue(false); + } catch (Exception ex) { + assertEquals("The HubConnection cannot be started if it is not in the 'Disconnected' state.", ex.getMessage()); + } assertEquals(HubConnectionState.CONNECTED, hubConnection.getConnectionState()); - hubConnection.stop(); + hubConnection.stop().timeout(1, TimeUnit.SECONDS).blockingAwait(); assertEquals(HubConnectionState.DISCONNECTED, hubConnection.getConnectionState()); } @@ -3595,9 +3600,6 @@ public void userSetAuthHeaderIsNotClearedAfterRedirect() { assertEquals(HubConnectionState.CONNECTED, hubConnection.getConnectionState()); hubConnection.stop().blockingAwait(); assertEquals("ExampleValue", beforeRedirectHeader.get()); - - hubConnection.start().timeout(1, TimeUnit.SECONDS).blockingAwait(); - assertEquals(HubConnectionState.CONNECTED, hubConnection.getConnectionState()); assertEquals("Bearer redirectToken", afterRedirectHeader.get()); // Making sure you can do this after restarting the HubConnection. @@ -3605,9 +3607,6 @@ public void userSetAuthHeaderIsNotClearedAfterRedirect() { assertEquals(HubConnectionState.CONNECTED, hubConnection.getConnectionState()); hubConnection.stop().blockingAwait(); assertEquals("ExampleValue", beforeRedirectHeader.get()); - - hubConnection.start().timeout(1, TimeUnit.SECONDS).blockingAwait(); - assertEquals(HubConnectionState.CONNECTED, hubConnection.getConnectionState()); assertEquals("Bearer redirectToken", afterRedirectHeader.get()); } From 07a08c042a28bbae4f215cc08f2610d4c20471c6 Mon Sep 17 00:00:00 2001 From: BrennanConroy Date: Tue, 21 Jul 2020 11:00:15 -0700 Subject: [PATCH 2/7] more --- .../com/microsoft/signalr/HubConnection.java | 144 ++++++++++-------- .../microsoft/signalr/HubConnectionState.java | 1 + .../microsoft/signalr/HubConnectionTest.java | 38 ++++- .../com/microsoft/signalr/sample/Chat.java | 3 +- 4 files changed, 118 insertions(+), 68 deletions(-) diff --git a/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java b/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java index 3f3d64be45a1..91aeabc821de 100644 --- a/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java +++ b/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java @@ -22,7 +22,9 @@ import io.reactivex.Completable; import io.reactivex.Observable; +import io.reactivex.Scheduler; import io.reactivex.Single; +import io.reactivex.schedulers.Schedulers; import io.reactivex.subjects.*; import okhttp3.OkHttpClient; @@ -341,81 +343,95 @@ public void setBaseUrl(String url) { * @return A Completable that completes when the connection has been established. */ public Completable start() { - if (hubConnectionState != HubConnectionState.DISCONNECTED) { - return Completable.error(new RuntimeException("The HubConnection cannot be started if it is not in the 'Disconnected' state.")); - } - - handshakeResponseSubject = CompletableSubject.create(); - handshakeReceived = false; - CompletableSubject tokenCompletable = CompletableSubject.create(); - localHeaders.put(UserAgentHelper.getUserAgentName(), UserAgentHelper.createUserAgentString()); - if (headers != null) { - this.localHeaders.putAll(headers); - } + CompletableSubject start = CompletableSubject.create(); - accessTokenProvider.subscribe(token -> { - if (token != null && !token.isEmpty()) { - this.localHeaders.put("Authorization", "Bearer " + token); + hubConnectionStateLock.lock(); + try { + if (hubConnectionState != HubConnectionState.DISCONNECTED) { + return Completable.error(new RuntimeException("The HubConnection cannot be started if it is not in the 'Disconnected' state.")); } - tokenCompletable.onComplete(); - }, error -> { - tokenCompletable.onError(error); - }); - stopError = null; - Single negotiate = null; - if (!skipNegotiate) { - negotiate = tokenCompletable.andThen(Single.defer(() -> startNegotiate(baseUrl, 0))); - } else { - negotiate = tokenCompletable.andThen(Single.defer(() -> Single.just(new NegotiateResponse(baseUrl)))); - } + hubConnectionState = HubConnectionState.CONNECTING; - CompletableSubject start = CompletableSubject.create(); + handshakeResponseSubject = CompletableSubject.create(); + handshakeReceived = false; + CompletableSubject tokenCompletable = CompletableSubject.create(); + localHeaders.put(UserAgentHelper.getUserAgentName(), UserAgentHelper.createUserAgentString()); + if (headers != null) { + this.localHeaders.putAll(headers); + } - negotiate.flatMapCompletable(negotiateResponse -> { - logger.debug("Starting HubConnection."); - if (transport == null) { - Single tokenProvider = negotiateResponse.getAccessToken() != null ? Single.just(negotiateResponse.getAccessToken()) : accessTokenProvider; - switch (transportEnum) { - case LONG_POLLING: - transport = new LongPollingTransport(localHeaders, httpClient, tokenProvider); - break; - default: - transport = new WebSocketTransport(localHeaders, httpClient); + accessTokenProvider.subscribe(token -> { + if (token != null && !token.isEmpty()) { + this.localHeaders.put("Authorization", "Bearer " + token); } + tokenCompletable.onComplete(); + }, error -> { + tokenCompletable.onError(error); + }); + + stopError = null; + Single negotiate = null; + if (!skipNegotiate) { + negotiate = tokenCompletable.andThen(Single.defer(() -> startNegotiate(baseUrl, 0))); + } else { + negotiate = tokenCompletable.andThen(Single.defer(() -> Single.just(new NegotiateResponse(baseUrl)))); } - transport.setOnReceive(this.callback); - transport.setOnClose((message) -> stopConnection(message)); - - return transport.start(negotiateResponse.getFinalUrl()).andThen(Completable.defer(() -> { - ByteBuffer handshake = HandshakeProtocol.createHandshakeRequestMessage( - new HandshakeRequestMessage(protocol.getName(), protocol.getVersion())); - - connectionState = new ConnectionState(this); - - return transport.send(handshake).andThen(Completable.defer(() -> { - timeoutHandshakeResponse(handshakeResponseTimeout, TimeUnit.MILLISECONDS); - return handshakeResponseSubject.andThen(Completable.defer(() -> { - hubConnectionStateLock.lock(); - try { - hubConnectionState = HubConnectionState.CONNECTED; - logger.info("HubConnection started."); - resetServerTimeout(); - //Don't send pings if we're using long polling. - if (transportEnum != TransportEnum.LONG_POLLING) { - activatePingTimer(); + negotiate.flatMapCompletable(negotiateResponse -> { + logger.debug("Starting HubConnection."); + if (transport == null) { + Single tokenProvider = negotiateResponse.getAccessToken() != null ? Single.just(negotiateResponse.getAccessToken()) : accessTokenProvider; + switch (transportEnum) { + case LONG_POLLING: + transport = new LongPollingTransport(localHeaders, httpClient, tokenProvider); + break; + default: + transport = new WebSocketTransport(localHeaders, httpClient); + } + } + + transport.setOnReceive(this.callback); + transport.setOnClose((message) -> stopConnection(message)); + + return transport.start(negotiateResponse.getFinalUrl()).andThen(Completable.defer(() -> { + ByteBuffer handshake = HandshakeProtocol.createHandshakeRequestMessage( + new HandshakeRequestMessage(protocol.getName(), protocol.getVersion())); + + connectionState = new ConnectionState(this); + + return transport.send(handshake).andThen(Completable.defer(() -> { + timeoutHandshakeResponse(handshakeResponseTimeout, TimeUnit.MILLISECONDS); + return handshakeResponseSubject.andThen(Completable.defer(() -> { + hubConnectionStateLock.lock(); + try { + hubConnectionState = HubConnectionState.CONNECTED; + logger.info("HubConnection started."); + resetServerTimeout(); + //Don't send pings if we're using long polling. + if (transportEnum != TransportEnum.LONG_POLLING) { + activatePingTimer(); + } + } finally { + hubConnectionStateLock.unlock(); } - } finally { - hubConnectionStateLock.unlock(); - } - return Completable.complete(); + return Completable.complete(); + })); })); })); - })); - // subscribe makes this a "hot" completable so this runs immediately - }).subscribeWith(start); + // subscribe makes this a "hot" completable so this runs immediately + }).subscribe(() -> { + start.onComplete(); + }, error -> { + hubConnectionStateLock.lock(); + hubConnectionState = HubConnectionState.DISCONNECTED; + hubConnectionStateLock.unlock(); + start.onError(error); + }); + } finally { + hubConnectionStateLock.unlock(); + } return start; } @@ -445,7 +461,7 @@ public void run() { } private Single startNegotiate(String url, int negotiateAttempts) { - if (hubConnectionState != HubConnectionState.DISCONNECTED) { + if (hubConnectionState != HubConnectionState.CONNECTING) { return Single.just(null); } diff --git a/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnectionState.java b/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnectionState.java index a357946b6aec..d3fc796ee410 100644 --- a/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnectionState.java +++ b/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnectionState.java @@ -9,4 +9,5 @@ public enum HubConnectionState { CONNECTED, DISCONNECTED, + CONNECTING, } \ No newline at end of file diff --git a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java index 516b04c18a4f..f5a797999cc7 100644 --- a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java +++ b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java @@ -24,6 +24,7 @@ import io.reactivex.Observable; import io.reactivex.Single; import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; import io.reactivex.subjects.CompletableSubject; import io.reactivex.subjects.PublishSubject; import io.reactivex.subjects.ReplaySubject; @@ -2577,9 +2578,10 @@ public void receiveHandshakeResponseAndMessage() { value.getAndUpdate((val) -> val + 1); }); + SingleSubject handshakeMessageTask = mockTransport.getNextSentMessage(); // On start we're going to receive the handshake response and also an invocation in the same payload. hubConnection.start(); - mockTransport.getStartTask().timeout(1, TimeUnit.SECONDS).blockingAwait(); + String sentMessage = handshakeMessageTask.timeout(1, TimeUnit.SECONDS).blockingGet(); String expectedSentMessage = "{\"protocol\":\"json\",\"version\":1}" + RECORD_SEPARATOR; assertEquals(expectedSentMessage, TestUtils.byteBufferToString(mockTransport.getSentMessages()[0])); @@ -2664,6 +2666,38 @@ public void callingStartOnStartedHubConnectionThrows() { assertEquals(HubConnectionState.DISCONNECTED, hubConnection.getConnectionState()); } + @Test + public void callingStartOnStartingHubConnectionThrows() { + CompletableSubject startedAccessToken = CompletableSubject.create(); + CompletableSubject continueAccessToken = CompletableSubject.create(); + HubConnection hubConnection = HubConnectionBuilder.create("http://example.com") + .withTransportImplementation(new MockTransport(true)) + .withHttpClient(new TestHttpClient()) + .withAccessTokenProvider(Single.defer(() -> { + startedAccessToken.onComplete(); + continueAccessToken.timeout(1, TimeUnit.SECONDS).blockingAwait(); + return Single.just("test"); + }).subscribeOn(Schedulers.newThread())) + .shouldSkipNegotiate(true) + .build(); + Completable start = hubConnection.start(); + startedAccessToken.timeout(1, TimeUnit.SECONDS).blockingAwait(); + assertEquals(HubConnectionState.CONNECTING, hubConnection.getConnectionState()); + + try { + hubConnection.start().timeout(1, TimeUnit.SECONDS).blockingAwait(); + assertTrue(false); + } catch (Exception ex) { + assertEquals("The HubConnection cannot be started if it is not in the 'Disconnected' state.", ex.getMessage()); + } + continueAccessToken.onComplete(); + start.timeout(1, TimeUnit.SECONDS).blockingAwait(); + assertEquals(HubConnectionState.CONNECTED, hubConnection.getConnectionState()); + + hubConnection.stop().timeout(1, TimeUnit.SECONDS).blockingAwait(); + assertEquals(HubConnectionState.DISCONNECTED, hubConnection.getConnectionState()); + } + @Test public void cannotSendBeforeStart() { HubConnection hubConnection = TestUtils.createHubConnection("http://example.com"); @@ -3698,7 +3732,7 @@ public void non200FromNegotiateThrowsError() { } @Test - public void hubConnectionCloseCallsStop() throws Exception { + public void hubConnectionCloseCallsStop() { MockTransport mockTransport = new MockTransport(); TestHttpClient client = new TestHttpClient() .on("POST", "http://example.com/negotiate?negotiateVersion=1", (req) -> Single.just(new HttpResponse(200, "", TestUtils.stringToByteBuffer("{\"url\":\"http://testexample.com/\"}")))) diff --git a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/sample/Chat.java b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/sample/Chat.java index d48c89818552..7a7ab4b8de8c 100644 --- a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/sample/Chat.java +++ b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/sample/Chat.java @@ -8,7 +8,6 @@ import com.microsoft.signalr.HubConnection; import com.microsoft.signalr.HubConnectionBuilder; - public class Chat { public static void main(final String[] args) throws Exception { System.out.println("Enter the URL of the SignalR Chat you want to join"); @@ -33,7 +32,7 @@ public static void main(final String[] args) throws Exception { while (!message.equals("leave")) { // Scans the next token of the input as an int. message = reader.nextLine(); - hubConnection.send("Send", message); + hubConnection.send("Send", "Java", message); } hubConnection.stop().blockingAwait(); From 6ea440fb7c99adea031958a36e8e6f0f1e1295b4 Mon Sep 17 00:00:00 2001 From: BrennanConroy Date: Mon, 27 Jul 2020 13:25:02 -0700 Subject: [PATCH 3/7] wait --- .../com/microsoft/signalr/HubConnection.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java b/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java index 91aeabc821de..b535eef479a8 100644 --- a/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java +++ b/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java @@ -22,9 +22,7 @@ import io.reactivex.Completable; import io.reactivex.Observable; -import io.reactivex.Scheduler; import io.reactivex.Single; -import io.reactivex.schedulers.Schedulers; import io.reactivex.subjects.*; import okhttp3.OkHttpClient; @@ -68,6 +66,7 @@ public class HubConnection implements AutoCloseable { private final int negotiateVersion = 1; private final Logger logger = LoggerFactory.getLogger(HubConnection.class); private ScheduledExecutorService handshakeTimeout = null; + private Completable start; /** * Sets the server timeout interval for the connection. @@ -343,15 +342,17 @@ public void setBaseUrl(String url) { * @return A Completable that completes when the connection has been established. */ public Completable start() { - CompletableSubject start = CompletableSubject.create(); + CompletableSubject localStart = CompletableSubject.create(); hubConnectionStateLock.lock(); try { if (hubConnectionState != HubConnectionState.DISCONNECTED) { - return Completable.error(new RuntimeException("The HubConnection cannot be started if it is not in the 'Disconnected' state.")); + logger.debug("Another start is in progress. Waiting for start to complete."); + return start; } hubConnectionState = HubConnectionState.CONNECTING; + start = localStart; handshakeResponseSubject = CompletableSubject.create(); handshakeReceived = false; @@ -422,18 +423,18 @@ public Completable start() { })); // subscribe makes this a "hot" completable so this runs immediately }).subscribe(() -> { - start.onComplete(); + localStart.onComplete(); }, error -> { hubConnectionStateLock.lock(); hubConnectionState = HubConnectionState.DISCONNECTED; hubConnectionStateLock.unlock(); - start.onError(error); + localStart.onError(error); }); } finally { hubConnectionStateLock.unlock(); } - return start; + return localStart; } private void activatePingTimer() { @@ -462,7 +463,7 @@ public void run() { private Single startNegotiate(String url, int negotiateAttempts) { if (hubConnectionState != HubConnectionState.CONNECTING) { - return Single.just(null); + throw new RuntimeException("HubConnection trying to negotiate when not in the CONNECTING state."); } return handleNegotiate(url).flatMap(response -> { From 7adf27982189a62b0d3febbf639ce7d288f1cf80 Mon Sep 17 00:00:00 2001 From: BrennanConroy Date: Tue, 28 Jul 2020 09:59:00 -0700 Subject: [PATCH 4/7] update test --- .../microsoft/signalr/HubConnectionTest.java | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java index f5a797999cc7..f25c40926f64 100644 --- a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java +++ b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java @@ -2649,17 +2649,12 @@ public void hubConnectionClosesAndRunsOnClosedCallbackAfterCloseMessageWithError } @Test - public void callingStartOnStartedHubConnectionThrows() { + public void callingStartOnStartedHubConnectionNoops() { HubConnection hubConnection = TestUtils.createHubConnection("http://example.com"); hubConnection.start().timeout(1, TimeUnit.SECONDS).blockingAwait(); assertEquals(HubConnectionState.CONNECTED, hubConnection.getConnectionState()); - try { - hubConnection.start().timeout(1, TimeUnit.SECONDS).blockingAwait(); - assertTrue(false); - } catch (Exception ex) { - assertEquals("The HubConnection cannot be started if it is not in the 'Disconnected' state.", ex.getMessage()); - } + hubConnection.start().timeout(0, TimeUnit.SECONDS).blockingAwait(); assertEquals(HubConnectionState.CONNECTED, hubConnection.getConnectionState()); hubConnection.stop().timeout(1, TimeUnit.SECONDS).blockingAwait(); @@ -2667,7 +2662,7 @@ public void callingStartOnStartedHubConnectionThrows() { } @Test - public void callingStartOnStartingHubConnectionThrows() { + public void callingStartOnStartingHubConnectionWaitsForOriginalStart() { CompletableSubject startedAccessToken = CompletableSubject.create(); CompletableSubject continueAccessToken = CompletableSubject.create(); HubConnection hubConnection = HubConnectionBuilder.create("http://example.com") @@ -2684,14 +2679,10 @@ public void callingStartOnStartingHubConnectionThrows() { startedAccessToken.timeout(1, TimeUnit.SECONDS).blockingAwait(); assertEquals(HubConnectionState.CONNECTING, hubConnection.getConnectionState()); - try { - hubConnection.start().timeout(1, TimeUnit.SECONDS).blockingAwait(); - assertTrue(false); - } catch (Exception ex) { - assertEquals("The HubConnection cannot be started if it is not in the 'Disconnected' state.", ex.getMessage()); - } + Completable start2 = hubConnection.start(); continueAccessToken.onComplete(); start.timeout(1, TimeUnit.SECONDS).blockingAwait(); + start2.timeout(1, TimeUnit.SECONDS).blockingAwait(); assertEquals(HubConnectionState.CONNECTED, hubConnection.getConnectionState()); hubConnection.stop().timeout(1, TimeUnit.SECONDS).blockingAwait(); From 6eae60aa4fd3db961eb416ff592d68209bce96f1 Mon Sep 17 00:00:00 2001 From: BrennanConroy Date: Tue, 28 Jul 2020 11:51:49 -0700 Subject: [PATCH 5/7] test --- .../src/test/java/com/microsoft/signalr/HubConnectionTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java index f25c40926f64..70c56d2b845e 100644 --- a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java +++ b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java @@ -2654,7 +2654,7 @@ public void callingStartOnStartedHubConnectionNoops() { hubConnection.start().timeout(1, TimeUnit.SECONDS).blockingAwait(); assertEquals(HubConnectionState.CONNECTED, hubConnection.getConnectionState()); - hubConnection.start().timeout(0, TimeUnit.SECONDS).blockingAwait(); + hubConnection.start().timeout(1, TimeUnit.SECONDS).blockingAwait(); assertEquals(HubConnectionState.CONNECTED, hubConnection.getConnectionState()); hubConnection.stop().timeout(1, TimeUnit.SECONDS).blockingAwait(); From d551a9a9f0c8b8a87c3ca9c67e630151237cd394 Mon Sep 17 00:00:00 2001 From: BrennanConroy Date: Fri, 21 Aug 2020 16:06:39 -0700 Subject: [PATCH 6/7] rebase --- .../test/java/com/microsoft/signalr/HubConnectionTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java index 70c56d2b845e..89b5a0efdd9e 100644 --- a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java +++ b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java @@ -2578,10 +2578,10 @@ public void receiveHandshakeResponseAndMessage() { value.getAndUpdate((val) -> val + 1); }); - SingleSubject handshakeMessageTask = mockTransport.getNextSentMessage(); + SingleSubject handshakeMessageTask = mockTransport.getNextSentMessage(); // On start we're going to receive the handshake response and also an invocation in the same payload. hubConnection.start(); - String sentMessage = handshakeMessageTask.timeout(1, TimeUnit.SECONDS).blockingGet(); + ByteBuffer sentMessage = handshakeMessageTask.timeout(1, TimeUnit.SECONDS).blockingGet(); String expectedSentMessage = "{\"protocol\":\"json\",\"version\":1}" + RECORD_SEPARATOR; assertEquals(expectedSentMessage, TestUtils.byteBufferToString(mockTransport.getSentMessages()[0])); From d179f34656235a99247925a14417f433b5694caa Mon Sep 17 00:00:00 2001 From: BrennanConroy Date: Mon, 24 Aug 2020 13:52:15 -0700 Subject: [PATCH 7/7] fb --- .../src/main/java/com/microsoft/signalr/HubConnection.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java b/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java index b535eef479a8..b0bcbb364829 100644 --- a/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java +++ b/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java @@ -347,7 +347,7 @@ public Completable start() { hubConnectionStateLock.lock(); try { if (hubConnectionState != HubConnectionState.DISCONNECTED) { - logger.debug("Another start is in progress. Waiting for start to complete."); + logger.debug("The connection is in the '{}' state. Waiting for in-progress start to complete or completing this start immediately.", hubConnectionState); return start; }