public void TestStartStop()
        {
            var service = new OptimizedSendingManager(
                GetMockSubscriptionManager(),
                new Mock <IStatisticsService>().Object,
                GetMockDataService(),
                GetMockLogger());

            RunSBComponentFullCycle(service);
        }
        public void TestReciveSendMessageBlockWcf()
        {
            const string BaseAddress     = "http://*****:*****@"<s:Envelope xmlns:s=""http://www.w3.org/2003/05/soap-envelope"">
                                <s:Header />
                                <s:Body>
                                    <AcceptMessageResponse xmlns=""http://tempuri.org/"" />
                                </s:Body>
                            </s:Envelope>"));
                        });
                    }))
                    {
                        int timeout = sendingManager.ScanningPeriodMilliseconds + SendTimeout;

                        var recievingThread = new Thread(asyncReciever.AsyncRecieve);

                        sendingManager.Prepare();
                        sendingManager.Start();

                        try
                        {
                            var sw = new Stopwatch();

                            bool sendingStarted = false;
                            int  n = 0;

                            recievingThread.Start();

                            while (true)
                            {
                                var now = DateTime.Now;

                                // wait for the callback
                                resetEvent.WaitOne(timeout);

                                // synchronous waiting time measurement
                                double waitingTime = (DateTime.Now - now).TotalMilliseconds;

                                if (!sendingStarted)
                                {
                                    timeout        = SendTimeout;
                                    sendingStarted = true;
                                    sw.Start();
                                }

                                if (exception != null)
                                {
                                    throw exception;
                                }

                                var sendedCount = sendedMessages.Count;

                                if (sendedCount > BlockSize)
                                {
                                    // the test will fail at Assert block
                                    break;
                                }

                                if (sendedCount == n)
                                {
                                    if (waitingTime < SendTimeout)
                                    {
                                        continue;
                                    }

                                    if (sendedCount < BlockSize)
                                    {
                                        throw new TimeoutException($"{dataService.ToString()}. Время ожидания callback-вызова превысило {SendTimeout} мсек.");
                                    }

                                    // the test result will be determined at Assert block
                                    break;
                                }

                                n = sendedCount;
                            }

                            sw.Stop();
                            sendingTime = sw.Elapsed.TotalMilliseconds - SendTimeout;
                        }
                        catch (Exception ex)
                        {
                            asyncReciever.SetStopFlag();
                            exception = exception ?? ex;
                        }
                        finally
                        {
                            sendingManager.Stop();
                            sendingManager.AfterStop();
                        }

                        recievingThread.Join();

                        if (exception != null)
                        {
                            throw exception;
                        }
                    }

                // Assert.
                Assert.False(sendedMessages.Count > BlockSize, $"{ dataService.ToString()}. Количество отправленных сообщений превысило количество полученных сообщений.");

                var diagnosticMessage = $"{dataService.ToString()}:";
                diagnosticMessage += $"{Environment.NewLine}  Recieving time {asyncReciever.RecievingTime.ToString()} ms.";
                diagnosticMessage += $"{Environment.NewLine}  Sending time {sendingTime.ToString()} ms.";
                Console.WriteLine(diagnosticMessage);
            }
        }
        public void TestDeletingUndeliveredMessageWithGroup()
        {
            foreach (var dataService in DataServices)
            {
                // Arrange.
                var messageType = new MessageType()
                {
                    ID = "messageTypeId"
                };
                var sender = new Client()
                {
                    ID = "senderId"
                };
                var recipient = new Client()
                {
                    ID = "recipientId", Address = "http://localhost:2525/Message"
                };
                var messageWithoutSubscription = new Message()
                {
                    Recipient = sender, MessageType = messageType, SendingTime = DateTime.Now, Group = "group"
                };
                var firstMessage = new Message()
                {
                    Recipient = recipient, MessageType = messageType, SendingTime = DateTime.Now, Group = "group"
                };
                var lastMessage = new Message()
                {
                    Recipient = recipient, MessageType = messageType, SendingTime = DateTime.Now.AddSeconds(1), Group = "group"
                };
                var subscription = new Subscription()
                {
                    Client = recipient, MessageType = messageType, IsCallback = true, TransportType = TransportType.HTTP, ExpiryDate = DateTime.Now.AddDays(1)
                };
                var dataObjects = new DataObject[] { messageType, sender, recipient, messageWithoutSubscription, firstMessage, lastMessage, subscription };

                dataService.UpdateObjects(ref dataObjects);

                var statisticsService = GetMockStatisticsService();
                var component         = new OptimizedSendingManager(
                    new DefaultSubscriptionsManager(dataService, statisticsService),
                    statisticsService,
                    dataService,
                    GetMockLogger())
                {
                    MaxTasks = 1,
                    ScanningPeriodMilliseconds = 5000
                };

                // Act.
                using (WebApp.Start("http://localhost:2525/Message", builder => builder.Run(context => throw new Exception())))
                {
                    component.Prepare();
                    component.Start();
                    Thread.Sleep(component.ScanningPeriodMilliseconds);
                    component.Stop();
                    component.AfterStop();
                }

                // Assert.
                Assert.Equal(2, ((SQLDataService)dataService).Query <Message>().Count());
            }
        }