1#!/usr/bin/env perl
2
3use strict;
4use warnings;
5use Test::More;
6use FindBin qw($Bin);
7use lib "$Bin/lib";
8use Carp qw(croak);
9use MemcachedTest;
10use IO::Socket qw(AF_INET SOCK_STREAM);
11use IO::Select;
12use Data::Dumper qw/Dumper/;
13
14if (!supports_proxy()) {
15    plan skip_all => 'proxy not enabled';
16    exit 0;
17}
18
19my $t = Memcached::ProxyTest->new(servers => [12172]);
20
21my $p_srv = new_memcached('-o proxy_config=./t/proxyins.lua -t 1');
22my $ps = $p_srv->sock;
23$ps->autoflush(1);
24
25$t->set_c($ps);
26$t->accept_backends();
27
28my $w = $p_srv->new_sock;
29print $w "watch proxyevents\r\n";
30is(<$w>, "OK\r\n");
31
32{
33    test_mgintres();
34    test_mgreq();
35    test_mgres();
36}
37
38sub test_mgintres {
39    note 'testing mcp.internal()';
40    subtest 'mgintres 0b init' => sub {
41        $t->c_send("ms intres/tokenint 0 F7\r\n");
42        $t->c_send("\r\n");
43        $t->c_recv("HD\r\n");
44        $t->clear();
45    };
46
47    subtest 'flagtoken and flagint 0b' => sub {
48        $t->c_send("mg intres/tokenint f t s Omoo\r\n");
49        $t->c_recv("SERVER_ERROR O[true]: moo t[true]: -1\r\n");
50        $t->clear();
51    };
52
53    subtest 'flagtoken and flagint with 0b value returned' => sub {
54        $t->c_send("mg intres/tokenint v f t s Omoo\r\n");
55        $t->c_recv("SERVER_ERROR O[true]: moo t[true]: -1\r\n");
56        $t->clear();
57    };
58
59    subtest 'mgintres 5b init' => sub {
60        $t->c_send("ms intres/tokenint 5 F5\r\n");
61        $t->c_send("hello\r\n");
62        $t->c_recv("HD\r\n");
63        $t->clear();
64    };
65
66    subtest 'flagtoken and flagint' => sub {
67        $t->c_send("mg intres/tokenint f t s Omoo\r\n");
68        $t->c_recv("SERVER_ERROR O[true]: moo t[true]: -1\r\n");
69        $t->clear();
70    };
71
72    subtest 'flagtoken and flagint with value returned' => sub {
73        $t->c_send("mg intres/tokenint v f t s Omoo\r\n");
74        $t->c_recv("SERVER_ERROR O[true]: moo t[true]: -1\r\n");
75        $t->clear();
76    };
77}
78
79sub test_mgreq {
80    note 'test ins with mg req object';
81
82    subtest 'sepkey with map' => sub {
83        $t->c_send("mg sepkey/bar/restofkey s t v\r\n");
84        $t->c_recv("SERVER_ERROR idx: 2 true\r\n");
85        $t->clear();
86    };
87
88    subtest 'sepkey onesep' => sub {
89        $t->c_send("mg sepkey/baz s t v\r\n");
90        $t->c_recv("SERVER_ERROR idx: 1\r\n");
91        $t->clear();
92    };
93
94    subtest 'sepkey nomap' => sub {
95        $t->c_send("mg sepkey/nomap s t v\r\n");
96        $t->c_recv("SERVER_ERROR str: nomap\r\n");
97        $t->clear();
98    };
99
100    subtest 'sepkey one' => sub {
101        $t->c_send("mg sepkey/one/two s t v\r\n");
102        $t->c_recv("SERVER_ERROR idx: 3\r\n");
103        $t->clear();
104    };
105
106    subtest 'sepkey three' => sub {
107        $t->c_send("mg sepkey/two/three s t v\r\n");
108        $t->c_recv("SERVER_ERROR idx: 3\r\n");
109        $t->clear();
110    };
111
112    subtest 'keyis one' => sub {
113        $t->c_send("mg reqkey/one s t v\r\n");
114        $t->c_recv("SERVER_ERROR one[true] two[false] three[false]\r\n");
115        $t->clear();
116    };
117
118    subtest 'keyis two' => sub {
119        $t->c_send("mg reqkey/two s t v\r\n");
120        $t->c_recv("SERVER_ERROR one[false] two[true] three[false]\r\n");
121        $t->clear();
122    };
123
124    subtest 'keyis three' => sub {
125        $t->c_send("mg reqkey/three s t v\r\n");
126        $t->c_recv("SERVER_ERROR one[false] two[false] three[true]\r\n");
127        $t->clear();
128    };
129
130    subtest 'keyis none' => sub {
131        $t->c_send("mg reqkey/twoo s t v\r\n");
132        $t->c_recv("SERVER_ERROR one[false] two[false] three[false]\r\n");
133        $t->clear();
134    };
135
136}
137
138sub test_mgres {
139    note 'test ins with mg res object';
140
141    subtest 'has flags' => sub {
142        $t->c_send("mg reshasf/foo f t s\r\n");
143        $t->be_recv_c(0);
144        $t->be_send(0, "HD f1234 t9995\r\n");
145        $t->c_recv("SERVER_ERROR f: true t: true\r\n");
146        $t->clear();
147    };
148
149    subtest 'has flags with value returned' => sub {
150        $t->c_send("mg reshasf/foo v f t s\r\n");
151        $t->be_recv_c(0);
152        $t->be_send(0, "VA 4 f1234 t9995\r\n");
153        $t->be_send(0, "data\r\n");
154        $t->c_recv("SERVER_ERROR f: true t: true\r\n");
155        $t->clear();
156    };
157
158    subtest 'one flag' => sub {
159        $t->c_send("mg reshasf/foo f t s\r\n");
160        $t->be_recv_c(0);
161        $t->be_send(0, "HD f1234 Oasdf\r\n");
162        $t->c_recv("SERVER_ERROR f: true t: false\r\n");
163        $t->clear();
164    };
165
166    subtest 'flagtoken and flagint' => sub {
167        $t->c_send("mg reshasf/tokenint f t s Omoo\r\n");
168        $t->be_recv_c(0);
169        $t->be_send(0, "HD f5678 t60 s300 Omoo\r\n");
170        $t->c_recv("SERVER_ERROR O[true]: moo t[true]: 60\r\n");
171        $t->clear();
172    };
173
174    subtest 'flagtoken and flagint req' => sub {
175        $t->c_send("mg reshasf/reqhasf Obar T333 s\r\n");
176        $t->be_recv_c(0);
177        $t->be_send(0, "HD Obar s300\r\n");
178        $t->c_recv("SERVER_ERROR O[true]: bar T[true]: 333\r\n");
179        $t->clear();
180    };
181
182    subtest 'flagtoken and flagint miss' => sub {
183        $t->c_send("mg reshasf/tokenint f t s Omoo\r\n");
184        $t->be_recv_c(0);
185        $t->be_send(0, "HD f5678 s300\r\n");
186        $t->c_recv("SERVER_ERROR O[false]: nil t[false]: nil\r\n");
187        $t->clear();
188    };
189
190    subtest 'flagis' => sub {
191        $t->c_send("mg reshasf/flagis Obaz\r\n");
192        $t->be_recv_c(0);
193        $t->be_send(0, "HD f Obaz\r\n");
194        $t->c_recv("SERVER_ERROR exists[true] matches[true]\r\n");
195        $t->clear();
196    };
197
198    subtest 'flagisnt' => sub {
199        $t->c_send("mg reshasf/flagis Obar\r\n");
200        $t->be_recv_c(0);
201        $t->be_send(0, "HD f Obaz\r\n");
202        $t->c_recv("SERVER_ERROR exists[true] matches[true]\r\n");
203        $t->clear();
204    };
205
206}
207
208done_testing();
209