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") } }