package bridge import ( "testing" "time" ) func TestLockManager(t *testing.T) { m := NewLockManager() tabID := "tab1" owner1 := "agent1" owner2 := "agent2" ttl := 100 * time.Millisecond if err := m.TryLock(tabID, owner1, ttl); err != nil { t.Fatalf("lock failed: %v", err) } if err := m.TryLock(tabID, owner1, ttl); err != nil { t.Fatalf("re-lock same owner failed: %v", err) } if err := m.TryLock(tabID, owner2, ttl); err == nil { t.Error("expected conflict error") } if err := m.Unlock(tabID, owner1); err != nil { t.Fatalf("unlock failed: %v", err) } if err := m.TryLock(tabID, owner2, ttl); err != nil { t.Fatalf("lock after unlock failed: %v", err) } time.Sleep(150 * time.Millisecond) if err := m.TryLock(tabID, owner1, ttl); err != nil { t.Fatalf("lock after expiration failed: %v", err) } } func TestLockManagerGet(t *testing.T) { m := NewLockManager() tabID := "tab1" owner := "agent1" ttl := 1 * time.Hour if info := m.Get(tabID); info != nil { t.Error("expected nil info for unlocked tab") } _ = m.TryLock(tabID, owner, ttl) info := m.Get(tabID) if info == nil { t.Fatal("expected info") return } if info.Owner != owner { t.Errorf("expected owner %s, got %s", owner, info.Owner) } }