51 lines
1.9 KiB
Go
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")
|
|
}
|
|
}
|