bastion 0.60.0
ci / personal-data (push) Successful in 4s
ci / test (push) Successful in 3m36s
ci / fuzz (push) Successful in 3m35s

This commit is contained in:
Privatae
2026-11-02 00:10:58 +00:00
parent 4a5c310482
commit 4f8285ef18
100 changed files with 11537 additions and 840 deletions
+92
View File
@@ -0,0 +1,92 @@
package main
import (
"strings"
"testing"
)
func askWorld(t *testing.T, enrol bool) string {
t.Helper()
uiTestConfigDir(t)
stubStopWorld(t, []agentObs{
{PID: 101, Kind: kindAgent, Signature: "aider", User: "u"},
{PID: 102, Kind: kindAgent, Signature: "aider", User: "u"},
{PID: 103, Kind: kindAgent, Signature: "aider", User: "u"},
{PID: 104, Kind: kindAgent, Signature: "aider", User: "u"},
{PID: 105, Kind: kindAgent, Signature: "aider", User: "u"},
{PID: 106, Kind: kindAgent, Signature: "aider", User: "u"},
{PID: 300, Kind: kindAgent, Signature: "claude-code", User: "u"},
{PID: 4532, Kind: kindApp, Signature: "claude-desktop", User: "u"},
}, map[int]int{310: 300, 311: 310}) // 311: a shell the claude-code session started
prev := homeForUserFn
t.Cleanup(func() { homeForUserFn = prev })
homeForUserFn = func(string) string { return "" }
d, err := machineFactorDir()
if err != nil {
t.Fatal(err)
}
if enrol {
enrolFactorAt(t, d, machineTestSecret)
}
return d
}
// An ask from another account becomes a pending request naming the agent
// that asked, from the kernel's pid, and approves nothing.
func TestAnAskBecomesARequestNamingTheAgentThatAsked(t *testing.T) {
d := askWorld(t, true)
r := fileAsk(agentAskRequest{Op: "stop", PID: 101}, "u", 311)
if !r.OK {
t.Fatalf("refused: %s", r.Why)
}
if !strings.Contains(r.Text, "Asked from Claude Code (pid 300), running as u.") {
t.Errorf("the request reads %q", r.Text)
}
pending := sortedPending(requestsLoad(d))
if len(pending) != 1 {
t.Fatalf("pending %v", pending)
}
for _, a := range approvalsLoad(d) {
t.Fatalf("an ask produced an approval: %+v", a)
}
}
func TestAnAskIsRefusedWithoutTheOwnersCodeOrForAnApp(t *testing.T) {
askWorld(t, false)
if r := fileAsk(agentAskRequest{Op: "stop", PID: 101}, "u", 0); r.OK || !strings.Contains(r.Why, "not set up their code") {
t.Errorf("no owner code: %+v", r)
}
askWorld(t, true)
if r := fileAsk(agentAskRequest{Op: "stop", PID: 4532}, "u", 0); r.OK || !strings.Contains(r.Why, "an app you are running") {
t.Errorf("an app: %+v", r)
}
if r := fileAsk(agentAskRequest{Op: "approve", PID: 101}, "u", 0); r.OK {
t.Errorf("an op other than stop was filed: %+v", r)
}
}
// One account cannot bury the owner in requests.
func TestOneAccountHasAtMostFiveAsksWaiting(t *testing.T) {
d := askWorld(t, true)
for i := 0; i < askMaxPendingPer; i++ {
if r := fileAsk(agentAskRequest{Op: "stop", PID: 101 + i}, "u", 0); !r.OK {
t.Fatalf("ask %d refused: %s", i+1, r.Why)
}
}
if r := fileAsk(agentAskRequest{Op: "stop", PID: 106}, "u", 0); r.OK || !strings.Contains(r.Why, "already have 5") {
t.Errorf("the sixth: %+v", r)
}
if r := fileAsk(agentAskRequest{Op: "stop", PID: 106}, "other", 0); !r.OK {
t.Errorf("another account was held to the first one's count: %s", r.Why)
}
// Asking again for the same agent is the same request, not another one:
// it is handed back (so the asker can follow it), and nothing new is filed.
before := len(sortedPending(requestsLoad(d)))
if r := fileAsk(agentAskRequest{Op: "stop", PID: 101}, "u", 0); !r.OK ||
requestsLoad(d)[fullRequestID(t, d, r.Request)].Details["pid"] != "101" {
t.Errorf("a repeat ask past the cap: %+v", r)
}
if after := len(sortedPending(requestsLoad(d))); after != before {
t.Errorf("a repeat ask past the cap filed a new request: %d -> %d pending", before, after)
}
}