]> git.vpit.fr Git - perl/modules/rgit.git/commitdiff
Revamp t/21-once.t
authorVincent Pit <vince@profvince.com>
Wed, 24 Feb 2010 11:20:35 +0000 (12:20 +0100)
committerVincent Pit <vince@profvince.com>
Wed, 24 Feb 2010 11:20:35 +0000 (12:20 +0100)
And skip it if the mock git executable can't be run

MANIFEST
t/21-once.t
t/lib/App/Rgit/TestUtils.pm [new file with mode: 0644]

index 8e4b60331c46b007c6e3fa70b1d534ed0ad8159c..ded8e848a82f7e922dc8832951fc3ff089cd7c9f 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -27,3 +27,4 @@ t/99-kwalitee.t
 t/bin/git
 t/bin/git.bat
 t/lib/App/Rgit/Policy/Callback.pm
+t/lib/App/Rgit/TestUtils.pm
index 65accd21f74d428c7611dac9dc9bd60c9aff6b2e..93a184ce3ce1c90e861131c9fd2982c5b8c8028c 100644 (file)
@@ -3,36 +3,51 @@
 use strict;
 use warnings;
 
-use Cwd qw/abs_path/;
+use Cwd        qw/abs_path/;
 use File::Temp qw/tempfile/;
 
-use Test::More tests => 9 * 5;
+use Test::More;
 
 use App::Rgit;
 
+use lib 't/lib';
+use App::Rgit::TestUtils qw/can_run_git/;
+
+my ($can_run, $reason) = can_run_git;
+if ($can_run) {
+ plan tests    => 9 * 5;
+} else {
+ plan skip_all => "Can't run the mock git executable on this system: $reason";
+}
+
 my @expected = (
  ([ [ qw/%n %g %w %b %%/ ] ]) x 5
 );
 
-local $ENV{GIT_DIR} = 't';
+local $ENV{GIT_DIR}       = 't';
 local $ENV{GIT_EXEC_PATH} = abs_path('t/bin/git');
 
 for my $cmd (qw/daemon gui help init version/) {
  my ($fh, $filename) = tempfile(UNLINK => 1);
+
  my $ar = App::Rgit->new(
   git  => $ENV{GIT_EXEC_PATH},
   root => $ENV{GIT_DIR},
   cmd  => $cmd,
-  args => [ abs_path($filename), $cmd, qw/%n %g %w %b %%/ ]
+  args => [ abs_path($filename), $cmd, qw/%n %g %w %b %%/ ],
  );
- isnt($ar, undef, "once $cmd has a defined object");
+ isa_ok $ar, 'App::Rgit', "once $cmd is an App::Rgit object";
+
  my $exit = $ar->run;
- is($exit, 0, "once $cmd returned 0");
+ is $exit, 0, "once $cmd returned 0";
+
  my @lines = sort split /\n/, do { local $/; <$fh> };
- is(@lines, 1, "once $cmd visited only one repo");
+ is @lines, 1, "once $cmd visited only one repo";
+
  my $r = [ split /\|/, defined $lines[0] ? $lines[0] : '' ];
  my $e = [ $cmd, qw/%n %g %w %b %%/ ];
  s/[\r\n]*$// for @$r;
- is($r->[$_], $e->[$_], "once $cmd argument $_ is ok")
-  for 0 .. 5;
+ for (0 .. 5) {
+  is $r->[$_], $e->[$_], "once $cmd argument $_ is ok";
+ }
 }
diff --git a/t/lib/App/Rgit/TestUtils.pm b/t/lib/App/Rgit/TestUtils.pm
new file mode 100644 (file)
index 0000000..07b1bd7
--- /dev/null
@@ -0,0 +1,69 @@
+package App::Rgit::TestUtils;
+
+use strict;
+use warnings;
+
+use Cwd        qw/abs_path/;
+use File::Temp qw/tempfile/;
+use POSIX      qw/WIFEXITED WEXITSTATUS WIFSIGNALED WTERMSIG SIGINT SIGQUIT/;
+
+BEGIN {
+ no warnings 'redefine';
+ *WIFEXITED   = sub { 1 }             unless eval { WIFEXITED(0);   1 };
+ *WEXITSTATUS = sub { shift() >> 8 }  unless eval { WEXITSTATUS(0); 1 };
+ *WIFSIGNALED = sub { shift() & 127 } unless eval { WIFSIGNALED(0); 1 };
+}
+
+use base qw/Exporter/;
+
+our @EXPORT_OK = (qw/can_run_git/);
+
+sub can_run_git {
+ my ($fh, $filename) = tempfile(UNLINK => 1);
+
+ my @ret = (1, '');
+
+CHECK:
+ {
+  my @args = (
+   abs_path($filename),
+   'version',
+  );
+
+  my $git = 't/bin/git';
+  if ($^O eq 'MSWin32') {
+   unless (-x $git) {
+    $git .= '.bat';
+    unless (-x $git) {
+     @ret = (0, "no $git executable");
+     last CHECK;
+    }
+   }
+  } else {
+   unless (-x $git) {
+    @ret = (0, "no $git executable");
+    last CHECK;
+   }
+  }
+
+  system { $git } $git, @args;
+
+  if ($? == -1) {
+   @ret = (0, $! || "unknown");
+   last CHECK;
+  }
+
+  my $status;
+  $status = WEXITSTATUS($?) if WIFEXITED($?);
+
+  if (WIFSIGNALED($?)) {
+   @ret = (0, 'process recieved signal ' . WTERMSIG($?));
+  } elsif ($status) {
+   @ret = (0, "process exited with code $status");
+  }
+ }
+
+ return wantarray ? @ret : $ret[0];
+}
+
+1;