public void EventsInBatchRecorded()
        {
            var expectedStats       = LdValue.BuildObject().Add("stats", "testValue").Build();
            var mockDiagnosticStore = MakeDiagnosticStore(null, null, new DiagnosticEvent(expectedStats));

            var            mockSender          = MakeMockSender();
            var            eventCapture        = EventCapture.From(mockSender);
            var            diagnosticCapture   = EventCapture.DiagnosticsFrom(mockSender);
            CountdownEvent diagnosticCountdown = new CountdownEvent(1);

            using (var ep = MakeProcessor(_config, mockSender, mockDiagnosticStore.Object, null, diagnosticCountdown))
            {
                RecordEval(ep, BasicFlagWithTracking, BasicEval);
                FlushAndWait(ep);

                mockDiagnosticStore.Verify(diagStore => diagStore.RecordEventsInBatch(2), Times.Once(),
                                           "Diagnostic store's RecordEventsInBatch should be called with the number of events in last flush");

                ep.DoDiagnosticSend(null);
                diagnosticCountdown.Wait();
                mockDiagnosticStore.Verify(diagStore => diagStore.CreateEventAndReset(), Times.Once());

                Assert.Equal(expectedStats, diagnosticCapture.EventsQueue.Take());
            }
        }
        public void DiagnosticStoreInitEventSentToDiagnosticUri()
        {
            var expected            = LdValue.BuildObject().Add("testKey", "testValue").Build();
            var mockDiagnosticStore = MakeDiagnosticStore(null, new DiagnosticEvent(expected),
                                                          new DiagnosticEvent(LdValue.Null));

            var mockSender          = MakeMockSender();
            var eventCapture        = EventCapture.From(mockSender);
            var diagnosticCapture   = EventCapture.DiagnosticsFrom(mockSender);
            var diagnosticCountdown = new CountdownEvent(1);

            using (var ep = MakeProcessor(_config, mockSender, mockDiagnosticStore.Object, null, diagnosticCountdown))
            {
                diagnosticCountdown.Wait();

                Assert.Equal(expected, diagnosticCapture.EventsQueue.Take());
            }
        }
        public void DiagnosticDisablerDisablesInitialDiagnostics()
        {
            var testDiagnostic      = LdValue.BuildObject().Add("testKey", "testValue").Build();
            var mockDiagnosticStore = MakeDiagnosticStore(new DiagnosticEvent(testDiagnostic),
                                                          new DiagnosticEvent(testDiagnostic), new DiagnosticEvent(LdValue.Null));

            var mockDiagnosticDisabler = new Mock <IDiagnosticDisabler>(MockBehavior.Strict);

            mockDiagnosticDisabler.Setup(diagDisabler => diagDisabler.Disabled).Returns(true);

            var mockSender        = MakeMockSender();
            var eventCapture      = EventCapture.From(mockSender);
            var diagnosticCapture = EventCapture.DiagnosticsFrom(mockSender);

            using (var ep = MakeProcessor(_config, mockSender, mockDiagnosticStore.Object, mockDiagnosticDisabler.Object, null))
            {
            }
            mockDiagnosticStore.Verify(diagStore => diagStore.InitEvent, Times.Never());
            mockDiagnosticStore.Verify(diagStore => diagStore.PersistedUnsentEvent, Times.Never());
            Assert.Empty(diagnosticCapture.Events);
        }
        public void DiagnosticDisablerEnabledInitialDiagnostics()
        {
            var expectedStats       = LdValue.BuildObject().Add("stats", "testValue").Build();
            var expectedInit        = LdValue.BuildObject().Add("init", "testValue").Build();
            var mockDiagnosticStore = MakeDiagnosticStore(new DiagnosticEvent(expectedStats),
                                                          new DiagnosticEvent(expectedInit), new DiagnosticEvent(LdValue.Null));

            var mockDiagnosticDisabler = new Mock <IDiagnosticDisabler>(MockBehavior.Strict);

            mockDiagnosticDisabler.Setup(diagDisabler => diagDisabler.Disabled).Returns(false);

            var mockSender          = MakeMockSender();
            var eventCapture        = EventCapture.From(mockSender);
            var diagnosticCapture   = EventCapture.DiagnosticsFrom(mockSender);
            var diagnosticCountdown = new CountdownEvent(1);

            using (var ep = MakeProcessor(_config, mockSender, mockDiagnosticStore.Object, mockDiagnosticDisabler.Object, diagnosticCountdown))
            {
                diagnosticCountdown.Wait();

                Assert.Equal(expectedStats, diagnosticCapture.EventsQueue.Take());
                Assert.Equal(expectedInit, diagnosticCapture.EventsQueue.Take());
            }
        }