public void BroadcastDisabled() { using (var pub = new XPublisherSocket()) using (var sub1 = new XSubscriberSocket()) using (var sub2 = new XSubscriberSocket()) { pub.Bind("inproc://manual"); pub.Options.XPubBroadcast = false; sub1.Connect("inproc://manual"); sub2.Connect("inproc://manual"); Thread.Sleep(50); sub1.SendFrame(new byte[] { 1, (byte)'A' }); sub2.SendFrame(new byte[] { 1, (byte)'A' }); var payload = new[] { (byte)42 }; var msg = new Msg(); msg.InitEmpty(); sub1.SendFrame(new byte[] { (byte)'A' }, true); sub1.SendFrame(new byte[] { (byte)42 }); var subscription = pub.ReceiveFrameBytes(); var topic = pub.ReceiveFrameBytes(); var message = pub.ReceiveFrameBytes(); pub.SendFrame(topic, true); pub.SendFrame(message); var broadcast2 = sub2.ReceiveFrameBytes(); Assert.IsTrue(broadcast2[0] == 65); broadcast2 = sub2.ReceiveFrameBytes(); Assert.IsTrue(broadcast2.SequenceEqual(payload)); // sub1 should receive a message normally var broadcast1 = sub1.ReceiveFrameBytes(); Assert.IsTrue(broadcast1[0] == 65); broadcast1 = sub1.ReceiveFrameBytes(); Assert.IsTrue(broadcast1.SequenceEqual(payload)); } }
public void BroadcastEnabled() { using (var pub = new XPublisherSocket()) using (var sub1 = new XSubscriberSocket()) using (var sub2 = new XSubscriberSocket()) { pub.Bind("inproc://manual"); pub.Options.XPubBroadcast = true; sub1.Connect("inproc://manual"); sub2.Connect("inproc://manual"); sub1.SendFrame(new byte[] {1, (byte) 'A'}); sub2.SendFrame(new byte[] {1, (byte) 'A'}); var payload = new[] {(byte) 42}; var msg = new Msg(); msg.InitEmpty(); // add prefix 2 to the topic, this indicates a broadcast message and it will not be sent to sub1 sub1.SendFrame(new byte[] {2, (byte) 'A'}, true); sub1.SendFrame(new byte[] {(byte) 42}); var subscription = pub.ReceiveFrameBytes(); var topic = pub.ReceiveFrameBytes(); var message = pub.ReceiveFrameBytes(); Assert.AreEqual(2, topic[0]); // we must skip the first byte if we have detected a broadcast message // the sender of this message is already marked for exclusion // but the match logic in Send should work with normal topic. topic = topic.Skip(1).ToArray(); pub.SendFrame(topic, true); pub.SendFrame(message); var broadcast2 = sub2.ReceiveFrameBytes(); Assert.IsTrue(broadcast2[0] == 65); broadcast2 = sub2.ReceiveFrameBytes(); Assert.IsTrue(broadcast2.SequenceEqual(payload)); // this message SHOULD NOT be resent to sub1 var received = sub1.TryReceive(ref msg, System.TimeSpan.FromMilliseconds(500)); Assert.IsFalse(received); } }
public void Manual() { using (var pub = new XPublisherSocket()) using (var sub = new XSubscriberSocket()) { pub.Bind("inproc://manual"); pub.Options.ManualPublisher = true; sub.Connect("inproc://manual"); sub.SendFrame(new byte[] { 1, (byte)'A' }); var subscription = pub.ReceiveFrameBytes(); Assert.AreEqual(subscription[1], (byte)'A'); pub.Subscribe("B"); pub.SendFrame("A"); pub.SendFrame("B"); Assert.AreEqual("B", sub.ReceiveFrameString()); } }
public void ClearWelcomeMessage() { using (var pub = new XPublisherSocket()) using (var sub = new SubscriberSocket()) { pub.Bind("inproc://welcome"); pub.SetWelcomeMessage("W"); pub.ClearWelcomeMessage(); sub.Subscribe("W"); sub.Connect("inproc://welcome"); var subscription = pub.ReceiveFrameBytes(); Assert.AreEqual(subscription[1], (byte)'W'); Assert.IsFalse(sub.TrySkipFrame()); } }
public void CouldTrackSubscriberIdentityInXPubSocket() { using (var pub = new XPublisherSocket()) using (var sub1 = new XSubscriberSocket()) using (var sub2 = new XSubscriberSocket()) { pub.Bind("inproc://manual"); pub.Options.ManualPublisher = true; sub1.Connect("inproc://manual"); sub2.Connect("inproc://manual"); Thread.Sleep(50); sub1.SendFrame(new byte[] { 1, (byte)'A' }); var identity1 = new byte[] { 1 }; var identity2 = new byte[] { 2 }; sub1.SendFrame(new[] { (byte)'A' }, true); sub1.SendFrame(new[] { (byte)42 }); var subscription = pub.ReceiveFrameBytes(); // NB Identity must be set before pub.Subscribe/Unsubscribe/Send, because these operations clear a private field with last subscriber // set identity to sub1 pub.Options.Identity = identity1; Assert.IsTrue(identity1.SequenceEqual(pub.Options.Identity), "Cannot read identity that was just set"); pub.Subscribe(subscription); Assert.IsTrue(identity1.SequenceEqual(pub.Options.Identity), "Identity must be kept after Subscribe/Unsubscribe/Send operations (which clear m_lastPipe)"); var topic = pub.ReceiveFrameBytes(); var message = pub.ReceiveFrameBytes(); sub2.SendFrame(new byte[] { 1, (byte)'A' }); sub2.SendFrame(new[] { (byte)'A' }, true); sub2.SendFrame(new[] { (byte)43 }); subscription = pub.ReceiveFrameBytes(); // Id of sub2 is not set yet Assert.IsNull(pub.Options.Identity); pub.Options.Identity = identity2; Assert.IsTrue(identity2.SequenceEqual(pub.Options.Identity), "Cannot read identity that was just set"); pub.Subscribe(subscription); Assert.IsTrue(identity2.SequenceEqual(pub.Options.Identity), "Identity must be kept after Subscribe/Unsubscribe/Send operations (which clear m_lastPipe)"); topic = pub.ReceiveFrameBytes(); message = pub.ReceiveFrameBytes(); sub1.SendFrame(new[] { (byte)'A' }, true); sub1.SendFrame(new[] { (byte)44 }); topic = pub.ReceiveFrameBytes(); message = pub.ReceiveFrameBytes(); Assert.IsTrue(identity1.SequenceEqual(pub.Options.Identity), "Identity option must be set to the identity of sub1 here"); sub2.SendFrame(new[] { (byte)'A' }, true); sub2.SendFrame(new[] { (byte)45 }); topic = pub.ReceiveFrameBytes(); message = pub.ReceiveFrameBytes(); Assert.IsTrue(identity2.SequenceEqual(pub.Options.Identity), "Identity option must be set to the identity of sub2 here"); } }