Mercurial > hg > nginx-tests
diff upstream_hash_memcached.t @ 411:17c5a1cc8757
Tests: upstream hash tests.
author | Sergey Kandaurov <pluknet@nginx.com> |
---|---|
date | Tue, 03 Jun 2014 12:09:09 +0400 |
parents | |
children | 995f3476202e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upstream_hash_memcached.t Tue Jun 03 12:09:09 2014 +0400 @@ -0,0 +1,164 @@ +#!/usr/bin/perl + +# (C) Sergey Kandaurov +# (C) Nginx, Inc. + +# Tests for upstream hash balancer module distribution consistency +# with Cache::Memcached and Cache::Memcached::Fast. + +############################################################################### + +use warnings; +use strict; + +use Test::More; + +BEGIN { use FindBin; chdir($FindBin::Bin); } + +use lib 'lib'; +use Test::Nginx; + +############################################################################### + +select STDERR; $| = 1; +select STDOUT; $| = 1; + +eval { require Cache::Memcached; }; +plan(skip_all => 'Cache::Memcached not installed') if $@; +eval { require Cache::Memcached::Fast; }; +plan(skip_all => 'Cache::Memcached::Fast not installed') if $@; + +my $t = Test::Nginx->new()->has(qw/http rewrite memcached upstream_hash/) + ->has_daemon('memcached')->write_file_expand('nginx.conf', <<'EOF'); + +%%TEST_GLOBALS%% + +daemon off; + +events { +} + +http { + %%TEST_GLOBALS_HTTP%% + + upstream memd { + hash $arg_a; + server 127.0.0.1:8081; + server 127.0.0.1:8082; + server 127.0.0.1:8083; + } + + upstream memd_c { + hash $arg_a consistent; + server 127.0.0.1:8081; + server 127.0.0.1:8082; + server 127.0.0.1:8083; + } + + upstream memd_w { + hash $arg_a; + server 127.0.0.1:8081 weight=2; + server 127.0.0.1:8082 weight=3; + server 127.0.0.1:8083; + } + + upstream memd_cw { + hash $arg_a consistent; + server 127.0.0.1:8081 weight=2; + server 127.0.0.1:8082 weight=3; + server 127.0.0.1:8083; + } + + server { + listen 127.0.0.1:8080; + server_name localhost; + + set $memcached_key $arg_a; + + location / { + memcached_pass memd; + } + location /c { + memcached_pass memd_c; + } + location /w { + memcached_pass memd_w; + } + location /cw { + memcached_pass memd_cw; + } + } +} + +EOF + +my $memhelp = `memcached -h`; +my @memopts = (); + +if ($memhelp =~ /repcached/) { + # repcached patch adds additional listen socket + push @memopts, '-X', '8082'; +} +if ($memhelp =~ /-U/) { + # UDP port is on by default in memcached 1.2.7+ + push @memopts, '-U', '0'; +} + +$t->run_daemon('memcached', '-l', '127.0.0.1', '-p', '8081', @memopts); +$t->run_daemon('memcached', '-l', '127.0.0.1', '-p', '8082', @memopts); +$t->run_daemon('memcached', '-l', '127.0.0.1', '-p', '8083', @memopts); +$t->try_run('no upstream hash')->plan(4); + +$t->waitforsocket('127.0.0.1:8081') or die "Can't start memcached"; +$t->waitforsocket('127.0.0.1:8082') or die "Can't start memcached"; +$t->waitforsocket('127.0.0.1:8083') or die "Can't start memcached"; + +############################################################################### + +my $memd1 = Cache::Memcached->new(servers => [ '127.0.0.1:8081' ]); +my $memd2 = Cache::Memcached->new(servers => [ '127.0.0.1:8082' ]); +my $memd3 = Cache::Memcached->new(servers => [ '127.0.0.1:8083' ]); + +for my $i (1 .. 20) { + $memd1->set($i, '8081') or die "can't put value into memcached: $!"; + $memd2->set($i, '8082') or die "can't put value into memcached: $!"; + $memd3->set($i, '8083') or die "can't put value into memcached: $!"; +} + +my $memd = new Cache::Memcached(servers => + [ '127.0.0.1:8081', '127.0.0.1:8082', '127.0.0.1:8083' ]); + +is_deeply(ngx('/'), mem($memd), 'cache::memcached'); + +$memd = new Cache::Memcached::Fast({ ketama_points => 160, servers => + [ '127.0.0.1:8081', '127.0.0.1:8082', '127.0.0.1:8083'] }); + +is_deeply(ngx('/c'), mem($memd), 'cache::memcached::fast'); + +$memd = new Cache::Memcached(servers => [ + [ '127.0.0.1:8081', 2 ], + [ '127.0.0.1:8082', 3 ], + [ '127.0.0.1:8083', 1 ]]); + +is_deeply(ngx('/w'), mem($memd), 'cache::memcached weight'); + +$memd = new Cache::Memcached::Fast({ ketama_points => 160, servers => [ + { address => '127.0.0.1:8081', weight => 2 }, + { address => '127.0.0.1:8082', weight => 3 }, + { address => '127.0.0.1:8083', weight => 1 }] }); + +is_deeply(ngx('/cw'), mem($memd), 'cache::memcached::fast weight'); + +############################################################################### + +sub ngx { + my ($uri) = @_; + [ map { http_get("/$uri?a=$_") =~ /^(\d+)/ms && $1; } (1 .. 20) ]; +} + +sub mem { + my ($memd) = @_; + [ map { $memd->get($_); } (1 .. 20) ]; +} + +###############################################################################