Test-Command-Simple-0.04/0000755002053500205350000000000012056011523015262 5ustar dmcbridedmcbrideTest-Command-Simple-0.04/ignore.txt0000644002053500205350000000017211470763457017331 0ustar dmcbridedmcbrideblib* Makefile Makefile.old Build Build.bat _build* pm_to_blib* *.tar.gz .lwpcookies cover_db pod2htm*.tmp Test-Command-* Test-Command-Simple-0.04/t/0000755002053500205350000000000012056011523015525 5ustar dmcbridedmcbrideTest-Command-Simple-0.04/t/manifest.t0000644002053500205350000000053112056011162017516 0ustar dmcbridedmcbride#!perl -T use strict; use warnings; use Test::More; BAIL_OUT("No support for OS") if $^O =~ /win/i && $^O !~ /cygwin/i; unless ( $ENV{RELEASE_TESTING} ) { plan( skip_all => "Author tests not required for installation" ); } eval "use Test::CheckManifest 0.9"; plan skip_all => "Test::CheckManifest 0.9 required" if $@; ok_manifest(); Test-Command-Simple-0.04/t/01-run.t0000644002053500205350000000076612056011103016737 0ustar dmcbridedmcbride#!/usr/bin/perl use strict; use warnings; use Test::More; BAIL_OUT("No support for OS") if $^O =~ /win/i && $^O !~ /cygwin/i; BEGIN { use_ok('Test::Command::Simple'); } run($^X, qw(-le), 'print q[this is here in the output]'); like(stdout, qr/here in the/, "Output looks ok"); is(length stderr, 0, "No stderr"); is(rc, 0, "Returns ok"); run_ok('echo', 'something else'); like(stdout, qr/mething/); # check that the return code is tested run_ok(3, $^X, -le => 'exit 3'); done_testing(); Test-Command-Simple-0.04/t/00-load.t0000644002053500205350000000041712056011153017047 0ustar dmcbridedmcbride#!perl -T use Test::More tests => 1; BAIL_OUT("No support for OS") if $^O =~ /win/i && $^O !~ /cygwin/i; BEGIN { use_ok( 'Test::Command::Simple' ) || print "Bail out! "; } diag( "Testing Test::Command::Simple $Test::Command::Simple::VERSION, Perl $], $^X" ); Test-Command-Simple-0.04/t/pod.t0000644002053500205350000000035011470763457016515 0ustar dmcbridedmcbride#!perl -T use strict; use warnings; use Test::More; # Ensure a recent version of Test::Pod my $min_tp = 1.22; eval "use Test::Pod $min_tp"; plan skip_all => "Test::Pod $min_tp required for testing POD" if $@; all_pod_files_ok(); Test-Command-Simple-0.04/t/pod-coverage.t0000644002053500205350000000104711470763457020312 0ustar dmcbridedmcbrideuse strict; use warnings; use Test::More; # Ensure a recent version of Test::Pod::Coverage my $min_tpc = 1.08; eval "use Test::Pod::Coverage $min_tpc"; plan skip_all => "Test::Pod::Coverage $min_tpc required for testing POD coverage" if $@; # Test::Pod::Coverage doesn't require a minimum Pod::Coverage version, # but older versions don't recognize some common documentation styles my $min_pc = 0.18; eval "use Pod::Coverage $min_pc"; plan skip_all => "Pod::Coverage $min_pc required for testing POD coverage" if $@; all_pod_coverage_ok(); Test-Command-Simple-0.04/MANIFEST.SKIP0000644002053500205350000000007011471000710017151 0ustar dmcbridedmcbride^MYMETA.yml$ ^_build/ ~$ \.bak$ ^blib/ tar\.gz$ ^Build$ Test-Command-Simple-0.04/Build.PL0000644002053500205350000000105012056011465016557 0ustar dmcbridedmcbrideuse strict; use warnings; use Module::Build; die("No support for OS\n") if $^O =~ /win/i && $^O !~ /cygwin/i; my $builder = Module::Build->new( module_name => 'Test::Command::Simple', license => 'perl', dist_author => q{Darin McBride }, dist_version_from => 'lib/Test/Command/Simple.pm', build_requires => { 'Test::More' => 0, }, add_to_cleanup => [ 'Test-Command-Simple-*' ], create_makefile_pl => 'traditional', ); $builder->create_build_script(); Test-Command-Simple-0.04/META.yml0000644002053500205350000000070012056011523016530 0ustar dmcbridedmcbride--- abstract: unknown author: - unknown build_requires: ExtUtils::MakeMaker: 0 configure_requires: ExtUtils::MakeMaker: 0 dynamic_config: 1 generated_by: 'ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.112621' license: unknown meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 name: Test-Command-Simple no_index: directory: - t - inc requires: Test::More: 0 version: 0.04 Test-Command-Simple-0.04/META.json0000644002053500205350000000150012056011523016677 0ustar dmcbridedmcbride{ "abstract" : "unknown", "author" : [ "unknown" ], "dynamic_config" : 1, "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.112621", "license" : [ "unknown" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : "2" }, "name" : "Test-Command-Simple", "no_index" : { "directory" : [ "t", "inc" ] }, "prereqs" : { "build" : { "requires" : { "ExtUtils::MakeMaker" : 0 } }, "configure" : { "requires" : { "ExtUtils::MakeMaker" : 0 } }, "runtime" : { "requires" : { "Test::More" : 0 } } }, "release_status" : "stable", "version" : "0.04" } Test-Command-Simple-0.04/Makefile.PL0000644002053500205350000000065011473032604017242 0ustar dmcbridedmcbride# Note: this file was auto-generated by Module::Build::Compat version 0.3607 use ExtUtils::MakeMaker; WriteMakefile ( 'PL_FILES' => {}, 'INSTALLDIRS' => 'site', 'NAME' => 'Test::Command::Simple', 'EXE_FILES' => [], 'VERSION_FROM' => 'lib/Test/Command/Simple.pm', 'PREREQ_PM' => { 'Test::More' => 0 } ) ; Test-Command-Simple-0.04/MANIFEST0000644002053500205350000000042012056011524016410 0ustar dmcbridedmcbrideBuild.PL Changes ignore.txt lib/Test/Command/Simple.pm Makefile.PL MANIFEST This list of files MANIFEST.SKIP META.yml README t/00-load.t t/01-run.t t/manifest.t t/pod-coverage.t t/pod.t META.json Module JSON meta-data (added by MakeMaker) Test-Command-Simple-0.04/lib/0000755002053500205350000000000012056011523016030 5ustar dmcbridedmcbrideTest-Command-Simple-0.04/lib/Test/0000755002053500205350000000000012056011523016747 5ustar dmcbridedmcbrideTest-Command-Simple-0.04/lib/Test/Command/0000755002053500205350000000000012056011523020325 5ustar dmcbridedmcbrideTest-Command-Simple-0.04/lib/Test/Command/Simple.pm0000644002053500205350000001517112056011373022124 0ustar dmcbridedmcbridepackage Test::Command::Simple; use warnings; use strict; =head1 NAME Test::Command - Test external commands (nearly) as easily as loaded modules. =head1 VERSION Version 0.04 =cut our $VERSION = '0.04'; use base 'Test::Builder::Module'; use IPC::Open3; use IO::Select; use Symbol qw(gensym); use Scalar::Util qw(looks_like_number); our @EXPORT = qw( run stdout stderr rc run_ok ); =head1 SYNOPSIS use Test::Command::Simple; run('echo', 'has this output'); # only tests that the command can be started, not checking rc is(rc,0,'Returned successfully') like(stdout,qr/has this output/,'Testing stdout'); is(length stderr, 0,'No stderr'); =head1 PURPOSE This test module is intended to simplify testing of external commands. It does so by running the command under L, closing the stdin immediately, and reading everything from the command's stdout and stderr. It then makes the output available to be tested. It is not (yet?) as feature-rich as L, but I think the interface to this is much simpler. Tests also plug directly into the L framework, which plays nice with L. As compared to L, this module is simpler, relying on the user to feed rc, stdout, and stderr to the appropriate other tests, presumably in L, but not necessarily. This makes it possible, for example, to test line 3 of the output: my (undef, undef, $line) = split /\r?\n/, stdout; is($line, 'This is the third line', 'Test the third line'); 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. 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. =head1 EXPORTS =head2 run Runs the given command. It will return when the command is done. This will also reinitialise all of the states for stdout, stderr, and rc. If you need to keep the values of a previous run() after a later one, you will need to store it. This should be mostly pretty rare. 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. =cut my ($stdout, $stderr, $rc); sub run { my $opts = @_ && ref $_[0] eq 'HASH' ? shift : {}; my @cmd = @_; # initialise everything each run. $rc = -1; $stdout = ''; $stderr = ''; my ($wtr, $rdr, $err) = map { gensym() } 1..3; my $pid = open3($wtr, $rdr, $err, @cmd) or do { return __PACKAGE__->builder->ok(0, "Can run '@cmd'"); }; __PACKAGE__->builder->ok(1, "Can run '@cmd'"); my $s = IO::Select->new(); if ($opts->{stdin}) { print $wtr $opts->{stdin}; } close $wtr; $s->add($rdr); $s->add($err); my %map = ( fileno($rdr) => \$stdout, fileno($err) => \$stderr, ); while ($s->count()) { if (my @ready = $s->can_read()) { for my $fh (@ready) { my $buffer; my $fileno = fileno($fh); my $read = sysread($fh, $buffer, 1024); if ($read && $map{$fileno}) { ${$map{$fileno}} .= $buffer; } else { # done. $s->remove($fh); close $fh; } } } elsif (my @err = $s->has_exception()) { warn "Exception on ", fileno($_) for @err; } } waitpid $pid, 0; $rc = $?; $rc; } =head2 stdout Returns the last run's stdout =cut sub stdout() { $stdout } =head2 stderr Returns the last run's stderr =cut sub stderr() { $stderr } =head2 rc Returns the last run's full $?, suitable for passing to L's :sys_wait_h macros (WIFEXITED, WEXITSTATUS, etc.) =cut sub rc() { $rc } =head2 exit_status Returns the exit status of the last run =cut sub exit_status() { #WEXITSTATUS($rc); $rc >> 8; } =head2 run_ok Shortcut for checking that the return from a command is 0. Will still set stdout and stderr for further testing. 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 "normal" exit only. If any signal is given, this will treat that as a failure. Note that this becomes B 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. =cut sub run_ok { my $wanted_rc = 0; if (looks_like_number($_[0]) && 0 <= $_[0] && $_[0] <= 255 && int($_[0]) == $_[0]) { $wanted_rc = shift(); } run(@_); __PACKAGE__->builder->is_eq(rc & 0xFF, 0, "Process terminated without a signal"); __PACKAGE__->builder->is_eq(exit_status, $wanted_rc, "Check return from '@_' is $wanted_rc"); } =head1 AUTHOR Darin McBride, C<< >> =head1 BUGS Please report any bugs or feature requests to C, or through the web interface at L. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. =head1 SUPPORT You can find documentation for this module with the perldoc command. perldoc Test::Command::Simple You can also look for information at: =over 4 =item * RT: CPAN's request tracker L =item * AnnoCPAN: Annotated CPAN documentation L =item * CPAN Ratings L =item * Search CPAN L =back =head1 ACKNOWLEDGEMENTS =head1 LICENSE AND COPYRIGHT Copyright 2010 Darin McBride. This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License. See http://dev.perl.org/licenses/ for more information. =cut 1; # End of Test::Command::Simple Test-Command-Simple-0.04/Changes0000644002053500205350000000073012056011356016561 0ustar dmcbridedmcbrideRevision history for Test-Command-Simple 0.04 2012-Nov-29 ! This method of running subcommands doesn't work hot on Windows (except cygwin). Instead of hanging the cpantesters, we'll instead drop the platform altogether. 0.03 2010-Nov-23 + Add stdin for run function. 0.02 2010-Nov-17 ! Unfortunately clobbered existing module, renamed. 0.01 2010-Nov-17 First version, released on an unsuspecting world. Test-Command-Simple-0.04/README0000644002053500205350000000265111471021534016151 0ustar dmcbridedmcbrideTest-Command-Simple 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. 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. INSTALLATION To install this module, run the following commands: perl Build.PL ./Build ./Build test ./Build install SUPPORT AND DOCUMENTATION After installing, you can find documentation for this module with the perldoc command. perldoc Test::Command You can also look for information at: RT, CPAN's request tracker http://rt.cpan.org/NoAuth/Bugs.html?Dist=Test-Command-Simple AnnoCPAN, Annotated CPAN documentation http://annocpan.org/dist/Test-Command-Simple CPAN Ratings http://cpanratings.perl.org/d/Test-Command-Simple Search CPAN http://search.cpan.org/dist/Test-Command-Simple/ LICENSE AND COPYRIGHT Copyright (C) 2010 Darin McBride This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License. See http://dev.perl.org/licenses/ for more information.