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 fc7f86304cc531988724eec842beb11379889e5b..ab43980dd9feffc0fcb5fdb61874a1dcc36e2861 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 @@ -2118,6 +2118,37 @@ class HubConnectionTest { assertEquals("Bearer secretToken", token.get()); } + @Test + public void AccessTokenProviderCanProvideDifferentValues() { + AtomicReference<String> token = new AtomicReference<>(); + TestHttpClient client = new TestHttpClient() + .on("POST", "http://example.com/negotiate?negotiateVersion=1", + (req) -> { + token.set(req.getHeaders().get("Authorization")); + return Single.just(new HttpResponse(200, "", "{\"connectionId\":\"bVOiRPG8-6YiJ6d7ZcTOVQ\",\"" + + "availableTransports\":[{\"transport\":\"WebSockets\",\"transferFormats\":[\"Text\",\"Binary\"]}]}")); + }); + + AtomicInteger i = new AtomicInteger(0); + MockTransport transport = new MockTransport(true); + HubConnection hubConnection = HubConnectionBuilder + .create("http://example.com") + .withTransportImplementation(transport) + .withHttpClient(client) + .withAccessTokenProvider(Single.defer(() -> Single.just("secret" + i.getAndIncrement()))) + .build(); + + hubConnection.start().timeout(1, TimeUnit.SECONDS).blockingAwait(); + assertEquals(HubConnectionState.CONNECTED, hubConnection.getConnectionState()); + hubConnection.stop().timeout(1, TimeUnit.SECONDS).blockingAwait(); + assertEquals("Bearer secret0", token.get()); + + hubConnection.start().timeout(1, TimeUnit.SECONDS).blockingAwait(); + assertEquals(HubConnectionState.CONNECTED, hubConnection.getConnectionState()); + hubConnection.stop().timeout(1, TimeUnit.SECONDS).blockingAwait(); + assertEquals("Bearer secret1", token.get()); + } + @Test public void accessTokenProviderIsOverriddenFromRedirectNegotiate() { AtomicReference<String> token = new AtomicReference<>(); diff --git a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/LongPollingTransportTest.java b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/LongPollingTransportTest.java index bd3f8343252f131ff0750fb4a8940321c79bc88d..5a9408387e81cd158faa9f6f6eac4903bfa3cff3 100644 --- a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/LongPollingTransportTest.java +++ b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/LongPollingTransportTest.java @@ -263,6 +263,42 @@ public class LongPollingTransportTest { close.onComplete(); } + @Test + public void LongPollingTransportRunsAccessTokenProviderEveryRequest() { + AtomicInteger requestCount = new AtomicInteger(); + AtomicReference<String> headerValue = new AtomicReference<>(); + CompletableSubject secondGet = CompletableSubject.create(); + CompletableSubject close = CompletableSubject.create(); + TestHttpClient client = new TestHttpClient() + .on("GET", (req) -> { + if (requestCount.get() == 0) { + requestCount.incrementAndGet(); + return Single.just(new HttpResponse(200, "", "")); + } + assertEquals("Bearer TOKEN1", req.getHeaders().get("Authorization")); + secondGet.onComplete(); + assertTrue(close.blockingAwait(1, TimeUnit.SECONDS)); + return Single.just(new HttpResponse(204, "", "")); + }) + .on("POST", (req) -> { + assertFalse(req.getHeaders().isEmpty()); + headerValue.set(req.getHeaders().get("Authorization")); + return Single.just(new HttpResponse(200, "", "")); + }); + + AtomicInteger i = new AtomicInteger(0); + Map<String, String> headers = new HashMap<>(); + Single<String> tokenProvider = Single.defer(() -> Single.just("TOKEN" + i.getAndIncrement())); + LongPollingTransport transport = new LongPollingTransport(headers, client, tokenProvider); + transport.setOnClose((error) -> {}); + + transport.start("http://example.com").timeout(1, TimeUnit.SECONDS).blockingAwait(); + secondGet.blockingAwait(1, TimeUnit.SECONDS); + assertTrue(transport.send("TEST").blockingAwait(1, TimeUnit.SECONDS)); + assertEquals("Bearer TOKEN2", headerValue.get()); + close.onComplete(); + } + @Test public void After204StopDoesNotTriggerOnClose() { AtomicBoolean firstPoll = new AtomicBoolean(true);