コード例 #1
0
ファイル: DeltaSpecs.cs プロジェクト: ably/ably-dotnet
        WhenMessageReceived_WithNotMatchingDeltaFromProperty_ShouldStartDecodeRecoveryAndMoveToAttachingWithError()
        {
            var(realtime, c) = await GetClientAndChannel();

            RealtimeChannel channel = (RealtimeChannel)c;

            channel.SetChannelState(ChannelState.Attached);
            var awaiter = new TaskCompletionAwaiter();
            ChannelStateChange stateChange = null;

            channel.On(ChannelEvent.Attaching, change =>
            {
                stateChange = change;
                channel.DecodeRecovery.Should().BeTrue();
                awaiter.Done();
            });

            realtime.ExecuteCommand(ProcessMessageCommand.Create(
                                        new ProtocolMessage(ProtocolMessage.MessageAction.Message)
            {
                Channel  = channel.Name,
                Messages = new[]
                {
                    new Message {
                        Extras = CreateExtrasWithDelta(new DeltaExtras("1", string.Empty))
                    },
                },
            }));

            await awaiter.Task;

            stateChange.Current.Should().Be(ChannelState.Attaching);
            stateChange.Error.Code.Should().Be(ErrorCodes.VcDiffDecodeError);
        }
コード例 #2
0
 private void channel_ChannelStateChanged(object sender, ChannelStateChange e)
 {
     outputBox.Items.Add(string.Format("Channel: {0}", e.Current));
     SendMessage(string.Format("Channel: {0}", e.Current));
 }
コード例 #3
0
        public async Task WithConnectedClient_WhenDowngradingCapabilities_ChannelShouldBecomeFailed(Protocol protocol)
        {
            var clientId         = "RTC8a1-downgrade".AddRandomSuffix();
            var channelName      = "RTC8a1-downgrade-channel".AddRandomSuffix();
            var wrongChannelName = "wrong".AddRandomSuffix();

            var(realtime, channel) = await SetupRealtimeClient();

            channel.On(statechange => Output.WriteLine($"Changed state: {statechange.Previous} to {statechange.Current}. Error: {statechange.Error}"));
            realtime.Connection.Once(ConnectionEvent.Disconnected, change => throw new Exception("Should not require a disconnect"));

            var result = await channel.PublishAsync("test", "should-not-fail");

            result.IsSuccess.Should().BeTrue();

            ChannelStateChange stateChange = null;

            var failedAwaiter = new TaskCompletionAwaiter(2000);

            channel.Once(ChannelEvent.Failed, state =>
            {
                stateChange = state;
                failedAwaiter.SetCompleted();
            });
            await DowngradeCapability(realtime);

            await channel.WaitForState(ChannelState.Failed, TimeSpan.FromSeconds(6));

            await failedAwaiter.Task;

            stateChange.Should().NotBeNull("channel should have failed");
            stateChange.Error.Code.Should().Be(ErrorCodes.OperationNotPermittedWithCapability);
            stateChange.Error.Message.Should().Contain("Channel denied access");

            async Task DowngradeCapability(AblyRealtime rt)
            {
                var capability = new Capability();

                capability.AddResource(wrongChannelName).AllowSubscribe();

                var newToken = await rt.Auth.AuthorizeAsync(new TokenParams
                {
                    Capability = capability,
                    ClientId   = clientId,
                });

                newToken.Should().NotBeNull();
            }

            async Task <(AblyRealtime, IRealtimeChannel)> SetupRealtimeClient()
            {
                var capability = new Capability();

                capability.AddResource(channelName).AllowAll();

                var restClient = await GetRestClient(protocol);

                var tokenDetails = await restClient.Auth.RequestTokenAsync(new TokenParams
                {
                    ClientId   = clientId,
                    Capability = capability
                });

                var rt = await GetRealtimeClient(protocol, (opts, _) => { opts.Token = tokenDetails.Token; });

                await rt.WaitForState(ConnectionState.Connected);

                var ch = rt.Channels.Get(channelName);
                await ch.AttachAsync();

                return(rt, ch);
            }
        }