Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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());
        }
Ejemplo n.º 4
0
        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());
        }
Ejemplo n.º 5
0
        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));
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        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
        }