public Task ReceiveAsync(IContext context) { switch (context.Message) { case Publish publish: foreach ((PID, object)tuple in _subscriptions.Select(publish.Topic, publish.Message)) { tuple.Item1.Tell(publish); } return(Task.CompletedTask); case Subscribe subscribe: SubscriptionInfo subscriptionInfo = new SubscriptionInfo(Type.GetType(subscribe.Type), subscribe.Topic); _subscriptions.Add(subscriptionInfo, subscribe.ConsumerActor); SubscribeAck subscribeAck = new SubscribeAck { SubscriptionId = ByteString.CopyFrom(subscriptionInfo.SubscriptionId.ToByteArray()) }; context.Respond(subscribeAck); return(Task.CompletedTask); case Unsubscribe unsubscribe: UnsubscribeAck unsubscribeAck = new UnsubscribeAck { Success = _subscriptions.Remove(new Guid(unsubscribe.SubscriptionId.ToByteArray())) }; context.Respond(unsubscribeAck); return(Task.CompletedTask); default: return(Task.CompletedTask); } }
public async Task when_writing_unsubscribe_ack_packet_then_succeeds(string jsonPath, string packetPath) { jsonPath = Path.Combine(Environment.CurrentDirectory, jsonPath); packetPath = Path.Combine(Environment.CurrentDirectory, packetPath); byte[] expectedPacket = Packet.ReadAllBytes(packetPath); FlowPacketFormatter <UnsubscribeAck> formatter = new FlowPacketFormatter <UnsubscribeAck>(MqttPacketType.UnsubscribeAck, id => new UnsubscribeAck(id)); UnsubscribeAck unsubscribeAck = Packet.ReadPacket <UnsubscribeAck>(jsonPath); byte[] result = await formatter.FormatAsync(unsubscribeAck); expectedPacket.Should().BeEquivalentTo(result); }
public async Task when_unsubscribing_existing_subscriptions_then_subscriptions_are_deleted_and_ack_is_sent() { Mock <IRepository <ClientSession> > sessionRepository = new Mock <IRepository <ClientSession> >(); string clientId = Guid.NewGuid().ToString(); ushort packetId = (ushort)new Random().Next(0, ushort.MaxValue); string topic = "foo/bar/test"; MqttQualityOfService qos = MqttQualityOfService.AtLeastOnce; ClientSession session = new ClientSession(clientId, clean: false) { Subscriptions = new List <ClientSubscription> { new ClientSubscription { ClientId = clientId, MaximumQualityOfService = qos, TopicFilter = topic } } }; ClientSession updatedSession = default; sessionRepository.Setup(r => r.Read(It.IsAny <string>())).Returns(session); sessionRepository.Setup(r => r.Update(It.IsAny <ClientSession>())).Callback <ClientSession>(s => updatedSession = s); Unsubscribe unsubscribe = new Unsubscribe(packetId, topic); Mock <IMqttChannel <IPacket> > channel = new Mock <IMqttChannel <IPacket> >(); IPacket response = default; channel.Setup(c => c.SendAsync(It.IsAny <IPacket>())) .Callback <IPacket>(p => response = p) .Returns(Task.Delay(0)); Mock <IConnectionProvider> connectionProvider = new Mock <IConnectionProvider>(); connectionProvider .Setup(p => p.GetConnection(It.Is <string>(c => c == clientId))) .Returns(channel.Object); ServerUnsubscribeFlow flow = new ServerUnsubscribeFlow(sessionRepository.Object); await flow.ExecuteAsync(clientId, unsubscribe, channel.Object); Assert.NotNull(response); 0.Should().Be(updatedSession.Subscriptions.Count); UnsubscribeAck unsubscribeAck = response as UnsubscribeAck; Assert.NotNull(unsubscribeAck); packetId.Should().Be(unsubscribeAck.PacketId); }
public async Task when_unsubscribing_not_existing_subscriptions_then_ack_is_sent() { Mock <IRepository <ClientSession> > sessionRepository = new Mock <IRepository <ClientSession> >(); string clientId = Guid.NewGuid().ToString(); ushort packetId = (ushort)new Random().Next(0, ushort.MaxValue); ClientSession session = new ClientSession(clientId, clean: false); sessionRepository.Setup(r => r.Read(It.IsAny <string>())).Returns(session); Unsubscribe unsubscribe = new Unsubscribe(packetId, "foo/bar"); Mock <IMqttChannel <IPacket> > channel = new Mock <IMqttChannel <IPacket> >(); IPacket response = default; channel.Setup(c => c.SendAsync(It.IsAny <IPacket>())) .Callback <IPacket>(p => response = p) .Returns(Task.Delay(0)); Mock <IConnectionProvider> connectionProvider = new Mock <IConnectionProvider>(); connectionProvider .Setup(p => p.GetConnection(It.Is <string>(c => c == clientId))) .Returns(channel.Object); ServerUnsubscribeFlow flow = new ServerUnsubscribeFlow(sessionRepository.Object); await flow.ExecuteAsync(clientId, unsubscribe, channel.Object); sessionRepository.Verify(r => r.Delete(It.IsAny <string>()), Times.Never); Assert.NotNull(response); UnsubscribeAck unsubscribeAck = response as UnsubscribeAck; Assert.NotNull(unsubscribeAck); packetId.Should().Be(unsubscribeAck.PacketId); }
public Unsubscribed(UnsubscribeAck ack, IActorRef subscriber) { Ack = ack; Subscriber = subscriber; }