using System; using System.Collections.Generic; using System.Threading.Tasks; using Util.Caching; using Util.Helpers; using Xunit; namespace Util.Applications.Locks { /// /// 业务锁测试 /// public class LockTest : IDisposable { /// /// 业务锁测试服务 /// private readonly LockTestService _service; /// /// 缓存 /// private readonly ICache _cache; /// /// 测试初始化 /// public LockTest( LockTestService service, ICache cache) { _service = service; _cache = cache; } /// /// 测试清理 /// public void Dispose() { Time.Reset(); _service.UnLockAsync().GetAwaiter().GetResult(); } /// /// 执行一个服务 /// [Fact] public async Task Test_1() { Assert.Equal( "ok",await _service.ExecuteAsync( "lock:Test_1" ) ); } /// /// 测试解锁 /// [Fact] public async Task Test_2() { var key = "lock:Test_2"; await _cache.RemoveAsync( key ); //执行,被锁定 await _service.ExecuteAsync( key ); //未解锁,无法执行 var result = new List(); await Util.Helpers.Thread.ParallelForAsync( async () => result.Add( await _service.ExecuteAsync( key ) ), 20 ); Assert.Empty( result.FindAll( t => t == "ok" ) ); //解锁 await _service.UnLockAsync(); //再次执行 await Util.Helpers.Thread.ParallelForAsync( async () => result.Add( await _service.ExecuteAsync( key ) ), 20 ); Assert.Single( result.FindAll( t => t == "ok" )); } /// /// 延迟1秒才允许执行 - 设置延迟时间后,UnLock无效 /// [Fact] public async Task Test_3() { var key = "lock:Test_3"; Assert.Equal( "ok", await _service.ExecuteAsync( key, TimeSpan.FromSeconds( 1 ) ) ); await _service.UnLockAsync(); Assert.Equal( "fail",await _service.ExecuteAsync( key ) ); await Task.Delay( 1500 ); Assert.Equal( "ok",await _service.ExecuteAsync( key ) ); } } }