From 190efae99c32c4e1e6300c0a37e03ea1cef5f015 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 2 Mar 2022 01:44:12 +0100 Subject: [PATCH] testscript: add go version conditions --- gotooltest/setup.go | 16 ---------------- testscript/doc.go | 1 + testscript/testdata/cond.txt | 7 ++++++- testscript/testscript.go | 10 ++++++++++ 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/gotooltest/setup.go b/gotooltest/setup.go index 122d2464..b1092c92 100644 --- a/gotooltest/setup.go +++ b/gotooltest/setup.go @@ -10,7 +10,6 @@ import ( "bytes" "encoding/json" "fmt" - "go/build" "os/exec" "path/filepath" "regexp" @@ -104,21 +103,6 @@ func Setup(p *testscript.Params) error { p.Cmds = make(map[string]func(ts *testscript.TestScript, neg bool, args []string)) } p.Cmds["go"] = cmdGo - origCondition := p.Condition - p.Condition = func(cond string) (bool, error) { - if goVersionRegex.MatchString(cond) { - for _, v := range build.Default.ReleaseTags { - if cond == v { - return true, nil - } - } - return false, nil - } - if origCondition == nil { - return false, fmt.Errorf("unknown condition %q", cond) - } - return origCondition(cond) - } return nil } diff --git a/testscript/doc.go b/testscript/doc.go index 24dc703a..ba91db36 100644 --- a/testscript/doc.go +++ b/testscript/doc.go @@ -107,6 +107,7 @@ should only run when the condition is satisfied. The predefined conditions are: - [exec:prog] for whether prog is available for execution (found by exec.LookPath) - [gc] for whether Go was built with gc - [gccgo] for whether Go was built with gccgo + - [go1.x] for whether the Go version is 1.x or later A condition can be negated: [!short] means to run the rest of the line when testing.Short() is false. diff --git a/testscript/testdata/cond.txt b/testscript/testdata/cond.txt index 4c2ca21c..60b62c2a 100644 --- a/testscript/testdata/cond.txt +++ b/testscript/testdata/cond.txt @@ -3,4 +3,9 @@ # test that exactly one of gc and gccgo is set [gc] exec sh -c 'echo gc >> go-compiler' [gccgo] exec sh -c 'echo gccgo >> go-compiler' -grep '\A(gc|gccgo)\n\z' go-compiler \ No newline at end of file +grep '\A(gc|gccgo)\n\z' go-compiler + +# test that go version build tags are set +[go1.1] exec sh -c 'echo go1.1 >> go-version' +[go2.1] exec sh -c 'echo go2.1 >> go-version' +grep '\Ago1\.1\n\z' go-version \ No newline at end of file diff --git a/testscript/testscript.go b/testscript/testscript.go index 586c5a60..af752e3f 100644 --- a/testscript/testscript.go +++ b/testscript/testscript.go @@ -12,6 +12,7 @@ import ( "context" "flag" "fmt" + "go/build" "io/ioutil" "os" "os/exec" @@ -30,6 +31,8 @@ import ( "github.com/rogpeppe/go-internal/txtar" ) +var goVersionRegex = regexp.MustCompile(`^go([1-9][0-9]*)\.([1-9][0-9]*)$`) + var execCache par.Cache // If -testwork is specified, the test prints the name of the temp directory @@ -597,6 +600,13 @@ func (ts *TestScript) condition(cond string) (bool, error) { // binary was built with but not necessarily the compiler // that will be used. return cond == runtime.Compiler, nil + case goVersionRegex.MatchString(cond): + for _, v := range build.Default.ReleaseTags { + if cond == v { + return true, nil + } + } + return false, nil case ts.params.Condition != nil: return ts.params.Condition(cond) default: