PageRenderTime 25ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/Wx-Perl-ProcessStream-0.32/t/01-events.t

#
Perl | 384 lines | 316 code | 44 blank | 24 comment | 27 complexity | 4e2d79d9c6ab70fcf1175ad8c0aebdba MD5 | raw file
  1. #!perl
  2. BEGIN { $ENV{WXPPS_MULTITEST} ||= 10; $ENV{WXPPS_POLLINTERVAL} ||= 100;}
  3. package main;
  4. use strict;
  5. use Test::More tests => 57 + $ENV{WXPPS_MULTITEST};
  6. use lib 't';
  7. use Wx;
  8. use WxTesting qw( app_from_wxtesting_frame );
  9. my $app = app_from_wxtesting_frame( 'ProcessStreamTestingFrame' );
  10. $app->MainLoop;
  11. package ProcessStreamTestingFrame;
  12. use strict;
  13. use base qw(WxTesting::Frame);
  14. use Wx::Perl::ProcessStream 0.30 qw( :everything );
  15. use Test::More;
  16. use Time::HiRes qw( sleep );
  17. sub new {
  18. my $class = shift;
  19. my $self = $class->SUPER::new( undef, -1, 'Testing Wx::Perl::ProcessStream ');
  20. EVT_WXP_PROCESS_STREAM_STDOUT( $self, \&evt_process);
  21. EVT_WXP_PROCESS_STREAM_STDERR( $self, \&evt_process);
  22. EVT_WXP_PROCESS_STREAM_EXIT( $self, \&evt_process);
  23. EVT_WXP_PROCESS_STREAM_MAXLINES( $self, \&evt_process);
  24. $self->{_stdout} = [];
  25. $self->{_stderr} = [];
  26. $self->{_exitcode} = undef;
  27. $self->{_eventmode} = 'single';
  28. return $self;
  29. }
  30. sub RunTests {
  31. my $self = shift;
  32. my $perl = $^X;
  33. # speed up tests
  34. Wx::Perl::ProcessStream->SetPollInterval($ENV{WXPPS_POLLINTERVAL});
  35. # test group 1
  36. my $cmd;
  37. my $process;
  38. my $errs;
  39. if($^O =~ /^MSWin/) {
  40. $cmd = [ $perl, '-e', q(print 0, qq(\n);) ];
  41. } else {
  42. $cmd = [ $perl, '-e', q(print 0, qq(\n);) ];
  43. }
  44. {
  45. $process = $self->start_process_a( $cmd );
  46. #ok( $process->IsAlive() );
  47. $self->wait_for_test_complete();
  48. is( $process->IsAlive(), 0 );
  49. is( $self->{_stdout}->[0], '0' );
  50. $errs = join('', @{ $self->{_stderr} });
  51. $errs ||= '';
  52. is( $errs, '' );
  53. is( $self->{_exitcode}, 0 );
  54. is( $process->GetExitCode() , 0 );
  55. $process->Destroy;
  56. $process = undef;
  57. }
  58. if($^O =~ /^MSWin/) {
  59. $cmd = [ $perl, '-e', q(print 'HELLO WORLD', qq(\n);) ];
  60. } else {
  61. $cmd = [ $perl, '-e', q(print 'HELLO WORLD', qq(\n);) ];
  62. }
  63. {
  64. $process = $self->start_process_a( $cmd );
  65. #ok( $process->IsAlive() );
  66. $self->wait_for_test_complete();
  67. is( $process->IsAlive(), 0 );
  68. is( $self->{_stdout}->[0], 'HELLO WORLD' );
  69. $errs = join('', @{ $self->{_stderr} });
  70. $errs ||= '';
  71. is( $errs, '' );
  72. is( $self->{_exitcode}, 0 );
  73. is( $process->GetExitCode() , 0 );
  74. $process->Destroy;
  75. $process = undef;
  76. }
  77. {
  78. $process = $self->start_process_b( $cmd );
  79. #ok( $process->IsAlive() );
  80. $self->wait_for_test_complete();
  81. is( $process->IsAlive(), 0 );
  82. is( $self->{_stdout}->[0], 'HELLO WORLD' );
  83. $errs = join('', @{ $self->{_stderr} });
  84. $errs ||= '';
  85. is( $errs, '' );
  86. is( $self->{_exitcode}, 0 );
  87. is( $process->GetExitCode() , 0 );
  88. $process->Destroy;
  89. $process = undef;
  90. }
  91. # test group 1a - arrref
  92. if($^O =~ /^MSWin/) {
  93. $cmd = [ $perl, '-e', q(print 'HELLO WORLD', qq(\n);) ];
  94. } else {
  95. $cmd = [ $perl, '-e', q(print 'HELLO WORLD', qq(\n);) ];
  96. }
  97. {
  98. $process = $self->start_process_a( $cmd );
  99. #ok( $process->IsAlive() );
  100. $self->wait_for_test_complete();
  101. is( $process->IsAlive(), 0 );
  102. is( $self->{_stdout}->[0], 'HELLO WORLD' );
  103. $errs = join('', @{ $self->{_stderr} });
  104. $errs ||= '';
  105. is( $errs, '' );
  106. is( $self->{_exitcode}, 0 );
  107. is( $process->GetExitCode() , 0 );
  108. $process->Destroy;
  109. $process = undef;
  110. }
  111. {
  112. $process = $self->start_process_b( $cmd );
  113. #ok( $process->IsAlive() );
  114. $self->wait_for_test_complete();
  115. is( $process->IsAlive(), 0 );
  116. is( $self->{_stdout}->[0], 'HELLO WORLD' );
  117. $errs = join('', @{ $self->{_stderr} });
  118. $errs ||= '';
  119. is( $errs, '' );
  120. is( $self->{_exitcode}, 0 );
  121. is( $process->GetExitCode() , 0 );
  122. $process->Destroy;
  123. $process = undef;
  124. }
  125. # test group 2
  126. $cmd = $perl . ' notarealtestascript.pl';
  127. $process = $self->start_process_b( $cmd );
  128. #ok( $process->IsAlive() );
  129. $self->wait_for_test_complete();
  130. is( $process->IsAlive(), 0 );
  131. my $out = join('', @{ $self->{_stdout} });
  132. $out ||= '';
  133. is( $out, '' );
  134. $errs = join('', @{ $self->{_stderr} });
  135. $errs ||= '';
  136. isnt( $errs, '' );
  137. isnt( $self->{_exitcode}, 0 );
  138. $process->Destroy;
  139. $process = undef;
  140. # test group 3
  141. if($^O =~ /^MSWin/) {
  142. $cmd = [ $perl, '-e', q($|=1;print 'ONE', qq(\n);sleep 1;print 'TWO', qq(\n);sleep 1;print 'THREE',qq(\n);sleep 1;print STDERR 'FOUR', qq(\n);exit(5);) ];
  143. } else {
  144. $cmd = [ $perl, '-e', q($|=1;print 'ONE', qq(\n);sleep 1;print 'TWO', qq(\n);sleep 1;print 'THREE',qq(\n);sleep 1;print STDERR 'FOUR', qq(\n);exit(5);) ];
  145. }
  146. $process = $self->start_process_b( $cmd );
  147. #ok( $process->IsAlive() );
  148. $self->wait_for_test_complete();
  149. is( $process->IsAlive(), 0 );
  150. my $bufferline = join('-', @{ $self->{_stdout } });
  151. $bufferline =~ s/^\-+//;
  152. $bufferline =~ s/\-+$//;
  153. is($bufferline, 'ONE-TWO-THREE' );
  154. $bufferline = join('-', @{ $self->{_stderr } });
  155. $bufferline =~ s/^\-+//;
  156. $bufferline =~ s/\-+$//;
  157. is($bufferline, 'FOUR' );
  158. is($self->{_exitcode}, 5 );
  159. $process->Destroy;
  160. $process = undef;
  161. # test group 4 - write STDIN
  162. $cmd = $perl . ' t/echo.pl';
  163. $process = $self->start_process_b( $cmd );
  164. #ok( $process->IsAlive() );
  165. $process->WriteProcess( qq(TEST STDIN 1\n) );
  166. $process->WriteProcess( qq(TEST STDIN 2\n) );
  167. $process->CloseInput();
  168. $self->wait_for_test_complete();
  169. is( $process->IsAlive(), 0 );
  170. $bufferline = join('-', @{ $process->GetStdOutBuffer() });
  171. $bufferline =~ s/^\-+//;
  172. $bufferline =~ s/\-+$//;
  173. is($bufferline, 'ECHO:TEST STDIN 1-TEST STDIN 2' );
  174. $errs = join('', @{ $self->{_stderr} });
  175. $errs ||= '';
  176. is( $errs, '' );
  177. is( $process->GetExitCode(), 123 );
  178. $process->Destroy;
  179. $process = undef;
  180. # test group 5 - shell echo program
  181. if($^O =~ /^MSWin/) {
  182. $cmd = 'cmd.exe /C ' . $perl . ' t/shelltest.pl';
  183. } else {
  184. $cmd = '/bin/sh t/shelltest.sh';
  185. }
  186. $process = $self->start_process_b( $cmd );
  187. #ok( $process->IsAlive() );
  188. while(!defined($self->{_exitcode})) {
  189. if(join('-', @{ $process->GetStdOutBuffer() }) eq 'WXTEST INPUT') {
  190. $process->WriteProcess(qq(WX TEST DATA\n));
  191. $process->CloseInput();
  192. }
  193. Wx::Perl::ProcessStream::Yield();
  194. }
  195. is( $process->IsAlive(), 0 );
  196. $bufferline = join('-', @{ $self->{_stdout} });
  197. $bufferline =~ s/^\-+//;
  198. $bufferline =~ s/\-+$//;
  199. is($bufferline, 'WXTEST INPUT-ECHO:WX TEST DATA' );
  200. $errs = join('', @{ $process->GetStdErrBuffer() });
  201. $errs ||= '';
  202. is( $errs, '' );
  203. is( $process->GetExitCode(), 0 );
  204. $process->Destroy;
  205. $process = undef;
  206. # test group 6 - multiple instance
  207. my @multiprocs;
  208. $self->{_eventmode} = 'multi';
  209. for (my $i = 0; $i < $ENV{WXPPS_MULTITEST}; $i ++) {
  210. my $sleeptime = 1 + (int(rand(10))/ 10); # sleep between 1.1 and 1.9 seconds - we want instances to exit in random order
  211. my $exitcode = 1 + int(rand(100)); # exitcodes 1 to 100
  212. my $multicmd = 'perl -e "use Time::HiRes qw( sleep ); sleep ' . $sleeptime . '; print qq(GOODBYE WORLD FROM PID: $$ INSTANCE: ' . $i . '\n); exit(' . $exitcode . ');"';
  213. my $multiprocess = $self->start_process_b( $multicmd );
  214. my $multipid = $multiprocess->GetPid;
  215. $self->{_multiresult}->{$multipid}->{expected} = $exitcode;
  216. push(@multiprocs, $multiprocess);
  217. }
  218. # wait for all procs to end
  219. {
  220. my $stillrunning = 1;
  221. while($stillrunning) {
  222. $stillrunning = 0;
  223. foreach my $mpid (sort keys( %{ $self->{_multiresult} } ) ) {
  224. $stillrunning ++ if(!defined($self->{_multiresult}->{$mpid}->{received}));
  225. }
  226. Wx::Perl::ProcessStream::Yield();
  227. }
  228. }
  229. for( @multiprocs ) {
  230. $_->Destroy;
  231. }
  232. @multiprocs = ();
  233. foreach my $mpid (sort keys( %{ $self->{_multiresult} } ) ) {
  234. my $mresult = $self->{_multiresult}->{$mpid};
  235. ok( $mresult->{expected} > 0 && ($mresult->{expected} eq $mresult->{received}), 'check expected vs received exit code' ) or
  236. diag(qq(PID $mpid expected : $self->{_multiresult}->{$mpid}->{expected} : received : $self->{_multiresult}->{$mpid}->{received}));
  237. }
  238. # test group 7 - num procs should be zero
  239. is(Wx::Perl::ProcessStream::ProcessCount(), 0, 'check process count is zero');
  240. # test group 8 - maxline testing
  241. {
  242. $self->{_eventmode} = 'single';
  243. if($^O =~ /^MSWin/) {
  244. $cmd = [ $perl, '-e', q($x = 1200; while($x){ print qq($x\n); $x--; };) ];
  245. } else {
  246. $cmd = [ $perl, '-e', q($x = 1200; while($x){ print qq($x\n); $x--; };) ];
  247. }
  248. $self->{_maxlineevtcount} = 0;
  249. $process = $self->start_process_b( $cmd );
  250. #ok( $process->IsAlive() );
  251. $self->wait_for_test_complete();
  252. is( $process->IsAlive(), 0 );
  253. is( $self->{_stdout}->[0], 1200 );
  254. my $num = scalar @{$self->{_stdout}};
  255. is( $self->{_stdout}->[$num -1], 1 );
  256. is( $num, 1200 );
  257. is( $self->{_exitcode}, 0 );
  258. is( $process->GetExitCode() , 0 );
  259. $process->Destroy;
  260. $process = undef;
  261. is( $self->{_maxlineevtcount}, 1 );
  262. Wx::Perl::ProcessStream->SetDefaultMaxLines(10);
  263. is( Wx::Perl::ProcessStream->GetDefaultMaxLines, 10 );
  264. $self->{_maxlineevtcount} = 0;
  265. $process = $self->start_process_b( $cmd );
  266. #ok( $process->IsAlive() );
  267. $self->wait_for_test_complete();
  268. is( $process->IsAlive(), 0 );
  269. is( $self->{_stdout}->[0], 1200 );
  270. $num = scalar @{$self->{_stdout}};
  271. is( $self->{_stdout}->[$num -1], 1 );
  272. is( $num, 1200 );
  273. is( $self->{_exitcode}, 0 );
  274. is( $process->GetExitCode() , 0 );
  275. $process->Destroy;
  276. $process = undef;
  277. is( $self->{_maxlineevtcount}, 120 );
  278. }
  279. return 1;
  280. }
  281. sub start_process_a {
  282. my ($self, $cmd) = @_;
  283. $self->{_stdout} = [];
  284. $self->{_stderr} = [];
  285. $self->{_exitcode} = undef;
  286. my $process = Wx::Perl::ProcessStream->OpenProcess( $cmd, 'TestCmd', $self );
  287. die 'Failed to launch process' if(!$process);
  288. return $process;
  289. }
  290. sub start_process_b {
  291. my ($self, $cmd) = @_;
  292. $self->{_stdout} = [];
  293. $self->{_stderr} = [];
  294. $self->{_exitcode} = undef;
  295. my $process = Wx::Perl::ProcessStream::Process->new( $cmd, 'TestCmd', $self )->Run;
  296. die 'Failed to launch process' if(!$process);
  297. return $process;
  298. }
  299. sub wait_for_test_complete {
  300. my $self = shift;
  301. while(!defined($self->{_exitcode})) {
  302. Wx::Perl::ProcessStream::Yield();
  303. sleep 0.1;
  304. }
  305. }
  306. sub evt_shell_stdout {
  307. my ($self, $event) = @_;
  308. $event->Skip(1);
  309. my $line = $event->GetLine();
  310. push(@{ $self->{_stdout} }, $line);
  311. my $process = $event->GetProcess();
  312. if($line eq 'WXTEST INPUT') {
  313. $process->WriteProcess( qq(WX TEST DATA\n));
  314. $process->CloseInput();
  315. }
  316. }
  317. sub evt_process {
  318. my ($self, $event) = @_;
  319. $event->Skip(1);
  320. my $evttype = $event->GetEventType();
  321. my $line = $event->GetLine();
  322. my $process = $event->GetProcess();
  323. # calling with perl one liners confuses line endings
  324. if($evttype == wxpEVT_PROCESS_STREAM_STDOUT) {
  325. push(@{ $self->{_stdout} }, $line);
  326. } elsif ( $evttype == wxpEVT_PROCESS_STREAM_STDERR) {
  327. push(@{ $self->{_stderr} }, $line);
  328. } elsif ( $evttype == wxpEVT_PROCESS_STREAM_MAXLINES) {
  329. $self->{_maxlineevtcount} ++;
  330. } elsif ( $evttype == wxpEVT_PROCESS_STREAM_EXIT) {
  331. if( $self->{_eventmode} ne 'multi') {
  332. $self->{_exitcode} = $process->GetExitCode();
  333. } else {
  334. my $pid = $process->GetPid();
  335. my $exitcode = $process->GetExitCode();
  336. $self->{_multiresult}->{$pid}->{received} = $exitcode;
  337. }
  338. }
  339. }
  340. 1;