public void ServerTelemetryPluginTest()
        {
            var testWriterFactory = new TestWriterFactory();

            using (var plugin = new ServerTelemetryPlugin())
            {
                plugin.Configure(testWriterFactory, null, null, new NullLoggerFactory());

                foreach (var testCase in _testCases)
                {
                    var logLine = testCase.GetLogLine();
                    plugin.ProcessLogLine(logLine, testCase.LogType);
                }
            }

            var testEventWriter  = testWriterFactory.Writers.Values.First() as TestWriter <ServerTelemetryEvent>;
            var testMetricWriter = testWriterFactory.Writers.Values.Last() as TestWriter <ServerTelemetryMetric>;

            testWriterFactory.Writers.Count.Should().Be(2);
            testEventWriter.WasDisposed.Should().Be(true);
            testMetricWriter.WasDisposed.Should().Be(true);

            var expectedOutput  = _testCases.Select(testCase => (Tuple <object, object[]>)testCase.ExpectedOutput).ToList();
            var expectedEvents  = expectedOutput.Select(i => i.Item1);
            var expectedMetrics = expectedOutput.SelectMany(i => i.Item2);

            testEventWriter.ReceivedObjects.Should().BeEquivalentTo(expectedEvents);
            testMetricWriter.ReceivedObjects.Should().BeEquivalentTo(expectedMetrics);
        }
        public void BadAndNoOpInput()
        {
            var processingNotificationsCollector = new ProcessingNotificationsCollector(10);
            var testWriterFactory = new TestWriterFactory();

            using (var plugin = new ServerTelemetryPlugin())
            {
                plugin.Configure(testWriterFactory, null, processingNotificationsCollector, new NullLoggerFactory());

                var wrongContentFormat = new LogLine(new ReadLogLineResult(123, "ServerTelemetry doesn't expect string"), TestLogFileInfo);
                var nullContent        = new LogLine(new ReadLogLineResult(123, null), TestLogFileInfo);
                var differentEventType = new LogLine(new ReadLogLineResult(123, new NativeJsonLogsBaseEvent {
                    EventType = "msg"
                }), TestLogFileInfo);                                                                                                                // This doesn't generate error, as it is a normal condition
                var payloadIsNull = new LogLine(new ReadLogLineResult(123, new NativeJsonLogsBaseEvent {
                    EventType = "server-telemetry"
                }), TestLogFileInfo);

                plugin.ProcessLogLine(wrongContentFormat, LogType.VizqlserverCpp);
                plugin.ProcessLogLine(nullContent, LogType.VizqlserverCpp);
                plugin.ProcessLogLine(differentEventType, LogType.VizqlserverCpp);
                plugin.ProcessLogLine(payloadIsNull, LogType.VizqlserverCpp);
            }

            testWriterFactory.AssertAllWritersAreDisposedAndEmpty(2);
            processingNotificationsCollector.TotalErrorsReported.Should().Be(3);
        }