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