state: a state file without a section loads it empty (closes #267)
check / check (push) Canceled after 0s

Load fills in each of domains, hostnames, ports and certificates that
the file leaves out or holds as null with an empty map. Before, such a
section loaded as a nil map, and the first check's write into it
panicked, so a state file holding {} stopped the watcher at every
start.

A state test loads {} and a file missing each section in turn, and
checks that every section is an empty map. A watcher test loads {}, and
a file without the certificates section, runs the first check against
live DNS, and checks that it saved domain, hostname, port and
certificate entries.

Model: opus-5-5
This commit was merged in pull request #278.
This commit is contained in:
2026-10-13 20:27:27 +02:00
parent 3592302615
commit 9e6871817a
5 changed files with 124 additions and 0 deletions
+48
View File
@@ -477,6 +477,54 @@ func TestDomainPortAndTLSChecks(t *testing.T) {
}
}
// TestFirstCheckAfterLoadingFileWithoutSections loads a state file
// holding {}, and one that leaves out the certificates section, and runs
// the first check. It saves domain, hostname, port and certificate
// entries; a section loaded as nil made it panic.
func TestFirstCheckAfterLoadingFileWithoutSections(t *testing.T) {
t.Parallel()
tests := []struct {
name string
file string
}{
{"no sections", `{}`},
{"no certificates", `{"domains": {}, "hostnames": {}, "ports": {}}`},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
cfg := defaultTestConfig(t)
cfg.Domains = []string{testSmallDomain}
_, deps := runChecks(t, cfg, func(deps *testDeps) {
err := os.WriteFile(cfg.StatePath(), []byte(tt.file), 0o600)
if err != nil {
t.Fatalf("writing the state file: %v", err)
}
err = deps.state.Load()
if err != nil {
t.Fatalf("loading the state file: %v", err)
}
})
snap := deps.state.GetSnapshot()
if len(snap.Domains) == 0 || len(snap.Hostnames) == 0 ||
len(snap.Ports) == 0 || len(snap.Certificates) == 0 {
t.Errorf(
"saved %d domain, %d hostname, %d port and %d "+
"certificate entries, want at least one of each",
len(snap.Domains), len(snap.Hostnames),
len(snap.Ports), len(snap.Certificates),
)
}
})
}
}
func TestNSChangeDetection(t *testing.T) {
t.Parallel()