Skip to content

Commit

Permalink
cmd/go: convert TestBadCgoDirectives to the script framework
Browse files Browse the repository at this point in the history
Part of converting all tests to script framework to improve
test parallelism.

Updates #36320
Updates #17751

Change-Id: I1328a87e2481b4555b01df5c898f1a8015412adc
Reviewed-on: https://go-review.googlesource.com/c/go/+/214296
Reviewed-by: Jay Conrod <[email protected]>
  • Loading branch information
matloob committed Feb 19, 2020
1 parent 7e368b3 commit ea38df0
Show file tree
Hide file tree
Showing 2 changed files with 126 additions and 112 deletions.
112 changes: 0 additions & 112 deletions src/cmd/go/go_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3340,118 +3340,6 @@ func TestBadCommandLines(t *testing.T) {
tg.grepStderr("invalid import path \"-x/y\"", "did not reject -x/y import path")
}

func TestBadCgoDirectives(t *testing.T) {
if !canCgo {
t.Skip("no cgo")
}
tooSlow(t)
tg := testgo(t)
defer tg.cleanup()

tg.tempFile("src/x/x.go", "package x\n")
tg.setenv("GOPATH", tg.path("."))

if runtime.Compiler == "gc" {
tg.tempFile("src/x/x.go", `package x
//go:cgo_ldflag "-fplugin=foo.so"
import "C"
`)
tg.runFail("build", "x")
tg.grepStderr("//go:cgo_ldflag .* only allowed in cgo-generated code", "did not reject //go:cgo_ldflag directive")
}

tg.must(os.Remove(tg.path("src/x/x.go")))
tg.runFail("build", "x")
tg.grepStderr("no Go files", "did not report missing source code")
tg.tempFile("src/x/_cgo_yy.go", `package x
//go:cgo_ldflag "-fplugin=foo.so"
import "C"
`)
tg.runFail("build", "x")
tg.grepStderr("no Go files", "did not report missing source code") // _* files are ignored...

if runtime.Compiler == "gc" {
tg.runFail("build", tg.path("src/x/_cgo_yy.go")) // ... but if forced, the comment is rejected
// Actually, today there is a separate issue that _ files named
// on the command line are ignored. Once that is fixed,
// we want to see the cgo_ldflag error.
tg.grepStderr("//go:cgo_ldflag only allowed in cgo-generated code|no Go files", "did not reject //go:cgo_ldflag directive")
}

tg.must(os.Remove(tg.path("src/x/_cgo_yy.go")))

tg.tempFile("src/x/x.go", "package x\n")
tg.tempFile("src/x/y.go", `package x
// #cgo CFLAGS: -fplugin=foo.so
import "C"
`)
tg.runFail("build", "x")
tg.grepStderr("invalid flag in #cgo CFLAGS: -fplugin=foo.so", "did not reject -fplugin")

tg.tempFile("src/x/y.go", `package x
// #cgo CFLAGS: -Ibar -fplugin=foo.so
import "C"
`)
tg.runFail("build", "x")
tg.grepStderr("invalid flag in #cgo CFLAGS: -fplugin=foo.so", "did not reject -fplugin")

tg.tempFile("src/x/y.go", `package x
// #cgo pkg-config: -foo
import "C"
`)
tg.runFail("build", "x")
tg.grepStderr("invalid pkg-config package name: -foo", "did not reject pkg-config: -foo")

tg.tempFile("src/x/y.go", `package x
// #cgo pkg-config: @foo
import "C"
`)
tg.runFail("build", "x")
tg.grepStderr("invalid pkg-config package name: @foo", "did not reject pkg-config: -foo")

tg.tempFile("src/x/y.go", `package x
// #cgo CFLAGS: @foo
import "C"
`)
tg.runFail("build", "x")
tg.grepStderr("invalid flag in #cgo CFLAGS: @foo", "did not reject @foo flag")

tg.tempFile("src/x/y.go", `package x
// #cgo CFLAGS: -D
import "C"
`)
tg.runFail("build", "x")
tg.grepStderr("invalid flag in #cgo CFLAGS: -D without argument", "did not reject trailing -I flag")

// Note that -I @foo is allowed because we rewrite it into -I /path/to/src/@foo
// before the check is applied. There's no such rewrite for -D.

tg.tempFile("src/x/y.go", `package x
// #cgo CFLAGS: -D @foo
import "C"
`)
tg.runFail("build", "x")
tg.grepStderr("invalid flag in #cgo CFLAGS: -D @foo", "did not reject -D @foo flag")

tg.tempFile("src/x/y.go", `package x
// #cgo CFLAGS: -D@foo
import "C"
`)
tg.runFail("build", "x")
tg.grepStderr("invalid flag in #cgo CFLAGS: -D@foo", "did not reject -D@foo flag")

tg.setenv("CGO_CFLAGS", "-D@foo")
tg.tempFile("src/x/y.go", `package x
import "C"
`)
tg.run("build", "-n", "x")
tg.grepStderr("-D@foo", "did not find -D@foo in commands")
}

func TestTwoPkgConfigs(t *testing.T) {
if !canCgo {
t.Skip("no cgo")
Expand Down
126 changes: 126 additions & 0 deletions src/cmd/go/testdata/script/cgo_bad_directives.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
[!cgo] skip
[short] skip

mkdir x
cp x.go.txt x/x.go

# Only allow //go:cgo_ldflag .* in cgo-generated code
[gc] cp x_gc.go.txt x/x.go
[gc] ! go build x
[gc] stderr '//go:cgo_ldflag .* only allowed in cgo-generated code'

# Ignore _* files
rm x/x.go
! go build x
stderr 'no Go files'
cp cgo_yy.go.txt x/_cgo_yy.go
! go build x
stderr 'no Go files' #_* files are ignored...

[gc] ! go build x/_cgo_yy.go # ... but if forced, the comment is rejected
# Actually, today there is a separate issue that _ files named
# on the command line are ignored. Once that is fixed,
# we want to see the cgo_ldflag error.
[gc] stderr '//go:cgo_ldflag only allowed in cgo-generated code|no Go files'

rm x/_cgo_yy.go

# Reject #cgo CFLAGS: -fplugin=foo.so
cp x.go.txt x/x.go
cp y_fplugin.go.txt x/y.go
! go build x
stderr 'invalid flag in #cgo CFLAGS: -fplugin=foo.so'

# Reject #cgo CFLAGS: -lbar -fplugin=foo.so
cp y_lbar_fplugin.go.txt x/y.go
! go build x
stderr 'invalid flag in #cgo CFLAGS: -fplugin=foo.so'

# Reject #cgo pkg-config: -foo
cp y_pkgconfig_dash_foo.txt x/y.go
! go build x
stderr 'invalid pkg-config package name: -foo'

# Reject #cgo pkg-config: @foo
cp y_pkgconfig_at_foo.txt x/y.go
! go build x
stderr 'invalid pkg-config package name: @foo'

# Reject #cgo CFLAGS: @foo
cp y_cflags_at_foo.txt x/y.go
! go build x
stderr 'invalid flag in #cgo CFLAGS: @foo'

# Reject #cgo CFLAGS: -D
cp y_cflags_dash_d.txt x/y.go
! go build x
stderr 'invalid flag in #cgo CFLAGS: -D without argument'

# Note that -I @foo is allowed because we rewrite it into -I /path/to/src/@foo
# before the check is applied. There's no such rewrite for -D.

# Reject #cgo CFLAGS: -D @foo
cp y_cflags_dash_d_space_at_foo.txt x/y.go
! go build x
stderr 'invalid flag in #cgo CFLAGS: -D @foo'

# Reject #cgo CFLAGS -D@foo
cp y_cflags_dash_d_at_foo.txt x/y.go
! go build x
stderr 'invalid flag in #cgo CFLAGS: -D@foo'

# Check for CFLAGS in commands
env CGO_CFLAGS=-D@foo
cp y_no_cflags.txt x/y.go
go build -n x
stderr '-D@foo'

-- x_gc.go.txt --
package x

//go:cgo_ldflag "-fplugin=foo.so"

import "C"
-- cgo_yy.go.txt --
package x

//go:cgo_ldflag "-fplugin=foo.so"

import "C"
-- x.go.txt --
package x
-- y_fplugin.go.txt --
package x
// #cgo CFLAGS: -fplugin=foo.so
import "C"
-- y_lbar_fplugin.go.txt --
package x
// #cgo CFLAGS: -Ibar -fplugin=foo.so
import "C"
-- y_pkgconfig_dash_foo.txt --
package x
// #cgo pkg-config: -foo
import "C"
-- y_pkgconfig_at_foo.txt --
package x
// #cgo pkg-config: @foo
import "C"
-- y_cflags_at_foo.txt --
package x
// #cgo CFLAGS: @foo
import "C"
-- y_cflags_dash_d.txt --
package x
// #cgo CFLAGS: -D
import "C"
-- y_cflags_dash_d_space_at_foo.txt --
package x
// #cgo CFLAGS: -D @foo
import "C"
-- y_cflags_dash_d_at_foo.txt --
package x
// #cgo CFLAGS: -D@foo
import "C"
-- y_no_cflags.txt --
package x
import "C"

0 comments on commit ea38df0

Please sign in to comment.