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, "TEST_MODULE_") if err != nil || cfg.Address != ":9123" || 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, "TEST_MODULE_", 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) } } }