public void ThrottledMarketDataStreamMultithreadingRemoveWatcherTest()
        {
            var           stream = new ThrottledMarketDataStream();
            List <Client> list   = new List <Client>();

            list.AddRange(new Client[] { new Client(), new Client(), new Client(), new Client(), new Client(), new Client(), new Client(), new Client(), null });

            ThrottledMarketDataStreamMultithreadingAddWatchers(list, stream);
            Assert.IsTrue(stream.WatcherCount == 9);

            // create a bunch of threads
            List <Thread> threads = new List <Thread>();

            list.ForEach(x => threads.Add(new Thread(() => ThreadMethodRemoveWatcher(x, stream))));

            // start them
            threads.ForEach(x => x.Start());

            // wait for them to finish
            threads.ForEach(x => x.Join());

            // this will not print untill all threads have completed
            System.Diagnostics.Debug.WriteLine("All threads finished.");
            System.Diagnostics.Debug.WriteLine($"WatcherCount - {stream.WatcherCount}");
            Assert.IsTrue(stream.WatcherCount == 0);
        }
        public void ThrottledMarketDataStreamTasksMultithreadingAddWatcherAyncTest()
        {
            var stream = new ThrottledMarketDataStream();

            List <Client> list  = new List <Client>();
            var           tasks = new List <Task>();

            for (int i = 0; i < 100; i++)
            {
                var currentClient = new Client();
                list.Add(currentClient);
                tasks.Add(new Task(async() => await ThreadMethodAddWatcherAync(currentClient, stream)));
            }

            Parallel.ForEach(tasks, task =>
            {
                task.Start();
            });

            Task.WhenAll(tasks).ContinueWith(done =>
            {
                // this will not print untill all tasks have completed.
                System.Diagnostics.Debug.WriteLine("All tasks add watcher finished.");
            });

            Thread.Sleep(100);
            Assert.IsTrue(stream.WatcherCount == 100);
        }
        public void ThrottledMarketDataStreamTasksMultithreadingStartStopTest()
        {
            var stream = new ThrottledMarketDataStream();

            var tasks = new List <Task>();

            for (int i = 0; i < 10; i++)
            {
                if (i % 2 == 0)
                {
                    tasks.Add(new Task(() => stream.Start()));
                }
                else
                {
                    tasks.Add(new Task(() => stream.End()));
                }
            }

            Parallel.ForEach(tasks, task =>
            {
                task.Start();
            });

            Task.WhenAll(tasks).ContinueWith(done =>
            {
                // this will not print untill all tasks have completed.
                System.Diagnostics.Debug.WriteLine("All tasks _stream Start/End  finished.");
                stream.End();
            });
        }
        public void Run()
        {
            //// Arrange

            var stream1 = new MarketDataStream();
            var stream2 = new MarketDataStream();

            var aggregator = new ThrottledMarketDataStream();

            stream1.AddWatcher(aggregator);
            stream2.AddWatcher(aggregator);

            var client = new Client();

            aggregator.AddWatcher(client);

            // Act
            aggregator.Start();
            stream1.Start();
            stream2.Start();

            Thread.Sleep(3000);

            // Assert
        }
        public void Run()
        {
            //// Arrange

            var stream1 = new MarketDataStream();
            var stream2 = new MarketDataStream();

            var aggregator = new ThrottledMarketDataStream();

            stream1.AddWatcher(aggregator);
            stream2.AddWatcher(aggregator);

            var logClient = new LogClientStrategy();
            var client    = new Client(logClient);

            aggregator.AddWatcher(client);

            // Act
            aggregator.Start();

            stream1.Start();
            stream2.Start();

            Thread.Sleep(3000);

            // Assert
            var result = logClient.Print();

            Assert.IsNotNull(result);
            Assert.IsFalse(string.IsNullOrWhiteSpace(result));
        }
        public void ThrottledMarketDataStreamMultithreadingAddWatcherTest()
        {
            var           stream = new ThrottledMarketDataStream();
            List <Client> list   = new List <Client>();

            list.AddRange(new Client[] { new Client(), new Client(), new Client(), new Client(), new Client() });

            ThrottledMarketDataStreamMultithreadingAddWatchers(list, stream);
            // this will not print untill all threads have completed
            System.Diagnostics.Debug.WriteLine("All threads finished.");
            Assert.IsTrue(stream.WatcherCount == 5);
        }
        public void ThrottledMarketDataStreamTasksMultithreadingOnUpdateSecondTest()
        {
            var stream = new ThrottledMarketDataStream();

            var randomizer = new Random(new Random().Next(1, int.MaxValue));
            var tasks      = new List <Task>();
            List <MarketDataUpdate> list = new List <MarketDataUpdate>();

            for (int i = 0; i < 1000; i++)
            {
                var update = new MarketDataUpdate()
                {
                    InstrumentId = "AAPL_" + randomizer.Next(1, 100),
                    Fields       = new Dictionary <byte, long>(),
                };

                for (int j = 0; j < randomizer.Next(1, 5); j++)
                {
                    update.Fields[(byte)randomizer.Next(1, 20)] = randomizer.Next(1, 10000);
                }
                list.Add(update);
            }

            for (int i = 0; i < list.Count - 1; i++)
            {
                tasks.Add(new Task(() => stream.OnUpdate(list[i])));
            }

            Parallel.ForEach(tasks, task =>
            {
                task.Start();
            });

            Task.WhenAll(tasks).ContinueWith(done =>
            {
                // this will not print untill all tasks have completed.
                System.Diagnostics.Debug.WriteLine("All tasks OnUpdate finished.");
            });
        }
Example #8
0
        public void Run()
        {
            //// Arrange

            var aggregator = new ThrottledMarketDataStream();
            var streams    = new List <MarketDataStream>();
            var client     = new Client();

            for (var i = 0; i < 1000; i++)
            {
                var stream = new MarketDataStream();
                stream.AddWatcher(aggregator);
                streams.Add(stream);
            }

            aggregator.AddWatcher(client);

            //// Act
            aggregator.Start();

            foreach (var stream in streams)
            {
                stream.Start();
            }

            Thread.Sleep(10000);

            foreach (var stream in streams)
            {
                stream.End();
            }

            aggregator.End();

            //// Assert
        }
        public void ThrottledMarketDataStreamOnUpdateNullIgnore()
        {
            var stream = new ThrottledMarketDataStream();

            stream.OnUpdate(null);
        }
Example #10
0
        public void Run()
        {
            // Arrange
            var expectedInput1 = new List <MarketDataUpdate>
            {
                new MarketDataUpdate
                {
                    InstrumentId = "AAPL_1", Fields = new Dictionary <byte, long> {
                        { 1, 10 }, { 4, 200 }, { 12, 187 }
                    }
                },
                new MarketDataUpdate
                {
                    InstrumentId = "AAPL_2", Fields = new Dictionary <byte, long> {
                        { 1, 12 }, { 4, 210 }
                    }
                },
                new MarketDataUpdate
                {
                    InstrumentId = "AAPL_1", Fields = new Dictionary <byte, long> {
                        { 12, 189 }
                    }
                },
                new MarketDataUpdate
                {
                    InstrumentId = "AAPL_1", Fields = new Dictionary <byte, long> {
                        { 2, 24 }
                    }
                },
                new MarketDataUpdate
                {
                    InstrumentId = "AAPL_2", Fields = new Dictionary <byte, long> {
                        { 5, 120 }
                    }
                }
            };

            string expected1 = "[1: 10, 4: 200, 12: 189, 2: 24]";
            string expected2 = "[1: 12, 4: 210, 5: 120]";

            var stream1 = new MarketDataStream(new ListDataStreamStrategy(expectedInput1));

            var aggregator = new ThrottledMarketDataStream(300);

            stream1.AddWatcher(aggregator);

            var logClient = new LogClientStrategy();
            var client    = new Client(logClient);

            aggregator.AddWatcher(client);

            // Act
            aggregator.Start();

            stream1.Start();

            Thread.Sleep(2000);

            // Assert
            var result = logClient.Print();

            Assert.IsNotNull(result);
            Assert.IsFalse(string.IsNullOrWhiteSpace(result));

            Assert.IsTrue(result.Contains(expected1), $"Wrong result \n\tExpected to contain: \t{expected1}\n\tActual: \t{result}\n");

            Assert.IsTrue(result.Contains(expected2), $"Wrong result \n\tExpected to contain: \t{expected2}\n\tActual: \t{result}\n");
        }