Mercurial > hg > nginx-tests
comparison 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 |
comparison
equal
deleted
inserted
replaced
410:9fe6fc05c1d1 | 411:17c5a1cc8757 |
---|---|
1 #!/usr/bin/perl | |
2 | |
3 # (C) Sergey Kandaurov | |
4 # (C) Nginx, Inc. | |
5 | |
6 # Tests for upstream hash balancer module distribution consistency | |
7 # with Cache::Memcached and Cache::Memcached::Fast. | |
8 | |
9 ############################################################################### | |
10 | |
11 use warnings; | |
12 use strict; | |
13 | |
14 use Test::More; | |
15 | |
16 BEGIN { use FindBin; chdir($FindBin::Bin); } | |
17 | |
18 use lib 'lib'; | |
19 use Test::Nginx; | |
20 | |
21 ############################################################################### | |
22 | |
23 select STDERR; $| = 1; | |
24 select STDOUT; $| = 1; | |
25 | |
26 eval { require Cache::Memcached; }; | |
27 plan(skip_all => 'Cache::Memcached not installed') if $@; | |
28 eval { require Cache::Memcached::Fast; }; | |
29 plan(skip_all => 'Cache::Memcached::Fast not installed') if $@; | |
30 | |
31 my $t = Test::Nginx->new()->has(qw/http rewrite memcached upstream_hash/) | |
32 ->has_daemon('memcached')->write_file_expand('nginx.conf', <<'EOF'); | |
33 | |
34 %%TEST_GLOBALS%% | |
35 | |
36 daemon off; | |
37 | |
38 events { | |
39 } | |
40 | |
41 http { | |
42 %%TEST_GLOBALS_HTTP%% | |
43 | |
44 upstream memd { | |
45 hash $arg_a; | |
46 server 127.0.0.1:8081; | |
47 server 127.0.0.1:8082; | |
48 server 127.0.0.1:8083; | |
49 } | |
50 | |
51 upstream memd_c { | |
52 hash $arg_a consistent; | |
53 server 127.0.0.1:8081; | |
54 server 127.0.0.1:8082; | |
55 server 127.0.0.1:8083; | |
56 } | |
57 | |
58 upstream memd_w { | |
59 hash $arg_a; | |
60 server 127.0.0.1:8081 weight=2; | |
61 server 127.0.0.1:8082 weight=3; | |
62 server 127.0.0.1:8083; | |
63 } | |
64 | |
65 upstream memd_cw { | |
66 hash $arg_a consistent; | |
67 server 127.0.0.1:8081 weight=2; | |
68 server 127.0.0.1:8082 weight=3; | |
69 server 127.0.0.1:8083; | |
70 } | |
71 | |
72 server { | |
73 listen 127.0.0.1:8080; | |
74 server_name localhost; | |
75 | |
76 set $memcached_key $arg_a; | |
77 | |
78 location / { | |
79 memcached_pass memd; | |
80 } | |
81 location /c { | |
82 memcached_pass memd_c; | |
83 } | |
84 location /w { | |
85 memcached_pass memd_w; | |
86 } | |
87 location /cw { | |
88 memcached_pass memd_cw; | |
89 } | |
90 } | |
91 } | |
92 | |
93 EOF | |
94 | |
95 my $memhelp = `memcached -h`; | |
96 my @memopts = (); | |
97 | |
98 if ($memhelp =~ /repcached/) { | |
99 # repcached patch adds additional listen socket | |
100 push @memopts, '-X', '8082'; | |
101 } | |
102 if ($memhelp =~ /-U/) { | |
103 # UDP port is on by default in memcached 1.2.7+ | |
104 push @memopts, '-U', '0'; | |
105 } | |
106 | |
107 $t->run_daemon('memcached', '-l', '127.0.0.1', '-p', '8081', @memopts); | |
108 $t->run_daemon('memcached', '-l', '127.0.0.1', '-p', '8082', @memopts); | |
109 $t->run_daemon('memcached', '-l', '127.0.0.1', '-p', '8083', @memopts); | |
110 $t->try_run('no upstream hash')->plan(4); | |
111 | |
112 $t->waitforsocket('127.0.0.1:8081') or die "Can't start memcached"; | |
113 $t->waitforsocket('127.0.0.1:8082') or die "Can't start memcached"; | |
114 $t->waitforsocket('127.0.0.1:8083') or die "Can't start memcached"; | |
115 | |
116 ############################################################################### | |
117 | |
118 my $memd1 = Cache::Memcached->new(servers => [ '127.0.0.1:8081' ]); | |
119 my $memd2 = Cache::Memcached->new(servers => [ '127.0.0.1:8082' ]); | |
120 my $memd3 = Cache::Memcached->new(servers => [ '127.0.0.1:8083' ]); | |
121 | |
122 for my $i (1 .. 20) { | |
123 $memd1->set($i, '8081') or die "can't put value into memcached: $!"; | |
124 $memd2->set($i, '8082') or die "can't put value into memcached: $!"; | |
125 $memd3->set($i, '8083') or die "can't put value into memcached: $!"; | |
126 } | |
127 | |
128 my $memd = new Cache::Memcached(servers => | |
129 [ '127.0.0.1:8081', '127.0.0.1:8082', '127.0.0.1:8083' ]); | |
130 | |
131 is_deeply(ngx('/'), mem($memd), 'cache::memcached'); | |
132 | |
133 $memd = new Cache::Memcached::Fast({ ketama_points => 160, servers => | |
134 [ '127.0.0.1:8081', '127.0.0.1:8082', '127.0.0.1:8083'] }); | |
135 | |
136 is_deeply(ngx('/c'), mem($memd), 'cache::memcached::fast'); | |
137 | |
138 $memd = new Cache::Memcached(servers => [ | |
139 [ '127.0.0.1:8081', 2 ], | |
140 [ '127.0.0.1:8082', 3 ], | |
141 [ '127.0.0.1:8083', 1 ]]); | |
142 | |
143 is_deeply(ngx('/w'), mem($memd), 'cache::memcached weight'); | |
144 | |
145 $memd = new Cache::Memcached::Fast({ ketama_points => 160, servers => [ | |
146 { address => '127.0.0.1:8081', weight => 2 }, | |
147 { address => '127.0.0.1:8082', weight => 3 }, | |
148 { address => '127.0.0.1:8083', weight => 1 }] }); | |
149 | |
150 is_deeply(ngx('/cw'), mem($memd), 'cache::memcached::fast weight'); | |
151 | |
152 ############################################################################### | |
153 | |
154 sub ngx { | |
155 my ($uri) = @_; | |
156 [ map { http_get("/$uri?a=$_") =~ /^(\d+)/ms && $1; } (1 .. 20) ]; | |
157 } | |
158 | |
159 sub mem { | |
160 my ($memd) = @_; | |
161 [ map { $memd->get($_); } (1 .. 20) ]; | |
162 } | |
163 | |
164 ############################################################################### |