#!/usr/bin/perl

# (C) Sergey Kandaurov
# (C) Nginx, Inc.

# Stream tests for upstream hash balancer module.

###############################################################################

use warnings;
use strict;

use Test::More;

use IO::Select;

BEGIN { use FindBin; chdir($FindBin::Bin); }

use lib 'lib';
use Test::Nginx;
use Test::Nginx::Stream qw/ stream /;

###############################################################################

select STDERR; $| = 1;
select STDOUT; $| = 1;

my $t = Test::Nginx->new()->has(qw/stream stream_upstream_hash/)->plan(4);

$t->write_file_expand('nginx.conf', <<'EOF');

%%TEST_GLOBALS%%

daemon off;

events {
}

stream {
    upstream hash {
        hash $remote_addr;
        server 127.0.0.1:8082;
        server 127.0.0.1:8083;
    }

    upstream cons {
        hash $remote_addr consistent;
        server 127.0.0.1:8082;
        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;
    }

    server {
        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

$t->run_daemon(\&stream_daemon, port(8082));
$t->run_daemon(\&stream_daemon, port(8083));
$t->run();

$t->waitforsocket('127.0.0.1:' . port(8082));
$t->waitforsocket('127.0.0.1:' . port(8083));

###############################################################################

my @ports = my ($port2, $port3) = (port(8082), port(8083));

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 {
	my ($count, $port) = @_;
	my (%ports);

	for (1 .. $count) {
		if (stream("127.0.0.1:$port")->io('.') =~ /(\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 stream_daemon {
	my ($port) = @_;

	my $server = IO::Socket::INET->new(
		Proto => 'tcp',
		LocalAddr => '127.0.0.1',
		LocalPort => $port,
		Listen => 5,
		Reuse => 1
	)
		or die "Can't create listening socket: $!\n";

	my $sel = IO::Select->new($server);

	local $SIG{PIPE} = 'IGNORE';

	while (my @ready = $sel->can_read) {
		foreach my $fh (@ready) {
			if ($server == $fh) {
				my $new = $fh->accept;
				$new->autoflush(1);
				$sel->add($new);

			} elsif (stream_handle_client($fh)) {
				$sel->remove($fh);
				$fh->close;
			}
		}
	}
}

sub stream_handle_client {
	my ($client) = @_;

	log2c("(new connection $client)");

	$client->sysread(my $buffer, 65536) or return 1;

	log2i("$client $buffer");

	$buffer = $client->sockport();

	log2o("$client $buffer");

	$client->syswrite($buffer);

	return 1;
}

sub log2i { Test::Nginx::log_core('|| <<', @_); }
sub log2o { Test::Nginx::log_core('|| >>', @_); }
sub log2c { Test::Nginx::log_core('||', @_); }

###############################################################################
