2026-05-12 20:07:49 +08:00

62 lines
2.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package router
import (
"context"
"testing"
"time"
)
func TestMemoryDirectorySameOwnerRenewalPreservesLeaseToken(t *testing.T) {
ctx := context.Background()
directory := NewMemoryDirectory()
now := time.Unix(100, 0).UTC()
first, err := directory.EnsureOwner(ctx, "room-1", "node-a", now, 10*time.Second)
if err != nil {
t.Fatalf("first EnsureOwner failed: %v", err)
}
renewed, err := directory.EnsureOwner(ctx, "room-1", "node-a", now.Add(time.Second), 10*time.Second)
if err != nil {
t.Fatalf("renew EnsureOwner failed: %v", err)
}
if renewed.LeaseToken != first.LeaseToken {
// 同节点续租不能换 token否则 Room Cell 命令进入 mailbox 后会被后台续租误伤。
t.Fatalf("same owner renewal rotated token: first=%s renewed=%s", first.LeaseToken, renewed.LeaseToken)
}
if !renewed.ExpiresAt.After(first.ExpiresAt) {
t.Fatalf("same owner renewal did not extend expiry: first=%s renewed=%s", first.ExpiresAt, renewed.ExpiresAt)
}
ok, err := directory.VerifyOwner(ctx, "room-1", "node-a", first.LeaseToken, now.Add(2*time.Second))
if err != nil {
t.Fatalf("VerifyOwner failed: %v", err)
}
if !ok {
t.Fatal("original token should remain valid after same owner renewal")
}
}
func TestMemoryDirectoryExpiredLeaseCreatesNewToken(t *testing.T) {
ctx := context.Background()
directory := NewMemoryDirectory()
now := time.Unix(100, 0).UTC()
first, err := directory.EnsureOwner(ctx, "room-1", "node-a", now, time.Second)
if err != nil {
t.Fatalf("first EnsureOwner failed: %v", err)
}
taken, err := directory.EnsureOwner(ctx, "room-1", "node-b", now.Add(2*time.Second), 10*time.Second)
if err != nil {
t.Fatalf("takeover EnsureOwner failed: %v", err)
}
if taken.NodeID != "node-b" {
t.Fatalf("expired lease should be taken by node-b, got %+v", taken)
}
if taken.LeaseToken == first.LeaseToken {
// 过期接管代表新的执行权实例,必须换 token 来挡住旧 owner 的迟到提交。
t.Fatal("expired lease takeover must create a new token")
}
}