user/dev discussion of public-inbox itself
 help / color / Atom feed
* [PATCH] t/www_listing: favor HTTP::Tiny over Net::HTTP
@ 2019-06-14 16:47 Eric Wong
  0 siblings, 0 replies; only message in thread
From: Eric Wong @ 2019-06-14 16:47 UTC (permalink / raw)
  To: meta

More testers are likely to have HTTP::Tiny than Net::HTTP, since
HTTP::Tiny is a dual-life module and distributed with Perl since
Perl 5.14 (2011-05-14), whereas Net::HTTP will likely live in
a separate package forever.
---
 t/www_listing.t | 68 ++++++++++++++++++++++++-------------------------
 1 file changed, 34 insertions(+), 34 deletions(-)

diff --git a/t/www_listing.t b/t/www_listing.t
index 1f29298..d82a4a4 100644
--- a/t/www_listing.t
+++ b/t/www_listing.t
@@ -7,12 +7,16 @@ use Test::More;
 use PublicInbox::Spawn qw(which);
 use File::Temp qw/tempdir/;
 require './t/common.perl';
-my @mods = qw(URI::Escape Plack::Builder IPC::Run Digest::SHA HTTP::Tiny
-		IO::Compress::Gzip IO::Uncompress::Gunzip Net::HTTP);
+my @mods = qw(URI::Escape Plack::Builder IPC::Run Digest::SHA
+		IO::Compress::Gzip IO::Uncompress::Gunzip HTTP::Tiny);
 foreach my $mod (@mods) {
 	eval("require $mod") or plan skip_all => "$mod missing for $0";
 }
-use_ok 'PublicInbox::WwwListing';
+
+require PublicInbox::WwwListing;
+my $json = eval { PublicInbox::WwwListing::_json() };
+plan skip_all => "JSON module missing: $@" if $@;
+
 use_ok 'PublicInbox::Git';
 
 my $fi_data = './t/git.fast-import-data';
@@ -28,11 +32,35 @@ ok(IPC::Run::run($cmd, '<', $fi_data), 'fast-import');
 like(PublicInbox::WwwListing::fingerprint($bare), qr/\A[a-f0-9]{40}\z/,
 	'got fingerprint with non-empty repo');
 
+sub tiny_test {
+	my ($host, $port) = @_;
+	my $http = HTTP::Tiny->new;
+	my $res = $http->get("http://$host:$port/manifest.js.gz");
+	is($res->{status}, 200, 'got manifest');
+	my $tmp;
+	IO::Uncompress::Gunzip::gunzip(\(delete $res->{content}) => \$tmp);
+	unlike($tmp, qr/"modified":\s*"/, 'modified is an integer');
+	my $manifest = $json->decode($tmp);
+	ok(my $clone = $manifest->{'/alt'}, '/alt in manifest');
+	is($clone->{owner}, 'lorelei', 'owner set');
+	is($clone->{reference}, '/bare', 'reference detected');
+	is($clone->{description}, "we're all clones", 'description read');
+	ok(my $bare = $manifest->{'/bare'}, '/bare in manifest');
+	is($bare->{description}, 'Unnamed repository',
+		'missing $GIT_DIR/description fallback');
+
+	like($bare->{fingerprint}, qr/\A[a-f0-9]{40}\z/, 'fingerprint');
+	is($clone->{fingerprint}, $bare->{fingerprint}, 'fingerprint matches');
+	is(HTTP::Date::time2str($bare->{modified}),
+		$res->{headers}->{'last-modified'},
+		'modified field and Last-Modified header match');
+
+	ok($manifest->{'/v2/git/0.git'}, 'v2 epoch appeared');
+}
+
 my $pid;
 END { kill 'TERM', $pid if defined $pid };
 SKIP: {
-	my $json = eval { PublicInbox::WwwListing::_json() };
-	skip "JSON module missing: $@", 1 if $@;
 	my $err = "$tmpdir/stderr.log";
 	my $out = "$tmpdir/stdout.log";
 	my $alt = "$tmpdir/alt.git";
@@ -83,36 +111,8 @@ SKIP: {
 	my $cmd = [ $httpd, "--stdout=$out", "--stderr=$err" ];
 	$pid = spawn_listener($env, $cmd, [$sock]);
 	$sock = undef;
-	my $http = Net::HTTP->new(Host => "$host:$port");
-	$http->write_request(GET => '/manifest.js.gz');
-	my ($code, undef, %h) = $http->read_response_headers;
-	is($code, 200, 'got manifest');
-	my $tmp;
-	my $body = '';
-	while (1) {
-		my $n = $http->read_entity_body(my $buf, 65536);
-		die unless defined $n;
-		last if $n == 0;
-		$body .= $buf;
-	}
-	IO::Uncompress::Gunzip::gunzip(\$body => \$tmp);
-	unlike($tmp, qr/"modified":\s*"/, 'modified is an integer');
-	my $manifest = $json->decode($tmp);
-	ok(my $clone = $manifest->{'/alt'}, '/alt in manifest');
-	is($clone->{owner}, 'lorelei', 'owner set');
-	is($clone->{reference}, '/bare', 'reference detected');
-	is($clone->{description}, "we're all clones", 'description read');
-	ok(my $bare = $manifest->{'/bare'}, '/bare in manifest');
-	is($bare->{description}, 'Unnamed repository',
-		'missing $GIT_DIR/description fallback');
 
-	like($bare->{fingerprint}, qr/\A[a-f0-9]{40}\z/, 'fingerprint');
-	is($clone->{fingerprint}, $bare->{fingerprint}, 'fingerprint matches');
-
-	is(HTTP::Date::time2str($bare->{modified}), $h{'Last-Modified'},
-		'modified field and Last-Modified header match');
-
-	ok($manifest->{'/v2/git/0.git'}, 'v2 epoch appeared');
+	tiny_test($host, $port);
 
 	skip 'skipping grok-pull integration test', 2 if !which('grok-pull');
 
-- 
EW


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, back to index

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-14 16:47 [PATCH] t/www_listing: favor HTTP::Tiny over Net::HTTP Eric Wong

user/dev discussion of public-inbox itself

Archives are clonable:
	git clone --mirror https://public-inbox.org/meta
	git clone --mirror http://czquwvybam4bgbro.onion/meta
	git clone --mirror http://hjrcffqmbrq6wope.onion/meta
	git clone --mirror http://ou63pmih66umazou.onion/meta

Newsgroups are available over NNTP:
	nntp://news.public-inbox.org/inbox.comp.mail.public-inbox.meta
	nntp://ou63pmih66umazou.onion/inbox.comp.mail.public-inbox.meta
	nntp://czquwvybam4bgbro.onion/inbox.comp.mail.public-inbox.meta
	nntp://hjrcffqmbrq6wope.onion/inbox.comp.mail.public-inbox.meta
	nntp://news.gmane.org/gmane.mail.public-inbox.general

 note: .onion URLs require Tor: https://www.torproject.org/

AGPL code for this site: git clone https://public-inbox.org/ public-inbox