diff options
author | Stefan Radomski <github@mintwerk.de> | 2016-07-11 12:56:11 (GMT) |
---|---|---|
committer | Stefan Radomski <github@mintwerk.de> | 2016-07-11 12:56:11 (GMT) |
commit | 5fa85b7377db25a73a2208063e3167e82febe98f (patch) | |
tree | 2ea561e90cb84ff805387c377a967c076b5b99a6 /test/src/test-http-debugger.pl | |
parent | 1a362feda9d514ee30ad8815394ce11da2bdd29a (diff) | |
download | uscxml-5fa85b7377db25a73a2208063e3167e82febe98f.zip uscxml-5fa85b7377db25a73a2208063e3167e82febe98f.tar.gz uscxml-5fa85b7377db25a73a2208063e3167e82febe98f.tar.bz2 |
Reactivated REST bridge for debugger
Diffstat (limited to 'test/src/test-http-debugger.pl')
-rwxr-xr-x | test/src/test-http-debugger.pl | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/test/src/test-http-debugger.pl b/test/src/test-http-debugger.pl new file mode 100755 index 0000000..14b2468 --- /dev/null +++ b/test/src/test-http-debugger.pl @@ -0,0 +1,208 @@ +#!/usr/bin/perl + +use lib './perl'; +use strict; +use File::Spec; +use File::Basename; +use Cwd 'abs_path'; +use JSON qw(from_json to_json); +use LWP; +use HTTP::Request::Common qw(POST GET); +use Data::Dumper; + +my $scxmlBin = abs_path(shift); +die ("First argument needs to be path to uscxml-browser binary") if (!$scxmlBin); +die("'" . $scxmlBin . "' is not an executable file") if (! -x $scxmlBin); + +my $baseDir = File::Spec->canonpath(dirname($0)); +chdir $baseDir; + +my $ua = LWP::UserAgent->new; +my $request; +my $response; +my $data; +my @breakpointSeq; + +my $pid = fork; + +if (!$pid) { + # exec("$scxmlBin -t4088 -d"); + exit; +} + +# my $baseURL = 'http://localhost:4088/debug'; +my $baseURL = 'http://localhost:5080/debug'; + +sub assertSuccess { + my $response = shift; + my $message = shift; + from_json($response->content())->{'status'} eq "success" or die($message); +} + +sub popAndCompare { + my $qualified = shift; + my $bp = shift(@breakpointSeq); + for my $key (keys %{$bp}) { + if (! exists($qualified->{$key}) || $qualified->{$key} ne $bp->{$key}) { + print Dumper($qualified); + print Dumper($bp); + die("Expected different breakpoint"); + } + } + print "SUCCESS\n"; +} + +sub testSimpleStepping { + + my $xml = << 'END_SCXML'; + <scxml> + <state id='s1'> + <onentry> + <log label="'foo'" /> + </onentry> + <transition target='s2' /> + </state> + <state id='s2'> + <transition target='pass' /> + </state> + <final id='pass' /> + </scxml> +END_SCXML + + @breakpointSeq = ( + { subject => "microstep", when => "before" }, + { subject => "state", when => "before", action => "enter" }, + { subject => "state", when => "after", action => "enter" }, + { subject => "state", when => "before", action => "enter", stateId => "s1" }, + { subject => "executable", when => "before", execName => "log" }, + { subject => "executable", when => "after", execName => "log" }, + { subject => "state", when => "after", action => "enter", stateId => "s1" }, + { subject => "microstep", when => "after" }, + { subject => "microstep", when => "before" }, + { subject => "state", when => "before", action => "exit", stateId => "s1" }, + { subject => "state", when => "after", action => "exit", stateId => "s1" }, + { subject => "transition", when => "before", source => "s1", target => "s2"}, + { subject => "transition", when => "after", source => "s1", target => "s2"}, + { subject => "state", when => "before", action => "enter", stateId => "s2" }, + { subject => "state", when => "after", action => "enter", stateId => "s2" }, + { subject => "microstep", when => "after" }, + { subject => "microstep", when => "before" }, + { subject => "state", when => "before", action => "exit", stateId => "s2" }, + { subject => "state", when => "after", action => "exit", stateId => "s2" }, + { subject => "transition", when => "before", source => "s2", target => "pass"}, + { subject => "transition", when => "after", source => "s2", target => "pass"}, + { subject => "state", when => "before", action => "enter", stateId => "pass" }, + { subject => "state", when => "after", action => "enter", stateId => "pass" }, + { subject => "microstep", when => "after" }, + + ); + + ### Get a session + $request = GET $baseURL.'/connect'; + $response = $ua->request($request); + assertSuccess($response, "Could not connect"); + + my $session = from_json($response->content())->{'session'}; + die("Cannot acquire session from server") if (!$session); + + ### Prepare an SCXML interpreter + $request = POST $baseURL.'/prepare', + [ + 'session' => $session, + 'url' => 'http://localhost/test152.scxml', + 'xml' => $xml + ]; + $response = $ua->request($request); + assertSuccess($response, "Could not prepare SCXML"); + + while(@breakpointSeq > 0) { + ### Take a step + $request = POST $baseURL.'/step', ['session' => $session]; + $response = $ua->request($request); + assertSuccess($response, "Could not step"); + # this will cause the interpreter to pause execution + + ### Get the pending messages + $request = POST $baseURL.'/poll', ['session' => $session]; + $response = $ua->request($request); + assertSuccess($response, "Could not get breakpoint after step"); + + # compare to what we expect + $data = from_json($response->content()); + popAndCompare($data->{'qualified'}); + } + + ### last step will finalize the interpreter + $request = POST $baseURL.'/step', ['session' => $session]; + $response = $ua->request($request); + assertSuccess($response, "Could not get breakpoint after step"); + + ### get the pending server push reply + $request = POST $baseURL.'/poll', ['session' => $session]; + $response = $ua->request($request); + assertSuccess($response, "Could not get breakpoint after step"); + + $data = from_json($response->content()); + die("Machine not yet finished") if ($data->{'replyType'} ne "finished"); + +} + +sub testBreakpoint { + my $xml = << 'END_SCXML'; + <scxml> + <state id='s1'> + <onentry> + <log label="'foo'" /> + </onentry> + <transition target='s2' /> + </state> + <state id='s2'> + <transition target='pass' /> + </state> + <final id='pass' /> + </scxml> +END_SCXML + + ### Get a session + $request = GET $baseURL.'/connect'; + $response = $ua->request($request); + assertSuccess($response, "Could not connect"); + + my $session = from_json($response->content())->{'session'}; + die("Cannot acquire session from server") if (!$session); + + ### Prepare an SCXML interpreter + $request = POST $baseURL.'/prepare', + [ + 'session' => $session, + 'url' => 'http://localhost/test154.scxml', + 'xml' => $xml + ]; + $response = $ua->request($request); + assertSuccess($response, "Could not prepare SCXML"); + + ### Skip to breakpoint + $request = POST $baseURL.'/breakpoint/skipto', + [ + 'session' => $session, + 'when' => 'after', + 'action' => 'enter', + 'subject' => 'state', + 'stateId' => 's1' + ]; + $response = $ua->request($request); + assertSuccess($response, "Could not add breakpoint"); + + ### get the pending server push reply + $request = POST $baseURL.'/poll', ['session' => $session]; + $response = $ua->request($request); + assertSuccess($response, "Could not get breakpoint after step"); + + $data = from_json($response->content()); + print Dumper($data); +} + +# &testSimpleStepping(); +&testBreakpoint(); + +kill('TERM', $pid);
\ No newline at end of file |