package hub import ( "context" "fmt" "testing" "time" ) func TestDirectAdmissionKeepsGuestsAndEnforcesCapacity(t *testing.T) { now := time.Now() h := testHub(&now) h.cfg.WaitingRoom = func(context.Context, string) (bool, error) { return false, nil } for i := 0; i < MaxAdmitted; i++ { session := fmt.Sprintf("guest-%d", i) o, err := h.Open("r", session, int64(100+i), "Guest", KindGuest) if err != nil { t.Fatal(err) } if err := h.Join(testCtx, "r", session, o.Peer); err != nil { t.Fatal(err) } p, _ := h.Find("r", session, o.Peer) if !p.Admitted || p.Kind != KindGuest { t.Fatal("direct admission changed authority", p) } } extra, _ := h.Open("r", "extra", 200, "Extra", KindGuest) if err := h.Join(testCtx, "r", "extra", extra.Peer); err != ErrMeshFull { t.Fatal("capacity bypassed", err) } p, _ := h.Find("r", "extra", extra.Peer) if p.Admitted { t.Fatal("overflow admitted") } } func TestDisablingWaitingRoomAdmitsQueuedGuests(t *testing.T) { now := time.Now() h := testHub(&now) waiting := true h.cfg.WaitingRoom = func(context.Context, string) (bool, error) { return waiting, nil } o, _ := h.Open("r", "guest", 100, "Guest", KindGuest) if err := h.Join(testCtx, "r", "guest", o.Peer); err != nil { t.Fatal(err) } p, _ := h.Find("r", "guest", o.Peer) if p.Admitted || !p.Joined { t.Fatal("did not wait") } waiting = false if err := h.RefreshWaiting(testCtx, "r"); err != nil { t.Fatal(err) } p, _ = h.Find("r", "guest", o.Peer) if !p.Admitted || p.Kind != KindGuest { t.Fatal("retry not admitted as guest") } }