Tests: upstream ip_hash tests with IPv6 and unix sockets.
diff --git a/upstream_ip_hash_ipv6.t b/upstream_ip_hash_ipv6.t
new file mode 100644
index 0000000..33b9130
--- /dev/null
+++ b/upstream_ip_hash_ipv6.t
@@ -0,0 +1,151 @@
+#!/usr/bin/perl
+
+# (C) Maxim Dounin
+# (C) Sergey Kandaurov
+# (C) Nginx, Inc.
+
+# Tests for upstream ip_hash balancer with IPv6 and unix sockets.
+
+###############################################################################
+
+use warnings;
+use strict;
+
+use Test::More;
+
+use Socket qw/ CRLF /;
+
+BEGIN { use FindBin; chdir($FindBin::Bin); }
+
+use lib 'lib';
+use Test::Nginx;
+
+###############################################################################
+
+select STDERR; $| = 1;
+select STDOUT; $| = 1;
+
+my $t = Test::Nginx->new()->has(qw/http proxy upstream_ip_hash realip unix/)
+	->write_file_expand('nginx.conf', <<'EOF')->run();
+
+%%TEST_GLOBALS%%
+
+daemon off;
+
+events {
+}
+
+http {
+    %%TEST_GLOBALS_HTTP%%
+
+    upstream u {
+        ip_hash;
+        server 127.0.0.1:8081;
+        server 127.0.0.1:8082;
+    }
+
+    server {
+        listen       127.0.0.1:8080;
+        server_name  localhost;
+
+        add_header X-IP $remote_addr always;
+
+        location / {
+            set_real_ip_from 127.0.0.0/8;
+            proxy_pass http://u;
+        }
+
+        location /unix {
+            proxy_pass http://unix:%%TESTDIR%%/unix.sock;
+            proxy_set_header X-Real-IP $http_x_real_ip;
+        }
+
+        location /ipv6 {
+            proxy_pass http://[::1]:%%PORT_8080%%;
+            proxy_set_header X-Real-IP $http_x_real_ip;
+        }
+    }
+
+    server {
+        listen       unix:%%TESTDIR%%/unix.sock;
+        listen       [::1]:%%PORT_8080%%;
+        server_name  localhost;
+
+        location / {
+            set_real_ip_from unix:;
+            set_real_ip_from ::1;
+            proxy_pass http://u;
+        }
+
+        location /unix/none {
+            proxy_pass http://u;
+        }
+    }
+
+    server {
+        listen       127.0.0.1:8081;
+        listen       127.0.0.1:8082;
+        server_name  localhost;
+
+        location / {
+            add_header X-Port $server_port always;
+        }
+    }
+}
+
+EOF
+
+plan(skip_all => 'no 127.0.0.1 on host')
+	if http_get('/') !~ /X-IP: 127.0.0.1/m;
+
+$t->try_run('no inet6 support')->plan(4);
+
+###############################################################################
+
+my @ports = my ($port1, $port2) = (port(8081), port(8082));
+
+is(many('/unix', 30), "$port1: 15, $port2: 15", 'ip_hash realip via unix');
+is(many('/ipv6', 30), "$port1: 15, $port2: 15", 'ip_hash realip via ipv6');
+
+is(many_ip6('/', 30), "$port1: 15, $port2: 15", 'ip_hash ipv6');
+like(many('/unix/none', 30), qr/($port1|$port2): 30/, 'ip_hash unix');
+
+###############################################################################
+
+sub many {
+	my ($uri, $count) = @_;
+	my %ports;
+
+	for my $i (1 .. $count) {
+		my $req = "GET $uri HTTP/1.0" . CRLF
+			. "X-Real-IP: 127.0.$i.2" . CRLF . CRLF;
+
+		if (http($req) =~ /X-Port: (\d+)/) {
+			$ports{$1} = 0 unless defined $ports{$1};
+			$ports{$1}++;
+		}
+	}
+
+	my @keys = map { my $p = $_; grep { $p == $_ } keys %ports } @ports;
+	return join ', ', map { $_ . ": " . $ports{$_} } @keys;
+}
+
+sub many_ip6 {
+	my ($uri, $count) = @_;
+	my %ports;
+
+	for my $i (1 .. $count) {
+		my $req = "GET $uri HTTP/1.0" . CRLF
+			. "X-Real-IP: ::$i" . CRLF . CRLF;
+
+		if (http($req) =~ /X-Port: (\d+)/) {
+			$ports{$1} = 0 unless defined $ports{$1};
+			$ports{$1}++;
+		}
+	}
+
+	my @keys = map { my $p = $_; grep { $p == $_ } keys %ports } @ports;
+	return join ', ', map { $_ . ": " . $ports{$_} } @keys;
+}
+
+###############################################################################