89 lines
2.6 KiB
Go
89 lines
2.6 KiB
Go
package health
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func aCatalogue(t *testing.T, manifests map[string]string) string {
|
|
t.Helper()
|
|
root := t.TempDir()
|
|
for module, body := range manifests {
|
|
dir := filepath.Join(root, "modules", module)
|
|
if err := os.MkdirAll(dir, 0o755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := os.WriteFile(filepath.Join(dir, "module.json"), []byte(body), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
return root
|
|
}
|
|
|
|
// A service that stays up and does not say how it is ready is counted; one that says, and a file, are not.
|
|
func TestOnlyALongRunningResourceWithoutHealthIsCounted(t *testing.T) {
|
|
root := aCatalogue(t, map[string]string{
|
|
"quiet": `{"module":"quiet","resources":[{"id":"svc","type":"service","unit":"quiet.service","state":"running"}]}`,
|
|
"says": `{"module":"says","resources":[{"id":"svc","type":"service","unit":"says.service","state":"running",` +
|
|
`"health":{"kind":"unit"}}]}`,
|
|
"file": `{"module":"file","resources":[{"id":"cfg","type":"file","path":"/etc/file.conf","content":"x"}]}`,
|
|
})
|
|
counted, err := Count(root)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if counted != 1 {
|
|
t.Fatalf("counted %d, wanted the one quiet service", counted)
|
|
}
|
|
}
|
|
|
|
func TestTheCountMayOnlyGoDown(t *testing.T) {
|
|
for _, c := range []struct {
|
|
kept, counted int
|
|
says string
|
|
}{
|
|
{58, 58, ""},
|
|
{58, 59, "rose from 58 to 59"},
|
|
{58, 57, "fell from 58 to 57"},
|
|
} {
|
|
got := Judge(c.kept, c.counted)
|
|
if (c.says == "") != (got == "") || !strings.Contains(got, c.says) {
|
|
t.Errorf("kept %d counted %d: %q, wanted %q", c.kept, c.counted, got, c.says)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestTheKeptCountIsTheFirstNumberOfTheFile(t *testing.T) {
|
|
path := filepath.Join(t.TempDir(), "health-undeclared")
|
|
if err := os.WriteFile(path, []byte("58\nThe long-running resources ...\n"), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if n, err := Kept(path); err != nil || n != 58 {
|
|
t.Fatalf("%d %v", n, err)
|
|
}
|
|
if err := os.WriteFile(path, []byte("many\n"), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := Kept(path); err == nil {
|
|
t.Fatal("a file with no number gave a count")
|
|
}
|
|
}
|
|
|
|
// The script's `module check` run over the real tree (novox/hq ADR 0240 rule 8, ADR 0529 clause 2 and 4): the long-running
|
|
// resources that do not say how they are ready, counted as the controller counts them, are the number health-undeclared keeps.
|
|
func TestTheCatalogueSaysHowItsLongRunningResourcesAreReady(t *testing.T) {
|
|
kept, err := Kept(filepath.Join("..", "..", "health-undeclared"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
counted, err := Count(filepath.Join("..", ".."))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if say := Judge(kept, counted); say != "" {
|
|
t.Fatal(say)
|
|
}
|
|
}
|