コード例 #1
0
        public void TestBarrierMethods()
        {
            // Define variables and constants
            StateMutationBarrier testBarrier = new StateMutationBarrier();
            object lockObj = new object();

            // Set up context


            // Execute
            testBarrier.AcquirePermit().Dispose();
            var permit = testBarrier.AcquirePermit(withLock: lockObj);

            Assert.IsTrue(Monitor.IsEntered(lockObj));
            Assert.IsFalse(testBarrier.IsFrozen);
            permit.Dispose();
#if !DEVELOPMENT && !RELEASE
            try {
                permit.Dispose();
                Assert.Fail();
            }
            catch (AssuranceFailedException) { }
#endif

            testBarrier.FreezeMutations();
            Assert.IsTrue(testBarrier.IsFrozen);
            testBarrier.UnfreezeMutations();
            Assert.IsFalse(testBarrier.IsFrozen);
            Thread t = new Thread(testBarrier.FreezeMutations);
            t.Start();
            t.Join();
            Assert.IsTrue(testBarrier.IsFrozen);
            t = new Thread(() => {
                try {
                    testBarrier.AcquirePermit();
                    Assert.Fail();
                }
                catch (ThreadAbortException) {
                    Thread.ResetAbort();
                }
            });
            t.Start();
            Thread.Sleep(500);
            t.Abort();

            // Assert outcome
        }