From 7c39722c1e5cc3eeec30a66058ee4da54c9b6ec1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Josef=20=C5=A0pa=C4=8Dek?= Date: Wed, 7 Dec 2022 23:05:54 +0100 Subject: [PATCH] Add test for network socket --- perl/MANIFEST | 1 + perl/Makefile.PL | 1 + perl/t/03-network_socket.t | 64 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 perl/t/03-network_socket.t diff --git a/perl/MANIFEST b/perl/MANIFEST index 591b0b3..1568745 100644 --- a/perl/MANIFEST +++ b/perl/MANIFEST @@ -14,4 +14,5 @@ MANIFEST.SKIP README t/01-load.t t/02-unix_domain_socket.t +t/03-network_socket.t typemap diff --git a/perl/Makefile.PL b/perl/Makefile.PL index a389f0c..0b49787 100644 --- a/perl/Makefile.PL +++ b/perl/Makefile.PL @@ -142,6 +142,7 @@ WriteMakefile( 'FCGI::Client' => 0.09, 'File::Temp' => 0, 'IO::Socket' => 0, + 'IO::Socket::IP' => 0, 'Test::More' => 0, }, @extras, diff --git a/perl/t/03-network_socket.t b/perl/t/03-network_socket.t new file mode 100644 index 0000000..84dd41d --- /dev/null +++ b/perl/t/03-network_socket.t @@ -0,0 +1,64 @@ +#!/usr/bin/env perl + +use strict; +use warnings; + +use Check::Fork qw(check_fork); +use Check::Socket qw(check_socket); +use FCGI; +use FCGI::Client; +use IO::Socket::IP; +use Test::More 'tests' => 4; + +check_fork() || plan skip_all => $Check::Fork::ERROR_MESSAGE; +check_socket() || plan skip_all => $Check::Socket::ERROR_MESSAGE; + +my $port = 8888; + +# Client +if (my $pid = fork()) { + my $right_ret = <<'END'; +Content-Type: text/plain + +END + + my ($stdout, $stderr) = client_request($port); + is($stdout, $right_ret."0\n", 'Test first round on stdout.'); + is($stderr, undef, 'Test first round on stderr.'); + + ($stdout, $stderr) = client_request($port); + is($stdout, $right_ret."1\n", 'Test second round on stdout.'); + is($stderr, undef, 'Test second round on stderr.'); + +# Server +} elsif (defined $pid) { + my $fcgi_socket = FCGI::OpenSocket(':'.$port, 5); + my $request = FCGI::Request(\*STDIN, \*STDOUT, \*STDERR, \%ENV, $fcgi_socket); + + # Only two cycles. + my $count = 0; + while ($count < 2 && $request->Accept() >= 0) { + print "Content-Type: text/plain\n\n"; + print $count++."\n"; + } + exit; + +} else { + die $!; +} + +sub client_request { + my $port = shift; + + my $sock = IO::Socket::IP->new( + PeerAddr => '127.0.0.1', + PeerPort => $port, + ) or die $!; + + my $client = FCGI::Client::Connection->new(sock => $sock); + my ($stdout, $stderr) = $client->request({ + REQUEST_METHOD => 'GET', + }, ''); + + return ($stdout, $stderr); +}