public async Task ExtendWithRepeater() { 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.WaitRandom(600)).Callback(() => { waitInvoked.Set(); Assert.True(waitAre.WaitOne(2000)); }); repeater.Setup(x => x.Next()).Returns(true); var task = Task.Run(() => { var l = new Redlock("r", "n", Ttl, _now, mem.ToInstances(), _log); return(l.Extend(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); }
public void ExtendWithRepeater_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 = Assert.Throws <Exception>(() => l.Extend(repeater.Object, 600)); Assert.Same(expected, actual); }