]> Cypherpunks repositories - gostls13.git/commitdiff
misc/cgo/stdio: fix tests in module mode
authorBryan C. Mills <bcmills@google.com>
Fri, 22 Feb 2019 17:14:23 +0000 (12:14 -0500)
committerBryan C. Mills <bcmills@google.com>
Sun, 24 Feb 2019 00:40:20 +0000 (00:40 +0000)
Updates #30228

Change-Id: I4d213c6fe68c47ccb877f13b55128e035f76a26b
Reviewed-on: https://go-review.googlesource.com/c/163421
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
12 files changed:
misc/cgo/stdio/overlaydir_test.go [new file with mode: 0644]
misc/cgo/stdio/stdio_test.go [new file with mode: 0644]
misc/cgo/stdio/testdata/chain.go [moved from misc/cgo/stdio/chain.go with 98% similarity]
misc/cgo/stdio/testdata/chain.out [moved from misc/cgo/stdio/chain.out with 100% similarity]
misc/cgo/stdio/testdata/fib.go [moved from misc/cgo/stdio/fib.go with 98% similarity]
misc/cgo/stdio/testdata/fib.out [moved from misc/cgo/stdio/fib.out with 100% similarity]
misc/cgo/stdio/testdata/hello.go [moved from misc/cgo/stdio/hello.go with 92% similarity]
misc/cgo/stdio/testdata/hello.out [moved from misc/cgo/stdio/hello.out with 100% similarity]
misc/cgo/stdio/testdata/run.out [moved from misc/cgo/stdio/run.out with 100% similarity]
misc/cgo/stdio/testdata/stdio/file.go [moved from misc/cgo/stdio/file.go with 100% similarity]
misc/cgo/stdio/testdata/stdio/stdio.go [moved from misc/cgo/stdio/stdio.go with 100% similarity]
src/cmd/dist/test.go

diff --git a/misc/cgo/stdio/overlaydir_test.go b/misc/cgo/stdio/overlaydir_test.go
new file mode 100644 (file)
index 0000000..8a8dcdb
--- /dev/null
@@ -0,0 +1,81 @@
+// Copyright 2019 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.
+
+package stdio_test
+
+import (
+       "io"
+       "os"
+       "path/filepath"
+       "strings"
+)
+
+// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
+//
+// TODO: Once we no longer need to support the misc module in GOPATH mode,
+// factor this function out into a package to reduce duplication.
+func overlayDir(dstRoot, srcRoot string) error {
+       dstRoot = filepath.Clean(dstRoot)
+       if err := os.MkdirAll(dstRoot, 0777); err != nil {
+               return err
+       }
+
+       symBase, err := filepath.Rel(srcRoot, dstRoot)
+       if err != nil {
+               symBase, err = filepath.Abs(srcRoot)
+               if err != nil {
+                       return err
+               }
+       }
+
+       return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
+               if err != nil || srcPath == srcRoot {
+                       return err
+               }
+
+               suffix := strings.TrimPrefix(srcPath, srcRoot)
+               for len(suffix) > 0 && suffix[0] == filepath.Separator {
+                       suffix = suffix[1:]
+               }
+               dstPath := filepath.Join(dstRoot, suffix)
+
+               perm := info.Mode() & os.ModePerm
+               if info.Mode()&os.ModeSymlink != 0 {
+                       info, err = os.Stat(srcPath)
+                       if err != nil {
+                               return err
+                       }
+                       perm = info.Mode() & os.ModePerm
+               }
+
+               // Always copy directories (don't symlink them).
+               // If we add a file in the overlay, we don't want to add it in the original.
+               if info.IsDir() {
+                       return os.Mkdir(dstPath, perm)
+               }
+
+               // If the OS supports symlinks, use them instead of copying bytes.
+               if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+                       return nil
+               }
+
+               // Otherwise, copy the bytes.
+               src, err := os.Open(srcPath)
+               if err != nil {
+                       return err
+               }
+               defer src.Close()
+
+               dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
+               if err != nil {
+                       return err
+               }
+
+               _, err = io.Copy(dst, src)
+               if closeErr := dst.Close(); err == nil {
+                       err = closeErr
+               }
+               return err
+       })
+}
diff --git a/misc/cgo/stdio/stdio_test.go b/misc/cgo/stdio/stdio_test.go
new file mode 100644 (file)
index 0000000..cb32da8
--- /dev/null
@@ -0,0 +1,60 @@
+// Copyright 2019 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.
+
+package stdio_test
+
+import (
+       "bytes"
+       "io/ioutil"
+       "log"
+       "os"
+       "os/exec"
+       "path/filepath"
+       "strings"
+       "testing"
+)
+
+func TestMain(m *testing.M) {
+       log.SetFlags(log.Lshortfile)
+       os.Exit(testMain(m))
+}
+
+func testMain(m *testing.M) int {
+       GOPATH, err := ioutil.TempDir("", "cgostdio")
+       if err != nil {
+               log.Panic(err)
+       }
+       defer os.RemoveAll(GOPATH)
+       os.Setenv("GOPATH", GOPATH)
+
+       // Copy testdata into GOPATH/src/cgostdio, along with a go.mod file
+       // declaring the same path.
+       modRoot := filepath.Join(GOPATH, "src", "cgostdio")
+       if err := overlayDir(modRoot, "testdata"); err != nil {
+               log.Panic(err)
+       }
+       if err := os.Chdir(modRoot); err != nil {
+               log.Panic(err)
+       }
+       if err := ioutil.WriteFile("go.mod", []byte("module cgostdio\n"), 0666); err != nil {
+               log.Panic(err)
+       }
+
+       return m.Run()
+}
+
+func TestTestRun(t *testing.T) {
+       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)
+       }
+       t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
+}
similarity index 98%
rename from misc/cgo/stdio/chain.go
rename to misc/cgo/stdio/testdata/chain.go
index cdc385208c9898ee7111b2b1f21b7d0d4d20d3fa..6c3f406a0da3f5439bc05741857f9978da0315be 100644 (file)
@@ -14,7 +14,7 @@ import (
        "runtime"
        "strconv"
 
-       "../stdio"
+       "cgostdio/stdio"
 )
 
 const N = 10
similarity index 98%
rename from misc/cgo/stdio/fib.go
rename to misc/cgo/stdio/testdata/fib.go
index 58f185c90f05105d521ab017ec866c1eb60cb78d..49cb0ea06f23c8f59973dce88fdcc381b80e66fe 100644 (file)
@@ -17,7 +17,7 @@ import (
        "runtime"
        "strconv"
 
-       "../stdio"
+       "cgostdio/stdio"
 )
 
 func fibber(c, out chan int64, i int64) {
similarity index 92%
rename from misc/cgo/stdio/hello.go
rename to misc/cgo/stdio/testdata/hello.go
index 56220d34be324cd602cf007a61f418c7cdfc0b74..046bfee7a7915a907f2d8df143889d45bbb1f80a 100644 (file)
@@ -8,7 +8,7 @@
 
 package main
 
-import "../stdio"
+import "cgostdio/stdio"
 
 func main() {
        stdio.Stdout.WriteString(stdio.Greeting + "\n")
index a03803b911697649ccaf3b48697c888e135a9bec..1eabb85639d643ba36c0aff6fd9e88e0fc83fa33 100644 (file)
@@ -611,7 +611,7 @@ func (t *tester) registerTests() {
                        name:    "cgo_stdio",
                        heading: "../misc/cgo/stdio",
                        fn: func(dt *distTest) error {
-                               t.addCmd(dt, "misc/cgo/stdio", "go", "run", filepath.Join(os.Getenv("GOROOT"), "test/run.go"), "-", ".")
+                               t.addCmd(dt, "misc/cgo/stdio", t.goTest(), t.timeout(120))
                                return nil
                        },
                })