diff _common.pm @ 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
children 8813a78ab8b5
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;
+
+###############################################################################