]> Cypherpunks repositories - gostls13.git/commitdiff
test: add ability to run tests with dynamic linking
authorMichael Hudson-Doyle <michael.hudson@canonical.com>
Tue, 27 Oct 2015 01:54:19 +0000 (14:54 +1300)
committerRuss Cox <rsc@golang.org>
Tue, 24 Nov 2015 17:15:43 +0000 (17:15 +0000)
This is a bit ugly but it's a useful test. Run go install -buildmode=shared std
and then go run run.go -linkshared (it passes on linux/amd64).

Change-Id: I5684c79cd03817fa1fc399788b7320f8535c08da
Reviewed-on: https://go-review.googlesource.com/16343
Reviewed-by: Russ Cox <rsc@golang.org>
test/run.go

index 22cec9b992ae41c8f8ca8c719b9e1511f34f2ebe..d3f58b77829edcf0909ec974cf449e3b983e9f5e 100644 (file)
@@ -37,6 +37,7 @@ var (
        numParallel    = flag.Int("n", runtime.NumCPU(), "number of parallel tests to run")
        summary        = flag.Bool("summary", false, "show summary of results")
        showSkips      = flag.Bool("show_skips", false, "show skipped tests")
+       linkshared     = flag.Bool("linkshared", false, "")
        updateErrors   = flag.Bool("update_errors", false, "update error messages in test file based on compiler output")
        runoutputLimit = flag.Int("l", defaultRunOutputLimit(), "number of parallel runoutput tests to run")
 
@@ -191,11 +192,19 @@ func goFiles(dir string) []string {
 type runCmd func(...string) ([]byte, error)
 
 func compileFile(runcmd runCmd, longname string) (out []byte, err error) {
-       return runcmd("go", "tool", "compile", "-e", longname)
+       cmd := []string{"go", "tool", "compile", "-e"}
+       if *linkshared {
+               cmd = append(cmd, "-dynlink", "-installsuffix=dynlink")
+       }
+       cmd = append(cmd, longname)
+       return runcmd(cmd...)
 }
 
 func compileInDir(runcmd runCmd, dir string, names ...string) (out []byte, err error) {
        cmd := []string{"go", "tool", "compile", "-e", "-D", ".", "-I", "."}
+       if *linkshared {
+               cmd = append(cmd, "-dynlink", "-installsuffix=dynlink")
+       }
        for _, name := range names {
                cmd = append(cmd, filepath.Join(dir, name))
        }
@@ -204,7 +213,12 @@ func compileInDir(runcmd runCmd, dir string, names ...string) (out []byte, err e
 
 func linkFile(runcmd runCmd, goname string) (err error) {
        pfile := strings.Replace(goname, ".go", ".o", -1)
-       _, err = runcmd("go", "tool", "link", "-w", "-o", "a.exe", "-L", ".", pfile)
+       cmd := []string{"go", "tool", "link", "-w", "-o", "a.exe", "-L", "."}
+       if *linkshared {
+               cmd = append(cmd, "-linkshared", "-installsuffix=dynlink")
+       }
+       cmd = append(cmd, pfile)
+       _, err = runcmd(cmd...)
        return
 }
 
@@ -513,6 +527,7 @@ func (t *test) run() {
 
        case "errorcheck":
                cmdline := []string{"go", "tool", "compile", "-e", "-o", "a.o"}
+               // No need to add -dynlink even if linkshared if we're just checking for errors...
                cmdline = append(cmdline, flags...)
                cmdline = append(cmdline, long)
                out, err := runcmd(cmdline...)
@@ -628,7 +643,12 @@ func (t *test) run() {
 
        case "run":
                useTmp = false
-               out, err := runcmd(append([]string{"go", "run", t.goFileName()}, args...)...)
+               cmd := []string{"go", "run"}
+               if *linkshared {
+                       cmd = append(cmd, "-linkshared")
+               }
+               cmd = append(cmd, t.goFileName())
+               out, err := runcmd(append(cmd, args...)...)
                if err != nil {
                        t.err = err
                        return
@@ -643,7 +663,12 @@ func (t *test) run() {
                        <-rungatec
                }()
                useTmp = false
-               out, err := runcmd(append([]string{"go", "run", t.goFileName()}, args...)...)
+               cmd := []string{"go", "run"}
+               if *linkshared {
+                       cmd = append(cmd, "-linkshared")
+               }
+               cmd = append(cmd, t.goFileName())
+               out, err := runcmd(append(cmd, args...)...)
                if err != nil {
                        t.err = err
                        return
@@ -653,7 +678,12 @@ func (t *test) run() {
                        t.err = fmt.Errorf("write tempfile:%s", err)
                        return
                }
-               out, err = runcmd("go", "run", tfile)
+               cmd = []string{"go", "run"}
+               if *linkshared {
+                       cmd = append(cmd, "-linkshared")
+               }
+               cmd = append(cmd, tfile)
+               out, err = runcmd(cmd...)
                if err != nil {
                        t.err = err
                        return
@@ -664,7 +694,12 @@ func (t *test) run() {
 
        case "errorcheckoutput":
                useTmp = false
-               out, err := runcmd(append([]string{"go", "run", t.goFileName()}, args...)...)
+               cmd := []string{"go", "run"}
+               if *linkshared {
+                       cmd = append(cmd, "-linkshared")
+               }
+               cmd = append(cmd, t.goFileName())
+               out, err := runcmd(append(cmd, args...)...)
                if err != nil {
                        t.err = err
                        return