# This is the original function.t file distributed with CGI.pm 2.78 # The only change is to change the use statement and change references # from CGI to CGI::Simple use Test::More tests => 40; use strict; use Config; use CGI::Simple ( -default ); # Makes forked test work OK Test::More->builder->no_ending( 1 ); # Set up a CGI environment $ENV{REQUEST_METHOD} = 'GET'; $ENV{QUERY_STRING} = 'game=chess&game=checkers&weather=dull'; $ENV{PATH_INFO} = '/somewhere/else'; $ENV{PATH_TRANSLATED} = '/usr/local/somewhere/else'; $ENV{SCRIPT_NAME} = '/cgi-bin/foo.cgi'; $ENV{SERVER_PROTOCOL} = 'HTTP/1.0'; $ENV{SERVER_PORT} = 8080; $ENV{SERVER_NAME} = 'the.good.ship.lollypop.com'; $ENV{REQUEST_URI} = "$ENV{SCRIPT_NAME}$ENV{PATH_INFO}?$ENV{QUERY_STRING}"; $ENV{HTTP_LOVE} = 'true'; my $q = new CGI::Simple; ok( $q, "CGI::Simple::new()" ); is( $q->request_method, 'GET', "CGI::Simple::request_method()" ); is( $q->query_string, 'game=chess;game=checkers;weather=dull', "CGI::Simple::query_string()" ); is( $q->param(), 2, "CGI::Simple::param()" ); is( join( ' ', sort $q->param() ), 'game weather', "CGI::Simple::param()" ); is( $q->param( 'game' ), 'chess', "CGI::Simple::param()" ); is( $q->param( 'weather' ), 'dull', "CGI::Simple::param()" ); is( join( ' ', $q->param( 'game' ) ), 'chess checkers', "CGI::Simple::param()" ); ok( $q->param( -name => 'foo', -value => 'bar' ), 'CGI::Simple::param() put' ); is( $q->param( -name => 'foo' ), 'bar', 'CGI::Simple::param() get' ); is( $q->query_string, 'game=chess;game=checkers;weather=dull;foo=bar', "CGI::Simple::query_string() redux" ); is( $q->http( 'love' ), 'true', "CGI::Simple::http()" ); is( $q->script_name, '/cgi-bin/foo.cgi', "CGI::Simple::script_name()" ); is( $q->url, 'http://the.good.ship.lollypop.com:8080/cgi-bin/foo.cgi', "CGI::Simple::url()" ); is( $q->self_url, 'http://the.good.ship.lollypop.com:8080/cgi-bin/foo.cgi/somewhere/else?' . 'game=chess;game=checkers;weather=dull;foo=bar', "CGI::Simple::url()" ); is( $q->url( -absolute => 1 ), '/cgi-bin/foo.cgi', 'CGI::Simple::url(-absolute=>1)' ); is( $q->url( -relative => 1 ), 'foo.cgi', 'CGI::Simple::url(-relative=>1)' ); is( $q->url( -relative => 1, -path => 1 ), 'foo.cgi/somewhere/else', 'CGI::Simple::url(-relative=>1,-path=>1)' ); is( $q->url( -relative => 1, -path => 1, -query => 1 ), 'foo.cgi/somewhere/else?game=chess;game=checkers;weather=dull;foo=bar', 'CGI::Simple::url(-relative=>1,-path=>1,-query=>1)' ); $q->delete( 'foo' ); ok( !$q->param( 'foo' ), 'CGI::Simple::delete()' ); $q->_reset_globals; $ENV{QUERY_STRING} = 'mary+had+a+little+lamb'; ok( $q = new CGI::Simple, "CGI::Simple::new() redux" ); is( join( ' ', $q->keywords ), 'mary had a little lamb', 'CGI::Simple::keywords' ); is( join( ' ', $q->param( 'keywords' ) ), 'mary had a little lamb', 'CGI::Simple::keywords' ); ok $q = new CGI::Simple( 'foo=bar=baz' ), 'CGI::Simple::new(), equals in value'; is $q->param( 'foo' ), 'bar=baz', 'parsed parameter containing equals'; ok( $q = new CGI::Simple( 'foo=bar&foo=baz' ), "CGI::Simple::new() redux" ); is( $q->param( 'foo' ), 'bar', 'CGI::Simple::param() redux' ); ok( $q = new CGI::Simple( { 'foo' => 'bar', 'bar' => 'froz' } ), "CGI::Simple::new() redux 2" ); is( $q->param( 'bar' ), 'froz', "CGI::Simple::param() redux 2" ); # test tied interface my $p = $q->Vars; is( $p->{bar}, 'froz', "tied interface fetch" ); $p->{bar} = join( "\0", qw(foo bar baz) ); is( join( ' ', $q->param( 'bar' ) ), 'foo bar baz', 'tied interface store' ); SKIP: { skip "Fork not available on this platform", 9 unless $Config{d_fork}; # test posting $q->_reset_globals; my $test_string = 'game=soccer&game=baseball&weather=nice'; $ENV{REQUEST_METHOD} = 'POST'; $ENV{CONTENT_LENGTH} = length( $test_string ); $ENV{QUERY_STRING} = 'big_balls=basketball&small_balls=golf'; $ENV{CONTENT_TYPE} = 'application/x-www-form-urlencoded'; if ( open( CHILD, "|-" ) ) { # cparent print CHILD $test_string; close CHILD; exit 0; } # at this point, we're in a new (child) process ok( $q = new CGI::Simple, "CGI::Simple::new() from POST" ); is( $q->param( 'weather' ), 'nice', "CGI::Simple::param() from POST" ); is( $q->url_param( 'big_balls' ), 'basketball', "CGI::url_param()" ); # test posting POSTDATA $q->_reset_globals; $test_string = 'soccerbaseballnice'; $ENV{REQUEST_METHOD} = 'POST'; $ENV{CONTENT_LENGTH} = length( $test_string ); $ENV{QUERY_STRING} = ''; $ENV{CONTENT_TYPE} = 'text/xml'; if ( open( CHILD, "|-" ) ) { # cparent print CHILD $test_string; close CHILD; exit 0; } ok( $q = new CGI::Simple, "CGI::Simple::new from POST" ); is( $q->param( 'POSTDATA' ), $test_string, "CGI::Simple::param('POSTDATA') from POST" ); # test posting POSTDATA with nulls $q->_reset_globals; $test_string = "some nulls \0\0\0 are better than others \0\0\0"; $ENV{REQUEST_METHOD} = 'POST'; $ENV{CONTENT_LENGTH} = length( $test_string ); $ENV{QUERY_STRING} = ''; $ENV{CONTENT_TYPE} = 'text/plain'; if ( open( CHILD, "|-" ) ) { # cparent print CHILD $test_string; close CHILD; exit 0; } ok( $q = new CGI::Simple, "CGI::Simple::new from POST" ); is( $q->param( 'POSTDATA' ), $test_string, "CGI::Simple::param('POSTDATA') from POST w/nulls" ); # test posting PUTDATA $q->_reset_globals; $test_string = 'soccerbaseballnice'; $ENV{REQUEST_METHOD} = 'PUT'; $ENV{CONTENT_LENGTH} = length( $test_string ); $ENV{CONTENT_TYPE} = 'text/xml'; if ( open( CHILD, "|-" ) ) { # cparent print CHILD $test_string; close CHILD; exit 0; } ok( $q = new CGI::Simple, "CGI::Simple::new from PUT" ); is( $q->param( 'PUTDATA' ), $test_string, "CGI::Simple::param('POSTDATA') from POST" ); }