Skip to content

Commit

Permalink
testscript: add RequireUniqueFilenames parameter
Browse files Browse the repository at this point in the history
  • Loading branch information
twpayne committed Sep 27, 2022
1 parent 7a6a5f8 commit 69978e7
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 3 deletions.
21 changes: 21 additions & 0 deletions testscript/testdata/testscript_duplicate_file.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Check that RequireUniqueFilenames works;
# it should reject txtar archives with duplicate filenames after normalization.

unquote scripts-simple/testscript.txt
unquote scripts-normalized/testscript.txt

testscript scripts-simple
testscript scripts-normalized

! testscript -unique-filenames scripts-simple
stdout 'duplicate filename'

! testscript -unique-filenames scripts-normalized
stdout 'duplicate filename'

-- scripts-simple/testscript.txt --
>-- file --
>-- file --
-- scripts-normalized/testscript.txt --
>-- file --
>-- dir/../file --
9 changes: 9 additions & 0 deletions testscript/testscript.go
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,10 @@ type Params struct {
// consistency across test scripts as well as keep separate process
// executions explicit.
RequireExplicitExec bool

// RequireUniqueFilenames requires that files in the txtar archive are
// unique. By default, later files silently overwrite earlier ones.
RequireUniqueFilenames bool
}

// RunDir runs the tests in the given directory. All files in dir with a ".txt"
Expand Down Expand Up @@ -364,6 +368,11 @@ func (ts *TestScript) setup() string {
ts.archive = a
for _, f := range a.Files {
name := ts.MkAbs(ts.expand(f.Name))
if ts.params.RequireUniqueFilenames {
if _, exists := ts.scriptFiles[name]; exists {
ts.Fatalf("%s: duplicate filename", f.Name)
}
}
ts.scriptFiles[name] = f.Name
ts.Check(os.MkdirAll(filepath.Dir(name), 0o777))
ts.Check(ioutil.WriteFile(name, f.Data, 0o666))
Expand Down
8 changes: 5 additions & 3 deletions testscript/testscript_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,7 @@ func TestScripts(t *testing.T) {
fset := flag.NewFlagSet("testscript", flag.ContinueOnError)
fUpdate := fset.Bool("update", false, "update scripts when cmp fails")
fExplicitExec := fset.Bool("explicit-exec", false, "require explicit use of exec for commands")
fUniqueFilenames := fset.Bool("unique-filenames", false, "require unique filenames in txtar archive")
fVerbose := fset.Bool("verbose", false, "be verbose with output")
if err := fset.Parse(args); err != nil {
ts.Fatalf("failed to parse args for testscript: %v", err)
Expand All @@ -201,9 +202,10 @@ func TestScripts(t *testing.T) {
}
}()
RunT(t, Params{
Dir: ts.MkAbs(dir),
UpdateScripts: *fUpdate,
RequireExplicitExec: *fExplicitExec,
Dir: ts.MkAbs(dir),
UpdateScripts: *fUpdate,
RequireExplicitExec: *fExplicitExec,
RequireUniqueFilenames: *fUniqueFilenames,
Cmds: map[string]func(ts *TestScript, neg bool, args []string){
"some-param-cmd": func(ts *TestScript, neg bool, args []string) {
},
Expand Down

0 comments on commit 69978e7

Please sign in to comment.