changeset 5:4d75bdb05ecf

Tests: some generic code and ssi tests. Move generic code to _common.pm and add test for ssi big includes.
author Maxim Dounin <mdounin@mdounin.ru>
date Sun, 07 Sep 2008 05:00:28 +0400
parents 6c41dbb2954f
children 8813a78ab8b5
files _common.pm smtp.t ssi-include-big.conf ssi-include-big.t
diffstat 4 files changed, 275 insertions(+), 93 deletions(-) [+]
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/_common.pm
@@ -0,0 +1,164 @@
+package _common;
+
+# (C) Maxim Dounin
+
+# Generict module for nginx tests.
+
+###############################################################################
+
+use warnings;
+use strict;
+
+use base qw/ Exporter /;
+
+our @EXPORT = qw/ start_nginx smtp_connect smtp_send smtp_read smtp_check
+	smtp_ok log_in log_out CRLF http /;
+
+###############################################################################
+
+use Test::More;
+use File::Temp qw/ tempdir /;
+use IO::Socket;
+
+use constant CRLF => "\x0D\x0A";
+
+our $testdir;
+our $s;
+
+###############################################################################
+
+# Create temp directory and run nginx instance.
+
+sub start_nginx {
+	my ($conf) = @_;
+
+	$testdir = tempdir('nginx-test-XXXXXXXXXX', TMPDIR => 1, CLEANUP => 1)
+		or die "Can't create temp directory: $!\n";
+
+	system("cat $conf | sed 's!%%TESTDIR%%!$testdir!g' "
+		. "> $testdir/nginx.conf");
+
+	my $pid = fork();
+	die "Unable to fork(): $!\n" unless defined $pid;
+
+	if ($pid == 0) {
+		exec('../nginx/objs/nginx', '-c', "$testdir/nginx.conf", '-g',
+			"pid $testdir/nginx.pid; "
+			. "error_log $testdir/nginx-error.log debug;")
+			or die "Unable to exec(): $!\n";
+	}
+
+	# wait for nginx to start
+
+	sleep 1;
+}
+
+sub stop_nginx {
+	# terminate nginx by SIGTERM
+	kill 15, `cat $testdir/nginx.pid`;
+	wait;
+}
+
+END {
+	stop_nginx();
+}
+
+###############################################################################
+
+sub log_out {
+	my ($msg) = @_;
+	$msg =~ s/^/# >> /gm;
+	$msg .= "\n" unless $msg =~ /\n\Z/;
+	print $msg;
+}
+
+sub log_in {
+	my ($msg) = @_;
+	$msg =~ s/^/# << /gm;
+	$msg =~ s/([\x00-\x1f\x7f-])/sprintf('\\x%02x', ord($1)) . (($1 eq "\n") ? "\n" : '')/gmxe;
+	$msg .= "\n" unless $msg =~ /\n\Z/;
+	print $msg;
+}
+
+###############################################################################
+
+sub http {
+	my ($request) = @_;
+	my $reply;
+	eval {
+		local $SIG{ALRM} = sub { die "alarm\n" };
+		alarm(2);
+		my $s = IO::Socket::INET->new(
+			Proto => 'tcp',
+			PeerHost => 'localhost:8080'
+		);
+		log_out($request);
+		$s->print($request);
+		local $/;
+		$reply = $s->getline();
+		log_in($reply);
+		alarm(0);
+	};
+	alarm(0);
+	if ($@) {
+		log_in('(timeout)');
+		return undef;
+	}
+	return $reply;
+}
+
+###############################################################################
+
+sub smtp_connect {
+	$s = IO::Socket::INET->new(
+		Proto => "tcp",
+		PeerAddr => "localhost",
+		PeerPort => 10025,
+		@_
+	)
+		or die "Can't connect to nginx: $!\n";
+
+	$s->autoflush(1);
+
+	return $s;
+}
+
+sub smtp_send {
+	my ($cmd) = @_;
+	log_out($cmd);
+	$s->print($cmd . CRLF);
+}
+
+sub smtp_read {
+	my ($regex, $name) = @_;
+	eval {
+		alarm(2);
+		local $SIG{ALRM} = sub { die "alarm\n" };
+		while (<$s>) {
+			log_in($_);
+			next if m/^\d\d\d-/;
+			last;
+		}
+		alarm(0);
+	};
+	alarm(0);
+	if ($@) {
+		return undef;
+	}
+	return $_;
+}
+
+sub smtp_check {
+	my ($regex, $name) = @_;
+	like(smtp_read(), $regex, $name);
+}
+
+sub smtp_ok {
+	smtp_check(qr/^2\d\d /, @_);
+}
+
+###############################################################################
+
+1;
+
+###############################################################################
--- a/smtp.t
+++ b/smtp.t
@@ -11,41 +11,16 @@ use strict;
 
 use Test::More tests => 28;
 
-use File::Temp qw/ tempdir /;
-use IO::Socket;
 use MIME::Base64;
 
-use constant CRLF => "\x0D\x0A";
+use _common;
+
+###############################################################################
 
 select STDERR; $| = 1;
 select STDOUT; $| = 1;
 
-###############################################################################
-
-# Create temp directory and run nginx instance.
-
-my $tempdir = tempdir('nginx-test-XXXXXXXXXX', TMPDIR => 1, CLEANUP => 1)
-	or die "Can't create temp directory: $!\n";
-
-my $pid = fork();
-die "Unable to fork(): $!\n" unless defined $pid;
-
-if ($pid == 0) {
-	exec('../nginx/objs/nginx', '-c', 'smtp.conf', '-g',
-		"pid $tempdir/nginx.pid; error_log $tempdir/nginx-error.log info;")
-		or die "Unable to exec(): $!\n";
-	print "# child after exec - not reached\n";
-}
-
-END {
-	# terminate nginx by SIGTERM
-	kill 15, $pid;
-	wait;
-}
-
-# Give nginx some time to start.
-
-sleep 1;
+start_nginx('smtp.conf');
 
 ###############################################################################
 
@@ -171,67 +146,3 @@ smtp_check(qr/^5.. /, "command before gr
 ok($s->eof(), "session have to be closed");
 
 ###############################################################################
-
-sub log_out {
-	my ($msg) = @_;
-	$msg =~ s/^/# >> /gm;
-	$msg .= "\n" unless $msg =~ /\n\Z/;
-	print $msg;
-}
-
-sub log_in {
-	my ($msg) = @_;
-	$msg =~ s/\x0d/\\x0d/gm;
-	$msg =~ s/\x0a/\\x0a/gm;
-	print '# << ' . $msg . "\n";
-}
-
-sub smtp_connect {
-	my $s = IO::Socket::INET->new(
-		Proto => "tcp",
-		PeerAddr => "localhost",
-		PeerPort => 10025,
-		@_
-	)
-		or die "Can't connect to nginx: $!\n";
-
-	$s->autoflush(1);
-
-	return $s;
-}
-
-sub smtp_send {
-	my ($cmd) = @_;
-	log_out($cmd);
-	$s->print($cmd . CRLF);
-}
-
-sub smtp_read {
-	my ($regex, $name) = @_;
-	eval {
-		alarm(2);
-		local $SIG{ALRM} = sub { die "alarm\n" };
-		while (<$s>) {
-			log_in($_);
-			next if m/^\d\d\d-/;
-			last;
-		}
-		alarm(0);
-	};
-	alarm(0);
-	if ($@) {
-		return undef;
-	}
-	return $_;
-}
-
-sub smtp_check {
-	my ($regex, $name) = @_;
-	like(smtp_read(), $regex, $name);
-}
-
-sub smtp_ok {
-	smtp_check(qr/^2\d\d /, @_);
-}
-
-###############################################################################
new file mode 100644
--- /dev/null
+++ b/ssi-include-big.conf
@@ -0,0 +1,33 @@
+# Config for ssi-include-big.t test.
+
+worker_processes  1;
+
+master_process off;
+daemon         off;
+
+events {
+    worker_connections  1024;
+}
+
+http {
+    access_log    off;
+    root          %%TESTDIR%%;
+
+    output_buffers  2 512;
+    ssi on;
+    gzip on;
+    gzip_http_version 1.0;
+
+
+    server {
+        listen       8080;
+        server_name  localhost;
+
+        location /proxy/ {
+            proxy_pass http://localhost:8080/local/;
+        }
+        location = /local/blah {
+            return 204;
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/ssi-include-big.t
@@ -0,0 +1,74 @@
+#!/usr/bin/perl
+
+# (C) Maxim Dounin
+
+# Tests for nginx ssi bug with big includes.
+
+###############################################################################
+
+use warnings;
+use strict;
+
+use Test::More tests => 3;
+
+use _common;
+use Compress::Zlib;
+
+###############################################################################
+
+select STDERR; $| = 1;
+select STDOUT; $| = 1;
+
+start_nginx('ssi-include-big.conf');
+
+write_file('c1.html', 'X' x 1023);
+write_file('c2.html', 'X' x 1024);
+write_file('c3.html', 'X' x 1025);
+write_file('test1.html', '<!--#include virtual="/proxy/blah" -->' . "\n"
+	. '<!--#include virtual="/c1.html" -->');
+write_file('test2.html', '<!--#include virtual="/proxy/blah" -->' . "\n"
+	. '<!--#include virtual="/c2.html" -->');
+write_file('test3.html', '<!--#include virtual="/proxy/blah" -->' . "\n"
+	. '<!--#include virtual="/c3.html" -->');
+
+###############################################################################
+
+my $t1 = http_gzip_request('/test1.html');
+like($t1, qr/X{1023}/, 'small included file (less than output_buffers)');
+
+my $t2 = http_gzip_request('/test2.html');
+like($t2, qr/X{1024}/, 'small included file (equal to output_buffers)');
+
+my $t3 = http_gzip_request('/test3.html');
+like($t3, qr/X{1025}/, 'big included file (more than output_buffers)');
+
+###############################################################################
+
+sub http_gzip_request {
+	my ($url) = @_;
+	return `GET -t 1 -H 'Accept-Encoding: gzip' http://localhost:8080$url | gunzip -c`;
+=pod
+
+	my $r = http(<<EOF);
+GET $url HTTP/1.0
+Host: localhost
+Connection: close
+Accept-Encoding: gzip
+
+EOF
+	return undef unless defined $r;
+	return undef unless $r =~ m/\x0d\x0a\x0d\x0a(.*)/ms;
+	return Compress::Zlib::memGunzip(my $b = $1);
+=cut
+}
+
+sub write_file {
+	my ($name, $content) = @_;
+
+	open F, '>' . $_common::testdir . '/' . $name
+		or die "Can't create $name: $!";
+	print F $content;
+	close F;
+}
+
+###############################################################################