package config import ( "path/filepath" "strings" "testing" "gitea.maximumdirect.net/eric/notarius/internal/framework/pipeline" ) func TestChunkCacheDefaults(t *testing.T) { cfg := Default() if cfg.Workspace.ChunkCache.Mode != pipeline.ChunkCacheAuto || cfg.Workspace.ChunkCache.Directory != "" { t.Fatalf("chunk cache defaults = %#v", cfg.Workspace.ChunkCache) } if err := cfg.Validate(); err != nil { t.Fatalf("Validate() error = %v", err) } } func TestChunkCacheFileConfiguration(t *testing.T) { cfg := parseAndApplyConfig(t, ` version: 2 workspace: chunk_cache: mode: refresh directory: " ./state/../plans " `) if cfg.Workspace.ChunkCache.Mode != pipeline.ChunkCacheRefresh { t.Fatalf("mode = %q", cfg.Workspace.ChunkCache.Mode) } if got, want := cfg.Workspace.ChunkCache.Directory, filepath.Clean("./state/../plans"); got != want { t.Fatalf("directory = %q, want %q", got, want) } if err := cfg.Validate(); err != nil { t.Fatalf("Validate() error = %v", err) } } func TestChunkCacheEnvironmentOverridesFile(t *testing.T) { fileCfg, err := ParseFileConfigYAML([]byte(` version: 2 workspace: chunk_cache: mode: bypass directory: /file/plans `)) if err != nil { t.Fatal(err) } cfg := Default() if err := cfg.ApplyFileConfigWithLookup(fileCfg, emptyLookup); err != nil { t.Fatal(err) } if err := cfg.ApplyEnvOverridesWithLookup(mapLookup(map[string]string{ "NOTARIUS_WORKSPACE_CHUNK_CACHE_MODE": "refresh", "NOTARIUS_WORKSPACE_CHUNK_CACHE_DIR": " /environment/../cache/plans ", })); err != nil { t.Fatal(err) } if cfg.Workspace.ChunkCache.Mode != pipeline.ChunkCacheRefresh || cfg.Workspace.ChunkCache.Directory != filepath.Clean("/environment/../cache/plans") { t.Fatalf("effective chunk cache = %#v", cfg.Workspace.ChunkCache) } } func TestChunkCacheEmptyDirectoryEnvironmentSelectsDefault(t *testing.T) { cfg := Default() cfg.Workspace.ChunkCache.Directory = "/file/plans" if err := cfg.ApplyEnvOverridesWithLookup(mapLookup(map[string]string{"NOTARIUS_WORKSPACE_CHUNK_CACHE_DIR": " \t "})); err != nil { t.Fatal(err) } if cfg.Workspace.ChunkCache.Directory != "" { t.Fatalf("directory = %q, want unset", cfg.Workspace.ChunkCache.Directory) } } func TestChunkCacheRejectsInvalidSuppliedModes(t *testing.T) { fileCfg, err := ParseFileConfigYAML([]byte("version: 2\nworkspace:\n chunk_cache:\n mode: sometimes\n")) if err != nil { t.Fatal(err) } cfg := Default() if err := cfg.ApplyFileConfigWithLookup(fileCfg, emptyLookup); err == nil || !strings.Contains(err.Error(), "workspace.chunk_cache.mode") { t.Fatalf("file mode error = %v", err) } cfg = Default() if err := cfg.ApplyEnvOverridesWithLookup(mapLookup(map[string]string{"NOTARIUS_WORKSPACE_CHUNK_CACHE_MODE": "sometimes"})); err == nil || !strings.Contains(err.Error(), "NOTARIUS_WORKSPACE_CHUNK_CACHE_MODE") { t.Fatalf("environment mode error = %v", err) } cfg = Default() cfg.Workspace.ChunkCache.Mode = "sometimes" if err := cfg.Validate(); err == nil || !strings.Contains(err.Error(), "chunk cache") { t.Fatalf("Validate() error = %v", err) } } func TestChunkCacheConfigurationClonesAndRedacts(t *testing.T) { cfg := Default() cfg.Workspace.ChunkCache = WorkspaceChunkCacheConfig{Mode: pipeline.ChunkCacheRefresh, Directory: "/var/cache/notarius/chunk-plans"} cloned := cloneConfig(cfg) redacted := cfg.Redacted() if cloned.Workspace.ChunkCache != cfg.Workspace.ChunkCache || redacted.Workspace.ChunkCache != cfg.Workspace.ChunkCache { t.Fatalf("cloned=%#v redacted=%#v", cloned.Workspace.ChunkCache, redacted.Workspace.ChunkCache) } redacted.Workspace.ChunkCache.Directory = "/changed" if cfg.Workspace.ChunkCache.Directory != "/var/cache/notarius/chunk-plans" { t.Fatal("redacted mutation changed original") } if err := cfg.Validate(); err != nil { t.Fatalf("Validate() error = %v", err) } } func TestChunkCacheDirectoryValidation(t *testing.T) { cfg := Default() cfg.Workspace.ChunkCache.Directory = "/var/cache/notarius/chunk-plans" if err := cfg.Validate(); err != nil { t.Fatalf("Validate(system root) error = %v", err) } cfg.Workspace.ChunkCache.Directory = "bad\x00path" if err := cfg.Validate(); err == nil || !strings.Contains(err.Error(), "NUL") { t.Fatalf("Validate(NUL directory) error = %v", err) } }