Files
go-omni/config/file_test.go

60 lines
1.5 KiB
Go

package config
import (
"bytes"
"git.yuntuo.hk/k2safe/go-omni/logx"
"os"
"path/filepath"
"strings"
"testing"
"time"
)
func TestFileMergeAndSafeReload(t *testing.T) {
path := filepath.Join(t.TempDir(), "service.yaml")
write := func(raw string) {
t.Helper()
if err := os.WriteFile(path, []byte(raw), 0600); err != nil {
t.Fatal(err)
}
}
write("address: ':8123'\nshutdownTimeout: 7s\nlog:\n level: info\n")
t.Setenv("TEST_MODULE_HTTP_ADDR", ":9123")
cfg, err := LoadFile(path)
if err != nil || cfg.Address != ":8123" || cfg.ShutdownTimeout != 7*time.Second {
t.Fatal(cfg, err)
}
var output bytes.Buffer
lc := cfg.Log
lc.Writer = &output
l, err := logx.New(lc)
if err != nil {
t.Fatal(err)
}
defer l.Close()
child := l.With("scope", "test")
r, err := NewReloader(path, l)
if err != nil {
t.Fatal(err)
}
child.Debug("hidden")
write("address: ':8123'\nshutdownTimeout: 7s\nlog:\n level: debug\n")
if err = r.Reload(); err != nil {
t.Fatal(err)
}
child.Debug("visible")
if strings.Contains(output.String(), "hidden") || !strings.Contains(output.String(), "visible") {
t.Fatal(output.String())
}
write("shutdownTimeout: 8s\nlog:\n level: error\n")
if err = r.Reload(); err == nil || r.Snapshot().Log.Level != "debug" {
t.Fatal("static reload changed live config", err)
}
for _, raw := range []string{"unknownOption: true", "log:\n level: bad", "shutdownTimeout: invalid", "address: x\naddress: y", "---\n{}\n---\n{}"} {
write(raw)
if err = r.Reload(); err == nil {
t.Fatal(raw)
}
}
}