proctl_test.go 2.9 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 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
	if err != nil {
		t.Fatal("Break():", err)
	}

	sleepytimefunc := p.GoSymTable.LookupFunc("main.sleepytime")
	sleepyaddr := sleepytimefunc.LineTable.PC

	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 {
		t.Fatal("Break not respected:\nPC:%d\nFN:%d\n", pc, sleepyaddr)
	}

	cmd.Process.Kill()
}
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160

func TestBreakPointIsSetOnlyOnce(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("main.sleepytime")
	if err != nil {
		t.Fatal("Break():", err)
	}

	_, err = p.Break("main.sleepytime")
	if err == nil {
		t.Fatal("Should not be able to add breakpoint twice")
	}
}