annotate stream_limit_rate2.t @ 1571:1b4ceab9cb1c

Tests: fixed ssl_certificate.t with LibreSSL client. Net::SSLeay::connect() that manages TLS handshake could return unexpected error when receiving server alert, as seen in server certificate tests if it could not been selected. Typically, it returns the expected error -1, but with certain libssl implementations it can be 0, as explained below. The error is propagated from libssl's SSL_connect(), which is usually -1. In modern OpenSSL versions, it is the default error code used in the state machine returned when something went wrong with parsing TLS message header. In versions up to OpenSSL 1.0.2, with SSLv23_method() used by default, -1 is the only error code in the ssl_connect() method implementation which is used as well if receiving alert while parsing ServerHello. BoringSSL also seems to return -1. But it is not so with LibreSSL that returns zero. Previously, tests failed with client built with LibreSSL with SSLv3 removed. Here, the error is propagated directly from ssl_read_bytes() method, which is always implemented as ssl3_read_bytes() in all TLS methods. It could be also seen with OpenSSL up to 1.0.2 with non-default methods explicitly set.
author Sergey Kandaurov <pluknet@nginx.com>
date Fri, 29 May 2020 23:10:20 +0300
parents ddbde6c5b0cd
children f3ba4c74de31
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
1 #!/usr/bin/perl
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
2
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
3 # (C) Andrey Zelenkov
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
4 # (C) Nginx, Inc.
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
5
1473
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
6 # Tests for stream proxy module, limit rate directives, variables support.
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
7
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
8 ###############################################################################
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
9
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
10 use warnings;
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
11 use strict;
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
12
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
13 use Test::More;
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
14
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
15 use IO::Select;
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
16
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
17 BEGIN { use FindBin; chdir($FindBin::Bin); }
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
18
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
19 use lib 'lib';
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
20 use Test::Nginx;
816
77359b849cd5 Tests: stream package.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 787
diff changeset
21 use Test::Nginx::Stream qw/ stream /;
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
22
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
23 ###############################################################################
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
24
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
25 select STDERR; $| = 1;
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
26 select STDOUT; $| = 1;
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
27
1473
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
28 my $t = Test::Nginx->new()->has(qw/stream stream_map/)
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
29 ->write_file_expand('nginx.conf', <<'EOF');
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
30
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
31 %%TEST_GLOBALS%%
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
32
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
33 daemon off;
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
34
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
35 events {
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
36 }
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
37
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
38 stream {
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
39 # download and upload rates are set equal to the maximum
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
40 # number of bytes transmitted
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
41
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
42 # proxy_download_rate value comes from following calculations:
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
43 # test string length (1000) + whitespace (1) + time string length (10)
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
44
1473
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
45 map $server_port $down {
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
46 default 1011;
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
47 %%PORT_8082%% 0;
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
48 %%PORT_8083%% 1;
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
49 %%PORT_8085%% 250;
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
50 }
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
51
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
52 map $server_port $up {
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
53 default 1000;
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
54 %%PORT_8082%% 0;
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
55 %%PORT_8084%% 1;
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
56 %%PORT_8086%% 250;
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
57 }
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
58
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
59 proxy_download_rate $down;
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
60 proxy_upload_rate $up;
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
61
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
62 server {
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
63 listen 127.0.0.1:8081;
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
64 proxy_pass 127.0.0.1:8080;
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
65 }
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
66
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
67 server {
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
68 listen 127.0.0.1:8082;
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
69 proxy_pass 127.0.0.1:8080;
1473
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
70 proxy_download_rate $down;
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
71 proxy_upload_rate $up;
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
72 }
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
73
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
74 server {
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
75 listen 127.0.0.1:8083;
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
76 proxy_pass 127.0.0.1:8080;
1473
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
77 proxy_download_rate $down;
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
78 }
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
79
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
80 server {
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
81 listen 127.0.0.1:8084;
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
82 proxy_pass 127.0.0.1:8080;
1473
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
83 proxy_upload_rate $up;
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
84 }
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
85
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
86 server {
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
87 listen 127.0.0.1:8085;
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
88 proxy_pass 127.0.0.1:8080;
1473
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
89 proxy_download_rate $down;
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
90 }
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
91
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
92 server {
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
93 listen 127.0.0.1:8086;
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
94 proxy_pass 127.0.0.1:8087;
1473
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
95 proxy_upload_rate $up;
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
96 }
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
97 }
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
98
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
99 EOF
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
100
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
101 $t->run_daemon(\&stream_daemon, port(8080));
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
102 $t->run_daemon(\&stream_daemon, port(8087));
1473
ddbde6c5b0cd Tests: stream limit rate tests, variables support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1472
diff changeset
103 $t->try_run('no proxy_download_rate variables')->plan(9);
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
104
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
105 $t->waitforsocket('127.0.0.1:' . port(8080));
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
106 $t->waitforsocket('127.0.0.1:' . port(8087));
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
107
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
108 ###############################################################################
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
109
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
110 my $str = '1234567890' x 100;
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
111
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
112 my %r = response($str, peer => '127.0.0.1:' . port(8081));
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
113 is($r{'data'}, $str, 'exact limit');
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
114
1472
7ae2747ee593 Tests: more stream_limit_rate.t tests.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
115 %r = response($str . 'extra', peer => '127.0.0.1:' . port(8082));
7ae2747ee593 Tests: more stream_limit_rate.t tests.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
116 is($r{'data'}, $str . 'extra', 'unlimited');
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
117
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
118 SKIP: {
1472
7ae2747ee593 Tests: more stream_limit_rate.t tests.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
119 skip 'unsafe on VM', 3 unless $ENV{TEST_NGINX_UNSAFE};
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
120
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
121 # if interaction between backend and client is slow then proxy can add extra
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
122 # bytes to upload/download data
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
123
1472
7ae2747ee593 Tests: more stream_limit_rate.t tests.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
124 %r = response($str . 'extra', peer => '127.0.0.1:' . port(8081));
7ae2747ee593 Tests: more stream_limit_rate.t tests.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
125 is($r{'data'}, $str, 'limited');
7ae2747ee593 Tests: more stream_limit_rate.t tests.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
126
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
127 %r = response($str, peer => '127.0.0.1:' . port(8083), readonce => 1);
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
128 is($r{'data'}, '1', 'download - one byte');
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
129
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
130 %r = response($str, peer => '127.0.0.1:' . port(8084));
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
131 is($r{'data'}, '1', 'upload - one byte');
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
132
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
133 }
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
134
787
a53c310c695d Tests: relaxed limit_rate tests timeouts.
Sergey Kandaurov <pluknet@nginx.com>
parents: 711
diff changeset
135 # Five chunks are split with four 1s delays:
710
aed139eaaf3f Tests: fixed comment after 40675bfad7d3.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 637
diff changeset
136 # the first four chunks are quarters of test string
aed139eaaf3f Tests: fixed comment after 40675bfad7d3.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 637
diff changeset
137 # and the fifth one is some extra data from backend.
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
138
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
139 %r = response($str, peer => '127.0.0.1:' . port(8085));
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
140 my $diff = time() - $r{'time'};
787
a53c310c695d Tests: relaxed limit_rate tests timeouts.
Sergey Kandaurov <pluknet@nginx.com>
parents: 711
diff changeset
141 cmp_ok($diff, '>=', 4, 'download - time');
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
142 is($r{'data'}, $str, 'download - data');
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
143
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
144 my $time = time();
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
145 %r = response($str . 'close', peer => '127.0.0.1:' . port(8086));
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
146 $diff = time() - $time;
787
a53c310c695d Tests: relaxed limit_rate tests timeouts.
Sergey Kandaurov <pluknet@nginx.com>
parents: 711
diff changeset
147 cmp_ok($diff, '>=', 4, 'upload - time');
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
148 is($r{'data'}, $str . 'close', 'upload - data');
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
149
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
150 ###############################################################################
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
151
816
77359b849cd5 Tests: stream package.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 787
diff changeset
152 sub response {
937
b1fa8e0cc27b Tests: whitespaces fix.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 866
diff changeset
153 my ($data, %extra) = @_;
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
154
816
77359b849cd5 Tests: stream package.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 787
diff changeset
155 my $s = stream($extra{peer});
77359b849cd5 Tests: stream package.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 787
diff changeset
156 $s->write($data);
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
157
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
158 $data = '';
816
77359b849cd5 Tests: stream package.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 787
diff changeset
159 while (1) {
77359b849cd5 Tests: stream package.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 787
diff changeset
160 my $buf = $s->read();
77359b849cd5 Tests: stream package.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 787
diff changeset
161 last unless length($buf);
77359b849cd5 Tests: stream package.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 787
diff changeset
162
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
163 $data .= $buf;
816
77359b849cd5 Tests: stream package.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 787
diff changeset
164
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
165 last if $extra{'readonce'};
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
166 }
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
167 $data =~ /([\S]*)\s?(\d+)?/;
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
168
816
77359b849cd5 Tests: stream package.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 787
diff changeset
169 return ('data' => $1, 'time' => $2)
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
170 }
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
171
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
172 ###############################################################################
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
173
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
174 sub stream_daemon {
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
175 my $port = shift;
952
e9064d691790 Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 937
diff changeset
176
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
177 my $server = IO::Socket::INET->new(
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
178 Proto => 'tcp',
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
179 LocalAddr => '127.0.0.1',
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
180 LocalPort => $port,
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
181 Listen => 5,
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
182 Reuse => 1
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
183 )
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
184 or die "Can't create listening socket: $!\n";
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
185
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
186 my $sel = IO::Select->new($server);
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
187
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
188 local $SIG{PIPE} = 'IGNORE';
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
189
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
190 while (my @ready = $sel->can_read) {
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
191 foreach my $fh (@ready) {
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
192 if ($server == $fh) {
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
193 my $new = $fh->accept;
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
194 $new->autoflush(1);
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
195 $sel->add($new);
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
196
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
197 } elsif (stream_handle_client($fh)) {
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
198 $sel->remove($fh);
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
199 $fh->close;
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
200 }
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
201 }
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
202 }
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
203 }
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
204
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
205 sub stream_handle_client {
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
206 my ($client) = @_;
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
207
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
208 log2c("(new connection $client)");
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
209
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
210 $client->sysread(my $buffer, 65536) or return 1;
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
211
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
212 log2i("$client $buffer");
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
213
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
214 $buffer .= " " . time() if $client->sockport() eq port(8080);
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
215
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
216 log2o("$client $buffer");
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
217
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
218 $client->syswrite($buffer);
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
219
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
220 return $client->sockport() eq port(8080) ? 1 : $buffer =~ /close/;
632
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
221 }
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
222
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
223 sub log2i { Test::Nginx::log_core('|| <<', @_); }
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
224 sub log2o { Test::Nginx::log_core('|| >>', @_); }
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
225 sub log2c { Test::Nginx::log_core('||', @_); }
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
226
c8d6f816e094 Tests: stream limit rate tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
227 ###############################################################################