The misc/cgo/life and misc/cgo/stdio tests started out as fairly simple
test cases when they were added, but the machinery to execute them has
grown in complexity over the years.
They currently reuse the test/run.go runner and its "run" action without
needing much of the additional flexibility that said runner implements.
Given that runner isn't well documented, it makes it harder to see that
ultimately these tests just do 'go run' on a few test programs and check
that the output matches a golden file.
Maybe these test cases should move out of misc to be near similar tests,
or the machinery to execute them can made available in a package that is
easier and safer to reuse. I'd rather not block the refactor of the test
directory runner on that, so for now rewrite these to be self-contained.
Also delete misc/cgo/stdio/testdata/run.out which has no effect on the
test. It was seemingly accidentally kept behind during the refactor in
CL
6220049.
For #56844.
Change-Id: I5e2f542824925092cdddb03b44b6295a4136ccb4
Reviewed-on: https://go-review.googlesource.com/c/go/+/465755
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: Austin Clements <austin@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Auto-Submit: Dmitri Shuralyov <dmitshur@golang.org>
Run-TryBot: Dmitri Shuralyov <dmitshur@golang.org>
"os"
"os/exec"
"path/filepath"
- "strings"
"testing"
)
return m.Run()
}
+// TestTestRun runs a test case for cgo //export.
func TestTestRun(t *testing.T) {
if os.Getenv("GOOS") == "android" {
t.Skip("the go tool runs with CGO_ENABLED=0 on the android device")
}
- out, err := exec.Command("go", "env", "GOROOT").Output()
+
+ cmd := exec.Command("go", "run", "main.go")
+ got, err := cmd.CombinedOutput()
if err != nil {
- t.Fatal(err)
+ t.Fatalf("%v: %s\n%s", cmd, err, got)
}
- GOROOT := string(bytes.TrimSpace(out))
-
- cmd := exec.Command("go", "run", filepath.Join(GOROOT, "test", "run.go"), "-", ".")
- out, err = cmd.CombinedOutput()
+ want, err := os.ReadFile("main.out")
if err != nil {
- t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+ t.Fatal("reading golden output:", err)
+ }
+ if !bytes.Equal(got, want) {
+ t.Errorf("'%v' output does not match expected in main.out. Instead saw:\n%s", cmd, got)
}
- t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
}
-// skip
-
// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// run -tags=use_go_run
-
// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build test_run
+//go:build test_run
// Run the game of life in C using Go for parallelization.
return m.Run()
}
+// TestTestRun runs a cgo test that doesn't depend on non-standard libraries.
func TestTestRun(t *testing.T) {
if os.Getenv("GOOS") == "android" {
t.Skip("subpackage stdio is not available on android")
}
- out, err := exec.Command("go", "env", "GOROOT").Output()
- if err != nil {
- t.Fatal(err)
- }
- GOROOT := string(bytes.TrimSpace(out))
- cmd := exec.Command("go", "run", filepath.Join(GOROOT, "test", "run.go"), "-", ".")
- out, err = cmd.CombinedOutput()
- if err != nil {
- t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+ for _, file := range [...]string{
+ "chain.go",
+ "fib.go",
+ "hello.go",
+ } {
+ file := file
+ wantFile := strings.Replace(file, ".go", ".out", 1)
+ t.Run(file, func(t *testing.T) {
+ cmd := exec.Command("go", "run", file)
+ got, err := cmd.CombinedOutput()
+ if err != nil {
+ t.Fatalf("%v: %s\n%s", cmd, err, got)
+ }
+ got = bytes.ReplaceAll(got, []byte("\r\n"), []byte("\n"))
+ want, err := os.ReadFile(wantFile)
+ if err != nil {
+ t.Fatal("reading golden output:", err)
+ }
+ if !bytes.Equal(got, want) {
+ t.Errorf("'%v' output does not match expected in %s. Instead saw:\n%s", cmd, wantFile, got)
+ }
+ })
}
- t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
}
-// run -tags=use_go_run
-
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build test_run
+//go:build test_run
// Pass numbers along a chain of threads.
-// run -tags=use_go_run
-
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build test_run
+//go:build test_run
// Compute Fibonacci numbers with two goroutines
// that pass integers back and forth. No actual
-// run -tags=use_go_run
-
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build test_run
+//go:build test_run
package main
+++ /dev/null
-* hello
-hello, world
-* fib
-0
-1
-1
-2
-3
-5
-8
-13
-21
-34
-55
-89
-144
-233
-377
-610
-987
-1597
-2584
-4181
-6765
-10946
-17711
-28657
-46368
-75025
-121393
-196418
-317811
-514229
-832040
-1346269
-2178309
-3524578
-5702887
-9227465
-14930352
-24157817
-39088169
-63245986
-102334155
-165580141
-267914296
-433494437
-701408733
-1134903170
-1836311903
-2971215073
-4807526976
-7778742049
-12586269025
-20365011074
-32951280099
-53316291173
-86267571272
-139583862445
-225851433717
-365435296162
-591286729879
-956722026041
-1548008755920
-2504730781961
-4052739537881
-6557470319842
-10610209857723
-17167680177565
-27777890035288
-44945570212853
-72723460248141
-117669030460994
-190392490709135
-308061521170129
-498454011879264
-806515533049393
-1304969544928657
-2111485077978050
-3416454622906707
-5527939700884757
-8944394323791464
-14472334024676221
-23416728348467685
-37889062373143906
-61305790721611591
-99194853094755497
-160500643816367088
-259695496911122585
-420196140727489673
-679891637638612258
-1100087778366101931
-1779979416004714189
-2880067194370816120
-* chain
-0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-// skip
-
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// skip
-
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.