‪TYPO3CMS  11.5
RedisBackendTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Prophecy\PhpUnit\ProphecyTrait;
21 use Psr\Log\LoggerInterface;
26 use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
27 
37 class ‪RedisBackendTest extends FunctionalTestCase
38 {
39  use ProphecyTrait;
40 
44  protected ‪$initializeDatabase = false;
45 
49  protected function ‪setUp(): void
50  {
51  if (!getenv('typo3TestingRedisHost')) {
52  self::markTestSkipped('environment variable "typo3TestingRedisHost" must be set to run this test');
53  }
54  // Note we assume that if that typo3TestingRedisHost env is set, we can use that for testing,
55  // there is no test to see if the daemon is actually up and running. Tests will fail if env
56  // is set but daemon is down.
57 
58  parent::setUp();
59  }
60 
64  protected function ‪setUpSubject(array $backendOptions = []): ‪RedisBackend
65  {
66  // We know this env is set, otherwise setUp() would skip the tests
67  $backendOptions['hostname'] = getenv('typo3TestingRedisHost');
68  // If typo3TestingRedisPort env is set, use it, otherwise fall back to standard port
69  $env = getenv('typo3TestingRedisPort');
70  $backendOptions['port'] = is_string($env) ? (int)$env : 6379;
71 
72  $frontendProphecy = $this->prophesize(FrontendInterface::class);
73  $frontendProphecy->getIdentifier()->willReturn('pages');
74 
75  ‪$GLOBALS['TYPO3_CONF_VARS']['LOG'] = 'only needed for logger initialisation';
76  $subject = new ‪RedisBackend('Testing', $backendOptions);
77  $subject->setLogger($this->prophesize(LoggerInterface::class)->reveal());
78  $subject->setCache($frontendProphecy->reveal());
79  $subject->initializeObject();
80  $subject->flush();
81  return $subject;
82  }
83 
87  protected function ‪setUpRedis(): \Redis
88  {
89  // We know this env is set, otherwise setUp() would skip the tests
90  $redisHost = getenv('typo3TestingRedisHost');
91  // If typo3TestingRedisPort env is set, use it, otherwise fall back to standard port
92  $env = getenv('typo3TestingRedisPort');
93  $redisPort = is_string($env) ? (int)$env : 6379;
94 
95  $redis = new \Redis();
96  $redis->connect($redisHost, $redisPort);
97  return $redis;
98  }
99 
104  {
105  $this->expectException(\InvalidArgumentException::class);
106  $this->expectExceptionCode(1279763057);
107 
108  $this->‪setUpSubject(['database' => 'foo']);
109  }
110 
115  {
116  $this->expectException(\InvalidArgumentException::class);
117  $this->expectExceptionCode(1279763534);
118 
119  $this->‪setUpSubject(['database' => -1]);
120  }
121 
126  {
127  $this->expectException(\InvalidArgumentException::class);
128  $this->expectExceptionCode(1289679153);
129 
130  $this->‪setUpSubject(['compression' => 'foo']);
131  }
132 
137  {
138  $this->expectException(\InvalidArgumentException::class);
139  $this->expectExceptionCode(1289679154);
140 
141  $this->‪setUpSubject(['compressionLevel' => 'foo']);
142  }
143 
148  {
149  $this->expectException(\InvalidArgumentException::class);
150  $this->expectExceptionCode(1289679155);
151 
152  $this->‪setUpSubject(['compressionLevel' => 11]);
153  }
154 
159  {
160  $this->expectException(\InvalidArgumentException::class);
161  $this->expectExceptionCode(1487849315);
162 
163  $this->‪setUpSubject(['connectionTimeout' => 'foo']);
164  }
165 
170  {
171  $this->expectException(\InvalidArgumentException::class);
172  $this->expectExceptionCode(1487849326);
173 
174  $this->‪setUpSubject(['connectionTimeout' => -1]);
175  }
176 
180  public function ‪setThrowsExceptionIfIdentifierIsNotAString(): void
181  {
182  $this->expectException(\InvalidArgumentException::class);
183  $this->expectExceptionCode(1377006651);
184 
185  $subject = $this->‪setUpSubject();
186  $subject->set([], 'data');
187  }
188 
192  public function ‪setThrowsExceptionIfDataIsNotAString(): void
193  {
194  $this->expectException(InvalidDataException::class);
195  $this->expectExceptionCode(1279469941);
196 
197  $subject = $this->‪setUpSubject();
198  $subject->set(‪StringUtility::getUniqueId('identifier'), []);
199  }
200 
204  public function ‪setThrowsExceptionIfLifetimeIsNegative(): void
205  {
206  $this->expectException(\InvalidArgumentException::class);
207  $this->expectExceptionCode(1279487573);
208 
209  $subject = $this->‪setUpSubject();
210  $subject->set(‪StringUtility::getUniqueId('identifier'), 'data', [], -42);
211  }
212 
217  {
218  $this->expectException(\InvalidArgumentException::class);
219  $this->expectExceptionCode(1279488008);
220 
221  $subject = $this->‪setUpSubject();
222  $subject->set(‪StringUtility::getUniqueId('identifier'), 'data', [], []);
223  }
224 
228  public function ‪setStoresEntriesInSelectedDatabase(): void
229  {
230  $redis = $this->‪setUpRedis();
231  $redis->select(1);
232  $subject = $this->‪setUpSubject(['database' => 1]);
233  $identifier = ‪StringUtility::getUniqueId('identifier');
234  $subject->set($identifier, 'data');
235  $result = $redis->exists('identData:' . $identifier);
236  if (is_int($result)) {
237  // Since 3.1.4 of phpredis/phpredis the return types has been changed
238  $result = (bool)$result;
239  }
240  self::assertTrue($result);
241  }
242 
247  {
248  $subject = $this->‪setUpSubject();
249  $redis = $this->‪setUpRedis();
250  $identifier = ‪StringUtility::getUniqueId('identifier');
251  $subject->set($identifier, 'data');
252  self::assertSame(\Redis::REDIS_STRING, $redis->type('identData:' . $identifier));
253  }
254 
258  public function ‪setSavesEntryWithDefaultLifeTime(): void
259  {
260  $subject = $this->‪setUpSubject();
261  $redis = $this->‪setUpRedis();
262  $identifier = ‪StringUtility::getUniqueId('identifier');
263  $defaultLifetime = 42;
264  $subject->setDefaultLifetime($defaultLifetime);
265  $subject->set($identifier, 'data');
266  $lifetimeRegisteredInBackend = $redis->ttl('identData:' . $identifier);
267  self::assertSame($defaultLifetime, $lifetimeRegisteredInBackend);
268  }
269 
273  public function ‪setSavesEntryWithSpecifiedLifeTime(): void
274  {
275  $subject = $this->‪setUpSubject();
276  $redis = $this->‪setUpRedis();
277  $identifier = ‪StringUtility::getUniqueId('identifier');
278  $lifetime = 43;
279  $subject->set($identifier, 'data', [], $lifetime);
280  $lifetimeRegisteredInBackend = $redis->ttl('identData:' . $identifier);
281  self::assertSame($lifetime, $lifetimeRegisteredInBackend);
282  }
283 
287  public function ‪setSavesEntryWithUnlimitedLifeTime(): void
288  {
289  $subject = $this->‪setUpSubject();
290  $redis = $this->‪setUpRedis();
291  $identifier = ‪StringUtility::getUniqueId('identifier');
292  $subject->set($identifier, 'data', [], 0);
293  $lifetimeRegisteredInBackend = $redis->ttl('identData:' . $identifier);
294  self::assertSame(31536000, $lifetimeRegisteredInBackend);
295  }
296 
300  public function ‪setOverwritesExistingEntryWithNewData(): void
301  {
302  $subject = $this->‪setUpSubject();
303  $data = 'data 1';
304  $identifier = ‪StringUtility::getUniqueId('identifier');
305  $subject->set($identifier, $data);
306  $otherData = 'data 2';
307  $subject->set($identifier, $otherData);
308  $fetchedData = $subject->get($identifier);
309  self::assertSame($otherData, $fetchedData);
310  }
311 
316  {
317  $subject = $this->‪setUpSubject();
318  $redis = $this->‪setUpRedis();
319  $data = 'data';
320  $identifier = ‪StringUtility::getUniqueId('identifier');
321  $subject->set($identifier, $data);
322  $lifetime = 42;
323  $subject->set($identifier, $data, [], $lifetime);
324  $lifetimeRegisteredInBackend = $redis->ttl('identData:' . $identifier);
325  self::assertSame($lifetime, $lifetimeRegisteredInBackend);
326  }
327 
332  {
333  $subject = $this->‪setUpSubject();
334  $redis = $this->‪setUpRedis();
335  $data = 'data';
336  $identifier = ‪StringUtility::getUniqueId('identifier');
337  $lifetime = 42;
338  $subject->set($identifier, $data, [], $lifetime);
339  $newDefaultLifetime = 43;
340  $subject->setDefaultLifetime($newDefaultLifetime);
341  $subject->set($identifier, $data, [], $newDefaultLifetime);
342  $lifetimeRegisteredInBackend = $redis->ttl('identData:' . $identifier);
343  self::assertSame($newDefaultLifetime, $lifetimeRegisteredInBackend);
344  }
345 
350  {
351  $subject = $this->‪setUpSubject();
352  $redis = $this->‪setUpRedis();
353  $data = 'data';
354  $identifier = ‪StringUtility::getUniqueId('identifier');
355  $lifetime = 42;
356  $subject->set($identifier, $data, [], $lifetime);
357  $subject->set($identifier, $data, [], 0);
358  $lifetimeRegisteredInBackend = $redis->ttl('identData:' . $identifier);
359  self::assertSame(31536000, $lifetimeRegisteredInBackend);
360  }
361 
365  public function ‪setSavesSetDataTypeForIdentifierToTagsSet(): void
366  {
367  $subject = $this->‪setUpSubject();
368  $redis = $this->‪setUpRedis();
369  $identifier = ‪StringUtility::getUniqueId('identifier');
370  $subject->set($identifier, 'data', ['tag']);
371  self::assertSame(\Redis::REDIS_SET, $redis->type('identTags:' . $identifier));
372  }
373 
377  public function ‪setSavesSpecifiedTagsInIdentifierToTagsSet(): void
378  {
379  $subject = $this->‪setUpSubject();
380  $redis = $this->‪setUpRedis();
381  $identifier = ‪StringUtility::getUniqueId('identifier');
382  $tags = ['thatTag', 'thisTag'];
383  $subject->set($identifier, 'data', $tags);
384  $savedTags = $redis->sMembers('identTags:' . $identifier);
385  sort($savedTags);
386  self::assertSame($tags, $savedTags);
387  }
388 
393  {
394  $subject = $this->‪setUpSubject();
395  $redis = $this->‪setUpRedis();
396  $identifier = ‪StringUtility::getUniqueId('identifier');
397  $tags = ['fooTag', 'barTag'];
398  $subject->set($identifier, 'data', $tags);
399  $subject->set($identifier, 'data', []);
400  self::assertSame([], $redis->sMembers('identTags:' . $identifier));
401  }
402 
407  {
408  $subject = $this->‪setUpSubject();
409  $redis = $this->‪setUpRedis();
410  $identifier = ‪StringUtility::getUniqueId('identifier');
411  $firstTagSet = ['tag1', 'tag2', 'tag3', 'tag4'];
412  $subject->set($identifier, 'data', $firstTagSet);
413  $secondTagSet = ['tag1', 'tag3'];
414  $subject->set($identifier, 'data', $secondTagSet);
415  $actualTagSet = $redis->sMembers('identTags:' . $identifier);
416  sort($actualTagSet);
417  self::assertSame($secondTagSet, $actualTagSet);
418  }
419 
423  public function ‪setSavesSetDataTypeForTagToIdentifiersSet(): void
424  {
425  $subject = $this->‪setUpSubject();
426  $redis = $this->‪setUpRedis();
427  $identifier = ‪StringUtility::getUniqueId('identifier');
428  $tag = 'tag';
429  $subject->set($identifier, 'data', [$tag]);
430  self::assertSame(\Redis::REDIS_SET, $redis->type('tagIdents:' . $tag));
431  }
432 
437  {
438  $subject = $this->‪setUpSubject();
439  $redis = $this->‪setUpRedis();
440  $identifier = ‪StringUtility::getUniqueId('identifier');
441  $tag = 'thisTag';
442  $subject->set($identifier, 'data', [$tag]);
443  $savedTagToIdentifiersMemberArray = $redis->sMembers('tagIdents:' . $tag);
444  self::assertSame([$identifier], $savedTagToIdentifiersMemberArray);
445  }
446 
451  {
452  $subject = $this->‪setUpSubject();
453  $redis = $this->‪setUpRedis();
454  $firstIdentifier = ‪StringUtility::getUniqueId('identifier1-');
455  $tag = 'thisTag';
456  $subject->set($firstIdentifier, 'data', [$tag]);
457  $secondIdentifier = ‪StringUtility::getUniqueId('identifier2-');
458  $subject->set($secondIdentifier, 'data', [$tag]);
459  $savedTagToIdentifiersMemberArray = $redis->sMembers('tagIdents:' . $tag);
460  sort($savedTagToIdentifiersMemberArray);
461  $identifierArray = [$firstIdentifier, $secondIdentifier];
462  sort($identifierArray);
463  self::assertSame([$firstIdentifier, $secondIdentifier], $savedTagToIdentifiersMemberArray);
464  }
465 
470  {
471  $subject = $this->‪setUpSubject();
472  $redis = $this->‪setUpRedis();
473  $identifier = ‪StringUtility::getUniqueId('identifier');
474  $tag = 'thisTag';
475  $subject->set($identifier, 'data', [$tag]);
476  $subject->set($identifier, 'data', []);
477  $savedTagToIdentifiersMemberArray = $redis->sMembers('tagIdents:' . $tag);
478  self::assertSame([], $savedTagToIdentifiersMemberArray);
479  }
480 
485  {
486  $subject = $this->‪setUpSubject();
487  $redis = $this->‪setUpRedis();
488  $identifier = ‪StringUtility::getUniqueId('identifier');
489  $subject->set($identifier, 'data');
490  $tag = 'thisTag';
491  $subject->set($identifier, 'data', [$tag]);
492  $savedTagToIdentifiersMemberArray = $redis->sMembers('tagIdents:' . $tag);
493  self::assertSame([$identifier], $savedTagToIdentifiersMemberArray);
494  }
495 
500  {
501  $subject = $this->‪setUpSubject([
502  'compression' => true,
503  ]);
504  $redis = $this->‪setUpRedis();
505  $identifier = ‪StringUtility::getUniqueId('identifier');
506  $data = 'some data ' . microtime();
507  $subject->set($identifier, $data);
508  $uncompressedStoredData = '';
509  try {
510  $uncompressedStoredData = @gzuncompress($redis->get('identData:' . $identifier));
511  } catch (\‪Exception $e) {
512  }
513  self::assertEquals($data, $uncompressedStoredData, 'Original and compressed data don\'t match');
514  }
515 
520  {
521  $subject = $this->‪setUpSubject([
522  'compression' => true,
523  'compressionLevel' => 0,
524  ]);
525  $redis = $this->‪setUpRedis();
526  $identifier = ‪StringUtility::getUniqueId('identifier');
527  $data = 'some data ' . microtime();
528  $subject->set($identifier, $data);
529  self::assertGreaterThan(0, substr_count($redis->get('identData:' . $identifier), $data), 'Plaintext data not found');
530  }
531 
535  public function ‪hasThrowsExceptionIfIdentifierIsNotAString(): void
536  {
537  $this->expectException(\InvalidArgumentException::class);
538  $this->expectExceptionCode(1377006653);
539 
540  $subject = $this->‪setUpSubject();
541  $subject->has([]);
542  }
543 
547  public function ‪hasReturnsFalseForNotExistingEntry(): void
548  {
549  $subject = $this->‪setUpSubject();
550  $identifier = ‪StringUtility::getUniqueId('identifier');
551  self::assertFalse($subject->has($identifier));
552  }
553 
557  public function ‪hasReturnsTrueForPreviouslySetEntry(): void
558  {
559  $subject = $this->‪setUpSubject();
560  $identifier = ‪StringUtility::getUniqueId('identifier');
561  $subject->set($identifier, 'data');
562  self::assertTrue($subject->has($identifier));
563  }
564 
568  public function ‪getThrowsExceptionIfIdentifierIsNotAString(): void
569  {
570  $this->expectException(\InvalidArgumentException::class);
571  // @todo Add exception code with redis extension
572 
573  $subject = $this->‪setUpSubject();
574  $subject->get([]);
575  }
576 
580  public function ‪getReturnsPreviouslyCompressedSetEntry(): void
581  {
582  $subject = $this->‪setUpSubject([
583  'compression' => true,
584  ]);
585  $data = 'data';
586  $identifier = ‪StringUtility::getUniqueId('identifier');
587  $subject->set($identifier, $data);
588  $fetchedData = $subject->get($identifier);
589  self::assertSame($data, $fetchedData);
590  }
591 
595  public function ‪getReturnsPreviouslySetEntry(): void
596  {
597  $subject = $this->‪setUpSubject();
598  $data = 'data';
599  $identifier = ‪StringUtility::getUniqueId('identifier');
600  $subject->set($identifier, $data);
601  $fetchedData = $subject->get($identifier);
602  self::assertSame($data, $fetchedData);
603  }
604 
609  {
610  $this->expectException(\InvalidArgumentException::class);
611  $this->expectExceptionCode(1377006654);
612 
613  $subject = $this->‪setUpSubject();
614  $subject->remove([]);
615  }
616 
620  public function ‪removeReturnsFalseIfNoEntryWasDeleted(): void
621  {
622  $subject = $this->‪setUpSubject();
623  self::assertFalse($subject->remove(‪StringUtility::getUniqueId('identifier')));
624  }
625 
629  public function ‪removeReturnsTrueIfAnEntryWasDeleted(): void
630  {
631  $subject = $this->‪setUpSubject();
632  $identifier = ‪StringUtility::getUniqueId('identifier');
633  $subject->set($identifier, 'data');
634  self::assertTrue($subject->remove($identifier));
635  }
636 
640  public function ‪removeDeletesEntryFromCache(): void
641  {
642  $subject = $this->‪setUpSubject();
643  $identifier = ‪StringUtility::getUniqueId('identifier');
644  $subject->set($identifier, 'data');
645  $subject->remove($identifier);
646  self::assertFalse($subject->has($identifier));
647  }
648 
652  public function ‪removeDeletesIdentifierToTagEntry(): void
653  {
654  $subject = $this->‪setUpSubject();
655  $redis = $this->‪setUpRedis();
656  $identifier = ‪StringUtility::getUniqueId('identifier');
657  $tag = 'thisTag';
658  $subject->set($identifier, 'data', [$tag]);
659  $subject->remove($identifier);
660  $result = $redis->exists('identTags:' . $identifier);
661  if (is_int($result)) {
662  // Since 3.1.4 of phpredis/phpredis the return types has been changed
663  $result = (bool)$result;
664  }
665  self::assertFalse($result);
666  }
667 
672  {
673  $subject = $this->‪setUpSubject();
674  $redis = $this->‪setUpRedis();
675  $identifier = ‪StringUtility::getUniqueId('identifier');
676  $tag = 'thisTag';
677  $subject->set($identifier, 'data', [$tag]);
678  $subject->remove($identifier);
679  $tagToIdentifiersMemberArray = $redis->sMembers('tagIdents:' . $tag);
680  self::assertSame([], $tagToIdentifiersMemberArray);
681  }
682 
687  {
688  $subject = $this->‪setUpSubject();
689  $redis = $this->‪setUpRedis();
690  $firstIdentifier = ‪StringUtility::getUniqueId('identifier');
691  $secondIdentifier = ‪StringUtility::getUniqueId('identifier');
692  $tag = 'thisTag';
693  $subject->set($firstIdentifier, 'data', [$tag]);
694  $subject->set($secondIdentifier, 'data', [$tag]);
695  $subject->remove($firstIdentifier);
696  $tagToIdentifiersMemberArray = $redis->sMembers('tagIdents:' . $tag);
697  self::assertSame([$secondIdentifier], $tagToIdentifiersMemberArray);
698  }
699 
704  {
705  $this->expectException(\InvalidArgumentException::class);
706  $this->expectExceptionCode(1377006655);
707 
708  $subject = $this->‪setUpSubject();
709  $subject->findIdentifiersByTag([]);
710  }
711 
716  {
717  $subject = $this->‪setUpSubject();
718  self::assertSame([], $subject->findIdentifiersByTag('thisTag'));
719  }
720 
725  {
726  $subject = $this->‪setUpSubject();
727  $firstIdentifier = ‪StringUtility::getUniqueId('identifier1-');
728  $secondIdentifier = ‪StringUtility::getUniqueId('identifier2-');
729  $thirdIdentifier = ‪StringUtility::getUniqueId('identifier3-');
730  $tagsForFirstIdentifier = ['thisTag'];
731  $tagsForSecondIdentifier = ['thatTag'];
732  $tagsForThirdIdentifier = ['thisTag', 'thatTag'];
733  $subject->set($firstIdentifier, 'data', $tagsForFirstIdentifier);
734  $subject->set($secondIdentifier, 'data', $tagsForSecondIdentifier);
735  $subject->set($thirdIdentifier, 'data', $tagsForThirdIdentifier);
736  $expectedResult = [$firstIdentifier, $thirdIdentifier];
737  $actualResult = $subject->findIdentifiersByTag('thisTag');
738  sort($actualResult);
739  self::assertSame($expectedResult, $actualResult);
740  }
741 
745  public function ‪flushRemovesAllEntriesFromCache(): void
746  {
747  $subject = $this->‪setUpSubject();
748  $redis = $this->‪setUpRedis();
749  $identifier = ‪StringUtility::getUniqueId('identifier');
750  $subject->set($identifier, 'data');
751  $subject->flush();
752  self::assertSame([], $redis->keys('*'));
753  }
754 
758  public function ‪flushByTagThrowsExceptionIfTagIsNotAString(): void
759  {
760  $this->expectException(\InvalidArgumentException::class);
761  $this->expectExceptionCode(1377006656);
762 
763  $subject = $this->‪setUpSubject();
764  $subject->flushByTag([]);
765  }
766 
771  {
772  $subject = $this->‪setUpSubject();
773  $identifier = ‪StringUtility::getUniqueId('identifier');
774  $subject->set($identifier . 'A', 'data', ['tag1']);
775  $subject->set($identifier . 'B', 'data', ['tag2']);
776  $subject->set($identifier . 'C', 'data', ['tag1', 'tag2']);
777  $subject->flushByTag('tag1');
778  $expectedResult = [false, true, false];
779  $actualResult = [
780  $subject->has($identifier . 'A'),
781  $subject->has($identifier . 'B'),
782  $subject->has($identifier . 'C'),
783  ];
784  self::assertSame($expectedResult, $actualResult);
785  }
786 
791  {
792  $subject = $this->‪setUpSubject();
793  $identifier = ‪StringUtility::getUniqueId('identifier');
794  $subject->set($identifier . 'A', 'data', ['tag1']);
795  $subject->set($identifier . 'B', 'data', ['tag2']);
796  $subject->set($identifier . 'C', 'data', ['tag1', 'tag2']);
797  $subject->set($identifier . 'D', 'data', ['tag3']);
798  $subject->flushByTags(['tag1', 'tag2']);
799  $expectedResult = [false, false, false, true];
800  $actualResult = [
801  $subject->has($identifier . 'A'),
802  $subject->has($identifier . 'B'),
803  $subject->has($identifier . 'C'),
804  $subject->has($identifier . 'D'),
805  ];
806  self::assertSame($expectedResult, $actualResult);
807  }
808 
812  public function ‪flushByTagRemovesTemporarySet(): void
813  {
814  $subject = $this->‪setUpSubject();
815  $redis = $this->‪setUpRedis();
816  $identifier = ‪StringUtility::getUniqueId('identifier');
817  $subject->set($identifier . 'A', 'data', ['tag1']);
818  $subject->set($identifier . 'C', 'data', ['tag1', 'tag2']);
819  $subject->flushByTag('tag1');
820  self::assertSame([], $redis->keys('temp*'));
821  }
822 
827  {
828  $subject = $this->‪setUpSubject();
829  $redis = $this->‪setUpRedis();
830  $identifier = ‪StringUtility::getUniqueId('identifier');
831  $tag = 'tag1';
832  $subject->set($identifier, 'data', [$tag]);
833  $subject->flushByTag($tag);
834  $result = $redis->exists('identTags:' . $identifier);
835  if (is_int($result)) {
836  // Since 3.1.4 of phpredis/phpredis the return types has been changed
837  $result = (bool)$result;
838  }
839  self::assertFalse($result);
840  }
841 
846  {
847  $subject = $this->‪setUpSubject();
848  $redis = $this->‪setUpRedis();
849  $identifierToBeRemoved = ‪StringUtility::getUniqueId('identifier');
850  $tagToRemove = 'tag1';
851  $subject->set($identifierToBeRemoved, 'data', [$tagToRemove]);
852  $identifierNotToBeRemoved = ‪StringUtility::getUniqueId('identifier');
853  $tagNotToRemove = 'tag2';
854  $subject->set($identifierNotToBeRemoved, 'data', [$tagNotToRemove]);
855  $subject->flushByTag($tagToRemove);
856  self::assertSame([$tagNotToRemove], $redis->sMembers('identTags:' . $identifierNotToBeRemoved));
857  }
858 
863  {
864  $subject = $this->‪setUpSubject();
865  $redis = $this->‪setUpRedis();
866  $identifier = ‪StringUtility::getUniqueId('identifier');
867  $tag = 'tag1';
868  $subject->set($identifier, 'data', [$tag]);
869  $subject->flushByTag($tag);
870  $result = $redis->exists('tagIdents:' . $tag);
871  if (is_int($result)) {
872  // Since 3.1.4 of phpredis/phpredis the return types has been changed
873  $result = (bool)$result;
874  }
875  self::assertFalse($result);
876  }
877 
882  {
883  $subject = $this->‪setUpSubject();
884  $redis = $this->‪setUpRedis();
885  $identifier = ‪StringUtility::getUniqueId('identifier');
886  $subject->set($identifier . 'A', 'data', ['tag1', 'tag2']);
887  $subject->set($identifier . 'B', 'data', ['tag1', 'tag2']);
888  $subject->set($identifier . 'C', 'data', ['tag2']);
889  $subject->flushByTag('tag1');
890  self::assertSame([$identifier . 'C'], $redis->sMembers('tagIdents:tag2'));
891  }
892 
897  {
898  $subject = $this->‪setUpSubject();
899  $redis = $this->‪setUpRedis();
900  $identifier = ‪StringUtility::getUniqueId('identifier');
901  $subject->set($identifier . 'A', 'data', ['tag']);
902  $subject->set($identifier . 'B', 'data', ['tag']);
903  $redis->del('identData:' . $identifier . 'A');
904  $subject->collectGarbage();
905  $result = $redis->exists('identData:' . $identifier . 'B');
906  if (is_int($result)) {
907  // Since 3.1.4 of phpredis/phpredis the return types has been changed
908  $result = (bool)$result;
909  }
910  self::assertTrue($result);
911  }
912 
917  {
918  $subject = $this->‪setUpSubject();
919  $redis = $this->‪setUpRedis();
920  $identifier = ‪StringUtility::getUniqueId('identifier');
921  $subject->set($identifier . 'A', 'data', ['tag']);
922  $subject->set($identifier . 'B', 'data', ['tag']);
923  $redis->del('identData:' . $identifier . 'A');
924  $subject->collectGarbage();
925  $expectedResult = [false, true];
926  $resultA = $redis->exists('identTags:' . $identifier . 'A');
927  $resultB = $redis->exists('identTags:' . $identifier . 'B');
928  if (is_int($resultA)) {
929  // Since 3.1.4 of phpredis/phpredis the return types has been changed
930  $resultA = (bool)$resultA;
931  }
932  if (is_int($resultB)) {
933  // Since 3.1.4 of phpredis/phpredis the return types has been changed
934  $resultB = (bool)$resultB;
935  }
936  $actualResult = [
937  $resultA,
938  $resultB,
939  ];
940  self::assertSame($expectedResult, $actualResult);
941  }
942 
947  {
948  $subject = $this->‪setUpSubject();
949  $redis = $this->‪setUpRedis();
950  $identifier = ‪StringUtility::getUniqueId('identifier');
951  $subject->set($identifier . 'A', 'data', ['tag1', 'tag2']);
952  $subject->set($identifier . 'B', 'data', ['tag2']);
953  $redis->del('identData:' . $identifier . 'A');
954  $subject->collectGarbage();
955  $expectedResult = [
956  [],
957  [$identifier . 'B'],
958  ];
959  $actualResult = [
960  $redis->sMembers('tagIdents:tag1'),
961  $redis->sMembers('tagIdents:tag2'),
962  ];
963  self::assertSame($expectedResult, $actualResult);
964  }
965 }
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\$initializeDatabase
‪bool $initializeDatabase
Definition: RedisBackendTest.php:42
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setUpRedis
‪setUpRedis()
Definition: RedisBackendTest.php:85
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setOverwritesExistingEntryWithNewDefaultLifetime
‪setOverwritesExistingEntryWithNewDefaultLifetime()
Definition: RedisBackendTest.php:329
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\findIdentifiersByTagReturnsAllIdentifiersTagedWithSpecifiedTag
‪findIdentifiersByTagReturnsAllIdentifiersTagedWithSpecifiedTag()
Definition: RedisBackendTest.php:722
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\getReturnsPreviouslySetEntry
‪getReturnsPreviouslySetEntry()
Definition: RedisBackendTest.php:593
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\removeReturnsTrueIfAnEntryWasDeleted
‪removeReturnsTrueIfAnEntryWasDeleted()
Definition: RedisBackendTest.php:627
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setSavesEntryWithUnlimitedLifeTime
‪setSavesEntryWithUnlimitedLifeTime()
Definition: RedisBackendTest.php:285
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setDatabaseThrowsExceptionIfGivenDatabaseNumberIsNotAnInteger
‪setDatabaseThrowsExceptionIfGivenDatabaseNumberIsNotAnInteger()
Definition: RedisBackendTest.php:101
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend
Definition: MemcachedBackendTest.php:18
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\collectGarbageRemovesExpiredIdentifierFromTagsToIdentifierSet
‪collectGarbageRemovesExpiredIdentifierFromTagsToIdentifierSet()
Definition: RedisBackendTest.php:944
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setSavesEntryWithSpecifiedLifeTime
‪setSavesEntryWithSpecifiedLifeTime()
Definition: RedisBackendTest.php:271
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setCompressionLevelThrowsExceptionIfCompressionLevelIsNotBetweenMinusOneAndNine
‪setCompressionLevelThrowsExceptionIfCompressionLevelIsNotBetweenMinusOneAndNine()
Definition: RedisBackendTest.php:145
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\removeReturnsFalseIfNoEntryWasDeleted
‪removeReturnsFalseIfNoEntryWasDeleted()
Definition: RedisBackendTest.php:618
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setStoresEntriesInSelectedDatabase
‪setStoresEntriesInSelectedDatabase()
Definition: RedisBackendTest.php:226
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\collectGarbageRemovesLeftOverIdentifierToTagsSet
‪collectGarbageRemovesLeftOverIdentifierToTagsSet()
Definition: RedisBackendTest.php:914
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\getReturnsPreviouslyCompressedSetEntry
‪getReturnsPreviouslyCompressedSetEntry()
Definition: RedisBackendTest.php:578
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setDatabaseThrowsExceptionIfGivenDatabaseNumberIsNegative
‪setDatabaseThrowsExceptionIfGivenDatabaseNumberIsNegative()
Definition: RedisBackendTest.php:112
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setOverwritesExistingEntryWithSpecifiedLifetime
‪setOverwritesExistingEntryWithSpecifiedLifetime()
Definition: RedisBackendTest.php:313
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setOverwritesExistingEntryWithNewData
‪setOverwritesExistingEntryWithNewData()
Definition: RedisBackendTest.php:298
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\flushByTagRemovesTemporarySet
‪flushByTagRemovesTemporarySet()
Definition: RedisBackendTest.php:810
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\removeDeletesIdentifierFromTagToIdentifiersSetWithMultipleEntries
‪removeDeletesIdentifierFromTagToIdentifiersSetWithMultipleEntries()
Definition: RedisBackendTest.php:684
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\flushByTagRemovesTagToIdentifiersSetOfGivenTag
‪flushByTagRemovesTagToIdentifiersSetOfGivenTag()
Definition: RedisBackendTest.php:860
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setThrowsExceptionIfIdentifierIsNotAString
‪setThrowsExceptionIfIdentifierIsNotAString()
Definition: RedisBackendTest.php:178
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\hasThrowsExceptionIfIdentifierIsNotAString
‪hasThrowsExceptionIfIdentifierIsNotAString()
Definition: RedisBackendTest.php:533
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setSavesIdentifierInTagToIdentifiersSetOfSpecifiedTag
‪setSavesIdentifierInTagToIdentifiersSetOfSpecifiedTag()
Definition: RedisBackendTest.php:434
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\flushByTagDoesNotRemoveIdentifierToTagsSetOfUnrelatedEntry
‪flushByTagDoesNotRemoveIdentifierToTagsSetOfUnrelatedEntry()
Definition: RedisBackendTest.php:843
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setUpSubject
‪setUpSubject(array $backendOptions=[])
Definition: RedisBackendTest.php:62
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\collectGarbageDoesNotRemoveNotExpiredIdentifierToDataEntry
‪collectGarbageDoesNotRemoveNotExpiredIdentifierToDataEntry()
Definition: RedisBackendTest.php:894
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setCompressionThrowsExceptionIfCompressionParameterIsNotOfTypeBoolean
‪setCompressionThrowsExceptionIfCompressionParameterIsNotOfTypeBoolean()
Definition: RedisBackendTest.php:123
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setAppendsSecondIdentifierInTagToIdentifiersEntry
‪setAppendsSecondIdentifierInTagToIdentifiersEntry()
Definition: RedisBackendTest.php:448
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\removeDeletesEntryFromCache
‪removeDeletesEntryFromCache()
Definition: RedisBackendTest.php:638
‪TYPO3\CMS\Core\Cache\Backend\RedisBackend
Definition: RedisBackend.php:31
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setSavesSetDataTypeForIdentifierToTagsSet
‪setSavesSetDataTypeForIdentifierToTagsSet()
Definition: RedisBackendTest.php:363
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\hasReturnsFalseForNotExistingEntry
‪hasReturnsFalseForNotExistingEntry()
Definition: RedisBackendTest.php:545
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\hasReturnsTrueForPreviouslySetEntry
‪hasReturnsTrueForPreviouslySetEntry()
Definition: RedisBackendTest.php:555
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\flushByTagsRemovesEntriesTaggedWithSpecifiedTags
‪flushByTagsRemovesEntriesTaggedWithSpecifiedTags()
Definition: RedisBackendTest.php:788
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\removeDeletesIdentifierFromTagToIdentifiersSet
‪removeDeletesIdentifierFromTagToIdentifiersSet()
Definition: RedisBackendTest.php:669
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setOverwritesExistingEntryWithNewUnlimitedLifetime
‪setOverwritesExistingEntryWithNewUnlimitedLifetime()
Definition: RedisBackendTest.php:347
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setRemovesIdentifierFromTagToIdentifiersEntryIfTagIsOmittedOnConsecutiveSet
‪setRemovesIdentifierFromTagToIdentifiersEntryIfTagIsOmittedOnConsecutiveSet()
Definition: RedisBackendTest.php:467
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\flushByTagThrowsExceptionIfTagIsNotAString
‪flushByTagThrowsExceptionIfTagIsNotAString()
Definition: RedisBackendTest.php:756
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setSavesStringDataTypeForIdentifierToDataEntry
‪setSavesStringDataTypeForIdentifierToDataEntry()
Definition: RedisBackendTest.php:244
‪TYPO3\CMS\Core\Cache\Exception\InvalidDataException
Definition: InvalidDataException.php:23
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setSavesPlaintextDataWithEnabledCompressionAndCompressionLevel0
‪setSavesPlaintextDataWithEnabledCompressionAndCompressionLevel0()
Definition: RedisBackendTest.php:517
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setRemovesAllPreviouslySetTagsFromIdentifierToTagsSet
‪setRemovesAllPreviouslySetTagsFromIdentifierToTagsSet()
Definition: RedisBackendTest.php:390
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setSavesSetDataTypeForTagToIdentifiersSet
‪setSavesSetDataTypeForTagToIdentifiersSet()
Definition: RedisBackendTest.php:421
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setThrowsExceptionIfLifetimeIsNegative
‪setThrowsExceptionIfLifetimeIsNegative()
Definition: RedisBackendTest.php:202
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\flushByTagRemovesIdentifierToTagsSetOfEntryTaggedWithGivenTag
‪flushByTagRemovesIdentifierToTagsSetOfEntryTaggedWithGivenTag()
Definition: RedisBackendTest.php:824
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\flushByTagRemovesEntriesTaggedWithSpecifiedTag
‪flushByTagRemovesEntriesTaggedWithSpecifiedTag()
Definition: RedisBackendTest.php:768
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\removeDeletesIdentifierToTagEntry
‪removeDeletesIdentifierToTagEntry()
Definition: RedisBackendTest.php:650
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setSavesEntryWithDefaultLifeTime
‪setSavesEntryWithDefaultLifeTime()
Definition: RedisBackendTest.php:256
‪TYPO3\CMS\Core\Cache\Frontend\FrontendInterface
Definition: FrontendInterface.php:22
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setUp
‪setUp()
Definition: RedisBackendTest.php:47
‪TYPO3\CMS\Core\Utility\StringUtility\getUniqueId
‪static string getUniqueId($prefix='')
Definition: StringUtility.php:128
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setThrowsExceptionIfDataIsNotAString
‪setThrowsExceptionIfDataIsNotAString()
Definition: RedisBackendTest.php:190
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\flushRemovesAllEntriesFromCache
‪flushRemovesAllEntriesFromCache()
Definition: RedisBackendTest.php:743
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\findIdentifiersByTagReturnsEmptyArrayForNotExistingTag
‪findIdentifiersByTagReturnsEmptyArrayForNotExistingTag()
Definition: RedisBackendTest.php:713
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\removeThrowsExceptionIfIdentifierIsNotAString
‪removeThrowsExceptionIfIdentifierIsNotAString()
Definition: RedisBackendTest.php:606
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\getThrowsExceptionIfIdentifierIsNotAString
‪getThrowsExceptionIfIdentifierIsNotAString()
Definition: RedisBackendTest.php:566
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setRemovesMultiplePreviouslySetTagsFromIdentifierToTagsSet
‪setRemovesMultiplePreviouslySetTagsFromIdentifierToTagsSet()
Definition: RedisBackendTest.php:404
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setSavesSpecifiedTagsInIdentifierToTagsSet
‪setSavesSpecifiedTagsInIdentifierToTagsSet()
Definition: RedisBackendTest.php:375
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setCompressionLevelThrowsExceptionIfCompressionLevelIsNotInteger
‪setCompressionLevelThrowsExceptionIfCompressionLevelIsNotInteger()
Definition: RedisBackendTest.php:134
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setAddsIdentifierInTagToIdentifiersEntryIfTagIsAddedOnConsecutiveSet
‪setAddsIdentifierInTagToIdentifiersEntryIfTagIsAddedOnConsecutiveSet()
Definition: RedisBackendTest.php:482
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest
Definition: RedisBackendTest.php:38
‪TYPO3\CMS\Core\Utility\StringUtility
Definition: StringUtility.php:22
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setConnectionTimeoutThrowsExceptionIfConnectionTimeoutIsNotInteger
‪setConnectionTimeoutThrowsExceptionIfConnectionTimeoutIsNotInteger()
Definition: RedisBackendTest.php:156
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\flushByTagRemovesIdentifiersTaggedWithGivenTagFromTagToIdentifiersSets
‪flushByTagRemovesIdentifiersTaggedWithGivenTagFromTagToIdentifiersSets()
Definition: RedisBackendTest.php:879
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setSavesCompressedDataWithEnabledCompression
‪setSavesCompressedDataWithEnabledCompression()
Definition: RedisBackendTest.php:497
‪TYPO3\CMS\Core\Cache\Exception
Definition: Exception.php:21
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setConnectionTimeoutThrowsExceptionIfConnectionTimeoutIsNegative
‪setConnectionTimeoutThrowsExceptionIfConnectionTimeoutIsNegative()
Definition: RedisBackendTest.php:167
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setThrowsExceptionIfLifetimeIsNotNullOrAnInteger
‪setThrowsExceptionIfLifetimeIsNotNullOrAnInteger()
Definition: RedisBackendTest.php:214
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\findIdentifiersByTagThrowsExceptionIfTagIsNotAString
‪findIdentifiersByTagThrowsExceptionIfTagIsNotAString()
Definition: RedisBackendTest.php:701