16fb12b70Safresh1#!perl 26fb12b70Safresh1 36fb12b70Safresh1use strict; 46fb12b70Safresh1use warnings; 56fb12b70Safresh1 66fb12b70Safresh1use File::Basename; 76fb12b70Safresh1use Test::More 0.88; 8*9f11ffb7Safresh1use lib 't'; 9*9f11ffb7Safresh1use Util qw[tmpfile rewind slurp monkey_patch dir_list parse_case 106fb12b70Safresh1 hashify connect_args clear_socket_source set_socket_source sort_headers 116fb12b70Safresh1 $CRLF $LF]; 126fb12b70Safresh1 136fb12b70Safresh1use HTTP::Tiny; 146fb12b70Safresh1BEGIN { monkey_patch() } 156fb12b70Safresh1 16b8851fccSafresh1for my $file ( dir_list("corpus", qr/^auth/ ) ) { 176fb12b70Safresh1 my $label = basename($file); 186fb12b70Safresh1 my $data = do { local (@ARGV,$/) = $file; <> }; 196fb12b70Safresh1 my ($params, @case_pairs) = split /--+\n/, $data; 206fb12b70Safresh1 my $case = parse_case($params); 216fb12b70Safresh1 226fb12b70Safresh1 my $url = $case->{url}[0]; 236fb12b70Safresh1 my $method = $case->{method}[0] || 'GET'; 246fb12b70Safresh1 my %headers = hashify( $case->{headers} ); 256fb12b70Safresh1 my %new_args = hashify( $case->{new_args} ); 266fb12b70Safresh1 276fb12b70Safresh1 my %options; 286fb12b70Safresh1 $options{headers} = \%headers if %headers; 296fb12b70Safresh1 my $call_args = %options ? [$method, $url, \%options] : [$method, $url]; 306fb12b70Safresh1 316fb12b70Safresh1 my $version = HTTP::Tiny->VERSION || 0; 326fb12b70Safresh1 my $agent = $new_args{agent} || "HTTP-Tiny/$version"; 336fb12b70Safresh1 346fb12b70Safresh1 my (@socket_pairs); 356fb12b70Safresh1 while ( @case_pairs ) { 366fb12b70Safresh1 my ($expect_req, $give_res) = splice( @case_pairs, 0, 2 ); 376fb12b70Safresh1 # cleanup source data 386fb12b70Safresh1 $expect_req =~ s{HTTP-Tiny/VERSION}{$agent}; 396fb12b70Safresh1 s{\n}{$CRLF}g for ($expect_req, $give_res); 406fb12b70Safresh1 416fb12b70Safresh1 # setup mocking and test 426fb12b70Safresh1 my $req_fh = tmpfile(); 436fb12b70Safresh1 my $res_fh = tmpfile($give_res); 446fb12b70Safresh1 456fb12b70Safresh1 push @socket_pairs, [$req_fh, $res_fh, $expect_req]; 466fb12b70Safresh1 } 476fb12b70Safresh1 486fb12b70Safresh1 clear_socket_source(); 496fb12b70Safresh1 set_socket_source(@$_) for @socket_pairs; 506fb12b70Safresh1 516fb12b70Safresh1 my $http = HTTP::Tiny->new(keep_alive => 0, %new_args); 526fb12b70Safresh1 my $response = $http->request(@$call_args); 536fb12b70Safresh1 546fb12b70Safresh1 my $calls = 0 556fb12b70Safresh1 + (defined($new_args{max_redirect}) ? $new_args{max_redirect} : 5); 566fb12b70Safresh1 576fb12b70Safresh1 for my $i ( 0 .. $calls ) { 586fb12b70Safresh1 last unless @socket_pairs; 596fb12b70Safresh1 my ($req_fh, $res_fh, $expect_req) = @{ shift @socket_pairs }; 606fb12b70Safresh1 my $got_req = slurp($req_fh); 616fb12b70Safresh1 is( sort_headers($got_req), sort_headers($expect_req), "$label request ($i)"); 626fb12b70Safresh1 $i++; 636fb12b70Safresh1 } 646fb12b70Safresh1 656fb12b70Safresh1 my $exp_content = $case->{expected} 666fb12b70Safresh1 ? join("$CRLF", @{$case->{expected}}) : ''; 676fb12b70Safresh1 686fb12b70Safresh1 is ( $response->{content}, $exp_content, "$label content" ); 696fb12b70Safresh1 706fb12b70Safresh1 if ( $case->{expected_url} ) { 716fb12b70Safresh1 is ( $response->{url}, $case->{expected_url}[0], "$label response URL" ); 726fb12b70Safresh1 } 736fb12b70Safresh1 746fb12b70Safresh1} 756fb12b70Safresh1 766fb12b70Safresh1done_testing; 77