(dev/core#174) Redis - Updates to comply with PSR-16
authorTim Otten <totten@civicrm.org>
Sat, 23 Jun 2018 02:22:34 +0000 (19:22 -0700)
committereileen <emcnaughton@wikimedia.org>
Sat, 30 Jun 2018 20:27:35 +0000 (08:27 +1200)
CRM/Utils/Cache/Redis.php
tests/phpunit/E2E/Cache/ConfiguredMemoryTest.php [new file with mode: 0644]

index 01fc538c9355cd38af7dd5b35bbd5a3ae4c2dcaf..3e2f2f7f9b3fa64ecbb6e786399f2c4d350441ab 100644 (file)
@@ -123,16 +123,18 @@ class CRM_Utils_Cache_Redis implements CRM_Utils_Cache_Interface {
    * @throws Exception
    */
   public function set($key, $value, $ttl = NULL) {
-    if ($ttl !== NULL) {
-      throw new \RuntimeException("FIXME: " . __CLASS__ . "::set() should support non-NULL TTL");
+    CRM_Utils_Cache::assertValidKey($key);
+    if (is_int($ttl) && $ttl <= 0) {
+      return $this->delete($key);
     }
-    if (!$this->_cache->set($this->_prefix . $key, serialize($value), $this->_timeout)) {
+    $ttl = CRM_Utils_Date::convertCacheTtl($ttl, self::DEFAULT_TIMEOUT);
+    if (!$this->_cache->setex($this->_prefix . $key, $ttl, serialize($value))) {
       if (PHP_SAPI === 'cli' || (Civi\Core\Container::isContainerBooted() && CRM_Core_Permission::check('view debug output'))) {
-        CRM_Core_Error::fatal("Redis set ($key) failed: " . $this->_cache->getLastError());
+        throw new CRM_Utils_Cache_CacheException("Redis set ($key) failed: " . $this->_cache->getLastError());
       }
       else {
         Civi::log()->error("Redis set ($key) failed: " . $this->_cache->getLastError());
-        CRM_Core_Error::fatal("Redis set ($key) failed");
+        throw new CRM_Utils_Cache_CacheException("Redis set ($key) failed");
       }
       return FALSE;
     }
@@ -146,6 +148,7 @@ class CRM_Utils_Cache_Redis implements CRM_Utils_Cache_Interface {
    * @return mixed
    */
   public function get($key, $default = NULL) {
+    CRM_Utils_Cache::assertValidKey($key);
     $result = $this->_cache->get($this->_prefix . $key);
     return ($result === FALSE) ? $default : unserialize($result);
   }
@@ -156,6 +159,7 @@ class CRM_Utils_Cache_Redis implements CRM_Utils_Cache_Interface {
    * @return bool
    */
   public function delete($key) {
+    CRM_Utils_Cache::assertValidKey($key);
     $this->_cache->delete($this->_prefix . $key);
     return TRUE;
   }
diff --git a/tests/phpunit/E2E/Cache/ConfiguredMemoryTest.php b/tests/phpunit/E2E/Cache/ConfiguredMemoryTest.php
new file mode 100644 (file)
index 0000000..5f1ea8b
--- /dev/null
@@ -0,0 +1,48 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | CiviCRM version 5                                                  |
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC (c) 2004-2018                                |
+ +--------------------------------------------------------------------+
+ | This file is a part of CiviCRM.                                    |
+ |                                                                    |
+ | CiviCRM is free software; you can copy, modify, and distribute it  |
+ | under the terms of the GNU Affero General Public License           |
+ | Version 3, 19 November 2007 and the CiviCRM Licensing Exception.   |
+ |                                                                    |
+ | CiviCRM is distributed in the hope that it will be useful, but     |
+ | WITHOUT ANY WARRANTY; without even the implied warranty of         |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.               |
+ | See the GNU Affero General Public License for more details.        |
+ |                                                                    |
+ | You should have received a copy of the GNU Affero General Public   |
+ | License along with this program; if not, contact CiviCRM LLC       |
+ | at info[AT]civicrm[DOT]org. If you have questions about the        |
+ | GNU Affero General Public License or the licensing of CiviCRM,     |
+ | see the CiviCRM license FAQ at http://civicrm.org/licensing        |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ * Verify that CRM_Utils_Cache_{Redis,Memcache} complies with PSR-16.
+ *
+ * NOTE: Only works if the local system is configured to use one of
+ * those services.
+ *
+ * @group e2e
+ */
+class E2E_Cache_ConfiguredMemoryTest extends E2E_Cache_CacheTestCase {
+
+  public function createSimpleCache() {
+    $cache = Civi::cache('default');
+
+    if ($cache instanceof CRM_Utils_Cache_Redis || $cache instanceof CRM_Utils_Cache_Memcache || $cache instanceof  CRM_Utils_Cache_Memcached) {
+      return $cache;
+    }
+    else {
+      $this->markTestSkipped('This environment is not configured to use a memory-backed cache service.');
+    }
+  }
+
+}