예제 #1
0
        public void ServiceQueue_1_Writer_1_Reader(ServiceQueueRotationAlgorithm algorithm)
        {
            using (var serviceQueue = new ServiceQueue(algorithm))
            using (var reader = new ServiceQueueReader())
            using (var writer = new ServiceQueueWriter())
            {
                var endpoint = GetEndpoint();
                serviceQueue.Bind(endpoint);

                var counterSignal = new CounterSignal(NumberOfMessages, 0);
                reader.MessageReceived += (s, m) => counterSignal.Increment();

                reader.Connect(endpoint);
                writer.Connect(endpoint);

                var messageSent = new TestMessage();

                var sw = Stopwatch.StartNew();
                for (var i = 0; i < NumberOfMessages; i++)
                {
                    writer.SendMessage(messageSent);
                }
                Assert.IsTrue(counterSignal.Wait(TimeOut), "Timeout waiting for message");
                sw.Stop();

                Assert.Inconclusive("{0} elapsed reading {1} messages ({2:N0} per second)", sw.Elapsed, NumberOfMessages, NumberOfMessages / sw.Elapsed.TotalSeconds);

            }
        }
        public void One_Publisher_One_Subscriber_Batch_Broadcast()
        {
            using (var publisher = new Publisher())
            using (var subscriber = new Subscriber())
            {
                var endpoint = GetEndpoint();
                publisher.Bind(endpoint);
                subscriber.Connect(endpoint);

                Thread.Sleep(100);

                var counterSignal = new CounterSignal(NumberOfMessagesToReceive);
                subscriber.MessageReceived += (s, m) => counterSignal.Increment();

                var messageSent = new TestMessage();

                var batch = new List<TestMessage>();
                for (var i = 0; i < NumberOfMessagesToReceive; i++)
                    batch.Add(messageSent);

                var sw = Stopwatch.StartNew();
                publisher.Broadcast(batch);
                Assert.IsTrue(counterSignal.Wait(TimeOut), "Timeout waiting for message");
                sw.Stop();

                Assert.Inconclusive("{0} elapsed reading {1} messages ({2:N0} per second)", sw.Elapsed, NumberOfMessagesToReceive, NumberOfMessagesToReceive / sw.Elapsed.TotalSeconds);
            }
        }
예제 #3
0
 public void initial_value_signal_not_set_Wait_TimeSpan_CancellationToken_cancelled()
 {
     var counterSignal = new CounterSignal(2, 1);
     var cancellationToken = new CancellationTokenSource(TimeSpan.FromMilliseconds(15)).Token;
     Assert.Throws<OperationCanceledException>(() => counterSignal.Wait(TimeSpan.FromSeconds(1), cancellationToken));
 }
예제 #4
0
 public void initial_value_signal_not_set_Wait_TimeSpan_false()
 {
     var counterSignal = new CounterSignal(2, 1);
     Assert.IsFalse(counterSignal.Wait(TimeSpan.Zero));
 }
        public void ServiceQueue_AddMessageFrame_connect_multiple_readers_LoadBalance()
        {
            var endpoint1 = new RedFoxEndpoint("/path1");
            var endpoint2 = new RedFoxEndpoint("/path2");

            using (var serviceQueue = new ServiceQueue(ServiceQueueRotationAlgorithm.LoadBalance))
            using (var serviceQueueReader1 = new ServiceQueueReader())
            using (var serviceQueueReader2 = new ServiceQueueReader())
            {
                const int count = 1000;
                var counter = new CounterSignal(count, 0);

                var messagesReceived1 = new List<IMessage>();
                serviceQueueReader1.MessageReceived += (s, m) =>
                {
                    messagesReceived1.Add(m);
                    counter.Increment();
                };

                var messagesReceived2 = new List<IMessage>();
                serviceQueueReader2.MessageReceived += (s, m) =>
                {
                    messagesReceived2.Add(m);
                    counter.Increment();
                };

                var testMessage = new TestMessage();
                var testMessageFrame = new MessageFrameCreator(DefaultMessageSerialization.Instance).CreateFromMessage(testMessage);

                serviceQueue.Bind(endpoint1);
                serviceQueue.Bind(endpoint2);

                serviceQueueReader1.Connect(endpoint1);
                serviceQueueReader2.Connect(endpoint2);

                for (var i = 0; i < count; i++)
                    serviceQueue.AddMessageFrame(testMessageFrame);

                Assert.IsTrue(counter.Wait());
                Assert.AreEqual(count, messagesReceived1.Count + messagesReceived2.Count);

                Assert.AreNotEqual(0, messagesReceived1.Count);
                Assert.AreNotEqual(0, messagesReceived2.Count);

                var ratio = (decimal)messagesReceived1.Count / messagesReceived2.Count;
                Assert.Greater(ratio, 0.9);
                Assert.Less(ratio, 1.1);
            }
        }
예제 #6
0
 public void counter_increment_then_decrement_signal_IsSet_false()
 {
     var counterSignal = new CounterSignal(2, 1);
     counterSignal.Increment();
     counterSignal.Decrement();
     Assert.IsFalse(counterSignal.IsSet);
 }
예제 #7
0
        public void initial_value_signal_set_Wait_TimeSpan()
        {
            var counterSignal = new CounterSignal(1, 1);

            Assert.IsTrue(counterSignal.Wait(TimeSpan.Zero));
        }
        private void One_Responder_N_Requesters(int n)
        {
            var echoWorker = new ResponderWorker();
            var workerFactory = new ResponderWorkerFactory(request => echoWorker);
            using (var responder = new Responder(workerFactory))
            {
                var endpoint = GetEndpoint();
                responder.Bind(endpoint);

                var requesters = Enumerable.Range(0, n).Select(x => new Requester()).ToList();
                foreach (var requester in requesters)
                {
                    requester.Connect(endpoint);
                }

                Thread.Sleep(100);

                var threadsStartedSignal = new CounterSignal(n, 0);
                var startSignal = new ManualResetEventSlim();
                var tasks = new List<Task>();
                foreach (var requester in requesters)
                {
                    var req = requester;
                    var task = Task.Factory.StartNew(() =>
                    {
                        threadsStartedSignal.Increment();
                        startSignal.Wait();

                        var message = new TestMessage();
                        for (var i = 0; i < NumberOfRequests / n; i++)
                        {
                            req.Request(message);
                        }
                    }, TaskCreationOptions.LongRunning);
                    tasks.Add(task);
                }
                Assert.IsTrue(threadsStartedSignal.Wait(TimeSpan.FromSeconds(1)));

                var sw = Stopwatch.StartNew();
                startSignal.Set();
                Assert.IsTrue(Task.WhenAll(tasks).Wait(TimeSpan.FromMinutes(1)));
                sw.Stop();

                foreach (var requester in requesters)
                {
                    requester.Disconnect();
                }

                Assert.Inconclusive("{0} elapsed sending/receiving {1} messages ({2:N0} per second)", sw.Elapsed, NumberOfRequests, NumberOfRequests / sw.Elapsed.TotalSeconds);
            }
        }
예제 #9
0
        public void benchmark_add_value()
        {
            var counterSignal = new CounterSignal(1, 0);

            const int iterations = 10000000;
            var sw = Stopwatch.StartNew();
            for (var i = 0; i < iterations; i++)
            {
                counterSignal.Add(1);
            }
            sw.Stop();

            Assert.Inconclusive("{0} ({1:N0} ops/sec)", sw.Elapsed, (decimal)iterations / sw.ElapsedMilliseconds * 1000m);
        }
예제 #10
0
        public void initial_value_greater_equal_one_initial_value_one_IsSet_false()
        {
            var counterSignal = new CounterSignal(1, 1);

            Assert.IsTrue(counterSignal.IsSet);
        }
예제 #11
0
 public void CurrentValue_decremented_on_Decrement()
 {
     var counterSignal = new CounterSignal(0, 2);
     counterSignal.Decrement();
     Assert.AreEqual(1, counterSignal.CurrentValue);
 }
예제 #12
0
        public void benchmark_get_value()
        {
            var counterSignal = new CounterSignal(1, 0);

            const int iterations = 10000000;
            var value = false;

            var sw = Stopwatch.StartNew();
            for (var i = 0; i < iterations; i++)
            {
                value |= counterSignal.Wait(TimeSpan.Zero);
            }
            sw.Stop();

            if (value) Console.WriteLine(); // prevent too aggressive optimization

            Assert.Inconclusive("{0} ({1:N0} ops/sec)", sw.Elapsed, (decimal)iterations / sw.ElapsedMilliseconds * 1000m);
        }
예제 #13
0
 public void CurrentValue_incremented_on_Increment()
 {
     var counterSignal = new CounterSignal(0, 1);
     counterSignal.Increment();
     Assert.AreEqual(2, counterSignal.CurrentValue);
 }
예제 #14
0
 public void CurrentValue_set_value()
 {
     var counterSignal = new CounterSignal(0) { CurrentValue = 1234 };
     Assert.AreEqual(1234, counterSignal.CurrentValue);
 }
예제 #15
0
 public void CurrentValue_is_initial_value_same_after_ctor(int initialValue)
 {
     var counterSignal = new CounterSignal(0, initialValue);
     Assert.AreEqual(initialValue, counterSignal.CurrentValue);
 }
예제 #16
0
        public void ServiceQueue_connect_Writer_send_multiple_message_received()
        {
            const int count = 1000;

            using (var serviceQueue = new ServiceQueue())
            using (var writer = new ServiceQueueWriter())
            {
                var endpoint = new RedFoxEndpoint("/path");

                var messageFrames = new List<MessageFrame>();
                var counterSignal = new CounterSignal(count, 0);
                serviceQueue.MessageFrameReceived += m =>
                {
                    messageFrames.Add(m);
                    counterSignal.Increment();
                };

                serviceQueue.Bind(endpoint);
                writer.Connect(endpoint);

                for (var i = 0; i < count; i++)
                    writer.SendMessage(new TestMessage());

                Assert.IsTrue(counterSignal.Wait(TimeSpan.FromSeconds(30)));
                Assert.AreEqual(count, messageFrames.Count);
            }
        }
예제 #17
0
 public void initial_value_greater_equal_one_initial_value_one_IsSet_false()
 {
     var counterSignal = new CounterSignal(1, 1);
     Assert.IsTrue(counterSignal.IsSet);
 }
예제 #18
0
        public void CurrentValue_is_initial_value_same_after_ctor(int initialValue)
        {
            var counterSignal = new CounterSignal(0, initialValue);

            Assert.AreEqual(initialValue, counterSignal.CurrentValue);
        }
예제 #19
0
 public void initial_value_signal_IsSet_true()
 {
     var counterSignal = new CounterSignal(1, 1);
     Assert.IsTrue(counterSignal.IsSet);
 }
예제 #20
0
        public void initial_value_signal_IsSet_true()
        {
            var counterSignal = new CounterSignal(1, 1);

            Assert.IsTrue(counterSignal.IsSet);
        }
예제 #21
0
 public void initial_value_signal_set_Wait_TimeSpan()
 {
     var counterSignal = new CounterSignal(1, 1);
     Assert.IsTrue(counterSignal.Wait(TimeSpan.Zero));
 }
예제 #22
0
        public void initial_value_signal_not_set_IsSet_false()
        {
            var counterSignal = new CounterSignal(2, 1);

            Assert.IsFalse(counterSignal.IsSet);
        }
        public void One_Publisher_Hundred_Subscribers_Single_Broadcasts()
        {
            using (var publisher = new Publisher())
            {
                var endpoint = GetEndpoint();
                publisher.Bind(endpoint);

                var counterSignal = new CounterSignal(NumberOfMessagesToReceive);
                var subscribers = Enumerable.Range(1, 100).Select(i =>
                {
                    var sub = new Subscriber();
                    sub.MessageReceived += (s, m) => counterSignal.Increment();
                    sub.Connect(endpoint);
                    return sub;
                }).ToList();

                Thread.Sleep(100);

                var messageSent = new TestMessage();

                var sw = Stopwatch.StartNew();
                for (var i = 0; i < NumberOfMessagesToReceive / 100; i++)
                {
                    publisher.Broadcast(messageSent);
                }
                Assert.IsTrue(counterSignal.Wait(TimeOut), "Timeout waiting for message");
                sw.Stop();

                subscribers.ForEach(sub => sub.Dispose());

                Assert.Inconclusive("{0} elapsed reading {1} messages ({2:N0} per second)", sw.Elapsed, NumberOfMessagesToReceive, NumberOfMessagesToReceive / sw.Elapsed.TotalSeconds);
            }
        }
예제 #24
0
        public void ServiceQueue_AddMessageFrame_connect_multiple_readers_multiple_message_received(ServiceQueueRotationAlgorithm rotationAlgorithm)
        {
            var endpoint = new RedFoxEndpoint("/path");

            using (var serviceQueue = new ServiceQueue(rotationAlgorithm))
            using (var serviceQueueReader1 = new ServiceQueueReader())
            using (var serviceQueueReader2 = new ServiceQueueReader())
            {
                const int count = 1000;
                var counter = new CounterSignal(count, 0);

                var messagesReceived1 = new List<IMessage>();
                serviceQueueReader1.MessageReceived += (s, m) =>
                {
                    messagesReceived1.Add(m);
                    counter.Increment();
                };

                var messagesReceived2 = new List<IMessage>();
                serviceQueueReader2.MessageReceived += (s, m) =>
                {
                    messagesReceived2.Add(m);
                    counter.Increment();
                };

                var testMessage = new TestMessage();
                var testMessageFrame = new MessageFrameCreator(DefaultMessageSerialization.Instance).CreateFromMessage(testMessage);

                for (var i = 0; i < count; i++)
                    serviceQueue.AddMessageFrame(testMessageFrame);

                serviceQueue.Bind(endpoint);

                serviceQueueReader1.Connect(endpoint);
                serviceQueueReader2.Connect(endpoint);

                Assert.IsTrue(counter.Wait(TimeSpan.FromSeconds(10)));
                Assert.AreEqual(count, messagesReceived1.Count + messagesReceived2.Count);
            }
        }
예제 #25
0
 public void counter_add_signal_IsSet_true()
 {
     var counterSignal = new CounterSignal(10, 1);
     counterSignal.Add(100);
     Assert.IsTrue(counterSignal.IsSet);
     Assert.IsTrue(counterSignal.Wait(TimeSpan.Zero));
 }
예제 #26
0
 public void initial_value_signal_not_set_IsSet_false()
 {
     var counterSignal = new CounterSignal(2, 1);
     Assert.IsFalse(counterSignal.IsSet);
 }
예제 #27
0
 public void counter_add_signal_IsSet_false()
 {
     var counterSignal = new CounterSignal(10, 0);
     counterSignal.Add(9);
     Assert.IsFalse(counterSignal.IsSet);
 }
예제 #28
0
 public void initial_value_signal_not_set_Wait_TimeSpan_CancellationToken_timed_out()
 {
     var counterSignal = new CounterSignal(2, 1);
     var cancellationToken = new CancellationTokenSource(TimeSpan.FromSeconds(1)).Token;
     Assert.IsFalse(counterSignal.Wait(TimeSpan.FromMilliseconds(15), cancellationToken));
 }
예제 #29
0
 public void counter_increment_signal_IsSet_true()
 {
     var counterSignal = new CounterSignal(2, 1);
     counterSignal.Increment();
     Assert.IsTrue(counterSignal.IsSet);
 }