Ejemplo n.º 1
0
        public async Task RestClient_WhenTokenExpired_ShouldNotRetryAndRaiseError(Protocol protocol)
        {
            var helper = new Rsa4Helper(this);

            // Get a very short lived token and wait for it to expire
            var authClient = await GetRestClient(protocol);

            var almostExpiredToken = await authClient.AblyAuth.RequestTokenAsync(new TokenParams { ClientId = "123", Ttl = TimeSpan.FromMilliseconds(1) });

            await Task.Delay(TimeSpan.FromMilliseconds(2));

            // Modify the expiry date to fool the client it has a valid token
            almostExpiredToken.Expires = DateTimeOffset.UtcNow.AddHours(1);

            // create a new client with the token
            // set the Key to an empty string to override the sandbox settings
            var restClient = await helper.GetRestClientWithRequests(protocol, almostExpiredToken, invalidateKey : true);

            var now = DateTimeOffset.UtcNow;

            // check the client thinks the token is valid
            restClient.AblyAuth.CurrentToken.IsValidToken(now).Should().BeTrue();

            var channelName = "RSA4a".AddRandomSuffix();

            try
            {
                await restClient.Channels.Get(channelName).PublishAsync("event", "data");

                throw new Exception("Unexpected success, the preceding code should have raised an AblyException");
            }
            catch (AblyException e)
            {
                // the server responds with a token error
                // (401 HTTP status code and an Ably error value 40140 <= code < 40150)
                // As the token is expired we can expect a specific code "40142": "token expired"
                e.ErrorInfo.StatusCode.Should().Be(HttpStatusCode.Unauthorized);
                e.ErrorInfo.Code.Should().Be(ErrorCodes.NoMeansProvidedToRenewAuthToken);
            }

            // did not retry the request
            helper.Requests.Count.Should().Be(1, "only one request should have been attempted");
            helper.Requests[0].Url.Should().Be($"/channels/{channelName}/messages", "only the publish request should have been attempted");
        }
Ejemplo n.º 2
0
        public async Task RSA4Helper_RestClient_ShouldTrackRequests(Protocol protocol)
        {
            var authClient = await GetRestClient(protocol);

            var token = await authClient.AblyAuth.RequestTokenAsync(new TokenParams { ClientId = "123" });

            var helper     = new Rsa4Helper(this);
            var restClient = await helper.GetRestClientWithRequests(protocol, token, invalidateKey : true);

            helper.Requests.Count.Should().Be(0);
            await restClient.TimeAsync();

            helper.Requests.Count.Should().Be(1);
            var realtimeClient = await helper.GetRealTimeClientWithRequests(protocol, token, invalidateKey : true);

            helper.Requests.Count.Should().Be(1);
            await realtimeClient.RestClient.TimeAsync();

            helper.Requests.Count.Should().Be(2);
        }