// ========================= private void TimeoutWorksTest(DiskQueue <int> queue) { Barrier bar = new Barrier(2); AtomicNullableBool takeResult = new AtomicNullableBool(); AtomicNullableBool peekResult = new AtomicNullableBool(); AtomicNullableBool addResult = new AtomicNullableBool(); Task task = Task.Run(() => { bar.SignalAndWait(); int item = 0; takeResult.Value = queue.TryTake(out item, 100); peekResult.Value = queue.TryPeek(out item, 100); while (queue.TryAdd(-1)) { ; } addResult.Value = queue.TryAdd(100, 100); }); bar.SignalAndWait(); TimingAssert.AreEqual(10000, false, () => takeResult.Value, "take"); TimingAssert.AreEqual(10000, false, () => peekResult.Value, "peek"); TimingAssert.AreEqual(10000, false, () => addResult.Value, "Add"); task.Wait(); }
// ========================= private void TakeWakesUpTest(DiskQueue <int> queue) { Barrier bar = new Barrier(2); AtomicNullableBool takeResult = new AtomicNullableBool(); AtomicNullableBool takeResult2 = new AtomicNullableBool(); Task task = Task.Run(() => { bar.SignalAndWait(); int item = 0; takeResult.Value = queue.TryTake(out item, 60000); Assert.AreEqual(100, item); item = 0; takeResult2.Value = queue.TryTake(out item, 60000); Assert.AreEqual(200, item); }); bar.SignalAndWait(); Thread.Sleep(10); Assert.IsFalse(takeResult.HasValue); queue.Add(100); TimingAssert.AreEqual(10000, true, () => takeResult.Value); Thread.Sleep(10); Assert.IsFalse(takeResult2.HasValue); queue.Add(200); TimingAssert.AreEqual(10000, true, () => takeResult2.Value); task.Wait(); }
// ========================= private void PeekWakesUpTest(DiskQueue <int> queue) { Barrier bar = new Barrier(3); AtomicNullableBool peekResult = new AtomicNullableBool(); AtomicNullableBool peekResult2 = new AtomicNullableBool(); Task task = Task.Run(() => { bar.SignalAndWait(); int item = 0; peekResult.Value = queue.TryPeek(out item, 60000); Assert.AreEqual(100, item); }); Task task2 = Task.Run(() => { bar.SignalAndWait(); int item = 0; peekResult2.Value = queue.TryPeek(out item, 60000); Assert.AreEqual(100, item); }); bar.SignalAndWait(); Thread.Sleep(10); Assert.IsFalse(peekResult.HasValue); Assert.IsFalse(peekResult2.HasValue); queue.Add(100); TimingAssert.AreEqual(10000, true, () => peekResult.Value); TimingAssert.AreEqual(10000, true, () => peekResult2.Value); Task.WaitAll(task, task2); }
// ========================= private void AddWakesUpTest(DiskQueue <int> queue, int segmentCapacity) { while (queue.TryAdd(100)) { ; // Fill queue } queue.AddForced(200); Barrier bar = new Barrier(2); AtomicNullableBool addResult = new AtomicNullableBool(); Task task = Task.Run(() => { bar.SignalAndWait(); addResult.Value = queue.TryAdd(-100, 60000); }); bar.SignalAndWait(); Thread.Sleep(10); Assert.IsFalse(addResult.HasValue); queue.Take(); Thread.Sleep(10); Assert.IsFalse(addResult.HasValue); for (int i = 0; i < segmentCapacity; i++) { int tmp = 0; Assert.IsTrue(queue.TryTake(out tmp)); } TimingAssert.AreEqual(10000, true, () => addResult.Value); task.Wait(); }