void OneRun(int threadCount, int operationCount)
{
ActivityMonitor.CriticalErrorCollector.Clear();
ActivityMonitor.CriticalErrorCollector.Capacity = 300;
InitializeEnv(
threadCount: threadCount,
buggyClientCount: 10,
operationCount: 250,
probFailurePerOperation: 0.9 / operationCount,
probBuggyOnErrorHandlerFailure: 0.1);
ActivityMonitor.CriticalErrorCollector.OnErrorFromBackgroundThreads += SafeOnErrorHandler;
ActivityMonitor.CriticalErrorCollector.OnErrorFromBackgroundThreads += BuggyOnErrorHandler;
int nextSeq = ActivityMonitor.CriticalErrorCollector.NextSequenceNumber;
RunAllAndWaitForTermination();
ActivityMonitor.CriticalErrorCollector.OnErrorFromBackgroundThreads -= SafeOnErrorHandler;
ActivityMonitor.CriticalErrorCollector.OnErrorFromBackgroundThreads -= BuggyOnErrorHandler;
if (TestHelper.LogsToConsole)
{
Console.WriteLine(@"ActivityMonitor.LoggingError Test:
ThreadCount: {0}
DispatchQueuedWorkItemCount: {1}
OptimizedDispatchQueuedWorkItemCount: {2}
Errors handled: {3}
Errors from Error handler: {4}
Errors Cleared while raised: {5}
Errors not Cleared while raised: {6}",
threadCount,
ActivityMonitor.CriticalErrorCollector.DispatchQueuedWorkItemCount,
ActivityMonitor.CriticalErrorCollector.OptimizedDispatchQueuedWorkItemCount,
ActivityMonitor.CriticalErrorCollector.NextSequenceNumber - nextSeq,
_buggyOnErrorHandlerReceivedCount,
_nbClearedWhileRaised,
_nbNotClearedWhileRaised);
}
CollectionAssert.IsEmpty(_errorsFromBackground);
var buggyClientMismatch = _buggyClients.Where(c => c.Failed != c.FailureHasBeenReceivedThroughEvent).ToArray();
CollectionAssert.IsEmpty(buggyClientMismatch);
string clientText = SafeClient.ToString();
for (int i = 0; i < _contexts.Count; ++i)
{
_contexts[i].CheckResult(clientText);
}
Assert.That(_buggyOnErrorHandlerReceivedCount, Is.GreaterThan(0), "There must be at least one error from the buggy handler.");
Assert.That(_buggyOnErrorHandlerReceivedCount, Is.EqualTo(_buggyOnErrorHandlerFailCount));
Assert.That(ActivityMonitor.CriticalErrorCollector.DispatchQueuedWorkItemCount, Is.GreaterThan(0), "Of course, events have been raised...");
Assert.That(ActivityMonitor.CriticalErrorCollector.OptimizedDispatchQueuedWorkItemCount, Is.GreaterThan(0), "Optimizations must have saved us some works.");
Assert.That(ActivityMonitor.CriticalErrorCollector.Capacity, Is.EqualTo(500), "Changed in SafeOnErrorHandler.");
Assert.That(_nbClearedWhileRaised, Is.GreaterThan(0), "Clear is called from SafeOnErrorHandler each 20 errors.");
ActivityMonitor.CriticalErrorCollector.Clear();
}