proctl_test.go 3.0 KB
Newer Older
D
Derek Parker 已提交
1 2 3 4
package proctl

import (
	"os/exec"
5
	"syscall"
D
Derek Parker 已提交
6 7 8
	"testing"
)

9 10
func StartTestProcess(name string) (*exec.Cmd, error) {
	cmd := exec.Command("../fixtures/" + name)
D
Derek Parker 已提交
11 12 13

	err := cmd.Start()
	if err != nil {
14
		return nil, err
D
Derek Parker 已提交
15 16
	}

17
	return cmd, nil
D
Derek Parker 已提交
18 19
}

20
func TestAttachProcess(t *testing.T) {
21
	cmd, err := StartTestProcess("testprog")
22 23 24 25 26 27 28 29 30 31 32 33 34
	if err != nil {
		t.Fatal("Starting test process:", err)
	}

	pid := cmd.Process.Pid
	p, err := NewDebugProcess(pid)
	if err != nil {
		t.Fatal("NewDebugProcess():", err)
	}

	if !p.ProcessState.Sys().(syscall.WaitStatus).Stopped() {
		t.Errorf("Process was not stopped correctly")
	}
35 36

	cmd.Process.Kill()
37 38
}

D
Derek Parker 已提交
39
func TestStep(t *testing.T) {
40
	cmd, err := StartTestProcess("testprog")
D
Derek Parker 已提交
41 42 43 44
	if err != nil {
		t.Fatal("Starting test process:", err)
	}

45
	pid := cmd.Process.Pid
D
Derek Parker 已提交
46 47 48 49 50 51 52
	p, err := NewDebugProcess(pid)
	if err != nil {
		t.Fatal("NewDebugProcess():", err)
	}

	regs, err := p.Registers()
	if err != nil {
53
		t.Fatal("Registers():", err, pid)
D
Derek Parker 已提交
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
	}

	rip := regs.PC()

	err = p.Step()
	if err != nil {
		t.Fatal("Step():", err)
	}

	regs, err = p.Registers()
	if err != nil {
		t.Fatal("Registers():", err)
	}

	if rip >= regs.PC() {
		t.Errorf("Expected %#v to be greater than %#v", regs.PC(), rip)
	}
71 72

	cmd.Process.Kill()
D
Derek Parker 已提交
73
}
74 75

func TestContinue(t *testing.T) {
76
	cmd, err := StartTestProcess("continuetestprog")
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
	if err != nil {
		t.Fatal("Starting test process:", err)
	}

	pid := cmd.Process.Pid
	p, err := NewDebugProcess(pid)
	if err != nil {
		t.Fatal("NewDebugProcess():", err)
	}

	if p.ProcessState.Exited() {
		t.Fatal("Process already exited")
	}

	err = p.Continue()
	if err != nil {
		t.Fatal("Continue():", err)
	}

96 97
	if !p.ProcessState.Success() {
		t.Fatal("Process did not exit successfully")
98 99
	}
}
100 101 102 103 104 105 106 107 108 109 110 111 112

func TestBreakPoint(t *testing.T) {
	cmd, err := StartTestProcess("testprog")
	if err != nil {
		t.Fatal("Starting test process:", err)
	}

	pid := cmd.Process.Pid
	p, err := NewDebugProcess(pid)
	if err != nil {
		t.Fatal("NewDebugProcess():", err)
	}

113
	_, err = p.Break("main.sleepytime")
114 115 116 117 118
	if err != nil {
		t.Fatal("Break():", err)
	}

	sleepytimefunc := p.GoSymTable.LookupFunc("main.sleepytime")
119
	sleepyaddr := sleepytimefunc.Entry
120 121 122 123 124 125 126 127 128 129 130 131 132

	err = p.Continue()
	if err != nil {
		t.Fatal("Continue():", err)
	}

	regs, err := p.Registers()
	if err != nil {
		t.Fatal("Registers():", err)
	}

	pc := regs.PC()
	if pc != sleepyaddr {
133
		t.Fatalf("Break not respected:\nPC:%d\nFN:%d\n", pc, sleepyaddr)
134 135
	}

136
	err = p.Step()
137
	if err != nil {
138
		t.Fatal(err)
139 140
	}

141
	regs, err = p.Registers()
142
	if err != nil {
143
		t.Fatal("Registers():", err)
144 145
	}

146 147 148
	pc = regs.PC()
	if pc == sleepyaddr {
		t.Fatalf("Step not respected:\nPC:%d\nFN:%d\n", pc, sleepyaddr)
149 150
	}

151
	cmd.Process.Kill()
152
}
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170

func TestBreakPointWithNonExistantFunction(t *testing.T) {
	cmd, err := StartTestProcess("testprog")
	if err != nil {
		t.Fatal("Starting test process:", err)
	}

	pid := cmd.Process.Pid
	p, err := NewDebugProcess(pid)
	if err != nil {
		t.Fatal("NewDebugProcess():", err)
	}

	_, err = p.Break("foo")
	if err == nil {
		t.Fatal("Should not be able to break at non existant function")
	}
}