public void DistributedPubSubMediator_should_send_one_message_to_each_group()
{
DistributedPubSubMediator_should_SendAll_to_all_other_nodes();
Within(TimeSpan.FromSeconds(20), () =>
{
RunOn(() =>
{
var u12 = CreateChatUser("u12");
u12.Tell(new JoinGroup("topic2", "group1"));
ExpectMsg<SubscribeAck>(s => s.Subscribe.Topic == "topic2"
&& s.Subscribe.Group == "group1"
&& s.Subscribe.Ref.Equals(u12));
}, _first);
RunOn(() =>
{
var u12 = CreateChatUser("u12");
u12.Tell(new JoinGroup("topic2", "group2"));
ExpectMsg<SubscribeAck>(s => s.Subscribe.Topic == "topic2"
&& s.Subscribe.Group == "group2"
&& s.Subscribe.Ref.Equals(u12));
var u13 = CreateChatUser("u13");
u12.Tell(new JoinGroup("topic2", "group2"));
ExpectMsg<SubscribeAck>(s => s.Subscribe.Topic == "topic2"
&& s.Subscribe.Group == "group2"
&& s.Subscribe.Ref.Equals(u13));
}, _second);
AwaitCount(17);
EnterBarrier("12-registered");
RunOn(() =>
{
ChatUser("u12").Tell(new ShoutToGroup("topic12", "hi"));
}, _first);
RunOn(() =>
{
ExpectMsg("hi");
ExpectNoMsg(TimeSpan.FromSeconds(2)); // each group receive only one message
}, _first, _second);
EnterBarrier("12-published");
RunOn(() =>
{
var u12 = ChatUser("u12");
u12.Tell(new ExitGroup("topic2", "group1"));
ExpectMsg<UnsubscribeAck>(s => s.Unsubscribe.Topic == "topic2"
&& s.Unsubscribe.Group == "group1"
&& s.Unsubscribe.Ref.Equals(u12));
}, _first);
RunOn(() =>
{
var u12 = ChatUser("u12");
u12.Tell(new ExitGroup("topic2", "group2"));
ExpectMsg<UnsubscribeAck>(s => s.Unsubscribe.Topic == "topic2"
&& s.Unsubscribe.Group == "group2"
&& s.Unsubscribe.Ref.Equals(u12));
var u13 = ChatUser("u13");
u12.Tell(new ExitGroup("topic2", "group2"));
ExpectMsg<UnsubscribeAck>(s => s.Unsubscribe.Topic == "topic2"
&& s.Unsubscribe.Group == "group2"
&& s.Unsubscribe.Ref.Equals(u13));
}, _second);
EnterBarrier("after-12");
});
}