x/debug: add optional flags to peek_test to allow it to use existing binaries for the test, instead of rebuilding them.
Change-Id: I9177c534ee193e7ba301817bbe7167b2b319733b
Reviewed-on: https://go-review.googlesource.com/19943
Reviewed-by: Dave Day <djd@golang.org>
diff --git a/tests/peek/peek_test.go b/tests/peek/peek_test.go
index 8d00a93..c1ec148 100644
--- a/tests/peek/peek_test.go
+++ b/tests/peek/peek_test.go
@@ -5,11 +5,13 @@
package peek_test
import (
+ "flag"
"fmt"
"log"
"os"
"os/exec"
"reflect"
+ "sync"
"testing"
"golang.org/x/debug"
@@ -389,6 +391,34 @@
return j == len(s)
}
+const (
+ proxySrc = "golang.org/x/debug/cmd/debugproxy"
+ traceeSrc = "golang.org/x/debug/tests/peek/testdata"
+)
+
+var (
+ // Locations of the proxy and tracee executables.
+ proxyBinary = "./debugproxy.out"
+ traceeBinary = "./tracee.out"
+ // Onces that ensure initProxy and initTracee are called at most once.
+ proxyOnce sync.Once
+ traceeOnce sync.Once
+ // Flags for setting the location of the proxy and tracee, so they don't need to be built.
+ proxyFlag = flag.String("proxy", "", "Location of debugproxy. If empty, proxy will be built.")
+ traceeFlag = flag.String("target", "", "Location of target. If empty, target will be built.")
+ // Executables this test has built, which will be removed on completion of the tests.
+ filesToRemove []string
+)
+
+func TestMain(m *testing.M) {
+ flag.Parse()
+ x := m.Run()
+ for _, f := range filesToRemove {
+ os.Remove(f)
+ }
+ os.Exit(x)
+}
+
func run(name string, args ...string) error {
cmd := exec.Command(name, args...)
cmd.Stdout = os.Stdout
@@ -396,33 +426,32 @@
return cmd.Run()
}
-const (
- proxySrc = "golang.org/x/debug/cmd/debugproxy"
- proxyBinary = "./debugproxy.out"
- traceeSrc = "golang.org/x/debug/tests/peek/testdata"
- traceeBinary = "./tracee.out"
-)
-
-func TestMain(m *testing.M) {
- os.Exit(buildAndRunTests(m))
+func initProxy() {
+ if *proxyFlag != "" {
+ proxyBinary = *proxyFlag
+ remote.DebugproxyCmd = proxyBinary
+ return
+ }
+ if err := run("go", "build", "-o", proxyBinary, proxySrc); err != nil {
+ log.Fatalf("couldn't build proxy: %v", err)
+ }
+ filesToRemove = append(filesToRemove, proxyBinary)
+ remote.DebugproxyCmd = proxyBinary
}
-func buildAndRunTests(m *testing.M) int {
- if err := run("go", "build", "-o", proxyBinary, proxySrc); err != nil {
- fmt.Println(err)
- return 1
+func initTracee() {
+ if *traceeFlag != "" {
+ traceeBinary = *traceeFlag
+ return
}
- remote.DebugproxyCmd = proxyBinary
- defer os.Remove(proxyBinary)
if err := run("go", "build", "-o", traceeBinary, traceeSrc); err != nil {
- fmt.Println(err)
- return 1
+ log.Fatalf("couldn't build target: %v", err)
}
- defer os.Remove(traceeBinary)
- return m.Run()
+ filesToRemove = append(filesToRemove, traceeBinary)
}
func TestLocalProgram(t *testing.T) {
+ traceeOnce.Do(initTracee)
prog, err := local.New(traceeBinary)
if err != nil {
t.Fatal("local.New:", err)
@@ -431,6 +460,8 @@
}
func TestRemoteProgram(t *testing.T) {
+ traceeOnce.Do(initTracee)
+ proxyOnce.Do(initProxy)
prog, err := remote.New("localhost", traceeBinary)
if err != nil {
t.Fatal("remote.New:", err)
@@ -547,7 +578,7 @@
}
// Set a breakpoint at line 125, resume, and check we stopped there.
- pcsLine125, err := prog.BreakpointAtLine("tracee/main.go", 125)
+ pcsLine125, err := prog.BreakpointAtLine("testdata/main.go", 125)
if err != nil {
t.Fatal("BreakpointAtLine:", err)
}