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