# HG changeset patch # User Sergey Kandaurov # Date 1433158476 -10800 # Node ID 884b2f0c173fb9932e011892fcec38bf6d79c5de # Parent 7497adad1a50ac7b2cb0905db22582de6d20700f Tests: tests for dumped nginx configuration ("nginx -T"). diff --git a/config_dump.t b/config_dump.t 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; +} diff --git a/lib/Test/Nginx.pm b/lib/Test/Nginx.pm --- 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;