using System.Collections.Concurrent;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Util.Helpers;
using Util.Http;
using Util.Tests.Infrastructure;
using Xunit;
namespace Util.Applications.Locks {
///
/// 请求锁过滤器测试
///
public class LockAttributeTest : ControllerTestBase {
///
/// 测试初始化
///
public LockAttributeTest( IHttpClient client, IHttpContextAccessor accessor ) : base(client, accessor ) {
}
///
/// 测试未设置防重复过滤器
///
[Fact]
public async Task Test_1() {
var url = "/api/lock/nolock";
var bag = new ConcurrentBag>();
await Thread.ParallelForAsync( async (i) => {
await Task.Delay( i * 100 );
var result = await GetAsync( url );
bag.Add( result );
}, 20 );
Assert.Equal( 20, bag.ToList().FindAll( t => t.Data == "ok" ).Count );
}
///
/// 测试设置防重复过滤器 - 全局锁 - 同一时刻只有一个用户成功执行
///
[Fact]
public async Task Test_2() {
var url = "/api/lock/GlobalLock";
var bag = new ConcurrentBag>();
await Thread.ParallelForAsync( async (i) => {
await Task.Delay( i * 10 );
var result = await GetAsync( url );
bag.Add( result );
}, 20 );
Assert.Single( bag.ToList().FindAll( t => t.Data == "ok" ));
}
///
/// 测试设置防重复过滤器 - 用户锁 - 模拟10个用户,每个用户发送5个请求,结果是每个用户只成功执行一次
///
[Fact]
public async Task Test_3() {
var url = "/api/lock/UserLock";
var bag = new ConcurrentBag>();
await Thread.ParallelForAsync( async (i) => {
await Task.Delay( i * 10 );
var userId = Id.Create();
await Thread.ParallelForAsync( async (j) => {
await Task.Delay( j * 100 );
var result = await Client.Get>( url ).Header( "user-id",userId ).GetResultAsync();
bag.Add( result );
}, 5 );
}, 10 );
Assert.Equal( 10, bag.ToList().FindAll( t => t.Data == "ok" ).Count );
}
}
}