Files
Assistant/tests/agent_execution/lease_test.go
2026-08-22 12:00:10 +03:00

51 lines
1.9 KiB
Go

package agent_execution_test
import (
"testing"
"time"
"git.cin.su/m/Assistant/contracts/work"
workdomain "git.cin.su/m/Assistant/modules/work/domain"
)
func TestAgentLeaseFencesWorkerAndToken(t *testing.T) {
now := time.Unix(100, 0)
lease, err := workdomain.AcquireAgentLease("run-1", "worker-a", 7, now, time.Minute)
if err != nil || lease.State != work.AgentLeaseActive {
t.Fatalf("lease = %#v %v", lease, err)
}
if _, err := workdomain.RenewAgentLease(lease, "worker-b", 7, now.Add(time.Second), time.Minute); err == nil {
t.Fatal("expected worker fencing")
}
if _, err := workdomain.RenewAgentLease(lease, "worker-a", 8, now.Add(time.Second), time.Minute); err == nil {
t.Fatal("expected token fencing")
}
if renewed, err := workdomain.RenewAgentLease(lease, "worker-a", 7, now.Add(time.Second), time.Minute); err != nil || !renewed.ExpiresAt.After(lease.ExpiresAt) {
t.Fatalf("renewed = %#v %v", renewed, err)
}
}
func TestExpiredLeaseCannotRenew(t *testing.T) {
now := time.Unix(100, 0)
lease, _ := workdomain.AcquireAgentLease("run-1", "worker-a", 1, now, time.Second)
if _, err := workdomain.RenewAgentLease(lease, "worker-a", 1, now.Add(time.Second), time.Second); err == nil {
t.Fatal("expected expired lease rejection")
}
}
func TestAgentCallbackRejectsReplayAndWrongFencing(t *testing.T) {
now := time.Unix(100, 0)
lease, _ := workdomain.AcquireAgentLease("run-1", "worker-a", 1, now, time.Minute)
callback := work.AgentCallback{RunID: "run-1", WorkerID: "worker-a", FencingToken: 1, Sequence: 2, Kind: work.AgentCallbackHeartbeat, ObservedAt: now.Add(time.Second)}
if err := workdomain.ValidateAgentCallback(callback, lease, 1); err != nil {
t.Fatal(err)
}
if err := workdomain.ValidateAgentCallback(callback, lease, 2); err == nil {
t.Fatal("expected replay rejection")
}
callback.FencingToken = 2
if err := workdomain.ValidateAgentCallback(callback, lease, 1); err == nil {
t.Fatal("expected fencing rejection")
}
}