.\" Automatically generated by Pod::Man 2.28 (Pod::Simple 3.28) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is turned on, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{ . if \nF \{ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "Test::Command::Simple 3pm" .TH Test::Command::Simple 3pm "2015-06-27" "perl v5.20.2" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" Test::Command::Simple \- Test external commands (nearly) as easily as loaded modules. .SH "VERSION" .IX Header "VERSION" Version 0.05 .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 1 \& use Test::Command::Simple; \& \& run(\*(Aqecho\*(Aq, \*(Aqhas this output\*(Aq); # only tests that the command can be started, not checking rc \& is(rc,0,\*(AqReturned successfully\*(Aq) \& like(stdout,qr/has this output/,\*(AqTesting stdout\*(Aq); \& is(length stderr, 0,\*(AqNo stderr\*(Aq); .Ve .SH "PURPOSE" .IX Header "PURPOSE" This test module is intended to simplify testing of external commands. It does so by running the command under IPC::Open3, closing the stdin immediately, and reading everything from the command's stdout and stderr. It then makes the output available to be tested. .PP It is not (yet?) as feature-rich as Test::Cmd, but I think the interface to this is much simpler. Tests also plug directly into the Test::Builder framework, which plays nice with Test::More. .PP As compared to Test::Command, this module is simpler, relying on the user to feed rc, stdout, and stderr to the appropriate other tests, presumably in Test::More, but not necessarily. This makes it possible, for example, to test line 3 of the output: .PP .Vb 2 \& my (undef, undef, $line) = split /\er?\en/, stdout; \& is($line, \*(AqThis is the third line\*(Aq, \*(AqTest the third line\*(Aq); .Ve .PP While this is possible to do with Test::Command's stdout_like, some regex's can get very awkward, and it becomes better to do this in multiple steps. .PP Also, Test::Command saves stdout and stderr to files. That has an advantage when you're saving a lot of text. However, this module prefers to slurp everything in using IPC::Open3, IO::Select, and sysread. Most of the time, commands being tested do not produce significant amounts of output, so there becomes no reason to use temporary files and involve the disk at all. .SH "EXPORTS" .IX Header "EXPORTS" .SS "run" .IX Subsection "run" Runs the given command. It will return when the command is done. .PP This will also reinitialise all of the states for stdout, stderr, and rc. If you need to keep the values of a previous \fIrun()\fR after a later one, you will need to store it. This should be mostly pretty rare. .PP Counts as one test: whether the IPC::Open3 call to open3 succeeded. That is not returned in a meaningful way to the user, though. To check if that's the case for purposes of SKIPping, rc will be set to \-1. .SS "stdout" .IX Subsection "stdout" Returns the last run's stdout .SS "stderr" .IX Subsection "stderr" Returns the last run's stderr .SS "rc" .IX Subsection "rc" Returns the last run's full $?, suitable for passing to \s-1POSIX\s0's :sys_wait_h macros (\s-1WIFEXITED, WEXITSTATUS,\s0 etc.) .SS "exit_status" .IX Subsection "exit_status" Returns the exit status of the last run .SS "run_ok" .IX Subsection "run_ok" Shortcut for checking that the return from a command is 0. Will still set stdout and stderr for further testing. .PP If the first parameter is an integer 0\-255, then that is the expected return code instead. Remember: $? has both a return code (0\-255) and a reason for exit embedded. This function must make the assumption that you want a \*(L"normal\*(R" exit only. If any signal is given, this will treat that as a failure. .PP Note that this becomes \fBthree\fR tests: one that IPC::Open3 could create the subprocess with the command, the next is the test that the process exited normally, and the last is the test of the rc. .SH "AUTHOR" .IX Header "AUTHOR" Darin McBride, \f(CW\*(C`\*(C'\fR .SH "BUGS" .IX Header "BUGS" Please report any bugs or feature requests to \f(CW\*(C`bug\-test\-command at rt.cpan.org\*(C'\fR, or through the web interface at . I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. .SH "SUPPORT" .IX Header "SUPPORT" You can find documentation for this module with the perldoc command. .PP .Vb 1 \& perldoc Test::Command::Simple .Ve .PP You can also look for information at: .IP "\(bu" 4 \&\s-1RT: CPAN\s0's request tracker .Sp .IP "\(bu" 4 AnnoCPAN: Annotated \s-1CPAN\s0 documentation .Sp .IP "\(bu" 4 \&\s-1CPAN\s0 Ratings .Sp .IP "\(bu" 4 Search \s-1CPAN\s0 .Sp .SH "ACKNOWLEDGEMENTS" .IX Header "ACKNOWLEDGEMENTS" .SH "LICENSE AND COPYRIGHT" .IX Header "LICENSE AND COPYRIGHT" Copyright 2010 Darin McBride. .PP This program is free software; you can redistribute it and/or modify it under the terms of either: the \s-1GNU\s0 General Public License as published by the Free Software Foundation; or the Artistic License. .PP See http://dev.perl.org/licenses/ for more information.