| #!perl.exe |
| |
| use strict; |
| use warnings; |
| use IO::Socket; |
| |
| ##################################################################### |
| # Copyright (c) 2004-2005 IBM Corporation and others. |
| # All rights reserved. This program and the accompanying materials |
| # are made available under the terms of the Eclipse Public License v1.0 |
| # which accompanies this distribution, and is available at |
| # http://www.eclipse.org/legal/epl-v10.html |
| # |
| # Contributors: |
| # Bjorn Freeman-Benson - initial API and implementation |
| ##################################################################### |
| # |
| # This test is designed to run on Windows: |
| # |
| # cd c:\eclipse\workspace\org.eclipse.debug.examples.core |
| # perl pdavm\tests\vmtests.pl |
| # |
| # If the tests fail, they often indicate that by hanging in an |
| # infinite loop. Additionally, the vm under test often becomes |
| # a 100% CPU usage zombie. Use the task manager to kill them. |
| # |
| my $socket1; |
| my $socket2; |
| |
| sub expect_output { |
| my $expect = shift; |
| my $line = <PROGRAM_OUTPUT>; |
| chomp($line); |
| return if( $line eq $expect ); |
| die "expected output: $expect\nSaw output: $line"; |
| } |
| sub expect_output_eof { |
| my $line = <PROGRAM_OUTPUT>; |
| return if( !defined $line ); |
| die "expected: EOF on output"; |
| } |
| sub send_command { |
| my $string = shift; |
| my $expect = shift; |
| $expect = "ok" if( !defined $expect ); |
| #print STDERR "SEND: $string\n"; |
| print $socket1 "$string\n"; |
| my $result = <$socket1>; |
| chomp($result); |
| #print STDERR "RESULT: $result\n"; |
| die "sent: $string\nexpected: $expect\nsaw: $result" if( !($result eq $expect) ); |
| } |
| sub expect_event { |
| my $string = shift; |
| my $event = <$socket2>; |
| chomp($event); |
| #print STDERR "EVENT: $event\n"; |
| die "expected event: $string\nsaw event: $event" if( !($string eq $event) ); |
| } |
| sub setup_sockets { |
| #print STDERR "calling socket 12345\n"; |
| $socket1 = IO::Socket::INET->new( |
| Proto => "tcp", |
| PeerAddr => "localhost", |
| PeerPort => "12345", |
| Timeout => 10, |
| ) |
| or die "cannot connect to debug socket 12345"; |
| #print STDERR "calling socket 12346\n"; |
| $socket2 = IO::Socket::INET->new( |
| Proto => "tcp", |
| PeerAddr => "localhost", |
| PeerPort => "12346", |
| Timeout => 10, |
| ) |
| or die "cannot connect to debug socket 12346"; |
| #print STDERR "done calling sockets\n"; |
| } |
| |
| sub test2 { |
| print "test2 (common debug commands)..\n"; |
| |
| my $kidpid; |
| die "can't fork: $!" unless defined($kidpid = fork()); |
| if( $kidpid ) { |
| #print STDERR "starting program\n"; |
| open PROGRAM_OUTPUT, "perl pdavm\\pda.pl pdavm\\tests\\vmtest2.pda -debug 12345 12346 |"; |
| #print STDERR "done starting program\n"; |
| expect_output("-debug 12345 12346"); |
| expect_output("debug connection accepted"); |
| expect_output("10"); |
| expect_output_eof(); |
| exit 0; |
| } else { |
| setup_sockets(); |
| expect_event("started"); |
| # test step |
| send_command("step"); |
| expect_event("resumed step"); |
| expect_event("suspended step"); |
| # test breakpoint |
| send_command("set 4"); |
| send_command("data", "6|"); |
| send_command("resume"); |
| expect_event("resumed client"); |
| expect_event("suspended breakpoint 4"); |
| # test data stack |
| send_command("data", "6|7|8|9|"); |
| send_command("popdata"); |
| send_command("data", "6|7|8|"); |
| send_command("pushdata 11"); |
| send_command("data", "6|7|8|11|"); |
| send_command("setdata 1 2"); |
| send_command("data", "6|2|8|11|"); |
| # test call stack |
| send_command("set 12"); |
| send_command("set 19"); |
| send_command("stepreturn"); |
| expect_event("resumed client"); |
| expect_event("suspended breakpoint 12"); |
| send_command("clear 19"); |
| send_command("stack", "pdavm\\tests\\vmtest2.pda|6|main#pdavm\\tests\\vmtest2.pda|18|sub1|m|n#pdavm\\tests\\vmtest2.pda|12|sub2" ); |
| send_command("stepreturn"); |
| expect_event("resumed client"); |
| expect_event("suspended step"); |
| send_command("stack", "pdavm\\tests\\vmtest2.pda|6|main#pdavm\\tests\\vmtest2.pda|18|sub1|m|n#pdavm\\tests\\vmtest2.pda|13|sub2" ); |
| send_command("stepreturn"); |
| expect_event("resumed client"); |
| expect_event("suspended step"); |
| send_command("stack", "pdavm\\tests\\vmtest2.pda|6|main#pdavm\\tests\\vmtest2.pda|22|sub1|m|n" ); |
| send_command("set 6"); |
| send_command("stepreturn"); |
| expect_event("resumed client"); |
| expect_event("suspended breakpoint 6"); |
| # test set and clear |
| send_command("set 27"); |
| send_command("set 29"); |
| send_command("set 33"); |
| send_command("resume"); |
| expect_event("resumed client"); |
| expect_event("suspended breakpoint 33"); |
| send_command("resume"); |
| expect_event("resumed client"); |
| expect_event("suspended breakpoint 27"); |
| send_command("clear 33"); |
| send_command("resume"); |
| expect_event("resumed client"); |
| expect_event("suspended breakpoint 29"); |
| # test var and setvar |
| send_command("set 47"); |
| send_command("resume"); |
| expect_event("resumed client"); |
| expect_event("suspended breakpoint 47"); |
| send_command("var 1 b", "4"); |
| send_command("var 2 b", "2"); |
| send_command("var 1 a", "0"); |
| send_command("setvar 1 a 99"); |
| send_command("data", "6|2|8|11|27|1|4|"); |
| send_command("step"); |
| expect_event("resumed step"); |
| expect_event("suspended step"); |
| send_command("var 1 a", "99"); |
| send_command("step"); |
| expect_event("resumed step"); |
| expect_event("suspended step"); |
| send_command("data", "6|2|8|11|27|1|4|99|"); |
| # test exit |
| send_command("exit"); |
| expect_event("terminated"); |
| } |
| #print STDERR "waiting for child\n"; |
| wait(); |
| #print STDERR "child joined\n"; |
| close PROGRAM_OUTPUT; |
| print "test2..SUCCESS\n"; |
| } |
| |
| sub test3 { |
| print "test3 (uncaught events)..\n"; |
| |
| my $kidpid; |
| die "can't fork: $!" unless defined($kidpid = fork()); |
| if( $kidpid ) { |
| #print STDERR "starting program\n"; |
| open PROGRAM_OUTPUT, "perl pdavm\\pda.pl pdavm\\tests\\vmtest3.pda -debug 12345 12346 |"; |
| #print STDERR "done starting program\n"; |
| expect_output("-debug 12345 12346"); |
| expect_output("debug connection accepted"); |
| expect_output("10"); |
| expect_output_eof(); |
| exit 0; |
| } else { |
| setup_sockets(); |
| expect_event("started"); |
| send_command("resume"); |
| expect_event("resumed client"); |
| expect_event("unimplemented instruction foobar"); |
| expect_event("no such label zippy"); |
| expect_event("terminated"); |
| } |
| #print STDERR "waiting for child\n"; |
| wait(); |
| #print STDERR "child joined\n"; |
| close PROGRAM_OUTPUT; |
| print "test3..SUCCESS\n"; |
| } |
| sub test4 { |
| print "test4 (caught events)..\n"; |
| |
| my $kidpid; |
| die "can't fork: $!" unless defined($kidpid = fork()); |
| if( $kidpid ) { |
| #print STDERR "starting program\n"; |
| open PROGRAM_OUTPUT, "perl pdavm\\pda.pl pdavm\\tests\\vmtest3.pda -debug 12345 12346 |"; |
| #print STDERR "done starting program\n"; |
| expect_output("-debug 12345 12346"); |
| expect_output("debug connection accepted"); |
| expect_output("10"); |
| expect_output_eof(); |
| exit 0; |
| } else { |
| setup_sockets(); |
| expect_event("started"); |
| send_command("eventstop unimpinstr 1"); |
| send_command("resume"); |
| expect_event("resumed client"); |
| expect_event("unimplemented instruction foobar"); |
| expect_event("suspended event unimpinstr"); |
| send_command("eventstop unimpinstr 0"); |
| send_command("resume"); |
| expect_event("resumed client"); |
| expect_event("unimplemented instruction foobar"); |
| expect_event("no such label zippy"); |
| expect_event("terminated"); |
| } |
| #print STDERR "waiting for child\n"; |
| wait(); |
| #print STDERR "child joined\n"; |
| close PROGRAM_OUTPUT; |
| print "test4..SUCCESS\n"; |
| } |
| sub test5 { |
| print "test5 (caught events)..\n"; |
| |
| my $kidpid; |
| die "can't fork: $!" unless defined($kidpid = fork()); |
| if( $kidpid ) { |
| #print STDERR "starting program\n"; |
| open PROGRAM_OUTPUT, "perl pdavm\\pda.pl pdavm\\tests\\vmtest3.pda -debug 12345 12346 |"; |
| #print STDERR "done starting program\n"; |
| expect_output("-debug 12345 12346"); |
| expect_output("debug connection accepted"); |
| expect_output("10"); |
| expect_output_eof(); |
| exit 0; |
| } else { |
| setup_sockets(); |
| expect_event("started"); |
| send_command("eventstop nosuchlabel 1"); |
| send_command("resume"); |
| expect_event("resumed client"); |
| expect_event("unimplemented instruction foobar"); |
| expect_event("no such label zippy"); |
| expect_event("suspended event nosuchlabel"); |
| send_command("eventstop nosuchlabel 0"); |
| send_command("resume"); |
| expect_event("resumed client"); |
| expect_event("no such label zippy"); |
| expect_event("terminated"); |
| } |
| #print STDERR "waiting for child\n"; |
| wait(); |
| #print STDERR "child joined\n"; |
| close PROGRAM_OUTPUT; |
| print "test5..SUCCESS\n"; |
| } |
| sub test6 { |
| print "test6 (watch points)..\n"; |
| |
| my $kidpid; |
| die "can't fork: $!" unless defined($kidpid = fork()); |
| if( $kidpid ) { |
| #print STDERR "starting program\n"; |
| open PROGRAM_OUTPUT, "perl pdavm\\pda.pl pdavm\\tests\\vmtest6.pda -debug 12345 12346 |"; |
| #print STDERR "done starting program\n"; |
| expect_output("-debug 12345 12346"); |
| expect_output("debug connection accepted"); |
| expect_output("8"); |
| expect_output_eof(); |
| exit 0; |
| } else { |
| setup_sockets(); |
| expect_event("started"); |
| send_command("watch inner::a 1"); |
| send_command("watch main::a 2"); |
| send_command("resume"); |
| expect_event("resumed client"); |
| expect_event("suspended watch write main::a"); |
| send_command("stack", "pdavm\\tests\\vmtest6.pda|4|main|a|b"); |
| send_command("resume"); |
| expect_event("resumed client"); |
| expect_event("suspended watch read inner::a"); |
| send_command("stack", "pdavm\\tests\\vmtest6.pda|10|main|a|b#pdavm\\tests\\vmtest6.pda|25|inner|a|c"); |
| send_command("watch inner::a 0"); |
| send_command("resume"); |
| expect_event("resumed client"); |
| expect_event("terminated"); |
| } |
| #print STDERR "waiting for child\n"; |
| wait(); |
| #print STDERR "child joined\n"; |
| close PROGRAM_OUTPUT; |
| print "test6..SUCCESS\n"; |
| } |
| sub test7 { |
| print "test7 (eval)..\n"; |
| |
| my $kidpid; |
| die "can't fork: $!" unless defined($kidpid = fork()); |
| if( $kidpid ) { |
| #print STDERR "starting program\n"; |
| open PROGRAM_OUTPUT, "perl pdavm\\pda.pl pdavm\\tests\\vmtest6.pda -debug 12345 12346 |"; |
| #print STDERR "done starting program\n"; |
| expect_output("-debug 12345 12346"); |
| expect_output("debug connection accepted"); |
| expect_output("8"); |
| expect_output_eof(); |
| exit 0; |
| } else { |
| setup_sockets(); |
| expect_event("started"); |
| send_command("set 25"); |
| send_command("resume"); |
| expect_event("resumed client"); |
| expect_event("suspended breakpoint 25"); |
| # |
| send_command("eval push%204|push%205|add"); |
| expect_event("resumed client"); |
| expect_event("evalresult 9"); |
| expect_event("suspended eval"); |
| # |
| send_command("step"); |
| expect_event("resumed step"); |
| expect_event("suspended step"); |
| send_command("stack", "pdavm\\tests\\vmtest6.pda|10|main|a|b#pdavm\\tests\\vmtest6.pda|26|inner|a|c"); |
| send_command("data", "4|4|"); |
| send_command("eval call%20other"); |
| expect_event("resumed client"); |
| expect_event("evalresult 15"); |
| expect_event("suspended eval"); |
| send_command("stack", "pdavm\\tests\\vmtest6.pda|10|main|a|b#pdavm\\tests\\vmtest6.pda|26|inner|a|c"); |
| send_command("data", "4|4|"); |
| send_command("resume"); |
| expect_event("resumed client"); |
| expect_event("terminated"); |
| } |
| #print STDERR "waiting for child\n"; |
| wait(); |
| #print STDERR "child joined\n"; |
| close PROGRAM_OUTPUT; |
| print "test7..SUCCESS\n"; |
| } |
| sub test1 { |
| print "test1 (normal run mode)..\n"; |
| open PROGRAM_OUTPUT, "perl pdavm\\pda.pl examples\\example.pda |" or die $!; |
| expect_output("\"hello\""); |
| expect_output("\"barfoo\""); |
| expect_output("\"first\""); |
| expect_output("\"second\""); |
| expect_output("12"); |
| expect_output("11"); |
| expect_output("10"); |
| expect_output("\"barfoo\""); |
| expect_output("\"first\""); |
| expect_output("\"second\""); |
| expect_output("\"end\""); |
| expect_output_eof(); |
| print "test1..SUCCESS\n"; |
| } |
| sub test8 { |
| print "test8 (drop to frame)..\n"; |
| |
| my $kidpid; |
| die "can't fork: $!" unless defined($kidpid = fork()); |
| if( $kidpid ) { |
| #print STDERR "starting program\n"; |
| open PROGRAM_OUTPUT, "perl pdavm\\pda.pl pdavm\\tests\\vmtest8.pda -debug 12345 12346 |"; |
| #print STDERR "done starting program\n"; |
| expect_output("-debug 12345 12346"); |
| expect_output("debug connection accepted"); |
| expect_output("1"); |
| expect_output_eof(); |
| exit 0; |
| } else { |
| setup_sockets(); |
| expect_event("started"); |
| send_command("step"); |
| expect_event("resumed step"); |
| expect_event("suspended step"); |
| send_command("step"); |
| expect_event("resumed step"); |
| expect_event("suspended step"); |
| send_command("step"); |
| expect_event("resumed step"); |
| expect_event("suspended step"); |
| send_command("step"); |
| expect_event("resumed step"); |
| expect_event("suspended step"); |
| send_command("step"); |
| expect_event("resumed step"); |
| expect_event("suspended step"); |
| send_command("step"); |
| expect_event("resumed step"); |
| expect_event("suspended step"); |
| send_command("step"); |
| expect_event("resumed step"); |
| expect_event("suspended step"); |
| send_command("stack", "pdavm\\tests\\vmtest8.pda|2|main|a#pdavm\\tests\\vmtest8.pda|8|inner|b#pdavm\\tests\\vmtest8.pda|12|inner2|c"); |
| send_command("drop"); |
| expect_event("suspended drop"); |
| send_command("stack", "pdavm\\tests\\vmtest8.pda|2|main|a#pdavm\\tests\\vmtest8.pda|7|inner|b"); |
| send_command("step"); |
| expect_event("resumed step"); |
| expect_event("suspended step"); |
| send_command("stack", "pdavm\\tests\\vmtest8.pda|2|main|a#pdavm\\tests\\vmtest8.pda|8|inner|b#pdavm\\tests\\vmtest8.pda|10|inner2"); |
| send_command("resume"); |
| expect_event("resumed client"); |
| expect_event("terminated"); |
| } |
| #print STDERR "waiting for child\n"; |
| wait(); |
| #print STDERR "child joined\n"; |
| close PROGRAM_OUTPUT; |
| print "test8..SUCCESS\n"; |
| } |
| |
| # |
| # Run the tests |
| # |
| test1(); |
| test2(); |
| test3(); |
| test4(); |
| test5(); |
| test6(); |
| test7(); |
| test8(); |
| print "All tests complete\n"; |