nats: say whether a user's grant is in force on the running server, not only written (hq issue 353)
mesh/merge-gate pass: builds nats, sent nowhere; merging this needs a person's bus upgrade; 1 wait(s) for a person; every machine composes with the change …
mesh/repo-check pass: its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
mesh/delivery delivered
mesh/merge-gate pass: builds nats, sent nowhere; merging this needs a person's bus upgrade; 1 wait(s) for a person; every machine composes with the change …
mesh/repo-check pass: its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
mesh/delivery delivered
nats_user_can read the user list on the machine. A list written is not a list the bus enforces until the server reloads it: on 2026-10-09 the controller asked between the write and the reload's effect. The answer now carries in_force — allowed in the file, and the server's config_load_time after the file's write — with why when it is not, and anything not known is not in force.
This commit is contained in:
@@ -2,6 +2,8 @@ package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
@@ -170,3 +172,39 @@ func TestClosedConnectionsArePerUserAndNameAndSayWhichWereDropped(t *testing.T)
|
||||
t.Errorf("narrowed: %+v", got)
|
||||
}
|
||||
}
|
||||
|
||||
// novox/hq issue 353: a grant written to the user list is in force only once the server reloaded after the
|
||||
// write; anything not known is not in force.
|
||||
func TestAGrantIsInForceOnlyWhenTheServerReloadedAfterTheListWasWritten(t *testing.T) {
|
||||
written, err := ParseWritten("2026-10-09 17:55:56.422211788 +0200\n")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
varz := func(at string) []byte { return []byte(`{"config_load_time":"` + at + `"}`) }
|
||||
allowed := func() map[string]any { return map[string]any{"allowed": true} }
|
||||
cases := []struct {
|
||||
name string
|
||||
answer map[string]any
|
||||
werr error
|
||||
varz []byte
|
||||
verr error
|
||||
want bool
|
||||
says string
|
||||
}{
|
||||
{"reloaded after the write", allowed(), nil, varz("2026-10-09T15:56:05.1Z"), nil, true, ""},
|
||||
{"reloaded before the write", allowed(), nil, varz("2026-10-09T15:55:56.4Z"), nil, false, "has not reloaded"},
|
||||
{"not allowed in the file", map[string]any{"allowed": false}, nil, varz("2026-10-09T15:56:05Z"), nil, false, "does not allow"},
|
||||
{"the write time unknown", allowed(), errors.New("no container"), varz("2026-10-09T15:56:05Z"), nil, false, "no container"},
|
||||
{"the server unknown", allowed(), nil, nil, errors.New("refused"), false, "could not be read"},
|
||||
{"a server that says no load time", allowed(), nil, []byte(`{}`), nil, false, "does not say"},
|
||||
}
|
||||
for _, c := range cases {
|
||||
got := InForce(c.answer, written, c.werr, c.varz, c.verr)
|
||||
if got["in_force"] != c.want || (c.says != "" && !strings.Contains(fmt.Sprint(got["why"]), c.says)) {
|
||||
t.Errorf("%s: %v", c.name, got)
|
||||
}
|
||||
}
|
||||
if _, err := ParseWritten("yesterday"); err == nil {
|
||||
t.Error("a write time that is not one was read")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user