| 1 | <?php |
| 2 | /* |
| 3 | +--------------------------------------------------------------------+ |
| 4 | | Copyright CiviCRM LLC. All rights reserved. | |
| 5 | | | |
| 6 | | This work is published under the GNU AGPLv3 license with some | |
| 7 | | permitted exceptions and without any warranty. For full license | |
| 8 | | and copyright information, see https://civicrm.org/licensing | |
| 9 | +--------------------------------------------------------------------+ |
| 10 | */ |
| 11 | |
| 12 | /** |
| 13 | * Class CRM_Core_BAO_CacheTest |
| 14 | * @group headless |
| 15 | */ |
| 16 | class CRM_Core_BAO_CacheTest extends CiviUnitTestCase { |
| 17 | |
| 18 | /** |
| 19 | * @var CRM_Utils_Cache_Interface |
| 20 | */ |
| 21 | protected $a; |
| 22 | |
| 23 | public function createSimpleCache() { |
| 24 | return new CRM_Utils_Cache_FastArrayDecorator( |
| 25 | $this->a = CRM_Utils_Cache::create([ |
| 26 | 'name' => 'CRM_Core_BAO_CacheTest', |
| 27 | 'type' => ['*memory*', 'SqlGroup', 'ArrayCache'], |
| 28 | ]) |
| 29 | ); |
| 30 | } |
| 31 | |
| 32 | public function testMultiVersionDecode() { |
| 33 | $encoders = ['serialize', ['CRM_Core_BAO_Cache', 'encode']]; |
| 34 | $values = [NULL, 0, 1, TRUE, FALSE, [], ['abcd'], 'ab;cd', new stdClass()]; |
| 35 | foreach ($encoders as $encoder) { |
| 36 | foreach ($values as $value) { |
| 37 | $encoded = $encoder($value); |
| 38 | $decoded = CRM_Core_BAO_Cache::decode($encoded); |
| 39 | $this->assertEquals($value, $decoded, "Failure encoding/decoding value " . var_export($value, 1) . ' with ' . var_export($encoder, 1)); |
| 40 | } |
| 41 | } |
| 42 | } |
| 43 | |
| 44 | public function exampleValues() { |
| 45 | $binary = ''; |
| 46 | for ($i = 0; $i < 256; $i++) { |
| 47 | $binary .= chr($i); |
| 48 | } |
| 49 | |
| 50 | $ex = []; |
| 51 | |
| 52 | $ex[] = [['abc' => 'def']]; |
| 53 | $ex[] = [0]; |
| 54 | $ex[] = ['hello world']; |
| 55 | $ex[] = ['Scarabée']; |
| 56 | $ex[] = ['Iñtërnâtiônàlizætiøn']; |
| 57 | $ex[] = ['これは日本語のテキストです。読めますか']; |
| 58 | $ex[] = ['देखें हिन्दी कैसी नजर आती है। अरे वाह ये तो नजर आती है।']; |
| 59 | $ex[] = [$binary]; |
| 60 | |
| 61 | return $ex; |
| 62 | } |
| 63 | |
| 64 | /** |
| 65 | * @param $originalValue |
| 66 | * @dataProvider exampleValues |
| 67 | */ |
| 68 | public function testSetGetItem($originalValue) { |
| 69 | $this->createSimpleCache(); |
| 70 | $this->a->set('testSetGetItem', $originalValue); |
| 71 | |
| 72 | $return_1 = $this->a->get('testSetGetItem'); |
| 73 | $this->assertEquals($originalValue, $return_1); |
| 74 | |
| 75 | // Wipe out any in-memory copies of the cache. Check to see if the SQL |
| 76 | // read is correct. |
| 77 | |
| 78 | CRM_Core_BAO_Cache::$_cache = NULL; |
| 79 | CRM_Utils_Cache::$_singleton = NULL; |
| 80 | $this->a->values = []; |
| 81 | $return_2 = $this->a->get('testSetGetItem'); |
| 82 | $this->assertEquals($originalValue, $return_2); |
| 83 | } |
| 84 | |
| 85 | public function getCleanKeyExamples() { |
| 86 | $es = []; |
| 87 | // allowed chars |
| 88 | $es[] = ['hello_world and/other.planets', 'hello_world-20and-2fother.planets']; |
| 89 | // escaped chars |
| 90 | $es[] = ['hello/world+-#@{}', 'hello-2fworld-2b-2d-23-40-7b-7d']; |
| 91 | // short with emoji |
| 92 | $es[] = ["LF-\nTAB-\tCR-\remojiskull💀", 'LF-2d-aTAB-2d-9CR-2d-demojiskull-f0-9f-92-80']; |
| 93 | // long with emoji |
| 94 | $es[] = ["LF-\nTAB-\tCR-\remojibomb💣emojiskull💀", '-5d9324e052f6e10240dce5029c5e8525']; |
| 95 | // spaces are escaped |
| 96 | $es[] = ['123456789 123456789 123456789 123456789 123456789 123', '123456789-20123456789-20123456789-20123456789-20123456789-20123']; |
| 97 | // long but allowed |
| 98 | $es[] = ['123456789_123456789_123456789_123456789_123456789_123456789_123', '123456789_123456789_123456789_123456789_123456789_123456789_123']; |
| 99 | // too long, md5 fallback |
| 100 | $es[] = ['123456789_123456789_123456789_123456789_123456789_123456789_1234', '-e02b981aff954fdcc9a81c25f5ec9681']; |
| 101 | // too long, md5 fallback |
| 102 | $es[] = ['123456789-/23456789-+23456789--23456789_123456789_123456789', '-43b6dec1026187ae6f6a8fe4d56ab22e']; |
| 103 | return $es; |
| 104 | } |
| 105 | |
| 106 | /** |
| 107 | * @param $inputKey |
| 108 | * @param $expectKey |
| 109 | * @dataProvider getCleanKeyExamples |
| 110 | */ |
| 111 | public function testCleanKeys($inputKey, $expectKey) { |
| 112 | $actualKey = CRM_Utils_Cache::cleanKey($inputKey); |
| 113 | $this->assertEquals($expectKey, $actualKey); |
| 114 | } |
| 115 | |
| 116 | } |