Files
ai-agent/workflow/service/flow/redis_lock_test.go
T

53 lines
1.3 KiB
Go

package flow
import (
"context"
"os"
"testing"
"github.com/gogf/gf/v2/frame/g"
)
// TestRedisLockMutualExclusion 验证互斥与防误删(需 AI_AGENT_TEST_REDIS=1 且本地 Redis 可用)
func TestRedisLockMutualExclusion(t *testing.T) {
if os.Getenv("AI_AGENT_TEST_REDIS") != "1" {
t.Skip("skip: AI_AGENT_TEST_REDIS not set")
}
ctx := context.Background()
key := "workflow:exec:recover:test-lock"
// 清理残留
g.Redis().Del(ctx, key)
l1 := NewRedisLock(key, 60)
l2 := NewRedisLock(key, 60)
ok1, err := l1.Acquire(ctx)
if err != nil || !ok1 {
t.Fatalf("l1 acquire should succeed: ok=%v err=%v", ok1, err)
}
ok2, err := l2.Acquire(ctx)
if err != nil {
t.Fatalf("l2 acquire err: %v", err)
}
if ok2 {
t.Fatalf("l2 不应抢到已被 l1 持有的锁")
}
// l2 尝试释放 l1 的锁:token 不匹配,不应删除
if err := l2.Release(ctx); err != nil {
t.Fatalf("l2 release err: %v", err)
}
ok2, _ = l2.Acquire(ctx)
if ok2 {
t.Fatalf("l2 释放他人锁后不应能抢到(l1 锁应仍在)")
}
// l1 释放后 l2 可抢到
if err := l1.Release(ctx); err != nil {
t.Fatalf("l1 release err: %v", err)
}
ok2, err = l2.Acquire(ctx)
if err != nil || !ok2 {
t.Fatalf("l1 释放后 l2 应可抢到: ok=%v err=%v", ok2, err)
}
l2.Release(ctx)
g.Redis().Del(ctx, key)
}