comparison stream_udp_upstream.t @ 868:d2cb9ed7412e

Tests: stream udp tests.
author Andrey Zelenkov <zelenkov@nginx.com>
date Tue, 15 Mar 2016 16:20:29 +0300
parents
children b9e42c554ba7
comparison
equal deleted inserted replaced
867:89898b20f258 868:d2cb9ed7412e
1 #!/usr/bin/perl
2
3 # (C) Sergey Kandaurov
4 # (C) Nginx, Inc.
5
6 # Stream tests for upstream module and balancers with datagrams.
7
8 ###############################################################################
9
10 use warnings;
11 use strict;
12
13 use Test::More;
14
15 BEGIN { use FindBin; chdir($FindBin::Bin); }
16
17 use lib 'lib';
18 use Test::Nginx;
19 use Test::Nginx::Stream qw/ dgram /;
20
21 ###############################################################################
22
23 select STDERR; $| = 1;
24 select STDOUT; $| = 1;
25
26 my $t = Test::Nginx->new()->has(qw/stream/)
27 ->write_file_expand('nginx.conf', <<'EOF');
28
29 %%TEST_GLOBALS%%
30
31 daemon off;
32
33 events {
34 }
35
36 stream {
37 proxy_responses 1;
38 proxy_timeout 1s;
39
40 upstream u {
41 server 127.0.0.1:8087;
42 server 127.0.0.1:8088;
43 }
44
45 upstream u2 {
46 server 127.0.0.1:8089 down;
47 server 127.0.0.1:8089;
48 server 127.0.0.1:8087;
49 server 127.0.0.1:8088;
50 }
51
52 upstream u3 {
53 server 127.0.0.1:8087;
54 server 127.0.0.1:8088 weight=2;
55 }
56
57 upstream u4 {
58 server 127.0.0.1:8089;
59 server 127.0.0.1:8087 backup;
60 }
61
62 server {
63 listen 127.0.0.1:8081 udp;
64 proxy_pass u;
65 }
66
67 server {
68 listen 127.0.0.1:8082 udp;
69 proxy_pass u2;
70 }
71
72 server {
73 listen 127.0.0.1:8083 udp;
74 proxy_pass u3;
75 }
76
77 server {
78 listen 127.0.0.1:8084 udp;
79 proxy_pass u4;
80 }
81 }
82
83 EOF
84
85 $t->run_daemon(\&udp_daemon, 8087, $t);
86 $t->run_daemon(\&udp_daemon, 8088, $t);
87 $t->try_run('no stream udp')->plan(4);
88
89 $t->waitforfile($t->testdir . '/8087');
90 $t->waitforfile($t->testdir . '/8088');
91
92 ###############################################################################
93
94 is(many('.', 30, peer => '127.0.0.1:8081'), '8087: 15, 8088: 15', 'balanced');
95 is(many('.', 30, peer => '127.0.0.1:8082'), '8087: 15, 8088: 15', 'failures');
96 is(many('.', 30, peer => '127.0.0.1:8083'), '8087: 10, 8088: 20', 'weight');
97 is(many('.', 30, peer => '127.0.0.1:8084'), '8087: 30', 'backup');
98
99 ###############################################################################
100
101 sub many {
102 my ($data, $count, %opts) = @_;
103 my (%ports, $peer);
104
105 $peer = $opts{peer};
106
107 for (1 .. $count) {
108 if (dgram($peer)->io($data) =~ /(\d+)/) {
109 $ports{$1} = 0 unless defined $ports{$1};
110 $ports{$1}++;
111 }
112 }
113
114 return join ', ', map { $_ . ": " . $ports{$_} } sort keys %ports;
115 }
116
117 ###############################################################################
118
119 sub udp_daemon {
120 my ($port, $t) = @_;
121
122 my $server = IO::Socket::INET->new(
123 Proto => 'udp',
124 LocalAddr => '127.0.0.1:' . $port,
125 Reuse => 1,
126 )
127 or die "Can't create listening socket: $!\n";
128
129 # signal we are ready
130
131 open my $fh, '>', $t->testdir() . '/' . $port;
132 close $fh;
133
134 while (1) {
135 $server->recv(my $buffer, 65536);
136 $buffer = $server->sockport();
137 $server->send($buffer);
138 }
139 }
140
141 ###############################################################################