From c202344d2720e6f9dd41f00708e3a9e424f25ef2 Mon Sep 17 00:00:00 2001 From: Brennan <brecon@microsoft.com> Date: Wed, 8 Jul 2020 19:18:25 -0700 Subject: [PATCH] [Java] Test accessTokenProvider usage (#23751) --- .../microsoft/signalr/HubConnectionTest.java | 31 ++++++++++++++++ .../signalr/LongPollingTransportTest.java | 36 +++++++++++++++++++ 2 files changed, 67 insertions(+) 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 fc7f86304cc..ab43980dd9f 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 bd3f8343252..5a9408387e8 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); -- GitLab