dwtest: add a flag to preserve tmp files following a test run
Add a "-keep" flag to the test that preserves the top level temp dir
to allow developers to inspect intermediate executables, etc. Helpful
for debugging test failures.
Change-Id: Ie0e729fde45e953536203b4a008aeceef7333006
Reviewed-on: https://go-review.googlesource.com/c/debug/+/504835
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Than McIntosh <thanm@google.com>
Reviewed-by: David Chase <drchase@google.com>
diff --git a/dwtest/dwloc_test.go b/dwtest/dwloc_test.go
index 0184c0e..17aceb3 100644
--- a/dwtest/dwloc_test.go
+++ b/dwtest/dwloc_test.go
@@ -28,6 +28,8 @@
import (
"bytes"
+ "flag"
+ "fmt"
"os"
"os/exec"
"path/filepath"
@@ -38,13 +40,15 @@
"golang.org/x/debug/internal/testenv"
)
+var preserveTemp = flag.Bool("keep", false, "keep tmpdir files for debugging")
+
// copyFilesForHarness copies various files into the build dir for the
// harness, including the main package, go.mod, and a copy of the
// dwtest package (the latter is why we are doing an explicit copy as
// opposed to just building directly from sources in testdata).
// Return value is the path to a build directory for the harness
// build.
-func copyFilesForHarness(t *testing.T) string {
+func copyFilesForHarness(t *testing.T, dir string) string {
mkdir := func(d string) {
if err := os.Mkdir(d, 0777); err != nil {
t.Fatalf("mkdir failed: %v", err)
@@ -61,7 +65,7 @@
}
}
join := filepath.Join
- bd := join(t.TempDir(), "build")
+ bd := join(dir, "build")
bdt := join(bd, "dwtest")
mkdir(bd)
mkdir(bdt)
@@ -73,13 +77,13 @@
}
// buildHarness builds the helper program "dwdumploc.exe".
-func buildHarness(t *testing.T) string {
+func buildHarness(t *testing.T, dir string) string {
// Copy source files into build dir.
- bd := copyFilesForHarness(t)
+ bd := copyFilesForHarness(t, dir)
// Run build.
- harnessPath := filepath.Join(t.TempDir(), "dumpdwloc.exe")
+ harnessPath := filepath.Join(dir, "dumpdwloc.exe")
cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", harnessPath)
cmd.Dir = bd
if b, err := cmd.CombinedOutput(); err != nil {
@@ -106,12 +110,12 @@
// gobuild is a helper to bulid a Go program from source code,
// so that we can inspect selected bits of DWARF in the resulting binary.
// Return value is binary path.
-func gobuild(t *testing.T, sourceCode string, pname string) string {
- spath := filepath.Join(t.TempDir(), pname+".go")
+func gobuild(t *testing.T, sourceCode string, pname string, dir string) string {
+ spath := filepath.Join(dir, pname+".go")
if err := os.WriteFile(spath, []byte(sourceCode), 0644); err != nil {
t.Fatalf("write to %s failed: %s", spath, err)
}
- epath := filepath.Join(t.TempDir(), pname+".exe")
+ epath := filepath.Join(dir, pname+".exe")
// A note on this build: Delve currently has problems digesting
// PIE binaries on Windows; until this can be straightened out,
@@ -242,13 +246,23 @@
t.Skipf("unsupported OS/ARCH pair %s (this tests supports only OS values supported by Delve", pair)
}
+ tdir := t.TempDir()
+ if *preserveTemp {
+ if td, err := os.MkdirTemp("", "dwloctest"); err != nil {
+ t.Fatal(err)
+ } else {
+ tdir = td
+ fmt.Fprintf(os.Stderr, "** preserving tmpdir %s\n", td)
+ }
+ }
+
// Build test harness.
- harnessPath := buildHarness(t)
+ harnessPath := buildHarness(t, tdir)
// Build program to inspect. NB: we're building at default (with
// optimization); it might also be worth doing a "-l -N" build
// to verify the location expressions in that case.
- ppath := gobuild(t, programSourceCode, "prog")
+ ppath := gobuild(t, programSourceCode, "prog", tdir)
// Sub-tests for each function we want to inspect.
t.Run("Issue47354", func(t *testing.T) {