From 9c298036b9b67db40e5df0169bdc5e4ff3cf2851 Mon Sep 17 00:00:00 2001 From: Derek Parker Date: Fri, 12 Sep 2014 15:19:36 -0500 Subject: [PATCH] Rebuild binaries for every test --- _helper/helper.go | 15 ++++++++++- dwarf/frame/frame_table_test.go | 13 +++++----- dwarf/line/line_parser_test.go | 43 +++++++++++++++----------------- dwarf/line/state_machine_test.go | 15 ++++++++++- 4 files changed, 55 insertions(+), 31 deletions(-) diff --git a/_helper/helper.go b/_helper/helper.go index 9edfed8a..19d7696e 100644 --- a/_helper/helper.go +++ b/_helper/helper.go @@ -1,6 +1,7 @@ package helper import ( + "os" "os/exec" "runtime" "syscall" @@ -22,6 +23,11 @@ func GetRegisters(p *proctl.DebuggedProcess, t *testing.T) *syscall.PtraceRegs { func WithTestProcess(name string, t *testing.T, fn testfunc) { runtime.LockOSThread() + err := CompileTestProg(name) + if err != nil { + t.Fatalf("Could not compile %s due to %s", name, err) + } + cmd, err := startTestProcess(name) if err != nil { t.Fatal("Starting test process:", err) @@ -32,11 +38,18 @@ func WithTestProcess(name string, t *testing.T, fn testfunc) { if err != nil { t.Fatal("NewDebugProcess():", err) } - defer cmd.Process.Kill() + defer func() { + cmd.Process.Kill() + os.Remove(name) + }() fn(p) } +func CompileTestProg(source string) error { + return exec.Command("go", "build", "-gcflags=-N -l", "-o", source, source+".go").Run() +} + func startTestProcess(name string) (*exec.Cmd, error) { cmd := exec.Command(name) diff --git a/dwarf/frame/frame_table_test.go b/dwarf/frame/frame_table_test.go index 5a30d8ad..32083a5e 100644 --- a/dwarf/frame/frame_table_test.go +++ b/dwarf/frame/frame_table_test.go @@ -13,14 +13,15 @@ import ( ) func TestFindReturnAddress(t *testing.T) { - var ( - testfile, _ = filepath.Abs("../../_fixtures/testnextprog") - dbframe = dwarfhelper.GrabDebugFrameSection(testfile, t) - fdes = frame.Parse(dbframe) - gsd = dwarfhelper.GosymData(testfile, t) - ) + var testfile, _ = filepath.Abs("../../_fixtures/testnextprog") helper.WithTestProcess(testfile, t, func(p *proctl.DebuggedProcess) { + var ( + dbframe = dwarfhelper.GrabDebugFrameSection(testfile, t) + fdes = frame.Parse(dbframe) + gsd = dwarfhelper.GosymData(testfile, t) + ) + testsourcefile := testfile + ".go" start, _, err := gsd.LineToPC(testsourcefile, 22) if err != nil { diff --git a/dwarf/line/line_parser_test.go b/dwarf/line/line_parser_test.go index c78b247c..aa7a2a06 100644 --- a/dwarf/line/line_parser_test.go +++ b/dwarf/line/line_parser_test.go @@ -3,6 +3,7 @@ package line import ( "debug/elf" "os" + "os/exec" "path/filepath" "strings" "testing" @@ -10,12 +11,7 @@ import ( "github.com/davecheney/profile" ) -func grabDebugLineSection(fp string, t *testing.T) []byte { - p, err := filepath.Abs(fp) - if err != nil { - t.Fatal(err) - } - +func grabDebugLineSection(p string, t *testing.T) []byte { f, err := os.Open(p) if err != nil { t.Fatal(err) @@ -36,24 +32,24 @@ func grabDebugLineSection(fp string, t *testing.T) []byte { func TestDebugLinePrologueParser(t *testing.T) { // Test against known good values, from readelf --debug-dump=rawline _fixtures/testnextprog - var ( - data = grabDebugLineSection("../../_fixtures/testnextprog", t) - dbl = Parse(data) - prologue = dbl.Prologue - ) - - if prologue.Length != uint32(60685) { - t.Fatal("Length was not parsed correctly", prologue.Length) + p, err := filepath.Abs("../../_fixtures/testnextprog") + if err != nil { + t.Fatal(err) } + err = exec.Command("go", "build", "-gcflags=-N -l", "-o", p, p+".go").Run() + if err != nil { + t.Fatal("Could not compile test file", p, err) + } + defer os.Remove(p) + data := grabDebugLineSection(p, t) + dbl := Parse(data) + prologue := dbl.Prologue + if prologue.Version != uint16(2) { t.Fatal("Version not parsed correctly", prologue.Version) } - if prologue.PrologueLength != uint32(5363) { - t.Fatal("Prologue Length not parsed correctly", prologue.PrologueLength) - } - if prologue.MinInstrLength != uint8(1) { t.Fatal("Minimun Instruction Length not parsed correctly", prologue.MinInstrLength) } @@ -85,10 +81,6 @@ func TestDebugLinePrologueParser(t *testing.T) { t.Fatal("Include dirs not parsed correctly") } - if len(dbl.FileNames) != 126 { - t.Fatal("Filenames not parsed correctly", len(dbl.FileNames)) - } - if !strings.Contains(dbl.FileNames[0].Name, "/dbg/_fixtures/testnextprog.go") { t.Fatal("First entry not parsed correctly") } @@ -96,7 +88,12 @@ func TestDebugLinePrologueParser(t *testing.T) { func BenchmarkLineParser(b *testing.B) { defer profile.Start(profile.MemProfile).Stop() - data := grabDebugLineSection("../../_fixtures/testnextprog", nil) + p, err := filepath.Abs("../../_fixtures/testnextprog") + if err != nil { + b.Fatal(err) + } + + data := grabDebugLineSection(p, nil) b.ResetTimer() for i := 0; i < b.N; i++ { diff --git a/dwarf/line/state_machine_test.go b/dwarf/line/state_machine_test.go index 759b1f14..ff117c9b 100644 --- a/dwarf/line/state_machine_test.go +++ b/dwarf/line/state_machine_test.go @@ -1,6 +1,8 @@ package line import ( + "os" + "os/exec" "path/filepath" "testing" @@ -14,8 +16,19 @@ func init() { } func TestNextLocAfterPC(t *testing.T) { + p, err := filepath.Abs("../../_fixtures/testnextprog") + if err != nil { + t.Fatal(err) + } + + err = exec.Command("go", "build", "-gcflags=-N -l", "-o", p, p+".go").Run() + if err != nil { + t.Fatal("Could not compile test file", p, err) + } + defer os.Remove(p) + var ( - data = grabDebugLineSection("../../_fixtures/testnextprog", t) + data = grabDebugLineSection(p, t) dbl = Parse(data) gosym = dwarfhelper.GosymData(testfile, t) pc, _, _ = gosym.LineToPC(testfile+".go", 20)