changeset 1481:06fbf6269f38

Tests: upstream hash tests for round-robin fallback on empty key.
author Sergey Kandaurov <pluknet@nginx.com>
date Tue, 28 May 2019 16:25:34 +0300
parents d23d959713b5
children 34e86a28cabd
files stream_upstream_hash.t upstream_hash.t
diffstat 2 files changed, 47 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- 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 {
--- 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;
 }
 
 ###############################################################################