Beispiel #1
0
        public async Task ExtendWithRepeaterAsync()
        {
            using var waitAre     = new AutoResetEvent(false);
            using var waitInvoked = new AutoResetEvent(false);
            var mem = MemInstances(3, (ttl, duration) => ttl);

            Lock("r", "n2", mem);
            var repeater = new Mock <IRedlockRepeater>(MockBehavior.Strict);

            repeater.Setup(x => x.WaitRandomAsync(600, default)).Returns(new ValueTask()).Callback(() =>
            {
                waitInvoked.Set();
                Assert.True(waitAre.WaitOne(2000));
            });
            repeater.Setup(x => x.Next()).Returns(true);
            var task = Task.Run(async() =>
            {
                var l = new Redlock("r", "n", Ttl, _now, mem.ToInstances(), _log);
                return(await l.ExtendAsync(repeater.Object, 600, () => _now));
            });

            Assert.True(waitInvoked.WaitOne(2000));
            repeater.Verify(x => x.Next(), Times.Once);
            Unlock("r", mem);
            Lock("r", "n", mem);
            waitAre.Set();
            var actualValidUntil = await task;

            Assert.All(mem, i => Assert.True(i.Contains("r", "n")));
            Assert.Equal(_now.Add(Ttl), actualValidUntil);
        }
Beispiel #2
0
        public async Task ExtendWithRepeaterAsync_UnableToObtainLock()
        {
            var mem = MemInstances(3, (ttl, duration) => ttl);

            Lock("r", "n2", mem);
            var repeater = new Mock <IRedlockRepeater>(MockBehavior.Strict);

            repeater.Setup(x => x.Next()).Returns(false);
            var expected = new Exception();

            repeater.Setup(x => x.CreateException("r", "n", 1)).Returns(expected);
            var l      = new Redlock("r", "n", Ttl, _now, mem.ToInstances(), _log);
            var actual = await Assert.ThrowsAsync <Exception>(() => l.ExtendAsync(repeater.Object, 600));

            Assert.Same(expected, actual);
        }