comparison stream_udp_upstream_hash.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 hash balancer module 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 stream_upstream_hash/);
27
28 $t->write_file_expand('nginx.conf', <<'EOF');
29
30 %%TEST_GLOBALS%%
31
32 daemon off;
33
34 events {
35 }
36
37 stream {
38 proxy_responses 1;
39 proxy_timeout 1s;
40
41 upstream hash {
42 hash $remote_addr;
43 server 127.0.0.1:8087;
44 server 127.0.0.1:8088;
45 }
46
47 upstream cons {
48 hash $remote_addr consistent;
49 server 127.0.0.1:8087;
50 server 127.0.0.1:8088;
51 }
52
53 server {
54 listen 127.0.0.1:8081 udp;
55 proxy_pass hash;
56 }
57
58 server {
59 listen 127.0.0.1:8082 udp;
60 proxy_pass cons;
61 }
62 }
63
64 EOF
65
66 $t->run_daemon(\&udp_daemon, 8087, $t);
67 $t->run_daemon(\&udp_daemon, 8088, $t);
68 $t->try_run('no stream udp')->plan(2);
69
70 $t->waitforfile($t->testdir . '/8087');
71 $t->waitforfile($t->testdir . '/8088');
72
73 ###############################################################################
74
75 is(many('.', 10, peer => '127.0.0.1:8081'), '8088: 10', 'hash');
76 is(many('.', 10, peer => '127.0.0.1:8082'), '8088: 10', 'hash consistent');
77
78 ###############################################################################
79
80 sub many {
81 my ($data, $count, %opts) = @_;
82 my (%ports, $peer);
83
84 $peer = $opts{peer};
85
86 for (1 .. $count) {
87 if (dgram($peer)->io($data) =~ /(\d+)/) {
88 $ports{$1} = 0 unless defined $ports{$1};
89 $ports{$1}++;
90 }
91 }
92
93 return join ', ', map { $_ . ": " . $ports{$_} } sort keys %ports;
94 }
95
96 ###############################################################################
97
98 sub udp_daemon {
99 my ($port, $t) = @_;
100
101 my $server = IO::Socket::INET->new(
102 Proto => 'udp',
103 LocalAddr => '127.0.0.1:' . $port,
104 Reuse => 1,
105 )
106 or die "Can't create listening socket: $!\n";
107
108 # signal we are ready
109
110 open my $fh, '>', $t->testdir() . '/' . $port;
111 close $fh;
112
113 while (1) {
114 $server->recv(my $buffer, 65536);
115 $buffer = $server->sockport();
116 $server->send($buffer);
117 }
118 }
119
120 ###############################################################################