// Copyright (c) 2026 Storm Dragon // SPDX-License-Identifier: GPL-3.0-or-later package tentaclewire import "testing" func TestSessionNegotiationRequiresIndependentGrants(t *testing.T) { cases := []struct { name string minor int apis, grants []string valid bool }{ {"legacy", 0, []string{"commands", "presentation"}, []string{"commands", "presentation"}, true}, {"legacy order", 0, []string{"presentation", "commands"}, []string{"presentation", "commands"}, false}, {"events only", 1, []string{"session-events", "commands"}, nil, true}, {"explicit sets", 1, []string{"remote-access", "interaction", "session-events", "commands", "presentation"}, []string{"output-observe", "interaction", "presentation"}, true}, {"missing events", 1, []string{"remote-access", "commands"}, []string{"output-observe"}, false}, {"grant without API", 1, []string{"session-events", "commands"}, []string{"output-observe"}, false}, {"API without grant", 1, []string{"session-events", "commands", "remote-access"}, nil, false}, {"unknown grant", 1, []string{"session-events", "commands", "remote-access"}, []string{"execute"}, false}, {"duplicate grant", 1, []string{"session-events", "commands", "remote-access"}, []string{"output-observe", "output-observe"}, false}, {"duplicate API", 1, []string{"session-events", "commands", "commands"}, nil, false}, {"missing prerequisite", 1, []string{"session-events", "commands", "interaction"}, []string{"interaction"}, false}, {"legacy capability in 1.1", 1, []string{"session-events", "commands"}, []string{"commands"}, false}, {"future version", 2, []string{"session-events", "commands"}, nil, false}, } for _, item := range cases { t.Run(item.name, func(t *testing.T) { if ValidNegotiation(item.minor, item.apis, item.grants) != item.valid { t.Fatal("wrong negotiation result") } }) } } func TestRemoteRevocationIdentifiesExactlyOneActionOrLease(t *testing.T) { token := "0123456789abcdef0123456789abcdef" for _, item := range []struct { action, lease string valid bool }{ {token, "", true}, {"", token, true}, {token, token, false}, {"", "", false}, {"short", "", false}, } { event := SessionEvent{Sequence: 1, Epoch: 1, Kind: "remote.revoked", Reason: "expired", Action: item.action, Lease: item.lease} if ValidSessionEvent(event) != item.valid { t.Fatalf("unexpected validation for %+v", item) } } }