Tests: upstream hash tests for round-robin fallback on empty key.
diff --git a/stream_upstream_hash.t b/stream_upstream_hash.t
index 885c50f..e28925e 100644
--- a/stream_upstream_hash.t
+++ b/stream_upstream_hash.t
@@ -25,7 +25,7 @@
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 @@
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 @@
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 @@
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
index b6a672e..8edbe95 100644
--- a/upstream_hash.t
+++ b/upstream_hash.t
@@ -22,7 +22,7 @@
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 @@
###############################################################################
-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 @@
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 @@
}
}
- return join ', ', map { $_ . ": " . $ports{$_} } sort keys %ports;
+ my @keys = map { my $p = $_; grep { $p == $_ } keys %ports } @ports;
+ return join ', ', map { $_ . ": " . $ports{$_} } @keys;
}
###############################################################################