annotate proxy.t @ 572:ca54b445d982

Tests: masked nginx bug in proxy next upstream. When iterating through several next upstreams per a worker cycle, a previously reported event about upstream connection error may be improperly applied to the next upstream, thus leading to the invalid connection error. E.g., in kqueue, where the problem is visible, this is caused by "ev->instance" that does not tolerate more than one next upstream at once, and kevents placed on the kqueue separately for read and write events. The change is to limit test case to the only one next upstream.
author Sergey Kandaurov <pluknet@nginx.com>
date Thu, 14 May 2015 11:54:24 +0300
parents a8596c7b33cc
children 3b6ff3b7367d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
42
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1 #!/usr/bin/perl
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3 # (C) Maxim Dounin
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
5 # Tests for http proxy module.
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
6
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
7 ###############################################################################
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
8
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
9 use warnings;
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
10 use strict;
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
11
121
8ac1faaddd2c Tests: better handle various configure arguments.
Maxim Dounin <mdounin@mdounin.ru>
parents: 107
diff changeset
12 use Test::More;
42
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
13
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
14 BEGIN { use FindBin; chdir($FindBin::Bin); }
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
15
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
16 use lib 'lib';
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
17 use Test::Nginx;
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
18
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
19 ###############################################################################
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
20
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
21 select STDERR; $| = 1;
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
22 select STDOUT; $| = 1;
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
23
432
c1269426585d Tests: test for implicit upstream with IP literal and variable.
Sergey Kandaurov <pluknet@nginx.com>
parents: 295
diff changeset
24 my $t = Test::Nginx->new()->has(qw/http proxy/)->plan(4);
42
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
25
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
26 $t->write_file_expand('nginx.conf', <<'EOF');
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
27
107
1c0ec30614c6 Tests: add TEST_GLOBALS and TEST_GLOBALS_HTTP config chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 83
diff changeset
28 %%TEST_GLOBALS%%
1c0ec30614c6 Tests: add TEST_GLOBALS and TEST_GLOBALS_HTTP config chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 83
diff changeset
29
249
6a0d934950bc Tests: remove extra spaces in "daemon off".
Maxim Dounin <mdounin@mdounin.ru>
parents: 166
diff changeset
30 daemon off;
42
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
31
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
32 events {
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
33 }
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
34
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
35 http {
107
1c0ec30614c6 Tests: add TEST_GLOBALS and TEST_GLOBALS_HTTP config chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 83
diff changeset
36 %%TEST_GLOBALS_HTTP%%
42
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
37
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
38 server {
45
d68b85def521 Tests: use 127.0.0.1 instead of localhost.
Maxim Dounin <mdounin@mdounin.ru>
parents: 43
diff changeset
39 listen 127.0.0.1:8080;
42
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
40 server_name localhost;
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
41
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
42 location / {
45
d68b85def521 Tests: use 127.0.0.1 instead of localhost.
Maxim Dounin <mdounin@mdounin.ru>
parents: 43
diff changeset
43 proxy_pass http://127.0.0.1:8081;
42
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
44 proxy_read_timeout 1s;
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
45 }
434
a8596c7b33cc Tests: style.
Maxim Dounin <mdounin@mdounin.ru>
parents: 432
diff changeset
46
432
c1269426585d Tests: test for implicit upstream with IP literal and variable.
Sergey Kandaurov <pluknet@nginx.com>
parents: 295
diff changeset
47 location /var {
434
a8596c7b33cc Tests: style.
Maxim Dounin <mdounin@mdounin.ru>
parents: 432
diff changeset
48 proxy_pass http://$arg_b;
a8596c7b33cc Tests: style.
Maxim Dounin <mdounin@mdounin.ru>
parents: 432
diff changeset
49 proxy_read_timeout 1s;
432
c1269426585d Tests: test for implicit upstream with IP literal and variable.
Sergey Kandaurov <pluknet@nginx.com>
parents: 295
diff changeset
50 }
42
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
51 }
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
52 }
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
53
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
54 EOF
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
55
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
56 $t->run_daemon(\&http_daemon);
295
6fe0459b6668 Tests: eliminate startup races in proxy and fastcgi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 249
diff changeset
57 $t->run()->waitforsocket('127.0.0.1:8081');
42
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
58
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
59 ###############################################################################
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
60
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
61 like(http_get('/'), qr/SEE-THIS/, 'proxy request');
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
62 like(http_get('/multi'), qr/AND-THIS/, 'proxy request with multiple packets');
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
63
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
64 unlike(http_head('/'), qr/SEE-THIS/, 'proxy head request');
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
65
434
a8596c7b33cc Tests: style.
Maxim Dounin <mdounin@mdounin.ru>
parents: 432
diff changeset
66 like(http_get('/var?b=127.0.0.1:8081/'), qr/SEE-THIS/, 'proxy with variables');
432
c1269426585d Tests: test for implicit upstream with IP literal and variable.
Sergey Kandaurov <pluknet@nginx.com>
parents: 295
diff changeset
67
42
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
68 ###############################################################################
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
69
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
70 sub http_daemon {
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
71 my $server = IO::Socket::INET->new(
83
6e5884419e4a Tests: whitespace cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 64
diff changeset
72 Proto => 'tcp',
42
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
73 LocalHost => '127.0.0.1:8081',
83
6e5884419e4a Tests: whitespace cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 64
diff changeset
74 Listen => 5,
6e5884419e4a Tests: whitespace cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 64
diff changeset
75 Reuse => 1
42
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
76 )
83
6e5884419e4a Tests: whitespace cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 64
diff changeset
77 or die "Can't create listening socket: $!\n";
42
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
78
295
6fe0459b6668 Tests: eliminate startup races in proxy and fastcgi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 249
diff changeset
79 local $SIG{PIPE} = 'IGNORE';
6fe0459b6668 Tests: eliminate startup races in proxy and fastcgi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 249
diff changeset
80
42
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
81 while (my $client = $server->accept()) {
83
6e5884419e4a Tests: whitespace cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 64
diff changeset
82 $client->autoflush(1);
42
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
83
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
84 my $headers = '';
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
85 my $uri = '';
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
86
83
6e5884419e4a Tests: whitespace cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 64
diff changeset
87 while (<$client>) {
42
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
88 $headers .= $_;
83
6e5884419e4a Tests: whitespace cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 64
diff changeset
89 last if (/^\x0d?\x0a?$/);
6e5884419e4a Tests: whitespace cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 64
diff changeset
90 }
42
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
91
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
92 $uri = $1 if $headers =~ /^\S+\s+([^ ]+)\s+HTTP/i;
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
93
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
94 if ($uri eq '/') {
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
95 print $client <<'EOF';
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
96 HTTP/1.1 200 OK
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
97 Connection: close
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
98
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
99 EOF
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
100 print $client "TEST-OK-IF-YOU-SEE-THIS"
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
101 unless $headers =~ /^HEAD/i;
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
102
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
103 } elsif ($uri eq '/multi') {
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
104
83
6e5884419e4a Tests: whitespace cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 64
diff changeset
105 print $client <<"EOF";
42
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
106 HTTP/1.1 200 OK
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
107 Connection: close
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
108
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
109 TEST-OK-IF-YOU-SEE-THIS
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
110 EOF
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
111
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
112 select undef, undef, undef, 0.1;
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
113 print $client 'AND-THIS';
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
114
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
115 } else {
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
116
83
6e5884419e4a Tests: whitespace cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 64
diff changeset
117 print $client <<"EOF";
42
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
118 HTTP/1.1 404 Not Found
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
119 Connection: close
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
120
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
121 Oops, '$uri' not found
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
122 EOF
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
123 }
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
124
83
6e5884419e4a Tests: whitespace cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 64
diff changeset
125 close $client;
42
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
126 }
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
127 }
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
128
7435db149168 Tests: basic proxy tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
129 ###############################################################################