thread-master/backend/internal/model/job/repository/redis_queue_test.go

72 lines
2.2 KiB
Go
Raw Normal View History

2026-06-26 08:37:04 +00:00
package repository
import (
"context"
"testing"
goredis "github.com/redis/go-redis/v9"
)
func TestRedisQueue_DedupeAndSchedulerLock(t *testing.T) {
ctx := context.Background()
client := goredis.NewClient(&goredis.Options{Addr: "127.0.0.1:6379"})
if err := client.Ping(ctx).Err(); err != nil {
t.Skip("redis not available:", err)
}
defer client.Close()
repo := NewRedisQueueRepository(client)
ok, err := repo.TryAcquireDedupe(ctx, "demo", "hash1", "job-1", 60)
if err != nil || !ok {
t.Fatalf("TryAcquireDedupe() = %v, %v", ok, err)
}
ok, err = repo.TryAcquireDedupe(ctx, "demo", "hash1", "job-2", 60)
if err != nil || ok {
t.Fatalf("duplicate TryAcquireDedupe() = %v, %v", ok, err)
}
if err := repo.ReleaseDedupe(ctx, "demo", "hash1"); err != nil {
t.Fatalf("ReleaseDedupe() error = %v", err)
}
ok, err = repo.TrySchedulerLock(ctx, "holder-a", 30)
if err != nil || !ok {
t.Fatalf("TrySchedulerLock() = %v, %v", ok, err)
}
ok, err = repo.TrySchedulerLock(ctx, "holder-b", 30)
if err != nil || ok {
t.Fatalf("duplicate TrySchedulerLock() = %v, %v", ok, err)
}
_ = repo.ReleaseSchedulerLock(ctx, "holder-a")
}
func TestRedisQueue_LockOwnerGuards(t *testing.T) {
ctx := context.Background()
client := goredis.NewClient(&goredis.Options{Addr: "127.0.0.1:6379"})
if err := client.Ping(ctx).Err(); err != nil {
t.Skip("redis not available:", err)
}
defer client.Close()
repo := NewRedisQueueRepository(client)
jobID := "owner-guard-job"
_ = client.Del(ctx, lockKey(jobID))
ok, err := repo.TryLock(ctx, jobID, "worker-a", 30)
if err != nil || !ok {
t.Fatalf("TryLock() = %v, %v", ok, err)
}
if err := repo.ReleaseLock(ctx, jobID, "worker-b"); err != nil {
t.Fatalf("ReleaseLock(worker-b) error = %v", err)
}
if value, err := client.Get(ctx, lockKey(jobID)).Result(); err != nil || value != "worker-a" {
t.Fatalf("lock value after wrong release = %q, %v", value, err)
}
if err := repo.RefreshLock(ctx, jobID, "worker-b", 30); err == nil {
t.Fatal("RefreshLock(worker-b) error = nil, want error")
}
if err := repo.ReleaseLock(ctx, jobID, "worker-a"); err != nil {
t.Fatalf("ReleaseLock(worker-a) error = %v", err)
}
_ = client.Del(ctx, lockKey(jobID))
}