# HG changeset patch # User Sergey Kandaurov # Date 1559049934 -10800 # Node ID 06fbf6269f38003c01f51ab3058bdbb904ad58a6 # Parent d23d959713b55c26cc78cca3c3fd0f69fbbaf945 Tests: upstream hash tests for round-robin fallback on empty key. diff --git a/stream_upstream_hash.t b/stream_upstream_hash.t --- a/stream_upstream_hash.t +++ b/stream_upstream_hash.t @@ -25,7 +25,7 @@ use Test::Nginx::Stream qw/ stream /; select STDERR; $| = 1; select STDOUT; $| = 1; -my $t = Test::Nginx->new()->has(qw/stream stream_upstream_hash/)->plan(2); +my $t = Test::Nginx->new()->has(qw/stream stream_upstream_hash/)->plan(4); $t->write_file_expand('nginx.conf', <<'EOF'); @@ -49,6 +49,18 @@ stream { server 127.0.0.1:8083; } + upstream empty { + hash $proxy_protocol_addr; + server 127.0.0.1:8082; + server 127.0.0.1:8083; + } + + upstream cempty { + hash $proxy_protocol_addr consistent; + server 127.0.0.1:8082; + server 127.0.0.1:8083; + } + server { listen 127.0.0.1:8080; proxy_pass hash; @@ -58,6 +70,16 @@ stream { listen 127.0.0.1:8081; proxy_pass cons; } + + server { + listen 127.0.0.1:8084; + proxy_pass empty; + } + + server { + listen 127.0.0.1:8085; + proxy_pass cempty; + } } EOF @@ -76,6 +98,16 @@ my @ports = my ($port2, $port3) = (port( is(many(10, port(8080)), "$port3: 10", 'hash'); like(many(10, port(8081)), qr/($port2|$port3): 10/, 'hash consistent'); +# fallback to round-robin + +TODO: { +local $TODO = 'not yet' unless $t->has_version('1.17.1'); + +like(many(4, port(8084)), qr/$port2: 2, $port3: 2/, 'empty key'); +like(many(4, port(8085)), qr/$port2: 2, $port3: 2/, 'empty key - consistent'); + +} + ############################################################################### sub many { diff --git a/upstream_hash.t b/upstream_hash.t --- a/upstream_hash.t +++ b/upstream_hash.t @@ -22,7 +22,7 @@ use Test::Nginx; select STDERR; $| = 1; select STDOUT; $| = 1; -my $t = Test::Nginx->new()->has(qw/http proxy rewrite upstream_hash/)->plan(13); +my $t = Test::Nginx->new()->has(qw/http proxy rewrite upstream_hash/)->plan(15); $t->write_file_expand('nginx.conf', <<'EOF'); @@ -166,7 +166,7 @@ EOF ############################################################################### -my ($p1, $p2, $p3) = (port(8081), port(8082), port(8083)); +my @ports = my ($p1, $p2, $p3) = (port(8081), port(8082), port(8083)); # Only requests for absent peer are moved to other peers if hash is consistent. # Check this by comparing two upstreams with different number of peers. @@ -178,6 +178,16 @@ ok(cmp_peers([iter('/cw', 20)], [iter('/ like(many('/?a=1', 10), qr/($p1|$p2|$p3): 10/, 'stable hash'); like(many('/c?a=1', 10), qr/($p1|$p2|$p3): 10/, 'stable hash - consistent'); +# fallback to round-robin + +TODO: { +local $TODO = 'not yet' unless $t->has_version('1.17.1'); + +like(many('/?a=', 6), qr/$p1: 2, $p2: 2, $p3: 2/, 'empty key'); +like(many('/c?a=', 6), qr/$p1: 2, $p2: 2, $p3: 2/, 'empty key - consistent'); + +} + my @res = iter('/', 10); is(@res, 10, 'all hashed peers'); @@ -244,7 +254,8 @@ sub many { } } - return join ', ', map { $_ . ": " . $ports{$_} } sort keys %ports; + my @keys = map { my $p = $_; grep { $p == $_ } keys %ports } @ports; + return join ', ', map { $_ . ": " . $ports{$_} } @keys; } ###############################################################################