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); }
private void channel_ChannelStateChanged(object sender, ChannelStateChange e) { outputBox.Items.Add(string.Format("Channel: {0}", e.Current)); SendMessage(string.Format("Channel: {0}", e.Current)); }
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); } }