This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
package alertworker
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/itworx/pulse/internal/alert"
|
||||
"github.com/itworx/pulse/internal/database"
|
||||
)
|
||||
|
||||
func TestPostgreSQLLeaseStoreCoordinatesAndReclaimsExpiredLease(t *testing.T) {
|
||||
dsn := os.Getenv("PULSE_TEST_DATABASE_URL")
|
||||
if dsn == "" {
|
||||
t.Skip("PULSE_TEST_DATABASE_URL is not set")
|
||||
}
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
||||
defer cancel()
|
||||
pool, err := database.NewPool(ctx, database.Config{URL: dsn, MaxConns: 4, MinConns: 1})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer pool.Close()
|
||||
if err := database.Migrate(ctx, pool); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
store := PostgresLeaseStore{Pool: pool}
|
||||
now := time.Date(2026, 8, 2, 5, 0, 0, 0, time.UTC)
|
||||
key := alert.NewID()
|
||||
scheduled := now
|
||||
first, acquired, err := store.Acquire(ctx, jobType, key, scheduled, "worker-a", now, time.Minute)
|
||||
if err != nil || !acquired {
|
||||
t.Fatalf("first acquire lease=%#v acquired=%v err=%v", first, acquired, err)
|
||||
}
|
||||
if _, acquired, err := store.Acquire(ctx, jobType, key, scheduled, "worker-b", now, time.Minute); err != nil || acquired {
|
||||
t.Fatalf("duplicate acquire acquired=%v err=%v", acquired, err)
|
||||
}
|
||||
if err := store.Complete(ctx, first, "completed", ""); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, acquired, err := store.Acquire(ctx, jobType, key, scheduled, "worker-b", now, time.Minute); err != nil || acquired {
|
||||
t.Fatalf("completed acquire acquired=%v err=%v", acquired, err)
|
||||
}
|
||||
expiredKey := alert.NewID()
|
||||
expired, acquired, err := store.Acquire(ctx, jobType, expiredKey, scheduled, "worker-a", now, time.Second)
|
||||
if err != nil || !acquired {
|
||||
t.Fatalf("expired first acquire=%#v acquired=%v err=%v", expired, acquired, err)
|
||||
}
|
||||
reclaimed, acquired, err := store.Acquire(ctx, jobType, expiredKey, scheduled, "worker-b", now.Add(2*time.Second), time.Minute)
|
||||
if err != nil || !acquired || reclaimed.JobKey != expiredKey {
|
||||
t.Fatalf("reclaim lease=%#v acquired=%v err=%v", reclaimed, acquired, err)
|
||||
}
|
||||
if err := store.Complete(ctx, reclaimed, "failed", "timeout"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user