This is an automated email from the git hooks/post-receive script.

abe pushed a commit to annotated tag 0.50
in repository libcgi-test-perl.

commit 4299c363a40f97cbdf6b6fe9c598041fb40ccf16
Author: Alex Tokarev <noh...@nohuhu.org>
Date:   Wed Aug 27 23:00:29 2014 -0700

    First stab at Windows compatibility
---
 lib/CGI/Test.pm                     | 156 +++++++++++++++++++++---------------
 t/01_env.t                          |  76 ++++++++++++++++++
 t/{parsing.t => 02_parsing.t}       |   0
 t/{get.t => 03_get.t}               |   0
 t/{post.t => 04_post.t}             |   0
 t/{play_get.t => 05_play_get.t}     |   0
 t/{play_post.t => 06_play_post.t}   |   0
 t/{play_multi.t => 07_play_multi.t} |   0
 t/env.t                             | 108 -------------------------
 9 files changed, 168 insertions(+), 172 deletions(-)

diff --git a/lib/CGI/Test.pm b/lib/CGI/Test.pm
index 73cf6c7..50e862f 100644
--- a/lib/CGI/Test.pm
+++ b/lib/CGI/Test.pm
@@ -10,7 +10,7 @@ package CGI::Test;
 
 use strict;
 use warnings;
-no  warnings 'uninitialized';
+#no  warnings 'uninitialized';
 
 use Carp;
 use HTTP::Status;
@@ -20,13 +20,11 @@ use File::Spec;
 use File::Basename;
 use Cwd qw(abs_path);
 
+use vars qw($VERSION);
 
-require Exporter;
-use vars qw($VERSION @ISA @EXPORT);
+$VERSION = '0.50';
 
-$VERSION = '0.32';
-@ISA     = qw(Exporter);
-@EXPORT  = qw(ok);
+use constant WINDOWS => eval { $^O =~ /win/i };
 
 #############################################################################
 #
@@ -364,16 +362,37 @@ sub _cgi_request
     my @post = ();
     local $SIG{PIPE} = 'IGNORE';
     local (*PREAD, *PWRITE);
-    if (defined $input)
-    {
-        unless (pipe(PREAD, PWRITE))
-        {
-            warn "can't open pipe: $!";
-            return $error->new(RC_INTERNAL_SERVER_ERROR, $this);
+    
+    my ($in_fh, $out_fh, $in_fname, $out_fname);
+    
+    if (defined $input) {
+        # In Windows, we use temp files instead of pipes to avoid
+        # duplication errors
+        if ( WINDOWS ) {
+            ($in_fh, $in_fname) =
+                mkstemp(File::Spec->catfile($this->tmp_dir, "cgi_in.XXXXXX"));
+            
+            binmode $in_fh;
+            
+            syswrite $in_fh, $input->data, $input->length;
+            close $in_fh;
+            
+            @post = (
+                -in_fname => $in_fname,
+                -input    => $input,
+            );
         }
+        else {
+            if ( not pipe(PREAD, PWRITE) ) {
+                warn "can't open pipe: $!";
+                return $error->new(RC_INTERNAL_SERVER_ERROR, $this);
+            }
 
-        @post = (-in    => \*PREAD,
-                 -input => $input,);
+            @post = (
+                -in    => \*PREAD,
+                -input => $input,
+            );
+        }
     }
 
     #
@@ -381,8 +400,10 @@ sub _cgi_request
     # the script is done.
     #
 
-    my ($fh, $fname) =
+    ($out_fh, $out_fname) =
       mkstemp(File::Spec->catfile($this->tmp_dir, "cgi_out.XXXXXX"));
+    
+    close $out_fh if WINDOWS;
 
     select((select(STDOUT), $| = 1)[ 0 ]);
     print STDOUT "";    # Flush STDOUT before forking
@@ -397,21 +418,24 @@ sub _cgi_request
     #
     # Child will run the CGI program with no input if it's a GET and
     # output stored to $fh.  When issuing a POST, data will be provided
-    # by the parent through a pipe.
+    # by the parent through a pipe in Unixy systems, or through a temp file
+    # in Windows.
     #
 
-    if ($pid == 0)
-    {
+    if ($pid == 0) {
         close PWRITE if defined $input;    # Writing side of the pipe
+        
         $this->_run_cgi(
             -script_file => $script,         # Real path
             -script_name => $script_name,    # Virtual path, given in URI
             -user        => $user,
-            -out         => $fh,
+            -out         => $out_fh,
+            -out_fname   => $out_fname,
             -uri         => $u,
             -path_info   => $path,
             @post,                           # Additional params for POST
-            );
+        );
+        
         confess "not reachable!";
     }
 
@@ -419,7 +443,8 @@ sub _cgi_request
     # Parent process
     #
 
-    close $fh;
+    close $out_fh unless WINDOWS;
+    
     if (defined $input)
     {                                        # Send POST input data
         close PREAD;
@@ -433,7 +458,8 @@ sub _cgi_request
     {
         warn "waitpid returned with pid=$child, but expected pid=$pid";
         kill 'TERM', $pid or warn "can't SIGTERM pid $pid: $!";
-        unlink $fname or warn "can't unlink $fname: $!";
+        unlink $in_fname  or warn "can't unlink $in_fname: $!";
+        unlink $out_fname or warn "can't unlink $out_fname: $!";
         return $error->new(RC_NO_CONTENT, $this);
     }
 
@@ -441,11 +467,12 @@ sub _cgi_request
     # Get header within generated response, and determine Content-Type.
     #
 
-    my $header = $this->_parse_header($fname);
+    my $header = $this->_parse_header($out_fname);
     unless (scalar keys %$header)
     {
         warn "script $script_name generated no valid headers";
-        unlink $fname or warn "can't unlink $fname: $!";
+        unlink $in_fname  or warn "can't unlink $in_fname: $!";
+        unlink $out_fname or warn "can't unlink $out_fname: $!";
         return $error->new(RC_INTERNAL_SERVER_ERROR, $this);
     }
     
@@ -453,7 +480,7 @@ sub _cgi_request
     # Return error page if we got 5xx status
     #
     
-    if ( my ($status) = $header->{Status} =~ /^(5\d\d)/ ) {
+    if ( my ($status) = ($header->{Status} || '') =~ /^(5\d\d)/ ) {
         return $error->new($status, $this);
     }
 
@@ -478,13 +505,17 @@ sub _cgi_request
 
     my $page = $objtype->new(
                         -server       => $this,
-                        -file         => $fname,
+                        -file         => $out_fname,
                         -content_type => $type,    # raw type, with parameters
                         -user         => $user,
                         -uri          => $u,
                         );
-
-    unlink $fname or warn "can't unlink $fname: $!";
+    
+    if ($in_fname) {
+        unlink $in_fname  or warn "can't unlink $in_fname: $!";
+    }
+    
+    unlink $out_fname or warn "can't unlink $out_fname: $!";
 
     return $page;
 }
@@ -510,29 +541,33 @@ sub _run_cgi
 
     my %params = @_;
 
-    my $script = $params{-script_file};
-    my $name   = $params{-script_name};
-    my $user   = $params{-user};
-    my $in     = $params{-in};
-    my $out    = $params{-out};
-    my $u      = $params{-uri};
-    my $path   = $params{-path_info};
-    my $input  = $params{-input};
+    my $script    = $params{-script_file};
+    my $name      = $params{-script_name};
+    my $user      = $params{-user};
+    my $in        = $params{-in};
+    my $in_fname  = $params{-in_fname};
+    my $out       = $params{-out};
+    my $out_fname = $params{-out_fname};
+    my $u         = $params{-uri};
+    my $path      = $params{-path_info};
+    my $input     = $params{-input};
 
     #
     # Connect file descriptors.
     #
 
-    if (defined $in)
-    {
-        open(STDIN, '<&=' . fileno($in)) || die "can't redirect STDIN: $!";
-    }
-    else
-    {
-        my $devnull = File::Spec->devnull;
-        open(STDIN, $devnull) || die "can't open $devnull: $!";
+    if ( !WINDOWS ) {
+        if (defined $in)
+        {
+            open(STDIN, '<&=' . fileno($in)) || die "can't redirect STDIN: $!";
+        }
+        else
+        {
+            my $devnull = File::Spec->devnull;
+            open(STDIN, $devnull) || die "can't open $devnull: $!";
+        }
+        open(STDOUT, '>&=' . fileno($out)) || die "can't redirect STDOUT: $!";
     }
-    open(STDOUT, '>&=' . fileno($out)) || die "can't redirect STDOUT: $!";
 
     #
     # Setup default CGI environment.
@@ -548,7 +583,7 @@ sub _run_cgi
     # If there's no input, delete CONTENT_* variables.
     #
 
-    if (defined $in)
+    if (defined $input)
     {
         $ENV{CONTENT_TYPE}   = $input->mime_type;
         $ENV{CONTENT_LENGTH} = $input->length;
@@ -627,9 +662,18 @@ sub _run_cgi
 
     chdir $directory or die "can't cd to $directory: $!";
 
-    {exec "./$basename"}
+    if ( WINDOWS ) {
+        my $cmd_line = $input ? "$basename < ${in_fname} > ${out_fname}"
+                     :          "$basename >${out_fname}"
+                     ;
+
+        exec $cmd_line;
+    }
+    else {
+        exec "./$basename";
+    }
+
     die "could not exec $script: $!";
-    return;
 }
 
 ######################################################################
@@ -682,22 +726,6 @@ sub _parse_header
     return \%header;
 }
 
-######################################################################
-#
-# ok
-#
-# Useful to print test result when using Test::Harness.
-#
-######################################################################
-sub ok
-{
-    my ($num, $ok, $comment) = @_;
-    print "not " unless $ok;
-    print "ok $num";
-    print " # $comment" if defined $comment;
-    print "\n";
-}
-
 1;
 
 =head1 NAME
diff --git a/t/01_env.t b/t/01_env.t
new file mode 100644
index 0000000..f958af7
--- /dev/null
+++ b/t/01_env.t
@@ -0,0 +1,76 @@
+use Test::More tests => 16;
+
+use CGI::Test;
+
+my $SERVER = "some-server";
+my $PORT = 18;
+my $BASE = "http://${SERVER}:${PORT}/cgi-bin";;
+my $SCRIPT = $^O =~ /win/i ? 'printenv.bat' : 'printenv';
+my $SCRIPT_FNAME = $^O =~ /win/i ? "t\\cgi\\$SCRIPT" : "t/cgi/$SCRIPT";
+
+my $ct = CGI::Test->new(
+       -base_url       => $BASE,
+       -cgi_dir        => "t/cgi",
+);
+
+ok defined $ct, "Got CGI::Test object";
+isa_ok $ct, 'CGI::Test', 'isa';
+
+my $PATH_INFO = "path/info";
+my $QUERY = "query=1";
+my $USER = "ram";
+
+my $page = $ct->GET("$BASE/$SCRIPT/${PATH_INFO}?${QUERY}", $USER);
+my $raw_length = length $page->raw_content;
+
+ok !$page->is_error, "No errors in page";
+ok $raw_length, "Got raw length: $raw_length";
+
+my %V;
+parse_content(\%V, $page->raw_content_ref);
+
+cmp_ok $V{SCRIPT_NAME}, 'eq', "/cgi-bin/$SCRIPT", "SCRIPT_NAME";
+cmp_ok $V{SERVER_PORT}, '==', $PORT, "SERVER_PORT";
+cmp_ok $V{REQUEST_METHOD}, 'eq', "GET", "REQUEST_METHOD";
+cmp_ok $V{SCRIPT_FILENAME}, 'eq', $SCRIPT_FNAME, "SCRIPT_FILENAME";
+cmp_ok $V{PATH_INFO}, 'eq', "/$PATH_INFO", "PATH_INFO";
+cmp_ok $V{QUERY_STRING}, 'eq', $QUERY, "QUERY_STRING";
+cmp_ok $V{REMOTE_USER}, 'eq', $USER, "REMOTE_USER";
+cmp_ok $V{HTTP_USER_AGENT}, 'eq', "CGI::Test", "HTTP_USER_AGENT";
+
+my $AGENT = "LWP::UserAgent";
+my $EXTRA = "is set";
+$page->delete;
+
+my $ct2 = CGI::Test->new(
+       -base_url       => $BASE,
+       -cgi_dir        => "t/cgi",
+       -cgi_env        => {
+               EXTRA_IMPORTANT_VARIABLE        => $EXTRA,
+               HTTP_USER_AGENT                         => $AGENT,
+               SCRIPT_FILENAME                         => "foo",
+       },
+);
+
+$page = $ct2->GET("$BASE/$SCRIPT");
+parse_content(\%V, $page->raw_content_ref);
+
+cmp_ok $V{SCRIPT_NAME}, 'eq', "/cgi-bin/$SCRIPT", "SCRIPT_NAME";
+cmp_ok $V{HTTP_USER_AGENT}, 'eq', $AGENT, "HTTP_USER_AGENT";
+cmp_ok $V{EXTRA_IMPORTANT_VARIABLE}, 'eq', $EXTRA, "EXTRA_IMPORTANT_VARIABLE";
+
+ok !exists $V{REMOTE_USER}, "REMOTE_USER not set";
+
+$page->delete;
+
+exit 0;                ## DONE
+
+sub parse_content {
+       my ($h, $cref) = @_;
+       %$h = ();
+       foreach my $l (split /\n/, $$cref) {
+               my ($k, $v) = $l =~ /^([^=]+)\s*=\s*(.*)$/;
+               $h->{$k} = $v;
+       }
+}
+
diff --git a/t/parsing.t b/t/02_parsing.t
similarity index 100%
rename from t/parsing.t
rename to t/02_parsing.t
diff --git a/t/get.t b/t/03_get.t
similarity index 100%
rename from t/get.t
rename to t/03_get.t
diff --git a/t/post.t b/t/04_post.t
similarity index 100%
rename from t/post.t
rename to t/04_post.t
diff --git a/t/play_get.t b/t/05_play_get.t
similarity index 100%
rename from t/play_get.t
rename to t/05_play_get.t
diff --git a/t/play_post.t b/t/06_play_post.t
similarity index 100%
rename from t/play_post.t
rename to t/06_play_post.t
diff --git a/t/play_multi.t b/t/07_play_multi.t
similarity index 100%
rename from t/play_multi.t
rename to t/07_play_multi.t
diff --git a/t/env.t b/t/env.t
deleted file mode 100644
index 82b2b84..0000000
--- a/t/env.t
+++ /dev/null
@@ -1,108 +0,0 @@
-#
-# $Id: env.t,v 1.2 2003/09/29 11:00:50 mshiltonj Exp $
-#
-#  Copyright (c) 2001, Raphael Manfredi
-#  
-#  You may redistribute only under the terms of the Artistic License,
-#  as specified in the README file that comes with the distribution.
-#
-# HISTORY
-# $Log: env.t,v $
-# Revision 1.2  2003/09/29 11:00:50  mshiltonj
-#     CGI::Test has changed ownership. The new owner is Steven Hilton
-#     <mshilt...@mshiltonj.com>.  Many thanks to Raphael Manfredi
-#     and Steve Fink.
-#
-#     CGI::Test is now hosted as a SourceForge project. It is located
-#     at <http://cgi-test.sourceforge.net>.
-#
-#     POD updated to reflect the above.
-#
-#     make() method on various objects has been deprecated, and has been
-#     replaced by more conventional (for me, at least) new() method.
-#     Support for make() may be removed in a later release.
-#
-#     Entire codebase reformatted using perltidy
-#     Go to <http://perltidy.sourceforge.net/> to see how neat it is.
-#
-#     Self-referential object variable name standardized to '$this'
-#     throughout code.
-#
-# Revision 1.1.1.1  2003/09/23 09:47:26  mshiltonj
-# Initial Import
-#
-# Revision 0.1  2001/03/31 10:54:03  ram
-# Baseline for first Alpha release.
-#
-# $EndLog$
-#
-
-use CGI::Test;
-
-print "1..15\n";
-
-my $SERVER = "some-server";
-my $PORT = 18;
-my $BASE = "http://${SERVER}:${PORT}/cgi-bin";;
-
-my $ct = CGI::Test->new(
-       -base_url       => $BASE,
-       -cgi_dir        => "t/cgi",
-);
-
-ok 1, defined $ct;
-
-my $PATH_INFO = "path/info";
-my $QUERY = "query=1";
-my $USER = "ram";
-
-my $page = $ct->GET("$BASE/printenv/${PATH_INFO}?${QUERY}", $USER);
-ok 2, !$page->is_error;
-ok 3, length $page->raw_content;
-
-my %V;
-parse_content(\%V, $page->raw_content_ref);
-
-ok 4, $V{SCRIPT_NAME} eq "/cgi-bin/printenv";
-ok 5, $V{SERVER_PORT} == $PORT;
-ok 6, $V{REQUEST_METHOD} eq "GET";
-ok 7, $V{SCRIPT_FILENAME} eq "t/cgi/printenv";
-ok 8, $V{PATH_INFO} eq "/$PATH_INFO";
-ok 9, $V{QUERY_STRING} eq $QUERY;
-ok 10, $V{REMOTE_USER} eq $USER;
-ok 11, $V{HTTP_USER_AGENT} eq "CGI::Test";
-
-my $AGENT = "LWP::UserAgent";
-my $EXTRA = "is set";
-$page->delete;
-
-my $ct2 = CGI::Test->new(
-       -base_url       => $BASE,
-       -cgi_dir        => "t/cgi",
-       -cgi_env        => {
-               EXTRA_IMPORTANT_VARIABLE        => $EXTRA,
-               HTTP_USER_AGENT                         => $AGENT,
-               SCRIPT_FILENAME                         => "foo",
-       },
-);
-
-$page = $ct2->GET("$BASE/printenv");
-parse_content(\%V, $page->raw_content_ref);
-
-ok 12, $V{SCRIPT_NAME} eq "/cgi-bin/printenv";
-ok 13, $V{HTTP_USER_AGENT} eq $AGENT;
-ok 14, $V{EXTRA_IMPORTANT_VARIABLE} eq $EXTRA;
-ok 15, !exists $V{REMOTE_USER};
-$page->delete;
-
-exit 0;                ## DONE
-
-sub parse_content {
-       my ($h, $cref) = @_;
-       %$h = ();
-       foreach my $l (split /\n/, $$cref) {
-               my ($k, $v) = split / = /, $l;
-               $h->{$k} = $v;
-       }
-}
-

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-perl/packages/libcgi-test-perl.git

_______________________________________________
Pkg-perl-cvs-commits mailing list
Pkg-perl-cvs-commits@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-perl-cvs-commits

Reply via email to