Mercurial > hg > nginx-tests
diff 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 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/stream_udp_upstream_hash.t @@ -0,0 +1,120 @@ +#!/usr/bin/perl + +# (C) Sergey Kandaurov +# (C) Nginx, Inc. + +# Stream tests for upstream hash balancer module with datagrams. + +############################################################################### + +use warnings; +use strict; + +use Test::More; + +BEGIN { use FindBin; chdir($FindBin::Bin); } + +use lib 'lib'; +use Test::Nginx; +use Test::Nginx::Stream qw/ dgram /; + +############################################################################### + +select STDERR; $| = 1; +select STDOUT; $| = 1; + +my $t = Test::Nginx->new()->has(qw/stream stream_upstream_hash/); + +$t->write_file_expand('nginx.conf', <<'EOF'); + +%%TEST_GLOBALS%% + +daemon off; + +events { +} + +stream { + proxy_responses 1; + proxy_timeout 1s; + + upstream hash { + hash $remote_addr; + server 127.0.0.1:8087; + server 127.0.0.1:8088; + } + + upstream cons { + hash $remote_addr consistent; + server 127.0.0.1:8087; + server 127.0.0.1:8088; + } + + server { + listen 127.0.0.1:8081 udp; + proxy_pass hash; + } + + server { + listen 127.0.0.1:8082 udp; + proxy_pass cons; + } +} + +EOF + +$t->run_daemon(\&udp_daemon, 8087, $t); +$t->run_daemon(\&udp_daemon, 8088, $t); +$t->try_run('no stream udp')->plan(2); + +$t->waitforfile($t->testdir . '/8087'); +$t->waitforfile($t->testdir . '/8088'); + +############################################################################### + +is(many('.', 10, peer => '127.0.0.1:8081'), '8088: 10', 'hash'); +is(many('.', 10, peer => '127.0.0.1:8082'), '8088: 10', 'hash consistent'); + +############################################################################### + +sub many { + my ($data, $count, %opts) = @_; + my (%ports, $peer); + + $peer = $opts{peer}; + + for (1 .. $count) { + if (dgram($peer)->io($data) =~ /(\d+)/) { + $ports{$1} = 0 unless defined $ports{$1}; + $ports{$1}++; + } + } + + return join ', ', map { $_ . ": " . $ports{$_} } sort keys %ports; +} + +############################################################################### + +sub udp_daemon { + my ($port, $t) = @_; + + my $server = IO::Socket::INET->new( + Proto => 'udp', + LocalAddr => '127.0.0.1:' . $port, + Reuse => 1, + ) + or die "Can't create listening socket: $!\n"; + + # signal we are ready + + open my $fh, '>', $t->testdir() . '/' . $port; + close $fh; + + while (1) { + $server->recv(my $buffer, 65536); + $buffer = $server->sockport(); + $server->send($buffer); + } +} + +###############################################################################