public void AddWorkItem_ItemsProcessed(int totItems, int totThreads, int maxQueuedItems) { MockWorker mw = new MockWorker(); CancellationTokenSource ts = new CancellationTokenSource(); List <MockWorkOut> doneWork = new List <MockWorkOut>(); var cfg = GetConfig(totThreads, maxQueuedItems); using (FIFOWorker <MockWorkIn, MockWorkOut> fifo = new FIFOWorker <MockWorkIn, MockWorkOut>(cfg, mw.DoMockWork_Simple)) { foreach (int inputIx in Enumerable.Range(1, totItems)) { foreach (var outItem in fifo.AddWorkItem(new MockWorkIn(inputIx), ts.Token)) { doneWork.Add(outItem); } } foreach (var outItem in fifo.Flush(ts.Token)) { doneWork.Add(outItem); } } Assert.AreEqual(Enumerable.Range(1, totItems), doneWork.Select(f => f.originalInputItem.ix)); Assert.AreEqual(Enumerable.Range(1, totItems), mw.doneWork.Where(f => !f.Item1).OrderBy(f => f.Item2.ix).Select(f => f.Item2.ix)); }
public void AddWorkItem_OneItemProcessed() { MockWorker mw = new MockWorker(); CancellationTokenSource ts = new CancellationTokenSource(); List <MockWorkOut> doneWork = new List <MockWorkOut>(); int inputIx = 1; int totThreads = 1; int maxQueuedItems = 1; var cfg = GetConfig(totThreads, maxQueuedItems); using (FIFOWorker <MockWorkIn, MockWorkOut> fifo = new FIFOWorker <MockWorkIn, MockWorkOut>(cfg, mw.DoMockWork_Simple)) { foreach (var outItem in fifo.AddWorkItem(new MockWorkIn(inputIx), ts.Token).Concat(fifo.Flush(ts.Token))) { doneWork.Add(outItem); } } Assert.AreEqual(1, doneWork.Count); Assert.AreEqual(inputIx, doneWork.First().originalInputItem.ix); Assert.AreEqual(1, mw.doneWork.Count); Assert.AreEqual(false, mw.doneWork.First().Item1); Assert.AreEqual(inputIx, mw.doneWork.First().Item2.ix); Assert.AreEqual(inputIx, mw.doneWork.First().Item3.originalInputItem.ix); }
public void AddWorkItem_Cancels(int totThreads) { MockWorker mw = new MockWorker(); CancellationTokenSource ts = new CancellationTokenSource(); List <MockWorkOut> doneWork = new List <MockWorkOut>(); var cfg = new FIFOWorkerConfig(totThreads); FIFOWorker <MockWorkIn, MockWorkOut> fifo = new FIFOWorker <MockWorkIn, MockWorkOut>(cfg, mw.DoMockWorkBlocking); int countTask = fifo.AddWorkItem(new MockWorkIn(1), ts.Token).Count(); mw.TriggerOnBlockedWork(() => ts.Cancel()); Assert.Throws <TaskCanceledException>(() => { try { fifo.Dispose(); } catch (AggregateException ag) { throw ag.GetBaseException(); } }); Assert.AreEqual(1, mw.doneWork.Count(f => f.Item1)); Assert.AreEqual(1, mw.doneWork.Count()); }
public void AddWorkItem_Cancels(int totThreads) { MockWorker mw = new MockWorker(); CancellationTokenSource ts = new CancellationTokenSource(); var cfg = new MultiThreadedWorkerConfig(totThreads); MultiThreadedWorker <MockWorkIn> mtw = new MultiThreadedWorker <MockWorkIn>(cfg, mw.DoMockWorkBlocking); mtw.AddWorkItem(new MockWorkIn(1), ts.Token); mw.TriggerOnBlockedWorkAsync(() => ts.Cancel()).Wait(); Assert.AreEqual(1, mw.doneWork.Count(f => f.Item1)); Assert.AreEqual(1, mw.doneWork.Count()); }
public void AddWorkItem_ItemsProcessed(int totItems, int totThreads, int maxQueuedItems) { MockWorker mw = new MockWorker(); CancellationTokenSource ts = new CancellationTokenSource(); var cfg = GetConfig(totThreads, maxQueuedItems); using (MultiThreadedWorker <MockWorkIn> mtw = new MultiThreadedWorker <MockWorkIn>(cfg, mw.DoMockWork_Simple)) { foreach (int inputIx in Enumerable.Range(1, totItems)) { mtw.AddWorkItem(new MockWorkIn(inputIx), ts.Token); } mtw.Flush(ts.Token); } Assert.AreEqual(Enumerable.Range(1, totItems), mw.doneWork.Where(f => !f.Item1).OrderBy(f => f.Item2.ix).Select(f => f.Item2.ix)); }
public void AddWorkItemAsync_OneItemProcessed() { MockWorker mw = new MockWorker(); CancellationTokenSource ts = new CancellationTokenSource(); int inputIx = 1; int totThreads = 1; int maxQueuedItems = 1; var cfg = GetConfig(totThreads, maxQueuedItems); using (MultiThreadedWorker <MockWorkIn> mtw = new MultiThreadedWorker <MockWorkIn>(cfg, mw.DoMockWork_Simple)) { mtw.AddWorkItem(new MockWorkIn(inputIx), ts.Token); } Assert.AreEqual(1, mw.doneWork.Count); Assert.AreEqual(false, mw.doneWork.First().Item1); Assert.AreEqual(inputIx, mw.doneWork.First().Item2.ix); }
public void TryAcceptWorkerMock() { var worker = new MockWorker(); var completed = new ManualResetEventSlim(false); var dequeueCount = new CountdownEvent(1); var target = new ConsumerQueue<int, int>(11, w => { Assert.AreSame(worker, w); completed.Set(); }, q => dequeueCount.Signal()); //test that correct instance passed target.Add(1); Task task = Task.Factory.StartNew(() => target.TryAcceptWorker(worker)); Assert.IsTrue(SpinWaitHelper.SpinWaitForCondition(() => target.IsBusy, 1000)); //should become busy when accept occurs task.Wait(); Assert.IsTrue(dequeueCount.Wait(1000)); //completed should be called Assert.IsTrue(completed.Wait(1000)); //completed should be called }