changeset 621:884b2f0c173f

Tests: tests for dumped nginx configuration ("nginx -T").
author Sergey Kandaurov <pluknet@nginx.com>
date Mon, 01 Jun 2015 14:34:36 +0300
parents 7497adad1a50
children b241c3c0119b
files config_dump.t lib/Test/Nginx.pm
diffstat 2 files changed, 118 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/config_dump.t
@@ -0,0 +1,104 @@
+#!/usr/bin/perl
+
+# (C) Sergey Kandaurov
+# (C) Nginx, Inc.
+
+# Tests for dumped nginx configuration (nginx -T).
+# Among other things, test that configuration blocks are properly processed.
+
+###############################################################################
+
+use warnings;
+use strict;
+
+use Test::More;
+
+BEGIN { use FindBin; chdir($FindBin::Bin); }
+
+use lib 'lib';
+use Test::Nginx;
+
+###############################################################################
+
+select STDERR; $| = 1;
+select STDOUT; $| = 1;
+
+my $t = Test::Nginx->new()->has(qw/http map/);
+
+plan(skip_all => 'no config dump') unless $t->has_version('1.9.2');
+
+$t->plan(10)->write_file_expand('nginx.conf', <<'EOF');
+
+%%TEST_GLOBALS%%
+
+daemon off;
+
+include %%TESTDIR%%/inc.conf;
+
+events {
+}
+
+http {
+    %%TEST_GLOBALS_HTTP%%
+
+    map $args $x {
+        default  0;
+        foo      bar;
+        include  map.conf;
+    }
+
+    upstream u {
+        server 127.0.0.1:8081;
+    }
+
+    server {
+        listen       127.0.0.1:8080;
+        server_name  localhost;
+
+        location / { }
+    }
+}
+
+EOF
+
+$t->write_file('inc.conf', 'include inc2.conf;');
+$t->write_file('inc2.conf', '#inc2.conf');
+$t->write_file('map.conf', '#map.conf;');
+
+$t->run();
+
+###############################################################################
+
+my $d = $t->testdir;
+
+my $dump = $t->dump_config();
+like($dump, qr!^# configuration file $d/nginx.conf:$!m, 'nginx.conf found');
+like($dump, qr!^# configuration file $d/inc.conf:$!m, 'inc.conf found');
+like($dump, qr!^# configuration file $d/inc2.conf:$!m, 'inc2.conf found');
+like($dump, qr!^# configuration file $d/map.conf:$!m, 'map.conf found');
+
+is(getconf($t, $dump, 'nginx.conf'), $t->read_file('nginx.conf'), 'content');
+is(getconf($t, $dump, 'inc.conf'), $t->read_file('inc.conf'), 'content inc');
+is(getconf($t, $dump, 'map.conf'), $t->read_file('map.conf'), 'content inc 2');
+
+unlink($t->testdir . "/inc.conf");
+unlink($t->testdir . "/map.conf");
+
+$dump = $t->dump_config();
+unlike($dump, qr!file $d/inc.conf!, 'missing inc.conf');
+unlike($dump, qr!file $d/map.conf!, 'missing map.conf');
+like($dump, qr!file $d/nginx.conf test failed!, 'test failed');
+
+$t->write_file('inc.conf', 'include inc2.conf;');
+$t->write_file('inc2.conf', '#inc2.conf');
+$t->write_file('map.conf', '#map.conf;');
+
+###############################################################################
+
+sub getconf {
+	my ($t, $string, $conf) = @_;
+	my $prefix = "# configuration file $d/$conf:\n";
+	my $offset = index($string, $prefix) + length($prefix);
+	my $len = length($t->read_file($conf));
+	return substr($string, $offset, $len) =~ tr/\r//rd;
+}
--- a/lib/Test/Nginx.pm
+++ b/lib/Test/Nginx.pm
@@ -277,6 +277,20 @@ sub run(;$) {
 	return $self;
 }
 
+sub dump_config() {
+	my ($self) = @_;
+
+	my $testdir = $self->{_testdir};
+
+	my @globals = $self->{_test_globals} ?
+		() : ('-g', "pid $testdir/nginx.pid; "
+		. "error_log $testdir/error.log debug;");
+	my $command = "$NGINX -T -p $testdir/ -c nginx.conf "
+		. join(' ', @globals);
+
+	return qx/$command 2>&1/;
+}
+
 sub waitforfile($;$) {
 	my ($self, $file, $pid) = @_;
 	my $exited;