public void EnsureDrain()
        {
            var subject = "176bb0976ef943e3988de4957c9e1a1a";
            var q       = new ConcurrentQueue <int>();

            AsyncContext.Run(() =>
            {
                using (NATSServer.CreateFastAndVerify(Context.Server1.Port))
                {
                    using (var sync = TestSync.SingleActor())
                    {
                        var opts = Context.GetTestOptions(Context.Server1.Port);
                        opts.ClosedEventHandler = (sender, args) =>
                        {
                            q.Enqueue(1);
                            sync.SignalComplete();
                        };

                        using (var cn = Context.ConnectionFactory.CreateConnection(opts))
                        {
                            for (var i = 0; i < 50; i++)
                            {
                                cn.Publish(subject, new[] { (byte)i });
                            }

                            cn.Drain();

                            sync.WaitForAll();
                            Assert.Single(q);
                        }
                    }
                }
            });
        }
        public void EnsureUnsubscribeForAsyncSub()
        {
            var subject  = "d37e3729c5c84702b836a4bb4edf7241";
            var recieved = new ConcurrentQueue <Msg>();

            AsyncContext.Run(async() =>
            {
                using (NATSServer.CreateFastAndVerify(Context.Server1.Port))
                {
                    using (var sync = TestSync.SingleActor())
                    {
                        using (var cn = Context.ConnectionFactory.CreateConnection(Context.Server1.Url))
                        {
                            using (var sub = cn.SubscribeAsync(subject, (_, m) =>
                            {
                                recieved.Enqueue(m.Message);
                                sync.SignalComplete();
                            }))
                            {
                                cn.Publish(subject, new byte[0]);
                                sync.WaitForAll();

                                sub.Unsubscribe();

                                cn.Publish(subject, new byte[0]);
                                await Task.Delay(100);
                                Assert.Equal(1, sub.Delivered);
                            }
                        }

                        Assert.Single(recieved);
                    }
                }
            });
        }
示例#3
0
        public void WhenObservingMoreThanOneSubjectTheyShouldNotInterfere()
        {
            sync = TestSync.TwoActors();

            var subject1 = "eaa520002f1f42b0b5e2d0e162822780";
            var subject2 = "319198581087493da52b48c96de2bf7e";
            var payload1 = SamplePayload.Random();
            var payload2 = SamplePayload.Random();

            using (NATSServer.CreateFastAndVerify(Context.Server1.Port))
            {
                using (var cn = Context.OpenConnection(Context.Server1.Port))
                {
                    using (var observable1 = cn.Observe(subject1))
                        using (var observable2 = cn.Observe(subject2))
                        {
                            var interceptingOb1 = new TestObserver(_ => sync.SignalComplete());
                            var interceptingOb2 = new TestObserver(_ => sync.SignalComplete());

                            observable1.Subscribe(interceptingOb1);
                            observable2.Subscribe(interceptingOb2);

                            cn.Publish(subject1, payload1);
                            cn.Publish(subject2, payload2);

                            sync.WaitForAll();
                            Assert.Equal(payload1, interceptingOb1.OnNextResults.Single());
                            Assert.Equal(payload2, interceptingOb2.OnNextResults.Single());
                        }
                }
            }
        }
示例#4
0
        public void WhenObservingMoreThanOneSubjectTheyShouldNotInterfere()
        {
            sync = TestSync.TwoActors();

            var subject1 = "32c4eeffac584ac19227bd68d2726a2b";
            var subject2 = "468fb15ff1ef4d738bddbf063aa3ae5d";
            var payload1 = SamplePayload.Random();
            var payload2 = SamplePayload.Random();

            using (Context.StartStreamingServerWithEmbedded(Context.Server1))
            {
                using (var cn = Context.GetStanConnection(Context.Server1))
                {
                    using (var observable1 = cn.Observe(subject1))
                        using (var observable2 = cn.Observe(subject2))
                        {
                            var interceptingOb1 = new TestObserver(_ => sync.SignalComplete());
                            var interceptingOb2 = new TestObserver(_ => sync.SignalComplete());

                            observable1.Subscribe(interceptingOb1);
                            observable2.Subscribe(interceptingOb2);

                            cn.Publish(subject1, payload1);
                            cn.Publish(subject2, payload2);

                            sync.WaitForAll();
                            Assert.Equal(payload1, interceptingOb1.OnNextResults.Single());
                            Assert.Equal(payload2, interceptingOb2.OnNextResults.Single());
                        }
                }
            }
        }
示例#5
0
        public void WhenSubscribingMoreThanOneObserverToTheObservableOnlyOneServerSubscriptionShouldBeSetup()
        {
            sync = TestSync.FourActors();
            var subject = "42016e8229d340c9869c8c2e30fec4f6";
            var payload = SamplePayload.Random();

            using (Context.StartStreamingServerWithEmbedded(Context.Server1))
            {
                using (var cn = Context.GetStanConnection(Context.Server1))
                {
                    var initialSubscriptionCount = cn.NATSConnection.SubscriptionCount;

                    using (var observable = cn.Observe(subject))
                    {
                        var interceptingOb     = new TestObserver(_ => sync.SignalComplete());
                        var interceptingSafeOb = new TestObserver(_ => sync.SignalComplete());

                        observable.Subscribe(interceptingOb);
                        observable.Subscribe(interceptingSafeOb);
                        observable.Subscribe(_ => sync.SignalComplete());
                        observable.SubscribeSafe(_ => sync.SignalComplete());

                        cn.Publish(subject, payload);

                        sync.WaitForAll();
                        Assert.Equal(1, cn.NATSConnection.SubscriptionCount - initialSubscriptionCount);
                    }
                }
            }
        }
示例#6
0
        public void WhenDisposingAnObserverItShouldNotReceiveMoreMessages()
        {
            sync = TestSync.TwoActors();

            var subject  = "415b09873e3348d3a953e93d35ff61bf";
            var payload1 = SamplePayload.Random();
            var payload2 = SamplePayload.Random();

            using (NATSServer.CreateFastAndVerify(Context.Server1.Port))
            {
                var interceptingOb1 = new TestObserver(_ => sync.SignalComplete());
                var interceptingOb2 = new TestObserver(_ => sync.SignalComplete());

                using (var cn = Context.OpenConnection(Context.Server1.Port))
                {
                    using (var observable = cn.Observe(subject))
                    {
                        using (observable.Subscribe(interceptingOb1))
                        {
                            using (observable.Subscribe(interceptingOb2))
                            {
                                cn.Publish(subject, payload1);
                                sync.WaitForAll();
                            }

                            cn.Publish(subject, payload2);
                            sync.WaitForOne();
                        }

                        Assert.Equal(new[] { payload1.Data, payload2.Data }, interceptingOb1.OnNextResults.Select(i => i.Data).ToArray());
                        Assert.Equal(new[] { payload1.Data }, interceptingOb2.OnNextResults.Select(i => i.Data).ToArray());
                    }
                }
            }
        }
示例#7
0
        public void WhenDisposingAnObserverItShouldNotReceiveMoreMessages()
        {
            sync = TestSync.TwoActors();

            var subject  = "f3d07d4e380048399df9363222ca482b";
            var payload1 = SamplePayload.Random();
            var payload2 = SamplePayload.Random();

            using (Context.StartStreamingServerWithEmbedded(Context.Server1))
            {
                var interceptingOb1 = new TestObserver(_ => sync.SignalComplete());
                var interceptingOb2 = new TestObserver(_ => sync.SignalComplete());

                using (var cn = Context.GetStanConnection(Context.Server1))
                {
                    using (var observable = cn.Observe(subject))
                    {
                        using (observable.Subscribe(interceptingOb1))
                        {
                            using (observable.Subscribe(interceptingOb2))
                            {
                                cn.Publish(subject, payload1);
                                sync.WaitForAll();
                            }

                            cn.Publish(subject, payload2);
                            sync.WaitForOne();
                        }

                        Assert.Equal(new[] { payload1.Data, payload2.Data }, interceptingOb1.OnNextResults.Select(i => i.Data).ToArray());
                        Assert.Equal(new[] { payload1.Data }, interceptingOb2.OnNextResults.Select(i => i.Data).ToArray());
                    }
                }
            }
        }
        public void EnsureDrainAsync()
        {
            var subject = "5dc823d90cab46679e0bf51afffda767";
            var q       = new ConcurrentQueue <int>();

            AsyncContext.Run(async() =>
            {
                using (NATSServer.CreateFastAndVerify(Context.Server1.Port))
                {
                    using (var sync = TestSync.SingleActor())
                    {
                        var opts = Context.GetTestOptions(Context.Server1.Port);
                        opts.ClosedEventHandler = (sender, args) =>
                        {
                            q.Enqueue(1);
                            sync.SignalComplete();
                        };

                        using (var cn = Context.ConnectionFactory.CreateConnection(opts))
                        {
                            for (var i = 0; i < 50; i++)
                            {
                                cn.Publish(subject, new[] { (byte)i });
                            }

                            await cn.DrainAsync();

                            sync.WaitForAll();
                            Assert.Single(q);
                        }
                    }
                }
            });
        }
示例#9
0
        public void WhenSubscribingMoreThanOneObserverToTheObservableOnlyOneServerSubscriptionShouldBeSetup()
        {
            sync = TestSync.FourActors();
            var subject = "eaa520002f1f42b0b5e2d0e162822780";
            var payload = SamplePayload.Random();

            using (NATSServer.CreateFastAndVerify(Context.Server1.Port))
            {
                using (var cn = Context.OpenConnection(Context.Server1.Port))
                {
                    using (var observable = cn.Observe(subject))
                    {
                        var interceptingOb     = new TestObserver(_ => sync.SignalComplete());
                        var interceptingSafeOb = new TestObserver(_ => sync.SignalComplete());

                        observable.Subscribe(interceptingOb);
                        observable.Subscribe(interceptingSafeOb);
                        observable.Subscribe(_ => sync.SignalComplete());
                        observable.SubscribeSafe(_ => sync.SignalComplete());

                        cn.Publish(subject, payload);

                        sync.WaitForAll();
                        Assert.Equal(1, cn.SubscriptionCount);
                    }
                }
            }
        }
示例#10
0
        public void WhenPublishingAllSubscribedObserversShouldGetTheMessage()
        {
            sync = TestSync.FourActors();
            var subject = "008f9155d7b84821a26d2e41f73a9a7f";
            var payload = SamplePayload.Random();

            using (Context.StartStreamingServerWithEmbedded(Context.Server1))
            {
                using (var cn = Context.GetStanConnection(Context.Server1))
                {
                    using (var observable = cn.Observe(subject))
                    {
                        var     interceptingOb = new TestObserver(_ => sync.SignalComplete());
                        var     interceptingSafeOb = new TestObserver(_ => sync.SignalComplete());
                        StanMsg delegatingObIntercept = null, safeDelegatingObIntercept = null;

                        observable.Subscribe(interceptingOb);
                        observable.SubscribeSafe(interceptingSafeOb);
                        observable.Subscribe(msg =>
                        {
                            delegatingObIntercept = msg;
                            sync.SignalComplete();
                        });
                        observable.SubscribeSafe(msg =>
                        {
                            safeDelegatingObIntercept = msg;
                            sync.SignalComplete();
                        });

                        cn.Publish(subject, payload);

                        sync.WaitForAll();
                        Assert.Equal(payload, interceptingOb.OnNextResults.Single());
                        Assert.Equal(payload, interceptingSafeOb.OnNextResults.Single());
                        Assert.Equal(payload, delegatingObIntercept);
                        Assert.Equal(payload, safeDelegatingObIntercept);
                    }
                }
            }
        }
示例#11
0
        public void WhenPublishingAllSubscribedObserversShouldGetTheMessage()
        {
            sync = TestSync.FourActors();
            var subject = "132dc3101ef74ede90913c70baa542de";
            var payload = SamplePayload.Random();

            using (NATSServer.CreateFastAndVerify(Context.Server1.Port))
            {
                using (var cn = Context.OpenConnection(Context.Server1.Port))
                {
                    using (var observable = cn.Observe(subject))
                    {
                        var interceptingOb = new TestObserver(_ => sync.SignalComplete());
                        var interceptingSafeOb = new TestObserver(_ => sync.SignalComplete());
                        Msg delegatingObIntercept = null, safeDelegatingObIntercept = null;

                        observable.Subscribe(interceptingOb);
                        observable.SubscribeSafe(interceptingSafeOb);
                        observable.Subscribe(msg =>
                        {
                            delegatingObIntercept = msg;
                            sync.SignalComplete();
                        });
                        observable.SubscribeSafe(msg =>
                        {
                            safeDelegatingObIntercept = msg;
                            sync.SignalComplete();
                        });

                        cn.Publish(subject, payload);

                        sync.WaitForAll();
                        Assert.Equal(payload, interceptingOb.OnNextResults.Single());
                        Assert.Equal(payload, interceptingSafeOb.OnNextResults.Single());
                        Assert.Equal(payload, delegatingObIntercept);
                        Assert.Equal(payload, safeDelegatingObIntercept);
                    }
                }
            }
        }
        public void EnsurePubSubWithFlush()
        {
            var subject  = "0b122a47380145b49969ddfaafe0c206";
            var recieved = new ConcurrentQueue <Msg>();

            AsyncContext.Run(() =>
            {
                using (NATSServer.CreateFastAndVerify(Context.Server1.Port))
                {
                    using (var sync = TestSync.SingleActor())
                    {
                        using (var cn = Context.ConnectionFactory.CreateConnection(Context.Server1.Url))
                        {
                            using (cn.SubscribeAsync(subject, (_, m) =>
                            {
                                recieved.Enqueue(m.Message);
                                if (recieved.Count == 5)
                                {
                                    sync.SignalComplete();
                                }
                            }))
                            {
                                for (var i = 0; i < 5; i++)
                                {
                                    cn.Publish(subject, new[] { (byte)i });
                                    cn.Flush();
                                    cn.FlushBuffer();
                                }

                                sync.WaitForAll();
                            }
                        }

                        Assert.Equal(5, recieved.Count);
                    }
                }
            });
        }
示例#13
0
        public void EnsurePubSubWithAsyncHandler()
        {
            var subject  = "236c9af7eae044f585973503e9803f4a";
            var recieved = new ConcurrentQueue <Msg>();

            AsyncContext.Run(() =>
            {
                using (NATSServer.CreateFast(Context.Server1.Port))
                {
                    using (var sync = TestSync.SingleActor())
                    {
                        using (var cn = Context.ConnectionFactory.CreateConnection(Context.Server1.Url))
                        {
                            using (cn.SubscribeAsync(subject, async(_, m) =>
                            {
                                await Task.Delay(100);
                                recieved.Enqueue(m.Message);
                                if (recieved.Count == 5)
                                {
                                    sync.SignalComplete();
                                }
                            }))
                            {
                                for (var i = 0; i < 5; i++)
                                {
                                    cn.Publish(subject, new[] { (byte)i });
                                }

                                sync.WaitForAll();
                            }
                        }

                        Assert.Equal(5, recieved.Count);
                    }
                }
            });
        }
        public void EnsureAutoUnsubscribeForAsyncSub()
        {
            var subject  = "0be903f6c9c14c10973e78ce03ad47e1";
            var recieved = new ConcurrentQueue <Msg>();

            AsyncContext.Run(async() =>
            {
                using (NATSServer.CreateFast(Context.Server1.Port))
                {
                    using (var sync = TestSync.SingleActor())
                    {
                        using (var cn = Context.ConnectionFactory.CreateConnection(Context.Server1.Url))
                        {
                            using (var sub = cn.SubscribeAsync(subject, (_, m) =>
                            {
                                recieved.Enqueue(m.Message);
                                sync.SignalComplete();
                            }))
                            {
                                sub.AutoUnsubscribe(1);

                                cn.Publish(subject, new byte[0]);
                                cn.Publish(subject, new byte[0]);

                                sync.WaitForAll();

                                await Task.Delay(100);
                                Assert.Equal(1, sub.Delivered);
                            }
                        }

                        Assert.Single(recieved);
                    }
                }
            });
        }
示例#15
0
        public void WhenDisposingAnObservableNoMoreDispatchesShouldBeDone()
        {
            sync = TestSync.TwoActors();

            var subject  = "61d374c816034f8b9428b04e273f4c85";
            var payload1 = SamplePayload.Random();
            var payload2 = SamplePayload.Random();

            using (Context.StartStreamingServerWithEmbedded(Context.Server1))
            {
                var interceptingOb1 = new TestObserver(_ => sync.SignalComplete());
                var interceptingOb2 = new TestObserver(_ => sync.SignalComplete());

                using (var cn = Context.GetStanConnection(Context.Server1))
                {
                    var observable1 = cn.Observe(subject);
                    var observable2 = cn.Observe(subject);

                    observable1.Subscribe(interceptingOb1);
                    observable2.Subscribe(interceptingOb2);

                    cn.Publish(subject, payload1);
                    sync.WaitForAll();

                    observable1.Dispose();

                    cn.Publish(subject, payload2);
                    sync.WaitForOne();

                    observable2.Dispose();

                    Assert.Equal(new[] { payload1.Data }, interceptingOb1.OnNextResults.Select(i => i.Data).ToArray());
                    Assert.Equal(new[] { payload1.Data, payload2.Data }, interceptingOb2.OnNextResults.Select(i => i.Data).ToArray());
                }
            }
        }
示例#16
0
        public void WhenDisposingAnObservableNoMoreDispatchesShouldBeDone()
        {
            sync = TestSync.TwoActors();

            var subject  = "bea00c947f4c470cb4e884c58202d3ac";
            var payload1 = SamplePayload.Random();
            var payload2 = SamplePayload.Random();

            using (NATSServer.CreateFastAndVerify(Context.Server1.Port))
            {
                var interceptingOb1 = new TestObserver(_ => sync.SignalComplete());
                var interceptingOb2 = new TestObserver(_ => sync.SignalComplete());

                using (var cn = Context.OpenConnection(Context.Server1.Port))
                {
                    var observable1 = cn.Observe(subject);
                    var observable2 = cn.Observe(subject);

                    observable1.Subscribe(interceptingOb1);
                    observable2.Subscribe(interceptingOb2);

                    cn.Publish(subject, payload1);
                    sync.WaitForAll();

                    observable1.Dispose();

                    cn.Publish(subject, payload2);
                    sync.WaitForOne();

                    observable2.Dispose();

                    Assert.Equal(new[] { payload1.Data }, interceptingOb1.OnNextResults.Select(i => i.Data).ToArray());
                    Assert.Equal(new[] { payload1.Data, payload2.Data }, interceptingOb2.OnNextResults.Select(i => i.Data).ToArray());
                }
            }
        }
        public void EnsurePubSub()
        {
            var subject  = "16160bf236cb42dda5bbd0dfc744dacc";
            var recieved = new ConcurrentQueue <Msg>();

            AsyncContext.Run(() =>
            {
                using (NATSServer.CreateFastAndVerify(Context.Server1.Port))
                {
                    using (var sync = TestSync.SingleActor())
                    {
                        using (var cn = Context.ConnectionFactory.CreateConnection(Context.Server1.Url))
                        {
                            using (cn.SubscribeAsync(subject, (_, m) =>
                            {
                                recieved.Enqueue(m.Message);
                                if (recieved.Count == 5)
                                {
                                    sync.SignalComplete();
                                }
                            }))
                            {
                                for (var i = 0; i < 5; i++)
                                {
                                    cn.Publish(subject, new[] { (byte)i });
                                }

                                sync.WaitForAll();
                            }
                        }

                        Assert.Equal(5, recieved.Count);
                    }
                }
            });
        }