public void SkipsFilesWithinOffset()
        {
            using (var file1 = new StringLogFile("sample-1", Sample1))
                using (var file2 = new StringLogFile("sample-2", Sample2))
                    using (var file3 = new StringLogFile("sample-3", Sample3))
                    {
                        var statsProvider = new LogFileStatsCache();
                        file1.InitializeDefaultStats(statsProvider);
                        file2.InitializeDefaultStats(statsProvider);
                        file3.InitializeDefaultStats(statsProvider);

                        var query = new SimpleLogQuery
                        {
                            Offset   = statsProvider.GetStats(file1, null).EventCount,
                            Quantity = statsProvider.GetStats(file2, null).EventCount
                        };

                        var subject = new LogAccumulator(statsProvider, query);

                        var actual = subject
                                     .Consume(file1)
                                     .Consume(file2)
                                     .Consume(file3);

                        Assert.That(actual.IsComplete);

                        Assert.That(file1.WasRead, Is.False);
                        Assert.That(file2.WasRead, Is.True);
                        Assert.That(file3.WasRead, Is.False);

                        Assert.That(actual.Events, Is.EqualTo(Sample2Events));
                    }
        }
        public void CanConsumeAllEvents()
        {
            using (var file1 = new StringLogFile("sample-1", Sample1))
                using (var file2 = new StringLogFile("sample-2", Sample2))
                {
                    var expected = Sample1Events.Concat(Sample2Events).ToList();

                    var statsProvider = new LogFileStatsCache();
                    file1.InitializeDefaultStats(statsProvider);
                    file2.InitializeDefaultStats(statsProvider);

                    var file1Events = statsProvider.GetStats(file1, null).EventCount;
                    var file2Events = statsProvider.GetStats(file2, null).EventCount;
                    var query       = new SimpleLogQuery
                    {
                        Quantity = file1Events + file2Events + 1
                    };

                    var subject = new LogAccumulator(statsProvider, query);

                    var actual = subject
                                 .Consume(file1)
                                 .Consume(file2);

                    Assert.That(actual.IsComplete, Is.False);

                    Assert.That(file1.WasRead, Is.True);
                    Assert.That(file2.WasRead, Is.True);

                    Assert.That(actual.Events, Is.EqualTo(expected));
                }
        }
        public void SkipsFilesByLoggerCount()
        {
            using (var file1 = new StringLogFile("sample-1", Sample1))
                using (var file2 = new StringLogFile("sample-2", Sample2))
                    using (var file3 = new StringLogFile("sample-3", Sample3))
                    {
                        var statsProvider = new LogFileStatsCache();
                        file1.InitializeDefaultStats(statsProvider);
                        file2.InitializeDefaultStats(statsProvider);
                        file3.InitializeDefaultStats(statsProvider);

                        var file1Stats = statsProvider.GetStats(file1, null);
                        var file2Stats = statsProvider.GetStats(file2, null);
                        var file3Stats = statsProvider.GetStats(file3, null);

                        const string logger          = "Root.ChildA";
                        var          sample1Matching = Sample1Events
                                                       .Where(e => e.Logger.StartsWith(logger))
                                                       .ToList();
                        var sample2Matching = Sample2Events
                                              .Where(e => e.Logger.StartsWith(logger))
                                              .ToList();

                        Assume.That(sample1Matching.Count, Is.LessThan(file1Stats.EventCount));
                        Assume.That(sample2Matching.Count, Is.LessThan(file2Stats.EventCount));

                        var expected = sample2Matching;

                        var minTime = expected.Last().Time;
                        var maxTime = expected.First().Time;
                        var query   = new SimpleLogQuery
                        {
                            Offset   = sample1Matching.Count,
                            Quantity = expected.Count,
                            Filter   = Filter.Logger(logger)
                        };

                        var subject = new LogAccumulator(statsProvider, query);

                        var actual = subject
                                     .Consume(file1)
                                     .Consume(file2)
                                     .Consume(file3);

                        Assert.That(actual.IsComplete);

                        Assert.That(file1.WasRead, Is.False);
                        Assert.That(file2.WasRead, Is.True);
                        Assert.That(file3.WasRead, Is.False);

                        Assert.That(actual.Events, Is.EqualTo(expected));
                    }
        }
        public void SkipsFilesOutsideQueriedTimeFrame()
        {
            using (var file1 = new StringLogFile("sample-1", Sample1))
                using (var file2 = new StringLogFile("sample-2", Sample2))
                    using (var file3 = new StringLogFile("sample-3", Sample3))
                    {
                        var statsProvider = new LogFileStatsCache();
                        file1.InitializeDefaultStats(statsProvider);
                        file2.InitializeDefaultStats(statsProvider);
                        file3.InitializeDefaultStats(statsProvider);

                        var file1Stats = statsProvider.GetStats(file1, null);
                        var file2Stats = statsProvider.GetStats(file2, null);
                        var file3Stats = statsProvider.GetStats(file3, null);
                        Assume.That(file1Stats.EarliestTimestamp, Is.GreaterThan(file2Stats.LatestTimestamp));
                        Assume.That(file2Stats.EarliestTimestamp, Is.GreaterThan(file3Stats.LatestTimestamp));

                        Assume.That(file2Stats.EventCount, Is.GreaterThanOrEqualTo(4));

                        var expected = Sample2Events
                                       .Skip(1)
                                       .Take(Sample2Events.Length - 2)
                                       .ToList();

                        var minTime = expected.Last().Time;
                        var maxTime = expected.First().Time;
                        var query   = new SimpleLogQuery
                        {
                            Offset       = 0,
                            Quantity     = expected.Count,
                            MinTimestamp = Timestamp.FromDateTime(minTime),
                            MaxTimestamp = Timestamp.FromDateTime(maxTime),
                            Filter       = Filter.Timestamp(minTime, maxTime)
                        };

                        var subject = new LogAccumulator(statsProvider, query);

                        var actual = subject
                                     .Consume(file1)
                                     .Consume(file2)
                                     .Consume(file3);

                        Assert.That(actual.IsComplete);

                        Assert.That(file1.WasRead, Is.False);
                        Assert.That(file2.WasRead, Is.True);
                        Assert.That(file3.WasRead, Is.False);

                        Assert.That(actual.Events, Is.EqualTo(expected));
                    }
        }
        public void CanFillUpEventsFromMultipleFiles()
        {
            using (var file1 = new StringLogFile("sample-1", Sample1))
                using (var file2 = new StringLogFile("sample-2", Sample2))
                    using (var file3 = new StringLogFile("sample-3", Sample3))
                    {
                        var statsProvider = new LogFileStatsCache();
                        file1.InitializeDefaultStats(statsProvider);
                        file2.InitializeDefaultStats(statsProvider);
                        file3.InitializeDefaultStats(statsProvider);

                        var file1Events = statsProvider.GetStats(file1, null).EventCount;
                        var file2Events = statsProvider.GetStats(file2, null).EventCount;
                        var file3Events = statsProvider.GetStats(file2, null).EventCount;

                        Assume.That(file2Events, Is.GreaterThanOrEqualTo(2));
                        Assume.That(file3Events, Is.GreaterThan(file2Events / 2 + file2Events % 2));

                        var offset   = file1Events + file2Events / 2;
                        var quantity = file3Events;

                        var expected = Sample1Events.Concat(Sample2Events).Concat(Sample3Events)
                                       .Skip(offset)
                                       .Take(quantity);

                        var query = new SimpleLogQuery
                        {
                            Offset   = offset,
                            Quantity = quantity
                        };

                        var subject = new LogAccumulator(statsProvider, query);

                        var actual = subject
                                     .Consume(file1)
                                     .Consume(file2)
                                     .Consume(file3);

                        Assert.That(actual.IsComplete);

                        Assert.That(file1.WasRead, Is.False);
                        Assert.That(file2.WasRead, Is.True);
                        Assert.That(file3.WasRead, Is.True);

                        Assert.That(actual.Events, Is.EqualTo(expected));
                    }
        }