From 182f8ac634ba9418eb888972ff8b882d01ee8311 Mon Sep 17 00:00:00 2001 From: douxu Date: Fri, 28 Mar 2025 16:48:56 +0800 Subject: [PATCH] add redis lock test of rwlocker --- distributedlock/rwlock_test.go | 102 +++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/distributedlock/rwlock_test.go b/distributedlock/rwlock_test.go index 2ad045e..d71241b 100644 --- a/distributedlock/rwlock_test.go +++ b/distributedlock/rwlock_test.go @@ -385,3 +385,105 @@ func TestRWLockReentrantWLock(t *testing.T) { t.Log("rwLock reentrant lock test success") return } + +// TODO 设计两个客户端分别加读锁与写锁 +func TestRWLock2CWithRLockAndWLock(t *testing.T) { + ctx := context.TODO() + rdb := redis.NewClient(&redis.Options{ + Network: "tcp", + Addr: "192.168.2.104:6379", + Password: "cnstar", + PoolSize: 50, + DialTimeout: 10 * time.Second, + }) + + rwLocker1 := GetRWLocker(rdb, &RedissionLockConfig{ + LockLeaseTime: 120, + NeedRefresh: true, + Key: "component", + Token: "fd348a84-e07c-4a61-8c19-f753e6bc556a", + }) + rwLocker1.logger = log + + rwLocker2 := GetRWLocker(rdb, &RedissionLockConfig{ + LockLeaseTime: 30, + NeedRefresh: true, + Key: "component", + Token: "fd348a84-e07c-4a61-8c19-f753e6bc5577", + }) + rwLocker2.logger = log + + duration := 10 * time.Second + // locker1加读锁 + err := rwLocker1.RLock(ctx, duration) + assert.Equal(t, nil, err) + + tokenKey1 := strings.Join([]string{rwLocker1.rwTokenTimeoutPrefix, rwLocker1.token}, ":") + num, err := rdb.HGet(ctx, rwLocker1.key, tokenKey1).Int() + assert.Equal(t, nil, err) + assert.Equal(t, 1, num) + + // locker2加写锁锁 + duration = 2 * time.Second + err = rwLocker2.WLock(ctx, duration) + // 预测加写锁失败 + assert.Equal(t, nil, err) + + // locker1解写锁 + err = rwLocker1.UnRLock(ctx) + assert.Equal(t, nil, err) + + t.Log("rwLock 2 client lock test success") + return +} + +// TODO 设计两个客户端分别加读锁与写锁 +func TestRWLock2CWithWLockAndRLock(t *testing.T) { + ctx := context.TODO() + rdb := redis.NewClient(&redis.Options{ + Network: "tcp", + Addr: "192.168.2.104:6379", + Password: "cnstar", + PoolSize: 50, + DialTimeout: 10 * time.Second, + }) + + rwLocker1 := GetRWLocker(rdb, &RedissionLockConfig{ + LockLeaseTime: 120, + NeedRefresh: true, + Key: "component", + Token: "fd348a84-e07c-4a61-8c19-f753e6bc556a", + }) + rwLocker1.logger = log + + rwLocker2 := GetRWLocker(rdb, &RedissionLockConfig{ + LockLeaseTime: 30, + NeedRefresh: true, + Key: "component", + Token: "fd348a84-e07c-4a61-8c19-f753e6bc5577", + }) + rwLocker2.logger = log + + duration := 10 * time.Second + // locker1加读锁 + err := rwLocker1.WLock(ctx, duration) + assert.Equal(t, nil, err) + + tokenKey1 := strings.Join([]string{rwLocker1.rwTokenTimeoutPrefix, rwLocker1.token}, ":") + num, err := rdb.HGet(ctx, rwLocker1.key, tokenKey1).Int() + assert.Equal(t, nil, err) + assert.Equal(t, 1, num) + + // locker2加读锁 + duration = 2 * time.Second + err = rwLocker2.RLock(ctx, duration) + // TODO 预测加读锁失败 + assert.Equal(t, nil, err) + + // locker1解写锁 + err = rwLocker1.UnWLock(ctx) + assert.Equal(t, nil, err) + + t.Log("rwLock 2 client lock test success") + return +}