From e3d160635da280077bfcda781632d5d6b7174e1b Mon Sep 17 00:00:00 2001 From: Lucas Bajolet Date: Mon, 16 Dec 2024 11:53:14 -0500 Subject: [PATCH] packer_test: add FileGlob checker When trying to validate that a particular file exists after a run of Packer in a test suite, we can use the FileExists checker that we provide as part of the gadgets we added for the acceptance test suites. This approach works well, but only if we can extract a file name reliably from the output of Packer core, or if we know what to look for exactly beforehand. For other cases with a generated name however, the FileExists checker is not enough, and therefore to accomodate for those cases, we are introducing a new checker for this purpose: FileGlob. FileGlob, as its name suggests, runs a glob expression on the filesystem, and returns an error if no match was found regarding this glob expression. --- packer_test/common/check/file_gadgets.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/packer_test/common/check/file_gadgets.go b/packer_test/common/check/file_gadgets.go index cb15f94e02d..83d507c4e62 100644 --- a/packer_test/common/check/file_gadgets.go +++ b/packer_test/common/check/file_gadgets.go @@ -3,6 +3,7 @@ package check import ( "fmt" "os" + "path/filepath" ) type fileExists struct { @@ -33,3 +34,26 @@ func FileExists(filePath string, isDir bool) Checker { isDir: isDir, } } + +type fileGlob struct { + filepath string +} + +func (fe fileGlob) Check(_, _ string, _ error) error { + matches, err := filepath.Glob(fe.filepath) + if err != nil { + return fmt.Errorf("error evaluating file glob pattern %q: %v", fe.filepath, err) + } + + if len(matches) == 0 { + return fmt.Errorf("no matches found for file glob pattern %q", fe.filepath) + } + + return nil +} + +func FileGlob(filename string) Checker { + return fileGlob{ + filepath: filename, + } +}