11
11
12
12
namespace Symfony \Component \Cache \Tests \Adapter ;
13
13
14
+ use Symfony \Component \Cache \Adapter \AbstractAdapter ;
14
15
use Symfony \Component \Cache \Adapter \MemcachedAdapter ;
15
16
16
17
class MemcachedAdapterTest extends AdapterTestCase
@@ -28,23 +29,144 @@ public static function setupBeforeClass()
28
29
if (!MemcachedAdapter::isSupported ()) {
29
30
self ::markTestSkipped ('Extension memcached >=2.2.0 required. ' );
30
31
}
32
+ self ::$ client = AbstractAdapter::createConnection ('memcached:// ' .getenv ('MEMCACHED_HOST ' ));
33
+ self ::$ client ->get ('foo ' );
34
+ $ code = self ::$ client ->getResultCode ();
31
35
32
- self ::$ client = new \Memcached ();
33
- self ::$ client ->addServers (array (array (
34
- getenv ('MEMCACHED_HOST ' ) ?: '127.0.0.1 ' ,
35
- getenv ('MEMCACHED_PORT ' ) ?: 11211 ,
36
- )));
37
-
38
- parent ::setupBeforeClass ();
36
+ if (\Memcached::RES_SUCCESS !== $ code && \Memcached::RES_NOTFOUND !== $ code ) {
37
+ self ::markTestSkipped ('Memcached error: ' .strtolower (self ::$ client ->getResultMessage ()));
38
+ }
39
39
}
40
40
41
41
public function createCachePool ($ defaultLifetime = 0 )
42
42
{
43
43
return new MemcachedAdapter (self ::$ client , str_replace ('\\' , '. ' , __CLASS__ ), $ defaultLifetime );
44
44
}
45
45
46
- public function testIsSupported ()
46
+ public function testOptions ()
47
+ {
48
+ $ client = MemcachedAdapter::createConnection (array (), array (
49
+ 'libketama_compatible ' => false ,
50
+ 'distribution ' => 'modula ' ,
51
+ 'compression ' => true ,
52
+ 'serializer ' => 'php ' ,
53
+ 'hash ' => 'md5 ' ,
54
+ ));
55
+
56
+ $ this ->assertSame (\Memcached::SERIALIZER_PHP , $ client ->getOption (\Memcached::OPT_SERIALIZER ));
57
+ $ this ->assertSame (\Memcached::HASH_MD5 , $ client ->getOption (\Memcached::OPT_HASH ));
58
+ $ this ->assertTrue ($ client ->getOption (\Memcached::OPT_COMPRESSION ));
59
+ $ this ->assertSame (0 , $ client ->getOption (\Memcached::OPT_LIBKETAMA_COMPATIBLE ));
60
+ $ this ->assertSame (\Memcached::DISTRIBUTION_MODULA , $ client ->getOption (\Memcached::OPT_DISTRIBUTION ));
61
+ }
62
+
63
+ /**
64
+ * @dataProvider provideBadOptions
65
+ * @expectedException \ErrorException
66
+ * @expectedExceptionMessage constant(): Couldn't find constant Memcached::
67
+ */
68
+ public function testBadOptions ($ name , $ value )
69
+ {
70
+ MemcachedAdapter::createConnection (array (), array ($ name => $ value ));
71
+ }
72
+
73
+ public function provideBadOptions ()
74
+ {
75
+ return array (
76
+ array ('foo ' , 'bar ' ),
77
+ array ('hash ' , 'zyx ' ),
78
+ array ('serializer ' , 'zyx ' ),
79
+ array ('distribution ' , 'zyx ' ),
80
+ );
81
+ }
82
+
83
+ /**
84
+ * @expectedException \Symfony\Component\Cache\Exception\CacheException
85
+ * @expectedExceptionMessage MemcachedAdapter: "binary_protocol" option must be enabled.
86
+ */
87
+ public function testBinaryProtocol ()
88
+ {
89
+ new MemcachedAdapter (MemcachedAdapter::createConnection (array (), array ('binary_protocol ' => false )));
90
+ }
91
+
92
+ public function testDefaultOptions ()
47
93
{
48
94
$ this ->assertTrue (MemcachedAdapter::isSupported ());
95
+
96
+ $ client = MemcachedAdapter::createConnection (array ());
97
+
98
+ $ this ->assertTrue ($ client ->getOption (\Memcached::OPT_COMPRESSION ));
99
+ $ this ->assertSame (1 , $ client ->getOption (\Memcached::OPT_BINARY_PROTOCOL ));
100
+ $ this ->assertSame (1 , $ client ->getOption (\Memcached::OPT_LIBKETAMA_COMPATIBLE ));
101
+ }
102
+
103
+ /**
104
+ * @expectedException \Symfony\Component\Cache\Exception\CacheException
105
+ * @expectedExceptionMessage MemcachedAdapter: "serializer" option must be "php" or "igbinary".
106
+ */
107
+ public function testOptionSerializer ()
108
+ {
109
+ if (!\Memcached::HAVE_JSON ) {
110
+ $ this ->markTestSkipped ('Memcached::HAVE_JSON required ' );
111
+ }
112
+
113
+ new MemcachedAdapter (MemcachedAdapter::createConnection (array (), array ('serializer ' => 'json ' )));
114
+ }
115
+
116
+ /**
117
+ * @dataProvider provideServersSetting
118
+ */
119
+ public function testServersSetting ($ dsn , $ host , $ port )
120
+ {
121
+ $ client1 = MemcachedAdapter::createConnection ($ dsn );
122
+ $ client2 = MemcachedAdapter::createConnection (array ($ dsn ));
123
+ $ client3 = MemcachedAdapter::createConnection (array (array ($ host , $ port )));
124
+ $ expect = array (
125
+ 'host ' => $ host ,
126
+ 'port ' => $ port ,
127
+ );
128
+
129
+ $ f = function ($ s ) { return array ('host ' => $ s ['host ' ], 'port ' => $ s ['port ' ]); };
130
+ $ this ->assertSame (array ($ expect ), array_map ($ f , $ client1 ->getServerList ()));
131
+ $ this ->assertSame (array ($ expect ), array_map ($ f , $ client2 ->getServerList ()));
132
+ $ this ->assertSame (array ($ expect ), array_map ($ f , $ client3 ->getServerList ()));
133
+ }
134
+
135
+ public function provideServersSetting ()
136
+ {
137
+ yield array (
138
+ 'memcached://127.0.0.1/50 ' ,
139
+ '127.0.0.1 ' ,
140
+ 11211 ,
141
+ );
142
+ yield array (
143
+ 'memcached://localhost:11222?weight=25 ' ,
144
+ 'localhost ' ,
145
+ 11222 ,
146
+ );
147
+ if (ini_get ('memcached.use_sasl ' )) {
148
+ yield array (
149
+ 'memcached://user:[email protected] ?weight=50 ' ,
150
+ '127.0.0.1 ' ,
151
+ 11211 ,
152
+ );
153
+ }
154
+ yield array (
155
+ 'memcached:///var/run/memcached.sock?weight=25 ' ,
156
+ '/var/run/memcached.sock ' ,
157
+ 0 ,
158
+ );
159
+ yield array (
160
+ 'memcached:///var/local/run/memcached.socket?weight=25 ' ,
161
+ '/var/local/run/memcached.socket ' ,
162
+ 0 ,
163
+ );
164
+ if (ini_get ('memcached.use_sasl ' )) {
165
+ yield array (
166
+ 'memcached://user:password@/var/local/run/memcached.socket?weight=25 ' ,
167
+ '/var/local/run/memcached.socket ' ,
168
+ 0 ,
169
+ );
170
+ }
49
171
}
50
172
}
0 commit comments