2015-06-21 03:47:44 +00:00
package servicetest
2015-03-20 21:11:11 +00:00
import (
2015-06-28 15:00:56 +00:00
"fmt"
2015-03-20 21:11:11 +00:00
"net"
2015-06-13 04:47:30 +00:00
"os"
2015-05-08 20:16:22 +00:00
"path/filepath"
2015-06-13 04:47:30 +00:00
"runtime"
2015-06-28 15:00:56 +00:00
"strconv"
2015-03-20 21:11:11 +00:00
"testing"
2015-06-12 19:49:23 +00:00
protest "github.com/derekparker/delve/proc/test"
2015-06-21 03:47:44 +00:00
2015-03-20 21:11:11 +00:00
"github.com/derekparker/delve/service"
"github.com/derekparker/delve/service/api"
2015-06-21 03:47:44 +00:00
"github.com/derekparker/delve/service/rpc"
2015-03-20 21:11:11 +00:00
)
2015-06-13 04:47:30 +00:00
func init ( ) {
runtime . GOMAXPROCS ( 2 )
}
2015-04-27 15:51:02 +00:00
func TestMain ( m * testing . M ) {
2015-06-21 03:47:44 +00:00
os . Exit ( protest . RunTestsWithFixtures ( m ) )
2015-04-27 15:51:02 +00:00
}
func withTestClient ( name string , t * testing . T , fn func ( c service . Client ) ) {
2015-03-20 21:11:11 +00:00
listener , err := net . Listen ( "tcp" , "localhost:0" )
if err != nil {
t . Fatalf ( "couldn't start listener: %s\n" , err )
}
2015-06-21 03:47:44 +00:00
defer listener . Close ( )
2015-06-24 13:08:48 +00:00
server := rpc . NewServer ( & service . Config {
Listener : listener ,
ProcessArgs : [ ] string { protest . BuildFixture ( name ) . Path } ,
} , false )
2015-06-27 04:05:15 +00:00
if err := server . Run ( ) ; err != nil {
t . Fatal ( err )
}
2015-06-24 13:08:48 +00:00
client := rpc . NewClient ( listener . Addr ( ) . String ( ) )
2015-06-24 14:44:24 +00:00
defer func ( ) {
client . Detach ( true )
} ( )
2015-06-24 13:08:48 +00:00
fn ( client )
2015-03-20 21:11:11 +00:00
}
2015-06-27 04:05:15 +00:00
func TestRunWithInvalidPath ( t * testing . T ) {
listener , err := net . Listen ( "tcp" , "localhost:0" )
if err != nil {
t . Fatalf ( "couldn't start listener: %s\n" , err )
}
defer listener . Close ( )
server := rpc . NewServer ( & service . Config {
Listener : listener ,
ProcessArgs : [ ] string { "invalid_path" } ,
} , false )
if err := server . Run ( ) ; err == nil {
t . Fatal ( "Expected Run to return error for invalid program path" )
}
}
2015-07-03 20:35:22 +00:00
func TestRestart_afterExit ( t * testing . T ) {
withTestClient ( "continuetestprog" , t , func ( c service . Client ) {
origPid := c . ProcessPid ( )
state := <- c . Continue ( )
if ! state . Exited {
t . Fatal ( "expected initial process to have exited" )
}
if err := c . Restart ( ) ; err != nil {
t . Fatal ( err )
}
if c . ProcessPid ( ) == origPid {
t . Fatal ( "did not spawn new process, has same PID" )
}
state = <- c . Continue ( )
if ! state . Exited {
t . Fatal ( "expected restarted process to have exited" )
}
} )
}
func TestRestart_duringStop ( t * testing . T ) {
withTestClient ( "continuetestprog" , t , func ( c service . Client ) {
origPid := c . ProcessPid ( )
2015-08-07 16:50:14 +00:00
_ , err := c . CreateBreakpoint ( & api . Breakpoint { FunctionName : "main.main" , Line : 1 } )
2015-07-03 20:35:22 +00:00
if err != nil {
t . Fatal ( err )
}
state := <- c . Continue ( )
if state . Breakpoint == nil {
t . Fatal ( "did not hit breakpoint" )
}
if err := c . Restart ( ) ; err != nil {
t . Fatal ( err )
}
if c . ProcessPid ( ) == origPid {
t . Fatal ( "did not spawn new process, has same PID" )
}
bps , err := c . ListBreakpoints ( )
if err != nil {
t . Fatal ( err )
}
2015-08-02 05:08:48 +00:00
if len ( bps ) == 0 {
t . Fatal ( "breakpoints not preserved" )
2015-07-03 20:35:22 +00:00
}
} )
}
func TestRestart_attachPid ( t * testing . T ) {
// Assert it does not work and returns error.
// We cannot restart a process we did not spawn.
server := rpc . NewServer ( & service . Config {
Listener : nil ,
AttachPid : 999 ,
} , false )
if err := server . Restart ( nil , nil ) ; err == nil {
t . Fatal ( "expected error on restart after attaching to pid but got none" )
}
}
2015-03-20 21:11:11 +00:00
func TestClientServer_exit ( t * testing . T ) {
2015-04-27 15:51:02 +00:00
withTestClient ( "continuetestprog" , t , func ( c service . Client ) {
2015-03-20 21:11:11 +00:00
state , err := c . GetState ( )
if err != nil {
t . Fatalf ( "Unexpected error: %v" , err )
}
if e , a := false , state . Exited ; e != a {
t . Fatalf ( "Expected exited %v, got %v" , e , a )
}
2015-06-28 15:00:56 +00:00
state = <- c . Continue ( )
2015-07-03 19:18:03 +00:00
if state . Err == nil {
t . Fatalf ( "Error expected after continue" )
2015-06-21 18:08:14 +00:00
}
2015-06-28 15:00:56 +00:00
if ! state . Exited {
t . Fatalf ( "Expected exit after continue: %v" , state )
2015-06-21 18:08:14 +00:00
}
state , err = c . GetState ( )
2015-03-20 21:11:11 +00:00
if err != nil {
2015-06-21 18:08:14 +00:00
t . Fatal ( err )
2015-03-20 21:11:11 +00:00
}
if state . CurrentThread == nil {
t . Fatalf ( "Expected CurrentThread" )
}
if e , a := true , state . Exited ; e != a {
t . Fatalf ( "Expected exited %v, got %v" , e , a )
}
} )
}
func TestClientServer_step ( t * testing . T ) {
2015-04-27 15:51:02 +00:00
withTestClient ( "testprog" , t , func ( c service . Client ) {
2015-08-07 16:50:14 +00:00
_ , err := c . CreateBreakpoint ( & api . Breakpoint { FunctionName : "main.helloworld" , Line : 1 } )
2015-03-20 21:11:11 +00:00
if err != nil {
t . Fatalf ( "Unexpected error: %v" , err )
}
2015-07-01 03:16:52 +00:00
stateBefore := <- c . Continue ( )
2015-06-28 15:00:56 +00:00
if stateBefore . Err != nil {
t . Fatalf ( "Unexpected error: %v" , stateBefore . Err )
2015-03-20 21:11:11 +00:00
}
stateAfter , err := c . Step ( )
if err != nil {
t . Fatalf ( "Unexpected error: %v" , err )
}
if before , after := stateBefore . CurrentThread . PC , stateAfter . CurrentThread . PC ; before >= after {
t . Errorf ( "Expected %#v to be greater than %#v" , before , after )
}
} )
}
type nextTest struct {
begin , end int
}
func testnext ( testcases [ ] nextTest , initialLocation string , t * testing . T ) {
2015-04-27 15:51:02 +00:00
withTestClient ( "testnextprog" , t , func ( c service . Client ) {
2015-08-07 16:50:14 +00:00
bp , err := c . CreateBreakpoint ( & api . Breakpoint { FunctionName : initialLocation , Line : - 1 } )
2015-03-20 21:11:11 +00:00
if err != nil {
t . Fatalf ( "Unexpected error: %v" , err )
}
2015-06-28 15:00:56 +00:00
state := <- c . Continue ( )
if state . Err != nil {
t . Fatalf ( "Unexpected error: %v" , state . Err )
2015-03-20 21:11:11 +00:00
}
2015-06-12 19:32:32 +00:00
_ , err = c . ClearBreakpoint ( bp . ID )
2015-03-20 21:11:11 +00:00
if err != nil {
t . Fatalf ( "Unexpected error: %v" , err )
}
for _ , tc := range testcases {
if state . CurrentThread . Line != tc . begin {
2015-04-27 15:51:02 +00:00
t . Fatalf ( "Program not stopped at correct spot expected %d was %d" , tc . begin , state . CurrentThread . Line )
2015-03-20 21:11:11 +00:00
}
t . Logf ( "Next for scenario %#v" , tc )
state , err = c . Next ( )
if err != nil {
t . Fatalf ( "Unexpected error: %v" , err )
}
if state . CurrentThread . Line != tc . end {
2015-04-27 15:51:02 +00:00
t . Fatalf ( "Program did not continue to correct next location expected %d was %d" , tc . end , state . CurrentThread . Line )
2015-03-20 21:11:11 +00:00
}
}
} )
}
func TestNextGeneral ( t * testing . T ) {
testcases := [ ] nextTest {
{ 19 , 20 } ,
{ 20 , 23 } ,
{ 23 , 24 } ,
{ 24 , 26 } ,
{ 26 , 31 } ,
{ 31 , 23 } ,
{ 23 , 24 } ,
{ 24 , 26 } ,
{ 26 , 31 } ,
{ 31 , 23 } ,
{ 23 , 24 } ,
{ 24 , 26 } ,
{ 26 , 27 } ,
{ 27 , 34 } ,
}
testnext ( testcases , "main.testnext" , t )
}
func TestNextGoroutine ( t * testing . T ) {
testcases := [ ] nextTest {
{ 47 , 42 } ,
}
testnext ( testcases , "main.testgoroutine" , t )
}
func TestNextFunctionReturn ( t * testing . T ) {
testcases := [ ] nextTest {
{ 14 , 35 } ,
}
testnext ( testcases , "main.helloworld" , t )
}
func TestClientServer_breakpointInMainThread ( t * testing . T ) {
2015-04-27 15:51:02 +00:00
withTestClient ( "testprog" , t , func ( c service . Client ) {
2015-08-07 16:50:14 +00:00
bp , err := c . CreateBreakpoint ( & api . Breakpoint { FunctionName : "main.helloworld" , Line : 1 } )
2015-03-20 21:11:11 +00:00
if err != nil {
t . Fatalf ( "Unexpected error: %v" , err )
}
2015-06-28 15:00:56 +00:00
state := <- c . Continue ( )
2015-03-20 21:11:11 +00:00
if err != nil {
t . Fatalf ( "Unexpected error: %v, state: %#v" , err , state )
}
pc := state . CurrentThread . PC
if pc - 1 != bp . Addr && pc != bp . Addr {
f , l := state . CurrentThread . File , state . CurrentThread . Line
t . Fatalf ( "Break not respected:\nPC:%#v %s:%d\nFN:%#v \n" , pc , f , l , bp . Addr )
}
} )
}
func TestClientServer_breakpointInSeparateGoroutine ( t * testing . T ) {
2015-04-27 15:51:02 +00:00
withTestClient ( "testthreads" , t , func ( c service . Client ) {
2015-08-07 16:50:14 +00:00
_ , err := c . CreateBreakpoint ( & api . Breakpoint { FunctionName : "main.anotherthread" , Line : 1 } )
2015-03-20 21:11:11 +00:00
if err != nil {
t . Fatalf ( "Unexpected error: %v" , err )
}
2015-06-28 15:00:56 +00:00
state := <- c . Continue ( )
if state . Err != nil {
t . Fatalf ( "Unexpected error: %v, state: %#v" , state . Err , state )
2015-03-20 21:11:11 +00:00
}
f , l := state . CurrentThread . File , state . CurrentThread . Line
2015-07-10 15:16:03 +00:00
if f != "testthreads.go" && l != 9 {
2015-03-20 21:11:11 +00:00
t . Fatal ( "Program did not hit breakpoint" )
}
} )
}
func TestClientServer_breakAtNonexistentPoint ( t * testing . T ) {
2015-04-27 15:51:02 +00:00
withTestClient ( "testprog" , t , func ( c service . Client ) {
2015-08-07 16:50:14 +00:00
_ , err := c . CreateBreakpoint ( & api . Breakpoint { FunctionName : "nowhere" , Line : 1 } )
2015-03-20 21:11:11 +00:00
if err == nil {
t . Fatal ( "Should not be able to break at non existent function" )
}
} )
}
func TestClientServer_clearBreakpoint ( t * testing . T ) {
2015-04-27 15:51:02 +00:00
withTestClient ( "testprog" , t , func ( c service . Client ) {
2015-08-07 16:50:14 +00:00
bp , err := c . CreateBreakpoint ( & api . Breakpoint { FunctionName : "main.sleepytime" , Line : 1 } )
2015-03-20 21:11:11 +00:00
if err != nil {
t . Fatalf ( "Unexpected error: %v" , err )
}
2015-06-12 19:32:32 +00:00
bps , err := c . ListBreakpoints ( )
2015-03-20 21:11:11 +00:00
if e , a := 1 , len ( bps ) ; e != a {
t . Fatalf ( "Expected breakpoint count %d, got %d" , e , a )
}
2015-06-12 19:32:32 +00:00
deleted , err := c . ClearBreakpoint ( bp . ID )
2015-03-20 21:11:11 +00:00
if err != nil {
t . Fatalf ( "Unexpected error: %v" , err )
}
if deleted . ID != bp . ID {
t . Fatalf ( "Expected deleted breakpoint ID %v, got %v" , bp . ID , deleted . ID )
}
2015-06-12 19:32:32 +00:00
bps , err = c . ListBreakpoints ( )
2015-03-20 21:11:11 +00:00
if e , a := 0 , len ( bps ) ; e != a {
t . Fatalf ( "Expected breakpoint count %d, got %d" , e , a )
}
} )
}
func TestClientServer_switchThread ( t * testing . T ) {
2015-04-27 15:51:02 +00:00
withTestClient ( "testnextprog" , t , func ( c service . Client ) {
2015-03-20 21:11:11 +00:00
// With invalid thread id
_ , err := c . SwitchThread ( - 1 )
if err == nil {
t . Fatal ( "Expected error for invalid thread id" )
}
2015-08-07 16:50:14 +00:00
_ , err = c . CreateBreakpoint ( & api . Breakpoint { FunctionName : "main.main" , Line : 1 } )
2015-03-20 21:11:11 +00:00
if err != nil {
t . Fatalf ( "Unexpected error: %v" , err )
}
2015-06-28 15:00:56 +00:00
state := <- c . Continue ( )
if state . Err != nil {
t . Fatalf ( "Unexpected error: %v, state: %#v" , state . Err , state )
2015-03-20 21:11:11 +00:00
}
var nt int
ct := state . CurrentThread . ID
threads , err := c . ListThreads ( )
if err != nil {
t . Fatalf ( "Unexpected error: %v" , err )
}
for _ , th := range threads {
if th . ID != ct {
nt = th . ID
break
}
}
if nt == 0 {
t . Fatal ( "could not find thread to switch to" )
}
// With valid thread id
state , err = c . SwitchThread ( nt )
if err != nil {
t . Fatal ( err )
}
if state . CurrentThread . ID != nt {
t . Fatal ( "Did not switch threads" )
}
} )
}
2015-05-08 20:16:22 +00:00
2015-06-28 15:00:56 +00:00
func testProgPath ( t * testing . T , name string ) string {
fp , err := filepath . Abs ( fmt . Sprintf ( "_fixtures/%s.go" , name ) )
if err != nil {
t . Fatal ( err )
}
if _ , err := os . Stat ( fp ) ; err != nil {
fp , err = filepath . Abs ( fmt . Sprintf ( "../../_fixtures/%s.go" , name ) )
2015-05-08 20:16:22 +00:00
if err != nil {
t . Fatal ( err )
}
2015-06-28 15:00:56 +00:00
}
return fp
}
func TestClientServer_infoLocals ( t * testing . T ) {
withTestClient ( "testnextprog" , t , func ( c service . Client ) {
fp := testProgPath ( t , "testnextprog" )
_ , err := c . CreateBreakpoint ( & api . Breakpoint { File : fp , Line : 23 } )
2015-05-08 20:16:22 +00:00
if err != nil {
t . Fatalf ( "Unexpected error: %v" , err )
}
2015-06-28 15:00:56 +00:00
state := <- c . Continue ( )
if state . Err != nil {
t . Fatalf ( "Unexpected error: %v, state: %#v" , state . Err , state )
2015-05-08 20:16:22 +00:00
}
locals , err := c . ListLocalVariables ( )
if err != nil {
t . Fatalf ( "Unexpected error: %v" , err )
}
if len ( locals ) != 3 {
t . Fatalf ( "Expected 3 locals, got %d %#v" , len ( locals ) , locals )
}
} )
}
func TestClientServer_infoArgs ( t * testing . T ) {
withTestClient ( "testnextprog" , t , func ( c service . Client ) {
2015-06-28 15:00:56 +00:00
fp := testProgPath ( t , "testnextprog" )
_ , err := c . CreateBreakpoint ( & api . Breakpoint { File : fp , Line : 47 } )
2015-05-08 20:16:22 +00:00
if err != nil {
t . Fatalf ( "Unexpected error: %v" , err )
}
2015-06-28 15:00:56 +00:00
state := <- c . Continue ( )
if state . Err != nil {
t . Fatalf ( "Unexpected error: %v, state: %#v" , state . Err , state )
2015-05-08 20:16:22 +00:00
}
2015-06-19 07:20:10 +00:00
regs , err := c . ListRegisters ( )
if err != nil {
t . Fatalf ( "Unexpected error: %v" , err )
}
if regs == "" {
t . Fatal ( "Expected string showing registers values, got empty string" )
}
2015-05-08 20:16:22 +00:00
locals , err := c . ListFunctionArgs ( )
if err != nil {
t . Fatalf ( "Unexpected error: %v" , err )
}
if len ( locals ) != 2 {
t . Fatalf ( "Expected 2 function args, got %d %#v" , len ( locals ) , locals )
}
} )
}
2015-06-28 15:00:56 +00:00
func TestClientServer_traceContinue ( t * testing . T ) {
withTestClient ( "integrationprog" , t , func ( c service . Client ) {
fp := testProgPath ( t , "integrationprog" )
2015-07-01 03:16:52 +00:00
_ , err := c . CreateBreakpoint ( & api . Breakpoint { File : fp , Line : 15 , Tracepoint : true , Goroutine : true , Stacktrace : 5 , Variables : [ ] string { "i" } } )
2015-06-28 15:00:56 +00:00
if err != nil {
t . Fatalf ( "Unexpected error: %v\n" , err )
}
count := 0
2015-07-01 03:16:52 +00:00
contChan := c . Continue ( )
for state := range contChan {
2015-06-28 15:00:56 +00:00
if state . Breakpoint != nil {
count ++
t . Logf ( "%v" , state )
bpi := state . BreakpointInfo
if bpi . Goroutine == nil {
t . Fatalf ( "No goroutine information" )
}
if len ( bpi . Stacktrace ) <= 0 {
t . Fatalf ( "No stacktrace\n" )
}
if len ( bpi . Variables ) != 1 {
t . Fatalf ( "Wrong number of variables returned: %d" , len ( bpi . Variables ) )
}
if bpi . Variables [ 0 ] . Name != "i" {
t . Fatalf ( "Wrong variable returned %s" , bpi . Variables [ 0 ] . Name )
}
if bpi . Variables [ 0 ] . Value != strconv . Itoa ( count - 1 ) {
t . Fatalf ( "Wrong variable value %s (%d)" , bpi . Variables [ 0 ] . Value , count )
}
}
if state . Exited {
continue
}
t . Logf ( "%v" , state )
if state . Err != nil {
t . Fatalf ( "Unexpected error during continue: %v\n" , state . Err )
}
}
if count != 3 {
t . Fatalf ( "Wrong number of continues hit: %d\n" , count )
}
} )
}
2015-07-09 16:41:03 +00:00
func TestClientServer_traceContinue2 ( t * testing . T ) {
withTestClient ( "integrationprog" , t , func ( c service . Client ) {
2015-08-07 16:50:14 +00:00
bp1 , err := c . CreateBreakpoint ( & api . Breakpoint { FunctionName : "main.main" , Line : 1 , Tracepoint : true } )
2015-07-09 16:41:03 +00:00
if err != nil {
t . Fatalf ( "Unexpected error: %v\n" , err )
}
2015-08-07 16:50:14 +00:00
bp2 , err := c . CreateBreakpoint ( & api . Breakpoint { FunctionName : "main.sayhi" , Line : 1 , Tracepoint : true } )
2015-07-09 16:41:03 +00:00
if err != nil {
t . Fatalf ( "Unexpected error: %v\n" , err )
}
countMain := 0
countSayhi := 0
contChan := c . Continue ( )
for state := range contChan {
if state . Breakpoint != nil {
switch state . Breakpoint . ID {
case bp1 . ID :
countMain ++
case bp2 . ID :
countSayhi ++
}
t . Logf ( "%v" , state )
}
if state . Exited {
continue
}
if state . Err != nil {
t . Fatalf ( "Unexpected error during continue: %v\n" , state . Err )
}
}
if countMain != 1 {
t . Fatalf ( "Wrong number of continues (main.main) hit: %d\n" , countMain )
}
if countSayhi != 3 {
t . Fatalf ( "Wrong number of continues (main.sayhi) hit: %d\n" , countSayhi )
}
} )
}
2015-08-07 16:50:14 +00:00
func findLocationHelper ( t * testing . T , c service . Client , loc string , shouldErr bool , count int , checkAddr uint64 ) [ ] uint64 {
locs , err := c . FindLocation ( loc )
t . Logf ( "FindLocation(\"%s\") → %v\n" , loc , locs )
if shouldErr {
if err == nil {
t . Fatalf ( "Resolving location <%s> didn't return an error: %v" , loc , locs )
}
} else {
if err != nil {
t . Fatalf ( "Error resolving location <%s>: %v" , loc , err )
}
}
if ( count >= 0 ) && ( len ( locs ) != count ) {
t . Fatalf ( "Wrong number of breakpoints returned for location <%s> (got %d, expected %d)" , loc , len ( locs ) , count )
}
if checkAddr != 0 && checkAddr != locs [ 0 ] . PC {
t . Fatalf ( "Wrong address returned for location <%s> (got %v, epected %v)" , loc , locs [ 0 ] . PC , checkAddr )
}
addrs := make ( [ ] uint64 , len ( locs ) )
for i := range locs {
addrs [ i ] = locs [ i ] . PC
}
return addrs
}
func TestClientServer_FindLocations ( t * testing . T ) {
withTestClient ( "locationsprog" , t , func ( c service . Client ) {
someFunctionCallAddr := findLocationHelper ( t , c , "locationsprog.go:26" , false , 1 , 0 ) [ 0 ]
findLocationHelper ( t , c , "anotherFunction:1" , false , 1 , someFunctionCallAddr )
findLocationHelper ( t , c , "main.anotherFunction:1" , false , 1 , someFunctionCallAddr )
findLocationHelper ( t , c , "anotherFunction" , false , 1 , someFunctionCallAddr )
findLocationHelper ( t , c , "main.anotherFunction" , false , 1 , someFunctionCallAddr )
findLocationHelper ( t , c , fmt . Sprintf ( "*0x%x" , someFunctionCallAddr ) , false , 1 , someFunctionCallAddr )
findLocationHelper ( t , c , "sprog.go:26" , true , 0 , 0 )
findLocationHelper ( t , c , "String" , true , 0 , 0 )
findLocationHelper ( t , c , "main.String" , true , 0 , 0 )
someTypeStringFuncAddr := findLocationHelper ( t , c , "locationsprog.go:14" , false , 1 , 0 ) [ 0 ]
otherTypeStringFuncAddr := findLocationHelper ( t , c , "locationsprog.go:18" , false , 1 , 0 ) [ 0 ]
findLocationHelper ( t , c , "SomeType.String" , false , 1 , someTypeStringFuncAddr )
findLocationHelper ( t , c , "(*SomeType).String" , false , 1 , someTypeStringFuncAddr )
findLocationHelper ( t , c , "main.SomeType.String" , false , 1 , someTypeStringFuncAddr )
findLocationHelper ( t , c , "main.(*SomeType).String" , false , 1 , someTypeStringFuncAddr )
stringAddrs := findLocationHelper ( t , c , "/^main.*Type.*String$/" , false , 2 , 0 )
if otherTypeStringFuncAddr != stringAddrs [ 0 ] && otherTypeStringFuncAddr != stringAddrs [ 1 ] {
t . Fatalf ( "Wrong locations returned for \"/.*Type.*String/\", got: %v expected: %v and %v\n" , stringAddrs , someTypeStringFuncAddr , otherTypeStringFuncAddr )
}
_ , err := c . CreateBreakpoint ( & api . Breakpoint { FunctionName : "main.main" , Line : 4 , Tracepoint : false } )
if err != nil {
t . Fatalf ( "CreateBreakpoint(): %v\n" , err )
}
<- c . Continue ( )
locationsprog34Addr := findLocationHelper ( t , c , "locationsprog.go:34" , false , 1 , 0 ) [ 0 ]
findLocationHelper ( t , c , "+1" , false , 1 , locationsprog34Addr )
findLocationHelper ( t , c , "34" , false , 1 , locationsprog34Addr )
findLocationHelper ( t , c , "-1" , false , 1 , findLocationHelper ( t , c , "locationsprog.go:32" , false , 1 , 0 ) [ 0 ] )
} )
withTestClient ( "testnextdefer" , t , func ( c service . Client ) {
firstMainLine := findLocationHelper ( t , c , "testnextdefer.go:9" , false , 1 , 0 ) [ 0 ]
findLocationHelper ( t , c , "main.main" , false , 1 , firstMainLine )
} )
withTestClient ( "stacktraceprog" , t , func ( c service . Client ) {
stacktracemeAddr := findLocationHelper ( t , c , "stacktraceprog.go:4" , false , 1 , 0 ) [ 0 ]
findLocationHelper ( t , c , "main.stacktraceme" , false , 1 , stacktracemeAddr )
} )
}
2015-08-07 07:30:01 +00:00
func TestClientServer_EvalVariableFor ( t * testing . T ) {
withTestClient ( "testvariables" , t , func ( c service . Client ) {
fp := testProgPath ( t , "testvariables" )
_ , err := c . CreateBreakpoint ( & api . Breakpoint { File : fp , Line : 59 } )
if err != nil {
t . Fatalf ( "CreateBreakpoint(): %v" , err )
}
state := <- c . Continue ( )
if state . Err != nil {
t . Fatalf ( "Continue(): %v\n" , state . Err )
}
var1 , err := c . EvalVariable ( "a1" )
if err != nil {
t . Fatalf ( "EvalVariable(): %v" , err )
}
t . Logf ( "var1: <%s>" , var1 . Value )
if var1 . Value != "foofoofoofoofoofoo" {
t . Fatalf ( "Wrong variable value (EvalVariable)" , var1 . Value )
}
var2 , err := c . EvalVariableFor ( state . CurrentThread . ID , "a1" )
if err != nil {
t . Fatalf ( "EvalVariableFor(): %v" , err )
}
t . Logf ( "var2: <%s>" , var2 . Value )
if var2 . Value != var1 . Value {
t . Fatalf ( "Wrong variable value (EvalVariableFor)" , var2 . Value )
}
} )
}