From c4e4ce938e68ecda9d7b3e62bd109d1067986580 Mon Sep 17 00:00:00 2001 From: Timothy J Warren Date: Fri, 8 May 2020 18:58:25 -0400 Subject: [PATCH] More tests and fixes --- src/Driver/AbstractDriver.php | 4 ++- src/Driver/ApcuDriver.php | 8 ++++-- src/Driver/MemcachedDriver.php | 11 +++++++- src/Driver/NullDriver.php | 6 ++++ src/Driver/RedisDriver.php | 12 ++++---- src/Pool.php | 5 ---- src/Teller.php | 9 ------ tests/Driver/DriverTestBase.php | 50 ++++++++++++++++++++++++++++++--- 8 files changed, 76 insertions(+), 29 deletions(-) diff --git a/src/Driver/AbstractDriver.php b/src/Driver/AbstractDriver.php index 0bbacb1..8977cf3 100644 --- a/src/Driver/AbstractDriver.php +++ b/src/Driver/AbstractDriver.php @@ -73,7 +73,9 @@ abstract class AbstractDriver implements DriverInterface, LoggerAwareInterface { $setResults = []; foreach ($items as $k => $v) { - $setResults[] = $this->set($k, $v, $expires); + $setResults[] = ($expires === NULL) + ? $this->set($k, $v) + : $this->set($k, $v, $expires); } // Only return true if all the results are true diff --git a/src/Driver/ApcuDriver.php b/src/Driver/ApcuDriver.php index 616417d..2beedda 100644 --- a/src/Driver/ApcuDriver.php +++ b/src/Driver/ApcuDriver.php @@ -104,9 +104,11 @@ class ApcuDriver extends AbstractDriver { { $ttl = $this->getTTLFromExpiration((int)$expires); - return ($expires === NULL) + $errorKeys = ($expires === NULL) ? apcu_store($items) : apcu_store($items, NULL, $ttl); + + return empty($errorKeys); } /** @@ -128,8 +130,8 @@ class ApcuDriver extends AbstractDriver { */ public function deleteMultiple(array $keys = []): bool { - $deleted = apcu_delete($keys); - return ($keys <=> $deleted) === 0; + $failedToDelete = apcu_delete($keys); + return empty($failedToDelete); } /** diff --git a/src/Driver/MemcachedDriver.php b/src/Driver/MemcachedDriver.php index 036deb8..1fd40b8 100644 --- a/src/Driver/MemcachedDriver.php +++ b/src/Driver/MemcachedDriver.php @@ -162,7 +162,16 @@ class MemcachedDriver extends AbstractDriver { public function deleteMultiple(array $keys = []): bool { $deleted = $this->conn->deleteMulti($keys); - return ($keys <=> $deleted) === 0; + + foreach ($deleted as $key => $status) + { + if ($status !== TRUE) + { + return FALSE; + } + } + + return TRUE; } /** diff --git a/src/Driver/NullDriver.php b/src/Driver/NullDriver.php index c443bc1..62b7c69 100644 --- a/src/Driver/NullDriver.php +++ b/src/Driver/NullDriver.php @@ -86,6 +86,12 @@ class NullDriver extends AbstractDriver { */ public function delete(string $key): bool { + // Don't return true if the key didn't exist to begin with + if ( ! array_key_exists($key, $this->store)) + { + return FALSE; + } + unset($this->store[$key]); return ( ! array_key_exists($key, $this->store)); } diff --git a/src/Driver/RedisDriver.php b/src/Driver/RedisDriver.php index f29838f..72e76cf 100644 --- a/src/Driver/RedisDriver.php +++ b/src/Driver/RedisDriver.php @@ -92,12 +92,11 @@ class RedisDriver extends AbstractDriver { { $value = serialize($value); - if ($expires !== NULL) - { - return $this->conn->set($key, $value, 'EX', $expires) === 'OK'; - } + $status = ($expires !== NULL) + ? $this->conn->set($key, $value, 'EX', $expires) + : $this->conn->set($key, $value); - return $this->conn->set($key, $value) === 'OK'; + return (string)$status === 'OK'; } /** @@ -108,7 +107,8 @@ class RedisDriver extends AbstractDriver { */ public function delete(string $key): bool { - return (bool) $this->conn->del([$key]); + // This call returns the number of keys deleted + return $this->conn->del([$key]) === 1; } /** diff --git a/src/Pool.php b/src/Pool.php index c9c37a5..509a97d 100644 --- a/src/Pool.php +++ b/src/Pool.php @@ -109,11 +109,6 @@ final class Pool implements CacheItemPoolInterface, LoggerAwareInterface { $items = []; foreach($keys as $key) { - if ( ! is_string($key)) - { - throw new InvalidArgumentException(); - } - $items[$key] = array_key_exists($key, $this->deferred) ? $this->deferred[$key] : new Item($this->driver, $key); diff --git a/src/Teller.php b/src/Teller.php index 325389d..fa433f7 100644 --- a/src/Teller.php +++ b/src/Teller.php @@ -148,15 +148,6 @@ class Teller implements SimpleCache\CacheInterface, LoggerAwareInterface { return ($ttl === NULL) ? $this->driver->setMultiple((array)$values) : $this->driver->setMultiple((array)$values, $ttl); - - $setResults = []; - foreach ($values as $k => $v) - { - $setResults[] = $this->set($k, $v, $ttl); - } - - // Only return true if all the results are true - return array_reduce($setResults, fn ($carry, $item) => $item && $carry, TRUE); } /** diff --git a/tests/Driver/DriverTestBase.php b/tests/Driver/DriverTestBase.php index 590c8ec..bb7798b 100644 --- a/tests/Driver/DriverTestBase.php +++ b/tests/Driver/DriverTestBase.php @@ -22,8 +22,6 @@ class DriverTestBase extends TestCase { protected DriverInterface $driver; - - public function testGetSet(): void { $this->driver->set('foo', 'bar'); @@ -37,7 +35,7 @@ class DriverTestBase extends TestCase { 'bar' => 'baz' ]; - $this->driver->set('bar', $bar); + $this->assertTrue($this->driver->set('bar', $bar)); $this->assertEquals($bar, $this->driver->get('bar')); } @@ -74,6 +72,42 @@ class DriverTestBase extends TestCase { $this->assertEquals($expected, $actual); } + public function testSetMultiple(): void + { + $data = [ + 'foo' => [ + 'apple' => 'orange' + ], + 'bar' => 'baz', + 'baz' => 123456, + 'a' => [1, 2, 3], + 'b' => false, + 'c' => true, + 'd' => null, + ]; + + $this->assertTrue($this->driver->setMultiple($data)); + $this->assertEquals($data, $this->driver->getMultiple(array_keys($data))); + } + + public function testSetMultipleExpires(): void + { + $data = [ + 'foo' => [ + 'apple' => 'orange' + ], + 'bar' => 'baz', + 'baz' => 123456, + 'a' => [1, 2, 3], + 'b' => false, + 'c' => true, + 'd' => null, + ]; + + $this->assertTrue($this->driver->setMultiple($data, 30)); + $this->assertEquals($data, $this->driver->getMultiple(array_keys($data))); + } + public function testSetWithExpires(): void { $this->driver->set('foo', 'bar', 30); @@ -98,12 +132,20 @@ class DriverTestBase extends TestCase { $this->assertTrue($this->driver->exists('a')); $this->assertTrue($this->driver->exists('b')); - /*$this->assertTrue(*/$this->driver->deleteMultiple(['a', 'b']);//); + $this->assertTrue($this->driver->deleteMultiple(['a', 'b'])); $this->assertFalse($this->driver->exists('a')); $this->assertFalse($this->driver->exists('b')); } + public function testDeleteMultipleBadKey(): void + { + $this->assertFalse($this->driver->exists('foo')); + $this->assertFalse($this->driver->exists('bar')); + + $this->assertFalse($this->driver->deleteMultiple(['foo', 'bar'])); + } + public function testExpiresAt(): void { $this->driver->set('abc', 'def');