public void LoadTestWithStopAndStartPush() { var intervalDataProvider = Substitute.For <IIntervalProvider>(); var initialDataProvider = Substitute.For <IInitialInfoProvider>(); var initialBidAsk = "initial BidAsk"; initialDataProvider.Provide(BidAskTopic, Arg.Any <string>()).Returns(initialBidAsk); intervalDataProvider.GetInterval(BidAskTopic).Returns(1000); var lstValue = new Queue <KeyValuePair <string, string> >(); for (var j = 1; j < 201; j++) { for (var i = 1; i < 10001; i++) { lstValue.Enqueue(new KeyValuePair <string, string>($"InsIdIR0005D{i.ToString().PadLeft(5, '0')}", $"{CreateBidAsk(j)}")); } } var lstResult = new List <string>(); var lstLoads = new List <object>(); var listener = Substitute.For <IPushSubscriber>(); listener.When(x => x.OnPush(Arg.Any <string>(), Arg.Any <IReadOnlyList <KeyValuePair <string, object> > >())).Do( x => { var topic = (string)x.Args()[0]; var value = (IEnumerable <KeyValuePair <string, object> >)x.Args()[1]; foreach (var item in value) { lstResult.Add( $"rec topic:{topic} key:{item.Key} value:{item.Value} time:{DateTime.Now.TimeOfDay}"); } }); var stopwatch = new Stopwatch(); var intervalChangePusher = new Core.PeriodicalChangePusher(intervalDataProvider, initialDataProvider); intervalChangePusher.Register(listener, BidAskTopic); var rnd = new Random(); var counter = 0; stopwatch.Start(); while (lstValue.Count > 0) { var keyValuePair = lstValue.Dequeue(); intervalChangePusher.Put(BidAskTopic, keyValuePair.Key, keyValuePair.Value); counter++; if (counter == 100) { Task.Delay(1000).Wait(); intervalChangePusher.StopPush(BidAskTopic); } if (counter % 79 == 0) { lstLoads.Add(intervalChangePusher.Load(BidAskTopic, $"InsIdIR0005D{rnd.Next(1, 10000).ToString().PadLeft(5, '0')}")); } } stopwatch.Stop(); Task.Delay(2000).Wait(); var count = lstResult.Count; Task.Delay(1000).Wait(); intervalChangePusher.StartPush(BidAskTopic); Task.Delay(3000).Wait(); Assert.AreEqual(count + 10000, lstResult.Count); }