#!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 = ; chomp($line); return if( $line eq $expect ); die "expected output: $expect\nSaw output: $line"; } sub expect_output_eof { my $line = ; 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";