Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 4e31fea

Browse files
robfrawleynicolas-grekas
authored andcommitted
[cache] Add tests for MemcachedAdapter::createClient()
1 parent dd4df10 commit 4e31fea

File tree

5 files changed

+139
-9
lines changed

5 files changed

+139
-9
lines changed

.travis.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ cache:
3838
- php-$MIN_PHP
3939

4040
services:
41+
- memcached
4142
- mongodb
4243
- redis-server
4344

@@ -60,7 +61,7 @@ before_install:
6061
- if [[ ! $skip && $PHP = 5.* ]]; then (echo yes | pecl install -f apcu-4.0.11 && echo apc.enable_cli = 1 >> $INI_FILE); fi
6162
- if [[ ! $skip && $PHP = 7.* ]]; then (echo yes | pecl install -f apcu-5.1.6 && echo apc.enable_cli = 1 >> $INI_FILE); fi
6263
- if [[ ! $deps && $PHP = 5.* ]]; then (cd src/Symfony/Component/Debug/Resources/ext && phpize && ./configure && make && echo extension = $(pwd)/modules/symfony_debug.so >> $INI_FILE); fi
63-
- if [[ ! $skip && $PHP = 5.* ]]; then pecl install -f memcached-2.1.0; fi
64+
- if [[ ! $skip && ! $PHP = hhvm* ]]; then echo extension = memcached.so >> $INI_FILE; fi
6465
- if [[ ! $skip && ! $PHP = hhvm* ]]; then echo extension = ldap.so >> $INI_FILE; fi
6566
- if [[ ! $skip && ! $PHP = hhvm* ]]; then echo extension = redis.so >> $INI_FILE; fi;
6667
- if [[ ! $skip && ! $PHP = hhvm* ]]; then phpenv config-rm xdebug.ini || echo "xdebug not available"; fi

phpunit.xml.dist

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
<env name="LDAP_HOST" value="127.0.0.1" />
1717
<env name="LDAP_PORT" value="3389" />
1818
<env name="REDIS_HOST" value="localhost" />
19+
<env name="MEMCACHED_HOST" value="localhost" />
1920
</php>
2021

2122
<testsuites>

src/Symfony/Component/Cache/Adapter/MemcachedAdapter.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ public static function createConnection($servers, array $options = array())
6767
}
6868
set_error_handler(function ($type, $msg, $file, $line) { throw new \ErrorException($msg, 0, $type, $file, $line); });
6969
try {
70+
if (!static::isSupported()) {
71+
throw new trigger_error('Memcached >= 2.2.0 is required');
72+
}
7073
$options += static::$defaultClientOptions;
7174
$client = new \Memcached($options['persistent_id']);
7275
$username = $options['username'];
@@ -76,6 +79,7 @@ public static function createConnection($servers, array $options = array())
7679

7780
// set client's options
7881
$client->setOption(\Memcached::OPT_BINARY_PROTOCOL, true);
82+
$client->setOption(\Memcached::OPT_NO_BLOCK, true);
7983
if (!array_key_exists('LIBKETAMA_COMPATIBLE', $options) && !array_key_exists(\Memcached::OPT_LIBKETAMA_COMPATIBLE, $options)) {
8084
$client->setOption(\Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
8185
}

src/Symfony/Component/Cache/Tests/Adapter/MemcachedAdapterTest.php

Lines changed: 131 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111

1212
namespace Symfony\Component\Cache\Tests\Adapter;
1313

14+
use Symfony\Component\Cache\Adapter\AbstractAdapter;
1415
use Symfony\Component\Cache\Adapter\MemcachedAdapter;
16+
use Symfony\Component\Cache\Exception\CacheException;
1517

1618
class MemcachedAdapterTest extends AdapterTestCase
1719
{
@@ -28,23 +30,144 @@ public static function setupBeforeClass()
2830
if (!MemcachedAdapter::isSupported()) {
2931
self::markTestSkipped('Extension memcached >=2.2.0 required.');
3032
}
33+
self::$client = AbstractAdapter::createConnection('memcached://'.getenv('MEMCACHED_HOST'));
34+
self::$client->get('foo');
35+
$code = self::$client->getResultCode();
3136

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+
}
3940
}
4041

4142
public function createCachePool($defaultLifetime = 0)
4243
{
4344
return new MemcachedAdapter(self::$client, str_replace('\\', '.', __CLASS__), $defaultLifetime);
4445
}
4546

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()
4794
{
4895
$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+
}
49172
}
50173
}

src/Symfony/Component/Cache/phpunit.xml.dist

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<php>
1010
<ini name="error_reporting" value="-1" />
1111
<env name="REDIS_HOST" value="localhost" />
12+
<env name="MEMCACHED_HOST" value="localhost" />
1213
</php>
1314

1415
<testsuites>

0 commit comments

Comments
 (0)