a06f331eb8
CI / benchmark (push) Has been skipped
install-script / posix-syntax (push) Successful in 6m1s
CI / build-onnx (push) Failing after 6m43s
init-smoke / dry-run (push) Failing after 15m57s
security / govulncheck (push) Has been cancelled
security / trivy-fs (push) Has been cancelled
CI / test (1.26, ubuntu-latest) (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
CI / test (1.26, macos-latest) (push) Has been cancelled
CI / build-windows (push) Has been cancelled
CI / lint (push) Has been cancelled
install-script / powershell-syntax (push) Has been cancelled
install-script / install (macos-14) (push) Has been cancelled
install-script / install (ubuntu-latest) (push) Has been cancelled
167 lines
4.7 KiB
Go
167 lines
4.7 KiB
Go
package daemon
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// TestServerEntry_EnabledAbsentMeansEnabled asserts the pointer-bool
|
|
// backward-compat contract: a roster written before the `enabled` key
|
|
// existed (no key at all) loads as enabled, never silently disabled.
|
|
func TestServerEntry_EnabledAbsentMeansEnabled(t *testing.T) {
|
|
dir := t.TempDir()
|
|
path := filepath.Join(dir, "servers.toml")
|
|
// No `enabled` key on the entry — the pre-existing-roster shape.
|
|
roster := `[[server]]
|
|
slug = "r2"
|
|
url = "https://r2.example:4747"
|
|
`
|
|
if err := os.WriteFile(path, []byte(roster), 0o600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
cfg, err := LoadServersConfig(path)
|
|
if err != nil {
|
|
t.Fatalf("load: %v", err)
|
|
}
|
|
if len(cfg.Server) != 1 {
|
|
t.Fatalf("want 1 server, got %d", len(cfg.Server))
|
|
}
|
|
if cfg.Server[0].Enabled != nil {
|
|
t.Fatalf("absent key should unmarshal to nil Enabled, got %v", *cfg.Server[0].Enabled)
|
|
}
|
|
if !cfg.Server[0].IsEnabled() {
|
|
t.Fatal("absent enabled key must be treated as enabled (default-on)")
|
|
}
|
|
}
|
|
|
|
// TestServerEntry_EnabledFalsePersists asserts an explicit
|
|
// `enabled = false` round-trips and reports disabled.
|
|
func TestServerEntry_EnabledFalsePersists(t *testing.T) {
|
|
dir := t.TempDir()
|
|
path := filepath.Join(dir, "servers.toml")
|
|
roster := `[[server]]
|
|
slug = "r2"
|
|
url = "https://r2.example:4747"
|
|
enabled = false
|
|
`
|
|
if err := os.WriteFile(path, []byte(roster), 0o600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
cfg, err := LoadServersConfig(path)
|
|
if err != nil {
|
|
t.Fatalf("load: %v", err)
|
|
}
|
|
if cfg.Server[0].Enabled == nil || *cfg.Server[0].Enabled {
|
|
t.Fatalf("explicit enabled=false should unmarshal to a non-nil false, got %v", cfg.Server[0].Enabled)
|
|
}
|
|
if cfg.Server[0].IsEnabled() {
|
|
t.Fatal("explicit enabled=false must report disabled")
|
|
}
|
|
}
|
|
|
|
// TestSetEnabled_OnDeletesKey asserts `proxy on` semantics: SetEnabled
|
|
// to true CLEARS the key (back to default-on) rather than writing
|
|
// `enabled = true`, so a re-saved roster stays minimal.
|
|
func TestSetEnabled_OnDeletesKey(t *testing.T) {
|
|
dir := t.TempDir()
|
|
path := filepath.Join(dir, "servers.toml")
|
|
roster := `[[server]]
|
|
slug = "r2"
|
|
url = "https://r2.example:4747"
|
|
enabled = false
|
|
`
|
|
if err := os.WriteFile(path, []byte(roster), 0o600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
cfg, err := LoadServersConfig(path)
|
|
if err != nil {
|
|
t.Fatalf("load: %v", err)
|
|
}
|
|
changed, err := cfg.SetEnabled("r2", true)
|
|
if err != nil {
|
|
t.Fatalf("SetEnabled: %v", err)
|
|
}
|
|
if !changed {
|
|
t.Fatal("flipping false->on should report changed")
|
|
}
|
|
if cfg.Server[0].Enabled != nil {
|
|
t.Fatal("SetEnabled(on) must clear the key (nil), not write enabled=true")
|
|
}
|
|
if err := cfg.Save(path); err != nil {
|
|
t.Fatalf("save: %v", err)
|
|
}
|
|
data, err := os.ReadFile(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if strings.Contains(string(data), "enabled") {
|
|
t.Fatalf("saved roster must not carry an enabled key after proxy-on, got:\n%s", data)
|
|
}
|
|
// And it reloads as enabled.
|
|
reloaded, err := LoadServersConfig(path)
|
|
if err != nil {
|
|
t.Fatalf("reload: %v", err)
|
|
}
|
|
if !reloaded.Server[0].IsEnabled() {
|
|
t.Fatal("re-saved + reloaded roster must be enabled")
|
|
}
|
|
}
|
|
|
|
// TestSetEnabled_OffWritesFalse asserts `proxy off` persists an
|
|
// explicit false that survives a daemon restart (Save + reload).
|
|
func TestSetEnabled_OffWritesFalse(t *testing.T) {
|
|
dir := t.TempDir()
|
|
path := filepath.Join(dir, "servers.toml")
|
|
roster := `[[server]]
|
|
slug = "r2"
|
|
url = "https://r2.example:4747"
|
|
`
|
|
if err := os.WriteFile(path, []byte(roster), 0o600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
cfg, err := LoadServersConfig(path)
|
|
if err != nil {
|
|
t.Fatalf("load: %v", err)
|
|
}
|
|
changed, err := cfg.SetEnabled("r2", false)
|
|
if err != nil {
|
|
t.Fatalf("SetEnabled: %v", err)
|
|
}
|
|
if !changed {
|
|
t.Fatal("flipping default-on->off should report changed")
|
|
}
|
|
if err := cfg.Save(path); err != nil {
|
|
t.Fatalf("save: %v", err)
|
|
}
|
|
reloaded, err := LoadServersConfig(path)
|
|
if err != nil {
|
|
t.Fatalf("reload: %v", err)
|
|
}
|
|
if reloaded.Server[0].IsEnabled() {
|
|
t.Fatal("proxy off must survive a restart (reload) as disabled")
|
|
}
|
|
}
|
|
|
|
// TestSetEnabled_UnknownSlug asserts SetEnabled errors on a slug not in
|
|
// the roster rather than silently no-op'ing.
|
|
func TestSetEnabled_UnknownSlug(t *testing.T) {
|
|
cfg := &ServersConfig{Server: []ServerEntry{{Slug: "r2", URL: "https://r2.example:4747"}}}
|
|
if _, err := cfg.SetEnabled("nope", false); err == nil {
|
|
t.Fatal("SetEnabled on an unknown slug must error")
|
|
}
|
|
}
|
|
|
|
// TestSetEnabled_Idempotent asserts a no-op toggle reports changed=false.
|
|
func TestSetEnabled_Idempotent(t *testing.T) {
|
|
cfg := &ServersConfig{Server: []ServerEntry{{Slug: "r2", URL: "https://r2.example:4747"}}}
|
|
changed, err := cfg.SetEnabled("r2", true) // already default-on
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if changed {
|
|
t.Fatal("enabling an already-enabled remote should report no change")
|
|
}
|
|
}
|