Example #1
0
        public void ShieldedLocalBasics()
        {
            var local = new ShieldedLocal <int>();

            Assert.Throws <InvalidOperationException>(() => { var b = local.HasValue; });
            Assert.Throws <InvalidOperationException>(() => { var i = local.Value; });
            Assert.Throws <InvalidOperationException>(() => local.Value = 10);
            Assert.Throws <InvalidOperationException>(() => local.Release());

            Shield.InTransaction(() => {
                local.Value = 10;
                Assert.IsTrue(local.HasValue);
                Assert.AreEqual(10, local);

                var t = new Thread(() => {
                    Shield.InTransaction(() => {
                        Assert.IsFalse(local.HasValue);
                        local.Value = 20;
                        Assert.IsTrue(local.HasValue);
                        Assert.AreEqual(20, local);
                    });
                });
                t.Start();
                t.Join();

                Assert.AreEqual(10, local);
                local.Release();
                Assert.IsFalse(local.HasValue);
                Assert.Throws <InvalidOperationException>(() => { var i = local.Value; });
            });
        }
Example #2
0
        public void ShieldedLocalBasics()
        {
            var local = new ShieldedLocal<int>();

            Assert.Throws<InvalidOperationException>(() => { var b = local.HasValue; });
            Assert.Throws<InvalidOperationException>(() => { var i = local.Value; });
            Assert.Throws<InvalidOperationException>(() => local.Value = 10);
            Assert.Throws<InvalidOperationException>(() => local.Release());

            Shield.InTransaction(() => {
                local.Value = 10;
                Assert.IsTrue(local.HasValue);
                Assert.AreEqual(10, local);

                var t = new Thread(() => {
                    Shield.InTransaction(() => {
                        Assert.IsFalse(local.HasValue);
                        local.Value = 20;
                        Assert.IsTrue(local.HasValue);
                        Assert.AreEqual(20, local);
                    });
                });
                t.Start();
                t.Join();

                Assert.AreEqual(10, local);
                local.Release();
                Assert.IsFalse(local.HasValue);
                Assert.Throws<InvalidOperationException>(() => { var i = local.Value; });
            });
        }
Example #3
0
        public void ResetOnRollback()
        {
            var local      = new ShieldedLocal <int>();
            int retryCount = 0;

            Shield.InTransaction(() => {
                retryCount++;
                Assert.False(local.HasValue);
                local.Value = 10;
                if (retryCount == 1)
                {
                    Shield.Rollback();
                }
            });
        }
Example #4
0
        public void GetDefaultValueTest()
        {
            var local = new ShieldedLocal <int>();

            Assert.Throws <InvalidOperationException>(() => { var b = local.GetValueOrDefault(); });
            Assert.Throws <InvalidOperationException>(() => { var b = local.GetValueOrDefault(42); });

            Shield.InTransaction(() =>
            {
                Assert.AreEqual(0, local.GetValueOrDefault());
                Assert.AreEqual(42, local.GetValueOrDefault(42));

                local.Value = 10;

                Assert.AreEqual(10, local.GetValueOrDefault());
                Assert.AreEqual(10, local.GetValueOrDefault(42));
            });
        }
Example #5
0
        public void ShieldedLocalVisibility()
        {
            var x     = new Shielded <int>();
            var local = new ShieldedLocal <int>();

            var didItRun = false;

            using (Shield.WhenCommitting(_ => {
                didItRun = true;
                Assert.AreEqual(10, local);
            }))
            {
                Shield.InTransaction(() => {
                    x.Value     = 1;
                    local.Value = 10;
                });
            }
            Assert.IsTrue(didItRun);

            using (var continuation = Shield.RunToCommit(Timeout.Infinite, () => {
                local.Value = 20;
            }))
            {
                continuation.InContext(() =>
                                       Assert.AreEqual(20, local));
            }

            didItRun = false;
            Shield.InTransaction(() => {
                local.Value = 30;
                Shield.SyncSideEffect(() => {
                    didItRun = true;
                    Assert.AreEqual(30, local);
                });
            });
            Assert.IsTrue(didItRun);
        }
Example #6
0
        public void ShieldedLocalVisibility()
        {
            var x = new Shielded<int>();
            var local = new ShieldedLocal<int>();

            var didItRun = false;
            using (Shield.WhenCommitting(_ => {
                didItRun = true;
                Assert.AreEqual(10, local);
            }))
            {
                Shield.InTransaction(() => {
                    x.Value = 1;
                    local.Value = 10;
                });
            }
            Assert.IsTrue(didItRun);

            using (var continuation = Shield.RunToCommit(Timeout.Infinite, () => {
                local.Value = 20;
            }))
            {
                continuation.InContext(() =>
                    Assert.AreEqual(20, local));
            }

            didItRun = false;
            Shield.InTransaction(() => {
                local.Value = 30;
                Shield.SyncSideEffect(() => {
                    didItRun = true;
                    Assert.AreEqual(30, local);
                });
            });
            Assert.IsTrue(didItRun);
        }