From 12ea8033a955ebfe4ddb78977aa31be07885797d Mon Sep 17 00:00:00 2001 From: Yoann La Cancellera Date: Tue, 10 Oct 2023 12:05:19 +0200 Subject: [PATCH] Add: proper error handling for files --- src/go/pt-galera-log-explainer/internal.go | 14 ++++++++- .../pt-galera-log-explainer/internal_test.go | 31 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 src/go/pt-galera-log-explainer/internal_test.go diff --git a/src/go/pt-galera-log-explainer/internal.go b/src/go/pt-galera-log-explainer/internal.go index 5253e44e..5a911861 100644 --- a/src/go/pt-galera-log-explainer/internal.go +++ b/src/go/pt-galera-log-explainer/internal.go @@ -2,6 +2,7 @@ package main import ( "bufio" + "os" "os/exec" "runtime" "strings" @@ -25,6 +26,10 @@ func init() { } } +var ( + errDirectoriesUnsupported = errors.New("directories are not supported") +) + // timelineFromPaths takes every path, search them using a list of regexes // and organize them in a timeline that will be ready to aggregate or read func timelineFromPaths(paths []string, regexes types.RegexMap) (types.Timeline, error) { @@ -34,6 +39,14 @@ func timelineFromPaths(paths []string, regexes types.RegexMap) (types.Timeline, compiledRegex := prepareGrepArgument(regexes) for _, path := range paths { + osinfo, err := os.Stat(path) + if err != nil { + return nil, err + } + if osinfo.IsDir() { + return nil, errDirectoriesUnsupported + } + stdout := make(chan string) go func() { @@ -193,7 +206,6 @@ func iterateOnGrepResults(path string, regexes types.RegexMap, grepStdout <-chan } ctx, displayer = regex.Handle(ctx, line) li := types.NewLogInfo(date, displayer, line, regex, key, ctx, filetype) - lt = lt.Add(li) } diff --git a/src/go/pt-galera-log-explainer/internal_test.go b/src/go/pt-galera-log-explainer/internal_test.go new file mode 100644 index 00000000..7bcd53ba --- /dev/null +++ b/src/go/pt-galera-log-explainer/internal_test.go @@ -0,0 +1,31 @@ +package main + +import ( + "errors" + "os" + "testing" +) + +func TestTimelineFromPaths(t *testing.T) { + tests := []struct { + path string + expectedErr error + }{ + { + path: "tests/logs/", + expectedErr: errDirectoriesUnsupported, + }, + { + path: "tests/logs/non_existing", + expectedErr: os.ErrNotExist, + }, + } + + for _, test := range tests { + _, err := timelineFromPaths([]string{test.path}, nil) + if !errors.Is(err, test.expectedErr) { + t.Fatalf("with path %s, expected error %v, got %v", test.path, test.expectedErr, err) + } + } + +}