diff --git a/filewatcher/filewatcher.go b/filewatcher/filewatcher.go index 8d8dfccea..9bb11b08c 100644 --- a/filewatcher/filewatcher.go +++ b/filewatcher/filewatcher.go @@ -372,7 +372,7 @@ func New(ctx context.Context, cfg Config) (*Result, error) { var err error data, mtime, files, err = openAndParse(cfg.Path, cfg.Parser, limit, hardLimit) - if errors.Is(err, os.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { time.Sleep(InitialReadInterval) continue } diff --git a/filewatcher/filewatcher_test.go b/filewatcher/filewatcher_test.go index c0805d1d1..d85f9247f 100644 --- a/filewatcher/filewatcher_test.go +++ b/filewatcher/filewatcher_test.go @@ -304,14 +304,14 @@ func updateDirWithContents(tb testing.TB, dst string, contents map[string]string for p, content := range contents { path := filepath.Join(dir, p) parent := filepath.Dir(path) - if err := os.Mkdir(parent, 0777); err != nil && !os.IsExist(err) { + if err := os.Mkdir(parent, 0777); err != nil && !errors.Is(err, fs.ErrExist) { tb.Fatalf("Failed to create directory %q for %q: %v", parent, path, err) } if err := os.WriteFile(path, []byte(content), 0666); err != nil { tb.Fatalf("Failed to write file %q: %v", path, err) } } - if err := os.RemoveAll(dst); err != nil && !os.IsNotExist(err) { + if err := os.RemoveAll(dst); err != nil && !errors.Is(err, fs.ErrNotExist) { tb.Fatalf("Failed to remove %q: %v", dst, err) } if err := os.Rename(dir, dst); err != nil { diff --git a/secrets/store.go b/secrets/store.go index 6eaa5bf83..6f637c97e 100644 --- a/secrets/store.go +++ b/secrets/store.go @@ -2,6 +2,7 @@ package secrets import ( "context" + "errors" "io" "io/fs" "os" @@ -45,12 +46,12 @@ func NewStore(ctx context.Context, path string, logger log.Wrapper, middlewares } store.secretHandler(middlewares...) fileInfo, err := os.Stat(path) - if err != nil { + if err != nil && !errors.Is(err, fs.ErrNotExist) { return nil, err } parser := store.parser - if fileInfo.IsDir() { + if fileInfo != nil && fileInfo.IsDir() { parser = filewatcher.WrapDirParser(store.dirParser) } diff --git a/secrets/store_test.go b/secrets/store_test.go index ce2d54229..da69fba51 100644 --- a/secrets/store_test.go +++ b/secrets/store_test.go @@ -3,6 +3,7 @@ package secrets_test import ( "context" "os" + "path/filepath" "reflect" "testing" "time" @@ -490,3 +491,27 @@ func TestAddMiddleware(t *testing.T) { ) } } + +func TestNewStoreWaitBeforeAvailable(t *testing.T) { + const ( + writeDelay = time.Second / 5 + timeout = time.Second * 5 + ) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + t.Cleanup(cancel) + dir := t.TempDir() + path := filepath.Join(dir, "secrets.json") + go func() { + // delay create and write secrets.json file + // note that we must also delay creating the file here. + time.Sleep(writeDelay) + if err := os.WriteFile(path, []byte(specificationExample), 0666); err != nil { + t.Errorf("Failed to write %q: %v", path, err) + } + }() + store, err := secrets.NewStore(ctx, path, nil) + if err != nil { + t.Fatalf("NewStore failed with %v", err) + } + store.Close() +}