Beispiel #1
0
        public async Task RealtimeClient_NewInstanceWithExpiredToken_ShouldNotRetryAndHaveError(Protocol protocol)
        {
            var helper     = new Rsa4Helper(this);
            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);

            // get a realtime client with no key
            var realtimeClient = await helper.GetRealTimeClientWithRequests(protocol, almostExpiredToken, invalidateKey : true);

            bool connected = false;

            realtimeClient.Connection.Once(ConnectionEvent.Connected, (_) => { connected = true; });

            // assert that there is no pre-existing error
            realtimeClient.Connection.ErrorReason.Should().BeNull();

            await realtimeClient.WaitForState(ConnectionState.Failed);

            realtimeClient.Connection.State.Should().Be(ConnectionState.Failed);
            connected.Should().BeFalse();

            realtimeClient.Connection.ErrorReason.Code.Should().Be(ErrorCodes.NoMeansProvidedToRenewAuthToken);
            helper.Requests.Count.Should().Be(0);
        }
Beispiel #2
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");
        }
Beispiel #3
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);
        }
Beispiel #4
0
        public async Task RealtimeWithAuthError_WhenTokenExpired_ShouldRetry_WhenRetryFails_ShouldSetError(Protocol protocol)
        {
            var helper = new Rsa4Helper(this);

            var restClient = await GetRestClient(protocol);

            var token = await restClient.Auth.AuthorizeAsync(new TokenParams
            {
                Ttl = TimeSpan.FromMilliseconds(1000),
            });

            // this realtime client will have a key for the sandbox, thus a means to renew
            var realtimeClient = await GetRealtimeClient(protocol, (options, _) =>
            {
                options.TokenDetails = token;
                options.AutoConnect  = false;
            });

            realtimeClient.RestClient.ExecuteHttpRequest = helper.AblyResponseWith500Status;

            var awaiter = new TaskCompletionAwaiter(5000);

            realtimeClient.Connection.Once(ConnectionEvent.Disconnected, state =>
            {
                state.Reason.Code.Should().Be(ErrorCodes.ClientAuthProviderRequestFailed);
                awaiter.SetCompleted();
            });

            await Task.Delay(2000);

            realtimeClient.Connect();

            var result = await awaiter.Task;

            result.Should().BeTrue();
            helper.Requests.Count.Should().Be(1);
            helper.Requests[0].Url.EndsWith("requestToken").Should().BeTrue();
        }
Beispiel #5
0
        public async Task RealtimeClient_ConnectedWithExpiringToken_WhenTokenExpired_ShouldNotRetryAndHaveError(Protocol protocol)
        {
            var helper = new Rsa4Helper(this);

            // Create a token that is valid long enough for a successful connection to occur
            var authClient = await GetRestClient(protocol);

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

            // get a realtime client with no Key, AuthUrl, or authCallback
            var realtimeClient = await helper.GetRealTimeClientWithRequests(protocol, almostExpiredToken, invalidateKey : true);

            await realtimeClient.WaitForState(ConnectionState.Connected);

            // assert that there is no pre-existing error
            realtimeClient.Connection.ErrorReason.Should().BeNull();

            await realtimeClient.WaitForState(ConnectionState.Failed);

            realtimeClient.Connection.State.Should().Be(ConnectionState.Failed);

            realtimeClient.Connection.ErrorReason.Code.Should().Be(ErrorCodes.NoMeansProvidedToRenewAuthToken);
            helper.Requests.Count.Should().Be(0);
        }