protected void RunTest_CanSetCompleted_SingleThread <TResult> (Func <AsyncProcessingRequest <TResult> > rqFn, TResult expectedResult, bool expectSame) { AsyncProcessingRequest <TResult> rq = rqFn .Invoke(); rq.SetCompleted(expectedResult); TResult actualResult = rq.Task .Result; Assert.AreEqual(TaskStatus.RanToCompletion, rq.Task.Status); if (!expectSame) { Assert.AreEqual(expectedResult, actualResult); } else { Assert.AreSame(expectedResult, actualResult); } }
protected async Task RunTest_CanSetCompleted_MultiThread <TResult> (Func <AsyncProcessingRequest <TResult> > rqFn, bool syncOnCheckpoints, int nThreads, TResult expectedResult, bool expectSame) { Barrier syncCheckpoint = new Barrier(nThreads); List <Task> allThreads = new List <Task>(); AsyncProcessingRequest <TResult> rq = rqFn .Invoke(); for (int i = 0; i < nThreads; i++) { allThreads.Add(Task.Run(() => { if (syncOnCheckpoints) { syncCheckpoint.SignalAndWait(); } rq.SetCompleted(expectedResult); })); } await Task.WhenAll(allThreads); TResult actualResult = rq.Task .Result; Assert.AreEqual(TaskStatus.RanToCompletion, rq.Task.Status); if (!expectSame) { Assert.AreEqual(expectedResult, actualResult); } else { Assert.AreSame(expectedResult, actualResult); } }