Пример #1
0
        public void TestNotifyAvgTimeSent()
        {
            // Arrange.
            var repo             = new MockRepository(MockBehavior.Default);
            var statSettingsMock = repo.Create <IStatisticsSettings>();
            var saveServiceMock  = repo.Create <IStatisticsSaveService>();
            var timerServiceMock = repo.Create <IStatisticsTimeService>();
            var loggerMock       = repo.Create <ILogger>();

            var client       = new Client();
            var subscription = new Subscription();
            var messageType  = new MessageType();

            var settings = new StatisticsSetting()
            {
                Subscription = subscription
            };

            statSettingsMock
            .Setup(ds => ds.GetSetting(It.IsAny <Subscription>()))
            .Returns <Subscription>(sub => settings);

            statSettingsMock
            .Setup(ds => ds.GetSubscriptionSB())
            .Returns(Guid.NewGuid());

            saveServiceMock
            .Setup(ds => ds.Save(It.IsAny <IEnumerable <StatisticsRecord> >()))
            .Callback <IEnumerable <StatisticsRecord> >(
                srs =>
            {
                Assert.Equal(2, srs.Count());
                var firstSrs = srs.First();
                Assert.Equal(subscription, firstSrs.StatisticsSetting.Subscription);
                Assert.Equal(0, firstSrs.ReceivedCount);
                Assert.Equal(0, firstSrs.SentCount);
                Assert.Equal(0, firstSrs.ErrorsCount);
                Assert.Equal(0, firstSrs.UniqueErrorsCount);
                Assert.Equal(80, firstSrs.SentAvgTime);
            });

            timerServiceMock.Setup(ts => ts.Now).Returns(() => DateTime.Now);

            var service = new DefaultStatisticsService(statSettingsMock.Object, saveServiceMock.Object, timerServiceMock.Object, loggerMock.Object);

            // Act.
            RunSBComponentAfterStart(
                service,
                c =>
            {
                c.NotifyAvgTimeSent(subscription, 100);
                c.NotifyAvgTimeSent(subscription, 60);
            });

            // Assert.
            saveServiceMock.Verify(ds => ds.Save(It.IsAny <IEnumerable <StatisticsRecord> >()), Times.Once);
            loggerMock.Verify(l => l.LogError(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <Message>()), Times.Never);
            repo.Verify();
        }
        public void TestStartStop()
        {
            var statSettings = new Mock <IStatisticsSettings>().Object;
            var saveService  = new Mock <IStatisticsSaveService>().Object;
            var timeService  = new Mock <IStatisticsTimeService>().Object;
            var service      = new DefaultStatisticsService(statSettings, saveService, timeService, GetMockSubscriptionManager(), GetMockLogger());

            RunSBComponentFullCycle(service);
        }
        public void TestNotifyErrorOccurred()
        {
            // Arrange.
            var statSettingsMock = new Mock <IStatisticsSettings>();
            var saveServiceMock  = new Mock <IStatisticsSaveService>();
            var timerServiceMock = new Mock <IStatisticsTimeService>();

            var subscriptions = Enumerable
                                .Repeat(0, 2)
                                .Select(x => new Subscription())
                                .ToArray();
            var settings = subscriptions
                           .Select(x => new StatisticsSetting()
            {
                Subscription = x
            })
                           .ToDictionary(x => x.Subscription);

            statSettingsMock
            .Setup(ds => ds.GetSetting(It.IsAny <Subscription>()))
            .Returns <Subscription>(sub => sub == null ? null : settings[sub]);

            statSettingsMock
            .Setup(ds => ds.GetSubscriptionSB())
            .Returns(Guid.NewGuid());

            timerServiceMock.Setup(ts => ts.Now).Returns(() => DateTime.Now);

            saveServiceMock
            .Setup(ds => ds.Save(It.IsAny <IEnumerable <StatisticsRecord> >()))
            .Callback <IEnumerable <StatisticsRecord> >(
                srs =>
            {
                Assert.Equal(3, srs.Count());
                Assert.Equal(subscriptions[0], srs.First().StatisticsSetting?.Subscription);
                Assert.Equal(1, srs.First().ErrorsCount);
                Assert.Equal(subscriptions[1], srs.Last().StatisticsSetting?.Subscription);
                Assert.Equal(2, srs.Last().ErrorsCount);
            });

            var service = new DefaultStatisticsService(statSettingsMock.Object, saveServiceMock.Object, timerServiceMock.Object, GetMockSubscriptionManager(), GetMockLogger());

            // Act.
            RunSBComponentAfterStart(
                service,
                c =>
            {
                c.NotifyErrorOccurred(subscriptions[0]);
                c.NotifyErrorOccurred(subscriptions[1]);
                c.NotifyErrorOccurred(subscriptions[1]);
            });

            // Assert.
            saveServiceMock.Verify(ds => ds.Save(It.IsAny <IEnumerable <StatisticsRecord> >()), Times.Once);
        }
        public void TestNotSavingWithoutMessages()
        {
            // Arrange.
            var statSettings    = new Mock <IStatisticsSettings>().Object;
            var saveServiceMock = new Mock <IStatisticsSaveService>();
            var timeService     = new Mock <IStatisticsTimeService>().Object;
            var service         = new DefaultStatisticsService(statSettings, saveServiceMock.Object, timeService, GetMockSubscriptionManager(), GetMockLogger());

            // Act.
            RunSBComponentFullCycle(service);

            // Assert.
            saveServiceMock.Verify(ds => ds.Save(It.IsAny <IEnumerable <StatisticsRecord> >()), Times.Never);
        }
        public void TestConstructorMissingParameters(IStatisticsSettings statSettings, IStatisticsSaveService saveService, IStatisticsTimeService timeService, ISubscriptionsManager subscriptions, ILogger logger)
        {
            // Arrange.
            bool check = false;

            // Act.
            try
            {
                var service = new DefaultStatisticsService(statSettings, saveService, timeService, subscriptions, logger);
            }
            catch (ArgumentNullException)
            {
                check = true;
            }

            // Assert.
            Assert.True(check);
        }
        public void TestSavingWithMessages()
        {
            // Arrange.
            var statSettingsMock = new Mock <IStatisticsSettings>();
            var saveServiceMock  = new Mock <IStatisticsSaveService>();
            var timeService      = new Mock <IStatisticsTimeService>().Object;

            var subscriptions = new Subscription[]
            {
                new Subscription(),
                new Subscription(),
                new Subscription(),
                new Subscription(),
                new Subscription(),
            };
            var settings = subscriptions
                           .Select(x => new StatisticsSetting()
            {
                Subscription = x
            })
                           .ToDictionary(x => x.Subscription);
            var sentBySubscription = new Dictionary <Guid?, int>();

            statSettingsMock
            .Setup(ds => ds.GetSubscriptionSB())
            .Returns(Guid.NewGuid());

            var service = new DefaultStatisticsService(statSettingsMock.Object, saveServiceMock.Object, timeService, GetMockSubscriptionManager(), GetMockLogger());

            // Act.
            RunSBComponentAfterStart(
                service,
                c =>
            {
                // TODO: from 1 to n messages in one interval => one save

                c.NotifyMessageSent(subscriptions[0]);
                c.NotifyMessageReceived(subscriptions[1]);
            });

            // Assert.
            saveServiceMock.Verify(ds => ds.Save(It.IsAny <IEnumerable <StatisticsRecord> >()), Times.Once);
        }
        public void TestSavingWithMutipleThreads()
        {
            // Arrange.
            var statSettingsMock = new Mock <IStatisticsSettings>();
            var saveServiceMock  = new Mock <IStatisticsSaveService>();
            var timerServiceMock = new Mock <IStatisticsTimeService>();

            var subscriptions = Enumerable
                                .Repeat(0, 10)
                                .Select(x => new Subscription())
                                .ToArray();
            var settings = subscriptions
                           .Select(x => new StatisticsSetting()
            {
                Subscription = x
            })
                           .ToDictionary(x => x.Subscription);
            int sent = 0;

            statSettingsMock
            .Setup(ds => ds.GetSetting(It.IsAny <Subscription>()))
            .Returns <Subscription>(sub => sub == null ? null : settings[sub]);

            statSettingsMock
            .Setup(ds => ds.GetSubscriptionSB())
            .Returns(Guid.NewGuid());

            saveServiceMock
            .Setup(ds => ds.Save(It.IsAny <IEnumerable <StatisticsRecord> >()))
            .Callback <IEnumerable <StatisticsRecord> >(
                srs =>
            {
                sent += srs.Sum(t => t.SentCount);
            });

            timerServiceMock.Setup(ts => ts.Now).Returns(() => DateTime.Now);

            var service = new DefaultStatisticsService(statSettingsMock.Object, saveServiceMock.Object, timerServiceMock.Object, GetMockSubscriptionManager(), GetMockLogger());

            // Act.
            RunSBComponentAfterStart(
                service,
                c =>
            {
                var rand = new Random();

                Action threadStart = () =>
                {
                    for (int i = 0; i < 10000; i++)
                    {
                        var subscription = subscriptions[rand.Next(10)];

                        c.NotifyMessageReceived(subscription);
                        c.NotifyMessageSent(subscription);
                    }
                };

                var threads = Enumerable
                              .Repeat(0, 10)
                              .Select(x => new Thread(() => { threadStart(); }))
                              .ToList();

                threads.ForEach(t => t.Start());
                threads.ForEach(t => t.Join());
            });

            // Assert.
            Assert.Equal(200000, sent);
        }
        public void TestSavingByTimer()
        {
            // Arrange.
            var statSettingsMock = new Mock <IStatisticsSettings>();
            var saveServiceMock  = new Mock <IStatisticsSaveService>();
            var timerServiceMock = new Mock <IStatisticsTimeService>();

            var subscriptions = new Subscription[]
            {
                new Subscription(),
                new Subscription(),
            };
            var settings = subscriptions
                           .Select(x => new StatisticsSetting()
            {
                Subscription = x
            })
                           .ToDictionary(x => x.Subscription);

            statSettingsMock
            .Setup(ds => ds.GetSetting(It.IsAny <Subscription>()))
            .Returns <Subscription>(sub => sub == null ? null : settings[sub]);

            statSettingsMock
            .Setup(ds => ds.GetSubscriptionSB())
            .Returns(Guid.NewGuid());

            timerServiceMock.Setup(ts => ts.Now).Returns(() => new DateTime(2000, 01, 01, 00, 00, 00, 00));

            var service = new DefaultStatisticsService(statSettingsMock.Object, saveServiceMock.Object, timerServiceMock.Object, GetMockSubscriptionManager(), GetMockLogger());

            // Act && Assert.
            RunSBComponentAfterStart(
                service,
                c =>
            {
                // Do not save records in the first interval.
                c.NotifyMessageSent(subscriptions[0]);
                Thread.Sleep(3000);
                saveServiceMock.Verify(ds => ds.Save(It.IsAny <IEnumerable <StatisticsRecord> >()), Times.Never);

                // Switching to the next interval.
                // Saving records only from the first interval.
                timerServiceMock.Setup(ts => ts.Now).Returns(() => new DateTime(2000, 01, 01, 00, 01, 00, 00));
                saveServiceMock
                .Setup(ds => ds.Save(It.IsAny <IEnumerable <StatisticsRecord> >()))
                .Callback <IEnumerable <StatisticsRecord> >(
                    srs =>
                {
                    Assert.Equal(2, srs.Count());
                    Assert.Equal(settings[subscriptions[0]], srs.First().StatisticsSetting);
                    Assert.Equal(subscriptions[0], srs.First().StatisticsSetting.Subscription);
                });

                c.NotifyMessageSent(subscriptions[1]);
                Thread.Sleep(3000);
                saveServiceMock.Verify(ds => ds.Save(It.IsAny <IEnumerable <StatisticsRecord> >()), Times.Once);

                // Saving all unsaved records after stop.
                saveServiceMock
                .Setup(ds => ds.Save(It.IsAny <IEnumerable <StatisticsRecord> >()))
                .Callback <IEnumerable <StatisticsRecord> >(
                    srs =>
                {
                    Assert.Equal(2, srs.Count());
                    Assert.Equal(settings[subscriptions[1]], srs.First().StatisticsSetting);
                    Assert.Equal(subscriptions[1], srs.First().StatisticsSetting.Subscription);
                });
            });
        }
        public void TestGroupingData()
        {
            // Arrange.
            var statSettingsMock = new Mock <IStatisticsSettings>();
            var saveServiceMock  = new Mock <IStatisticsSaveService>();
            var timeService      = new Mock <IStatisticsTimeService>().Object;

            var subscriptions = new Subscription[]
            {
                new Subscription(),
                new Subscription(),
                new Subscription(),
                new Subscription(),
                new Subscription(),
            };
            var settings = subscriptions
                           .Select(x => new StatisticsSetting()
            {
                Subscription = x
            })
                           .ToDictionary(x => x.Subscription);
            var sentBySubscription = new Dictionary <Guid?, int>();

            statSettingsMock
            .Setup(ds => ds.GetSetting(It.IsAny <Subscription>()))
            .Returns <Subscription>(sub => sub == null ? null : settings[sub]);

            statSettingsMock
            .Setup(ds => ds.GetSubscriptionSB())
            .Returns(Guid.NewGuid());

            saveServiceMock
            .Setup(ds => ds.Save(It.IsAny <IEnumerable <StatisticsRecord> >()))
            .Callback <IEnumerable <StatisticsRecord> >(
                srs =>
            {
                foreach (var sr in srs)
                {
                    if (sr.StatisticsSetting != null)
                    {
                        var subscriptionId = new Guid(sr.StatisticsSetting.Subscription.__PrimaryKey.ToString());
                        if (!sentBySubscription.ContainsKey(subscriptionId))
                        {
                            sentBySubscription[subscriptionId] = sr.SentCount;
                        }
                        else
                        {
                            sentBySubscription[subscriptionId] += sr.SentCount;
                        }
                    }
                }
            });

            var service = new DefaultStatisticsService(statSettingsMock.Object, saveServiceMock.Object, timeService, GetMockSubscriptionManager(), GetMockLogger());

            // Act.
            RunSBComponentAfterStart(
                service,
                c =>
            {
                c.NotifyMessageSent(subscriptions[1]);
                c.NotifyMessageSent(subscriptions[2]);
                c.NotifyMessageSent(subscriptions[3]);
                c.NotifyMessageSent(subscriptions[4]);

                c.NotifyMessageSent(subscriptions[2]);
                c.NotifyMessageSent(subscriptions[3]);
                c.NotifyMessageSent(subscriptions[4]);

                c.NotifyMessageSent(subscriptions[3]);
                c.NotifyMessageSent(subscriptions[4]);

                c.NotifyMessageSent(subscriptions[4]);
            });

            // Assert.
            Assert.Equal(1, sentBySubscription[new Guid(subscriptions[1].__PrimaryKey.ToString())]);
            Assert.Equal(2, sentBySubscription[new Guid(subscriptions[2].__PrimaryKey.ToString())]);
            Assert.Equal(3, sentBySubscription[new Guid(subscriptions[3].__PrimaryKey.ToString())]);
            Assert.Equal(4, sentBySubscription[new Guid(subscriptions[4].__PrimaryKey.ToString())]);
            Assert.False(sentBySubscription.ContainsKey(new Guid(subscriptions[0].__PrimaryKey.ToString())));
        }