public void GetEventLogEntitiesToDelete(int numEventLogEntries, int maxEventLogEntries)
        {
            IList <WorkflowRunLogEntry> entries;
            ICollection <long>          entitiesToDelete;

            // Remove any existing log entries
            Entity.Delete(Entity.GetInstancesOfType <WorkflowRunLogEntry>().Select(e => e.Id));

            // Create the test entries
            entries = Enumerable.Range(0, numEventLogEntries)
                      .Select(i =>
            {
                WorkflowRunLogEntry entry;

                entry = new WorkflowRunLogEntry
                {
                    Name = string.Format("Test Entry {0}", i + 1),
                    LogEntrySeverity_Enum = LogSeverityEnum_Enumeration.InformationSeverity
                };
                entry.Save();

                // Wait to ensure creation times are different. The resolution of
                // CreatedDate is a second, unfortunately.
                Thread.Sleep(1000);

                return(entry);
            })
                      .ToList();

            // Reload the entities to get the correct created date and other fields
            entries = Entity.Get <WorkflowRunLogEntry>(entries.Select(e => e.Id), new IEntityRef[] { Resource.CreatedDate_Field })
                      .OrderBy(e => e.CreatedDate)
                      .ToList();

            // Find the entities to delete
            entitiesToDelete = new ActivityLogPurger().GetEventLogEntitiesToDelete(maxEventLogEntries);

            Assert.That(
                entitiesToDelete,
                Is.EquivalentTo(
                    entries.Take(Math.Max(numEventLogEntries - maxEventLogEntries, 0))
                    .Select(e => e.Id)));
        }
        public void Purge(int numEventLogEntries, int maxEventLogEntries)
        {
            IList <WorkflowRunLogEntry> entries;
            EventLogSettings            eventLogSettings;
            int numberEntitiesDeleted;

            var workflowRunLogEntries = Entity.GetInstancesOfType <WorkflowRunLogEntry>( ).ToList( );

            var longs = workflowRunLogEntries.Select(e => e.Id).ToList( );

            // Remove any existing log entries
            Entity.Delete(longs);

            // Create the test entries
            entries = Enumerable.Range(0, numEventLogEntries)
                      .Select(i =>
            {
                WorkflowRunLogEntry entry;

                entry = new WorkflowRunLogEntry
                {
                    Name = string.Format("Test Entry {0}", i + 1),
                    LogEntrySeverity_Enum = LogSeverityEnum_Enumeration.InformationSeverity
                };
                entry.Save();

                // Wait to ensure creation times are different. The resolution of
                // CreatedDate is a second, unfortunately.
                Thread.Sleep(1000);

                return(entry);
            })
                      .ToList();

            // Reload the entities to get the correct created date and other fields
            entries = Entity.Get <WorkflowRunLogEntry>(entries.Select(e => e.Id), new IEntityRef[] { Resource.CreatedDate_Field })
                      .OrderBy(e => e.CreatedDate)
                      .ToList();

            // Set the maximum number of event log entries
            eventLogSettings = Entity.Get <EventLogSettings>(ActivityLogPurger.EventLogSettingsAlias, true);
            eventLogSettings.MaxEventLogEntries = maxEventLogEntries;
            eventLogSettings.Save();

            using (EventLogMonitor eventLogMonitor = new EventLogMonitor())
            {
                new ActivityLogPurger().Purge();

                numberEntitiesDeleted = Math.Max(numEventLogEntries - maxEventLogEntries, 0);
                if (numberEntitiesDeleted > 0)
                {
                    Assert.That(
                        eventLogMonitor.Entries,
                        Has.Exactly(1)
                        .Property("Message").Matches("Deleting \\d+ excess event log entry entities.")
                        .And.Property("Level").EqualTo(EventLogLevel.Information));
                }

                workflowRunLogEntries = Entity.GetInstancesOfType <WorkflowRunLogEntry>( ).ToList( );

                longs = workflowRunLogEntries.Select(e => e.Id).ToList( );

                Assert.That(longs,
                            Is.EquivalentTo(
                                entries.Reverse()
                                .Take(Math.Min(maxEventLogEntries, numEventLogEntries))
                                .Select(e => e.Id)));
            }
        }