‪TYPO3CMS  ‪main
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 PHPUnit\Framework\Attributes\RequiresPhpExtension;
21 use PHPUnit\Framework\Attributes\Test;
22 use Psr\Log\LoggerInterface;
27 use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
28 
29 #[RequiresPhpExtension('redis')]
30 final class ‪RedisBackendTest extends FunctionalTestCase
31 {
32  protected bool ‪$initializeDatabase = false;
33 
34  protected function ‪setUp(): void
35  {
36  if (!getenv('typo3TestingRedisHost')) {
37  self::markTestSkipped('environment variable "typo3TestingRedisHost" must be set to run this test');
38  }
39  // Note we assume that if typo3TestingRedisHost env is set, we can use that for testing,
40  // there is no test to see if the daemon is actually up and running. Tests will fail if env
41  // is set but daemon is down.
42  parent::setUp();
43  }
44 
45  protected function ‪setUpSubject(array $backendOptions = []): ‪RedisBackend
46  {
47  // We know this env is set, otherwise setUp() would skip the tests
48  $backendOptions['hostname'] = getenv('typo3TestingRedisHost');
49  // If typo3TestingRedisPort env is set, use it, otherwise fall back to standard port
50  $env = getenv('typo3TestingRedisPort');
51  $backendOptions['port'] = is_string($env) ? (int)$env : 6379;
52 
53  $frontendMock = $this->createMock(FrontendInterface::class);
54  $frontendMock->method('getIdentifier')->willReturn('pages');
55 
56  ‪$GLOBALS['TYPO3_CONF_VARS']['LOG'] = 'only needed for logger initialisation';
57  $subject = new ‪RedisBackend('Testing', $backendOptions);
58  $subject->setLogger($this->createMock(LoggerInterface::class));
59  $subject->setCache($frontendMock);
60  $subject->initializeObject();
61  $subject->flush();
62  return $subject;
63  }
64 
65  private function ‪setUpRedis(): \Redis
66  {
67  // We know this env is set, otherwise setUp() would skip the tests
68  $redisHost = getenv('typo3TestingRedisHost');
69  // If typo3TestingRedisPort env is set, use it, otherwise fall back to standard port
70  $env = getenv('typo3TestingRedisPort');
71  $redisPort = is_string($env) ? (int)$env : 6379;
72  $redis = new \Redis();
73  $redis->connect($redisHost, $redisPort);
74  return $redis;
75  }
76 
77  #[Test]
79  {
80  $this->expectException(\InvalidArgumentException::class);
81  $this->expectExceptionCode(1279763057);
82  $this->‪setUpSubject(['database' => 'foo']);
83  }
84 
85  #[Test]
87  {
88  $this->expectException(\InvalidArgumentException::class);
89  $this->expectExceptionCode(1279763534);
90  $this->‪setUpSubject(['database' => -1]);
91  }
92 
93  #[Test]
95  {
96  $this->expectException(\InvalidArgumentException::class);
97  $this->expectExceptionCode(1289679153);
98  $this->‪setUpSubject(['compression' => 'foo']);
99  }
100 
101  #[Test]
103  {
104  $this->expectException(\InvalidArgumentException::class);
105  $this->expectExceptionCode(1289679154);
106  $this->‪setUpSubject(['compressionLevel' => 'foo']);
107  }
108 
109  #[Test]
111  {
112  $this->expectException(\InvalidArgumentException::class);
113  $this->expectExceptionCode(1289679155);
114  $this->‪setUpSubject(['compressionLevel' => 11]);
115  }
116 
117  #[Test]
119  {
120  $this->expectException(\InvalidArgumentException::class);
121  $this->expectExceptionCode(1487849315);
122  $this->‪setUpSubject(['connectionTimeout' => 'foo']);
123  }
124 
125  #[Test]
127  {
128  $this->expectException(\InvalidArgumentException::class);
129  $this->expectExceptionCode(1487849326);
130  $this->‪setUpSubject(['connectionTimeout' => -1]);
131  }
132 
133  #[Test]
135  {
136  $this->expectException(\InvalidArgumentException::class);
137  $this->expectExceptionCode(1377006651);
138  $subject = $this->‪setUpSubject();
139  $subject->set([], 'data');
140  }
141 
142  #[Test]
144  {
145  $this->expectException(InvalidDataException::class);
146  $this->expectExceptionCode(1279469941);
147  $subject = $this->‪setUpSubject();
148  $subject->set(‪StringUtility::getUniqueId('identifier'), []);
149  }
150 
151  #[Test]
153  {
154  $this->expectException(\InvalidArgumentException::class);
155  $this->expectExceptionCode(1279487573);
156  $subject = $this->‪setUpSubject();
157  $subject->set(‪StringUtility::getUniqueId('identifier'), 'data', [], -42);
158  }
159 
160  #[Test]
162  {
163  $this->expectException(\InvalidArgumentException::class);
164  $this->expectExceptionCode(1279488008);
165  $subject = $this->‪setUpSubject();
166  $subject->set(‪StringUtility::getUniqueId('identifier'), 'data', [], []);
167  }
168 
169  #[Test]
171  {
172  $redis = $this->‪setUpRedis();
173  $redis->select(1);
174  $subject = $this->‪setUpSubject(['database' => 1]);
176  $subject->set(‪$identifier, 'data');
177  $result = $redis->exists('identData:' . ‪$identifier);
178  if (is_int($result)) {
179  // Since 3.1.4 of phpredis/phpredis the return types has been changed
180  $result = (bool)$result;
181  }
182  self::assertTrue($result);
183  }
184 
185  #[Test]
187  {
188  $subject = $this->‪setUpSubject();
189  $redis = $this->‪setUpRedis();
191  $subject->set(‪$identifier, 'data');
192  self::assertSame(\Redis::REDIS_STRING, $redis->type('identData:' . ‪$identifier));
193  }
194 
195  #[Test]
196  public function ‪setSavesEntryWithDefaultLifeTime(): void
197  {
198  $subject = $this->‪setUpSubject();
199  $redis = $this->‪setUpRedis();
201  $defaultLifetime = 42;
202  $subject->setDefaultLifetime($defaultLifetime);
203  $subject->set(‪$identifier, 'data');
204  $lifetimeRegisteredInBackend = $redis->ttl('identData:' . ‪$identifier);
205  self::assertSame($defaultLifetime, $lifetimeRegisteredInBackend);
206  }
207 
208  #[Test]
210  {
211  $subject = $this->‪setUpSubject();
212  $redis = $this->‪setUpRedis();
214  $lifetime = 43;
215  $subject->set(‪$identifier, 'data', [], $lifetime);
216  $lifetimeRegisteredInBackend = $redis->ttl('identData:' . ‪$identifier);
217  self::assertSame($lifetime, $lifetimeRegisteredInBackend);
218  }
219 
220  #[Test]
222  {
223  $subject = $this->‪setUpSubject();
224  $redis = $this->‪setUpRedis();
226  $subject->set(‪$identifier, 'data', [], 0);
227  $lifetimeRegisteredInBackend = $redis->ttl('identData:' . ‪$identifier);
228  self::assertSame(31536000, $lifetimeRegisteredInBackend);
229  }
230 
231  #[Test]
233  {
234  $subject = $this->‪setUpSubject();
235  $data = 'data 1';
237  $subject->set(‪$identifier, $data);
238  $otherData = 'data 2';
239  $subject->set(‪$identifier, $otherData);
240  $fetchedData = $subject->get(‪$identifier);
241  self::assertSame($otherData, $fetchedData);
242  }
243 
244  #[Test]
246  {
247  $subject = $this->‪setUpSubject();
248  $redis = $this->‪setUpRedis();
249  $data = 'data';
251  $subject->set(‪$identifier, $data);
252  $lifetime = 42;
253  $subject->set(‪$identifier, $data, [], $lifetime);
254  $lifetimeRegisteredInBackend = $redis->ttl('identData:' . ‪$identifier);
255  self::assertSame($lifetime, $lifetimeRegisteredInBackend);
256  }
257 
258  #[Test]
260  {
261  $subject = $this->‪setUpSubject();
262  $redis = $this->‪setUpRedis();
263  $data = 'data';
265  $lifetime = 42;
266  $subject->set(‪$identifier, $data, [], $lifetime);
267  $newDefaultLifetime = 43;
268  $subject->setDefaultLifetime($newDefaultLifetime);
269  $subject->set(‪$identifier, $data, [], $newDefaultLifetime);
270  $lifetimeRegisteredInBackend = $redis->ttl('identData:' . ‪$identifier);
271  self::assertSame($newDefaultLifetime, $lifetimeRegisteredInBackend);
272  }
273 
274  #[Test]
276  {
277  $subject = $this->‪setUpSubject();
278  $redis = $this->‪setUpRedis();
279  $data = 'data';
281  $lifetime = 42;
282  $subject->set(‪$identifier, $data, [], $lifetime);
283  $subject->set(‪$identifier, $data, [], 0);
284  $lifetimeRegisteredInBackend = $redis->ttl('identData:' . ‪$identifier);
285  self::assertSame(31536000, $lifetimeRegisteredInBackend);
286  }
287 
288  #[Test]
290  {
291  $subject = $this->‪setUpSubject();
292  $redis = $this->‪setUpRedis();
294  $subject->set(‪$identifier, 'data', ['tag']);
295  self::assertSame(\Redis::REDIS_SET, $redis->type('identTags:' . ‪$identifier));
296  }
297 
298  #[Test]
300  {
301  $subject = $this->‪setUpSubject();
302  $redis = $this->‪setUpRedis();
304  $tags = ['thatTag', 'thisTag'];
305  $subject->set(‪$identifier, 'data', $tags);
306  $savedTags = $redis->sMembers('identTags:' . ‪$identifier);
307  sort($savedTags);
308  self::assertSame($tags, $savedTags);
309  }
310 
311  #[Test]
313  {
314  $subject = $this->‪setUpSubject();
315  $redis = $this->‪setUpRedis();
317  $tags = ['fooTag', 'barTag'];
318  $subject->set(‪$identifier, 'data', $tags);
319  $subject->set(‪$identifier, 'data', []);
320  self::assertSame([], $redis->sMembers('identTags:' . ‪$identifier));
321  }
322 
323  #[Test]
325  {
326  $subject = $this->‪setUpSubject();
327  $redis = $this->‪setUpRedis();
329  $firstTagSet = ['tag1', 'tag2', 'tag3', 'tag4'];
330  $subject->set(‪$identifier, 'data', $firstTagSet);
331  $secondTagSet = ['tag1', 'tag3'];
332  $subject->set(‪$identifier, 'data', $secondTagSet);
333  $actualTagSet = $redis->sMembers('identTags:' . ‪$identifier);
334  sort($actualTagSet);
335  self::assertSame($secondTagSet, $actualTagSet);
336  }
337 
338  #[Test]
340  {
341  $subject = $this->‪setUpSubject();
342  $redis = $this->‪setUpRedis();
344  $tag = 'tag';
345  $subject->set(‪$identifier, 'data', [$tag]);
346  self::assertSame(\Redis::REDIS_SET, $redis->type('tagIdents:' . $tag));
347  }
348 
349  #[Test]
351  {
352  $subject = $this->‪setUpSubject();
353  $redis = $this->‪setUpRedis();
355  $tag = 'thisTag';
356  $subject->set(‪$identifier, 'data', [$tag]);
357  $savedTagToIdentifiersMemberArray = $redis->sMembers('tagIdents:' . $tag);
358  self::assertSame([‪$identifier], $savedTagToIdentifiersMemberArray);
359  }
360 
361  #[Test]
363  {
364  $subject = $this->‪setUpSubject();
365  $redis = $this->‪setUpRedis();
366  $firstIdentifier = ‪StringUtility::getUniqueId('identifier1-');
367  $tag = 'thisTag';
368  $subject->set($firstIdentifier, 'data', [$tag]);
369  $secondIdentifier = ‪StringUtility::getUniqueId('identifier2-');
370  $subject->set($secondIdentifier, 'data', [$tag]);
371  $savedTagToIdentifiersMemberArray = $redis->sMembers('tagIdents:' . $tag);
372  sort($savedTagToIdentifiersMemberArray);
373  $identifierArray = [$firstIdentifier, $secondIdentifier];
374  sort($identifierArray);
375  self::assertSame([$firstIdentifier, $secondIdentifier], $savedTagToIdentifiersMemberArray);
376  }
377 
378  #[Test]
380  {
381  $subject = $this->‪setUpSubject();
382  $redis = $this->‪setUpRedis();
384  $tag = 'thisTag';
385  $subject->set(‪$identifier, 'data', [$tag]);
386  $subject->set(‪$identifier, 'data', []);
387  $savedTagToIdentifiersMemberArray = $redis->sMembers('tagIdents:' . $tag);
388  self::assertSame([], $savedTagToIdentifiersMemberArray);
389  }
390 
391  #[Test]
393  {
394  $subject = $this->‪setUpSubject();
395  $redis = $this->‪setUpRedis();
397  $subject->set(‪$identifier, 'data');
398  $tag = 'thisTag';
399  $subject->set(‪$identifier, 'data', [$tag]);
400  $savedTagToIdentifiersMemberArray = $redis->sMembers('tagIdents:' . $tag);
401  self::assertSame([‪$identifier], $savedTagToIdentifiersMemberArray);
402  }
403 
404  #[Test]
406  {
407  $subject = $this->‪setUpSubject([
408  'compression' => true,
409  ]);
410  $redis = $this->‪setUpRedis();
412  $data = 'some data ' . microtime();
413  $subject->set(‪$identifier, $data);
414  $uncompressedStoredData = '';
415  try {
416  $uncompressedStoredData = @gzuncompress($redis->get('identData:' . ‪$identifier));
417  } catch (\‪Exception $e) {
418  }
419  self::assertEquals($data, $uncompressedStoredData, 'Original and compressed data don\'t match');
420  }
421 
422  #[Test]
424  {
425  $subject = $this->‪setUpSubject([
426  'compression' => true,
427  'compressionLevel' => 0,
428  ]);
429  $redis = $this->‪setUpRedis();
431  $data = 'some data ' . microtime();
432  $subject->set(‪$identifier, $data);
433  self::assertGreaterThan(0, substr_count($redis->get('identData:' . ‪$identifier), $data), 'Plaintext data not found');
434  }
435 
436  #[Test]
438  {
439  $this->expectException(\InvalidArgumentException::class);
440  $this->expectExceptionCode(1377006653);
441 
442  $subject = $this->‪setUpSubject();
443  $subject->has([]);
444  }
445 
446  #[Test]
448  {
449  $subject = $this->‪setUpSubject();
451  self::assertFalse($subject->has(‪$identifier));
452  }
453 
454  #[Test]
456  {
457  $subject = $this->‪setUpSubject();
459  $subject->set(‪$identifier, 'data');
460  self::assertTrue($subject->has(‪$identifier));
461  }
462 
463  #[Test]
465  {
466  $this->expectException(\InvalidArgumentException::class);
467  // @todo Add exception code with redis extension
468 
469  $subject = $this->‪setUpSubject();
470  $subject->get([]);
471  }
472 
473  #[Test]
475  {
476  $subject = $this->‪setUpSubject([
477  'compression' => true,
478  ]);
479  $data = 'data';
481  $subject->set(‪$identifier, $data);
482  $fetchedData = $subject->get(‪$identifier);
483  self::assertSame($data, $fetchedData);
484  }
485 
486  #[Test]
487  public function ‪getReturnsPreviouslySetEntry(): void
488  {
489  $subject = $this->‪setUpSubject();
490  $data = 'data';
492  $subject->set(‪$identifier, $data);
493  $fetchedData = $subject->get(‪$identifier);
494  self::assertSame($data, $fetchedData);
495  }
496 
497  #[Test]
499  {
500  $this->expectException(\InvalidArgumentException::class);
501  $this->expectExceptionCode(1377006654);
502 
503  $subject = $this->‪setUpSubject();
504  $subject->remove([]);
505  }
506 
507  #[Test]
509  {
510  $subject = $this->‪setUpSubject();
511  self::assertFalse($subject->remove(‪StringUtility::getUniqueId('identifier')));
512  }
513 
514  #[Test]
516  {
517  $subject = $this->‪setUpSubject();
519  $subject->set(‪$identifier, 'data');
520  self::assertTrue($subject->remove(‪$identifier));
521  }
522 
523  #[Test]
524  public function ‪removeDeletesEntryFromCache(): void
525  {
526  $subject = $this->‪setUpSubject();
528  $subject->set(‪$identifier, 'data');
529  $subject->remove(‪$identifier);
530  self::assertFalse($subject->has(‪$identifier));
531  }
532 
533  #[Test]
534  public function ‪removeDeletesIdentifierToTagEntry(): void
535  {
536  $subject = $this->‪setUpSubject();
537  $redis = $this->‪setUpRedis();
539  $tag = 'thisTag';
540  $subject->set(‪$identifier, 'data', [$tag]);
541  $subject->remove(‪$identifier);
542  $result = $redis->exists('identTags:' . ‪$identifier);
543  if (is_int($result)) {
544  // Since 3.1.4 of phpredis/phpredis the return types has been changed
545  $result = (bool)$result;
546  }
547  self::assertFalse($result);
548  }
549 
550  #[Test]
552  {
553  $subject = $this->‪setUpSubject();
554  $redis = $this->‪setUpRedis();
556  $tag = 'thisTag';
557  $subject->set(‪$identifier, 'data', [$tag]);
558  $subject->remove(‪$identifier);
559  $tagToIdentifiersMemberArray = $redis->sMembers('tagIdents:' . $tag);
560  self::assertSame([], $tagToIdentifiersMemberArray);
561  }
562 
563  #[Test]
565  {
566  $subject = $this->‪setUpSubject();
567  $redis = $this->‪setUpRedis();
568  $firstIdentifier = ‪StringUtility::getUniqueId('identifier');
569  $secondIdentifier = ‪StringUtility::getUniqueId('identifier');
570  $tag = 'thisTag';
571  $subject->set($firstIdentifier, 'data', [$tag]);
572  $subject->set($secondIdentifier, 'data', [$tag]);
573  $subject->remove($firstIdentifier);
574  $tagToIdentifiersMemberArray = $redis->sMembers('tagIdents:' . $tag);
575  self::assertSame([$secondIdentifier], $tagToIdentifiersMemberArray);
576  }
577 
578  #[Test]
580  {
581  $this->expectException(\InvalidArgumentException::class);
582  $this->expectExceptionCode(1377006655);
583 
584  $subject = $this->‪setUpSubject();
585  $subject->findIdentifiersByTag([]);
586  }
587 
588  #[Test]
590  {
591  $subject = $this->‪setUpSubject();
592  self::assertSame([], $subject->findIdentifiersByTag('thisTag'));
593  }
594 
595  #[Test]
597  {
598  $subject = $this->‪setUpSubject();
599  $firstIdentifier = ‪StringUtility::getUniqueId('identifier1-');
600  $secondIdentifier = ‪StringUtility::getUniqueId('identifier2-');
601  $thirdIdentifier = ‪StringUtility::getUniqueId('identifier3-');
602  $tagsForFirstIdentifier = ['thisTag'];
603  $tagsForSecondIdentifier = ['thatTag'];
604  $tagsForThirdIdentifier = ['thisTag', 'thatTag'];
605  $subject->set($firstIdentifier, 'data', $tagsForFirstIdentifier);
606  $subject->set($secondIdentifier, 'data', $tagsForSecondIdentifier);
607  $subject->set($thirdIdentifier, 'data', $tagsForThirdIdentifier);
608  $expectedResult = [$firstIdentifier, $thirdIdentifier];
609  $actualResult = $subject->findIdentifiersByTag('thisTag');
610  sort($actualResult);
611  self::assertSame($expectedResult, $actualResult);
612  }
613 
614  #[Test]
615  public function ‪flushRemovesAllEntriesFromCache(): void
616  {
617  $subject = $this->‪setUpSubject();
618  $redis = $this->‪setUpRedis();
620  $subject->set(‪$identifier, 'data');
621  $subject->flush();
622  self::assertSame([], $redis->keys('*'));
623  }
624 
625  #[Test]
627  {
628  $this->expectException(\InvalidArgumentException::class);
629  $this->expectExceptionCode(1377006656);
630 
631  $subject = $this->‪setUpSubject();
632  $subject->flushByTag([]);
633  }
634 
635  #[Test]
637  {
638  $subject = $this->‪setUpSubject();
640  $subject->set(‪$identifier . 'A', 'data', ['tag1']);
641  $subject->set(‪$identifier . 'B', 'data', ['tag2']);
642  $subject->set(‪$identifier . 'C', 'data', ['tag1', 'tag2']);
643  $subject->flushByTag('tag1');
644  $expectedResult = [false, true, false];
645  $actualResult = [
646  $subject->has(‪$identifier . 'A'),
647  $subject->has(‪$identifier . 'B'),
648  $subject->has(‪$identifier . 'C'),
649  ];
650  self::assertSame($expectedResult, $actualResult);
651  }
652 
653  #[Test]
655  {
656  $subject = $this->‪setUpSubject();
658  $subject->set(‪$identifier . 'A', 'data', ['tag1']);
659  $subject->set(‪$identifier . 'B', 'data', ['tag2']);
660  $subject->set(‪$identifier . 'C', 'data', ['tag1', 'tag2']);
661  $subject->set(‪$identifier . 'D', 'data', ['tag3']);
662  $subject->flushByTags(['tag1', 'tag2']);
663  $expectedResult = [false, false, false, true];
664  $actualResult = [
665  $subject->has(‪$identifier . 'A'),
666  $subject->has(‪$identifier . 'B'),
667  $subject->has(‪$identifier . 'C'),
668  $subject->has(‪$identifier . 'D'),
669  ];
670  self::assertSame($expectedResult, $actualResult);
671  }
672 
673  #[Test]
674  public function ‪flushByTagRemovesTemporarySet(): void
675  {
676  $subject = $this->‪setUpSubject();
677  $redis = $this->‪setUpRedis();
679  $subject->set(‪$identifier . 'A', 'data', ['tag1']);
680  $subject->set(‪$identifier . 'C', 'data', ['tag1', 'tag2']);
681  $subject->flushByTag('tag1');
682  self::assertSame([], $redis->keys('temp*'));
683  }
684 
685  #[Test]
687  {
688  $subject = $this->‪setUpSubject();
689  $redis = $this->‪setUpRedis();
691  $tag = 'tag1';
692  $subject->set(‪$identifier, 'data', [$tag]);
693  $subject->flushByTag($tag);
694  $result = $redis->exists('identTags:' . ‪$identifier);
695  if (is_int($result)) {
696  // Since 3.1.4 of phpredis/phpredis the return types has been changed
697  $result = (bool)$result;
698  }
699  self::assertFalse($result);
700  }
701 
702  #[Test]
704  {
705  $subject = $this->‪setUpSubject();
706  $redis = $this->‪setUpRedis();
707  $identifierToBeRemoved = ‪StringUtility::getUniqueId('identifier');
708  $tagToRemove = 'tag1';
709  $subject->set($identifierToBeRemoved, 'data', [$tagToRemove]);
710  $identifierNotToBeRemoved = ‪StringUtility::getUniqueId('identifier');
711  $tagNotToRemove = 'tag2';
712  $subject->set($identifierNotToBeRemoved, 'data', [$tagNotToRemove]);
713  $subject->flushByTag($tagToRemove);
714  self::assertSame([$tagNotToRemove], $redis->sMembers('identTags:' . $identifierNotToBeRemoved));
715  }
716 
717  #[Test]
719  {
720  $subject = $this->‪setUpSubject();
721  $redis = $this->‪setUpRedis();
723  $tag = 'tag1';
724  $subject->set(‪$identifier, 'data', [$tag]);
725  $subject->flushByTag($tag);
726  $result = $redis->exists('tagIdents:' . $tag);
727  if (is_int($result)) {
728  // Since 3.1.4 of phpredis/phpredis the return types has been changed
729  $result = (bool)$result;
730  }
731  self::assertFalse($result);
732  }
733 
734  #[Test]
736  {
737  $subject = $this->‪setUpSubject();
738  $redis = $this->‪setUpRedis();
740  $subject->set(‪$identifier . 'A', 'data', ['tag1', 'tag2']);
741  $subject->set(‪$identifier . 'B', 'data', ['tag1', 'tag2']);
742  $subject->set(‪$identifier . 'C', 'data', ['tag2']);
743  $subject->flushByTag('tag1');
744  self::assertSame([‪$identifier . 'C'], $redis->sMembers('tagIdents:tag2'));
745  }
746 
747  #[Test]
749  {
750  $subject = $this->‪setUpSubject();
751  $redis = $this->‪setUpRedis();
753  $subject->set(‪$identifier . 'A', 'data', ['tag']);
754  $subject->set(‪$identifier . 'B', 'data', ['tag']);
755  $redis->del('identData:' . ‪$identifier . 'A');
756  $subject->collectGarbage();
757  $result = $redis->exists('identData:' . ‪$identifier . 'B');
758  if (is_int($result)) {
759  // Since 3.1.4 of phpredis/phpredis the return types has been changed
760  $result = (bool)$result;
761  }
762  self::assertTrue($result);
763  }
764 
765  #[Test]
767  {
768  $subject = $this->‪setUpSubject();
769  $redis = $this->‪setUpRedis();
771  $subject->set(‪$identifier . 'A', 'data', ['tag']);
772  $subject->set(‪$identifier . 'B', 'data', ['tag']);
773  $redis->del('identData:' . ‪$identifier . 'A');
774  $subject->collectGarbage();
775  $expectedResult = [false, true];
776  $resultA = $redis->exists('identTags:' . ‪$identifier . 'A');
777  $resultB = $redis->exists('identTags:' . ‪$identifier . 'B');
778  if (is_int($resultA)) {
779  // Since 3.1.4 of phpredis/phpredis the return types has been changed
780  $resultA = (bool)$resultA;
781  }
782  if (is_int($resultB)) {
783  // Since 3.1.4 of phpredis/phpredis the return types has been changed
784  $resultB = (bool)$resultB;
785  }
786  $actualResult = [
787  $resultA,
788  $resultB,
789  ];
790  self::assertSame($expectedResult, $actualResult);
791  }
792 
793  #[Test]
795  {
796  $subject = $this->‪setUpSubject();
797  $redis = $this->‪setUpRedis();
799  $subject->set(‪$identifier . 'A', 'data', ['tag1', 'tag2']);
800  $subject->set(‪$identifier . 'B', 'data', ['tag2']);
801  $redis->del('identData:' . ‪$identifier . 'A');
802  $subject->collectGarbage();
803  $expectedResult = [
804  [],
805  [‪$identifier . 'B'],
806  ];
807  $actualResult = [
808  $redis->sMembers('tagIdents:tag1'),
809  $redis->sMembers('tagIdents:tag2'),
810  ];
811  self::assertSame($expectedResult, $actualResult);
812  }
813 }
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\$initializeDatabase
‪bool $initializeDatabase
Definition: RedisBackendTest.php:32
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setUpRedis
‪setUpRedis()
Definition: RedisBackendTest.php:65
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setOverwritesExistingEntryWithNewDefaultLifetime
‪setOverwritesExistingEntryWithNewDefaultLifetime()
Definition: RedisBackendTest.php:259
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\findIdentifiersByTagReturnsAllIdentifiersTagedWithSpecifiedTag
‪findIdentifiersByTagReturnsAllIdentifiersTagedWithSpecifiedTag()
Definition: RedisBackendTest.php:596
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\getReturnsPreviouslySetEntry
‪getReturnsPreviouslySetEntry()
Definition: RedisBackendTest.php:487
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\removeReturnsTrueIfAnEntryWasDeleted
‪removeReturnsTrueIfAnEntryWasDeleted()
Definition: RedisBackendTest.php:515
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setSavesEntryWithUnlimitedLifeTime
‪setSavesEntryWithUnlimitedLifeTime()
Definition: RedisBackendTest.php:221
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setDatabaseThrowsExceptionIfGivenDatabaseNumberIsNotAnInteger
‪setDatabaseThrowsExceptionIfGivenDatabaseNumberIsNotAnInteger()
Definition: RedisBackendTest.php:78
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend
Definition: ApcuBackendTest.php:18
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\collectGarbageRemovesExpiredIdentifierFromTagsToIdentifierSet
‪collectGarbageRemovesExpiredIdentifierFromTagsToIdentifierSet()
Definition: RedisBackendTest.php:794
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setSavesEntryWithSpecifiedLifeTime
‪setSavesEntryWithSpecifiedLifeTime()
Definition: RedisBackendTest.php:209
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setCompressionLevelThrowsExceptionIfCompressionLevelIsNotBetweenMinusOneAndNine
‪setCompressionLevelThrowsExceptionIfCompressionLevelIsNotBetweenMinusOneAndNine()
Definition: RedisBackendTest.php:110
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\removeReturnsFalseIfNoEntryWasDeleted
‪removeReturnsFalseIfNoEntryWasDeleted()
Definition: RedisBackendTest.php:508
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setStoresEntriesInSelectedDatabase
‪setStoresEntriesInSelectedDatabase()
Definition: RedisBackendTest.php:170
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\collectGarbageRemovesLeftOverIdentifierToTagsSet
‪collectGarbageRemovesLeftOverIdentifierToTagsSet()
Definition: RedisBackendTest.php:766
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\getReturnsPreviouslyCompressedSetEntry
‪getReturnsPreviouslyCompressedSetEntry()
Definition: RedisBackendTest.php:474
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setDatabaseThrowsExceptionIfGivenDatabaseNumberIsNegative
‪setDatabaseThrowsExceptionIfGivenDatabaseNumberIsNegative()
Definition: RedisBackendTest.php:86
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setOverwritesExistingEntryWithSpecifiedLifetime
‪setOverwritesExistingEntryWithSpecifiedLifetime()
Definition: RedisBackendTest.php:245
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setOverwritesExistingEntryWithNewData
‪setOverwritesExistingEntryWithNewData()
Definition: RedisBackendTest.php:232
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\flushByTagRemovesTemporarySet
‪flushByTagRemovesTemporarySet()
Definition: RedisBackendTest.php:674
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\removeDeletesIdentifierFromTagToIdentifiersSetWithMultipleEntries
‪removeDeletesIdentifierFromTagToIdentifiersSetWithMultipleEntries()
Definition: RedisBackendTest.php:564
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\flushByTagRemovesTagToIdentifiersSetOfGivenTag
‪flushByTagRemovesTagToIdentifiersSetOfGivenTag()
Definition: RedisBackendTest.php:718
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setThrowsExceptionIfIdentifierIsNotAString
‪setThrowsExceptionIfIdentifierIsNotAString()
Definition: RedisBackendTest.php:134
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\hasThrowsExceptionIfIdentifierIsNotAString
‪hasThrowsExceptionIfIdentifierIsNotAString()
Definition: RedisBackendTest.php:437
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setSavesIdentifierInTagToIdentifiersSetOfSpecifiedTag
‪setSavesIdentifierInTagToIdentifiersSetOfSpecifiedTag()
Definition: RedisBackendTest.php:350
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\flushByTagDoesNotRemoveIdentifierToTagsSetOfUnrelatedEntry
‪flushByTagDoesNotRemoveIdentifierToTagsSetOfUnrelatedEntry()
Definition: RedisBackendTest.php:703
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setUpSubject
‪setUpSubject(array $backendOptions=[])
Definition: RedisBackendTest.php:45
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\collectGarbageDoesNotRemoveNotExpiredIdentifierToDataEntry
‪collectGarbageDoesNotRemoveNotExpiredIdentifierToDataEntry()
Definition: RedisBackendTest.php:748
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setCompressionThrowsExceptionIfCompressionParameterIsNotOfTypeBoolean
‪setCompressionThrowsExceptionIfCompressionParameterIsNotOfTypeBoolean()
Definition: RedisBackendTest.php:94
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setAppendsSecondIdentifierInTagToIdentifiersEntry
‪setAppendsSecondIdentifierInTagToIdentifiersEntry()
Definition: RedisBackendTest.php:362
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\removeDeletesEntryFromCache
‪removeDeletesEntryFromCache()
Definition: RedisBackendTest.php:524
‪TYPO3\CMS\Core\Cache\Backend\RedisBackend
Definition: RedisBackend.php:31
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setSavesSetDataTypeForIdentifierToTagsSet
‪setSavesSetDataTypeForIdentifierToTagsSet()
Definition: RedisBackendTest.php:289
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\hasReturnsFalseForNotExistingEntry
‪hasReturnsFalseForNotExistingEntry()
Definition: RedisBackendTest.php:447
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\hasReturnsTrueForPreviouslySetEntry
‪hasReturnsTrueForPreviouslySetEntry()
Definition: RedisBackendTest.php:455
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\flushByTagsRemovesEntriesTaggedWithSpecifiedTags
‪flushByTagsRemovesEntriesTaggedWithSpecifiedTags()
Definition: RedisBackendTest.php:654
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\removeDeletesIdentifierFromTagToIdentifiersSet
‪removeDeletesIdentifierFromTagToIdentifiersSet()
Definition: RedisBackendTest.php:551
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setOverwritesExistingEntryWithNewUnlimitedLifetime
‪setOverwritesExistingEntryWithNewUnlimitedLifetime()
Definition: RedisBackendTest.php:275
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setRemovesIdentifierFromTagToIdentifiersEntryIfTagIsOmittedOnConsecutiveSet
‪setRemovesIdentifierFromTagToIdentifiersEntryIfTagIsOmittedOnConsecutiveSet()
Definition: RedisBackendTest.php:379
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\flushByTagThrowsExceptionIfTagIsNotAString
‪flushByTagThrowsExceptionIfTagIsNotAString()
Definition: RedisBackendTest.php:626
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setSavesStringDataTypeForIdentifierToDataEntry
‪setSavesStringDataTypeForIdentifierToDataEntry()
Definition: RedisBackendTest.php:186
‪TYPO3\CMS\Core\Cache\Exception\InvalidDataException
Definition: InvalidDataException.php:23
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setSavesPlaintextDataWithEnabledCompressionAndCompressionLevel0
‪setSavesPlaintextDataWithEnabledCompressionAndCompressionLevel0()
Definition: RedisBackendTest.php:423
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setRemovesAllPreviouslySetTagsFromIdentifierToTagsSet
‪setRemovesAllPreviouslySetTagsFromIdentifierToTagsSet()
Definition: RedisBackendTest.php:312
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setSavesSetDataTypeForTagToIdentifiersSet
‪setSavesSetDataTypeForTagToIdentifiersSet()
Definition: RedisBackendTest.php:339
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setThrowsExceptionIfLifetimeIsNegative
‪setThrowsExceptionIfLifetimeIsNegative()
Definition: RedisBackendTest.php:152
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\flushByTagRemovesIdentifierToTagsSetOfEntryTaggedWithGivenTag
‪flushByTagRemovesIdentifierToTagsSetOfEntryTaggedWithGivenTag()
Definition: RedisBackendTest.php:686
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\flushByTagRemovesEntriesTaggedWithSpecifiedTag
‪flushByTagRemovesEntriesTaggedWithSpecifiedTag()
Definition: RedisBackendTest.php:636
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\removeDeletesIdentifierToTagEntry
‪removeDeletesIdentifierToTagEntry()
Definition: RedisBackendTest.php:534
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setSavesEntryWithDefaultLifeTime
‪setSavesEntryWithDefaultLifeTime()
Definition: RedisBackendTest.php:196
‪TYPO3\CMS\Core\Cache\Frontend\FrontendInterface
Definition: FrontendInterface.php:22
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setUp
‪setUp()
Definition: RedisBackendTest.php:34
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setThrowsExceptionIfDataIsNotAString
‪setThrowsExceptionIfDataIsNotAString()
Definition: RedisBackendTest.php:143
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\flushRemovesAllEntriesFromCache
‪flushRemovesAllEntriesFromCache()
Definition: RedisBackendTest.php:615
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\findIdentifiersByTagReturnsEmptyArrayForNotExistingTag
‪findIdentifiersByTagReturnsEmptyArrayForNotExistingTag()
Definition: RedisBackendTest.php:589
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\removeThrowsExceptionIfIdentifierIsNotAString
‪removeThrowsExceptionIfIdentifierIsNotAString()
Definition: RedisBackendTest.php:498
‪$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:464
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setRemovesMultiplePreviouslySetTagsFromIdentifierToTagsSet
‪setRemovesMultiplePreviouslySetTagsFromIdentifierToTagsSet()
Definition: RedisBackendTest.php:324
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setSavesSpecifiedTagsInIdentifierToTagsSet
‪setSavesSpecifiedTagsInIdentifierToTagsSet()
Definition: RedisBackendTest.php:299
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setCompressionLevelThrowsExceptionIfCompressionLevelIsNotInteger
‪setCompressionLevelThrowsExceptionIfCompressionLevelIsNotInteger()
Definition: RedisBackendTest.php:102
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setAddsIdentifierInTagToIdentifiersEntryIfTagIsAddedOnConsecutiveSet
‪setAddsIdentifierInTagToIdentifiersEntryIfTagIsAddedOnConsecutiveSet()
Definition: RedisBackendTest.php:392
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest
Definition: RedisBackendTest.php:31
‪TYPO3\CMS\Core\Utility\StringUtility
Definition: StringUtility.php:24
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setConnectionTimeoutThrowsExceptionIfConnectionTimeoutIsNotInteger
‪setConnectionTimeoutThrowsExceptionIfConnectionTimeoutIsNotInteger()
Definition: RedisBackendTest.php:118
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\flushByTagRemovesIdentifiersTaggedWithGivenTagFromTagToIdentifiersSets
‪flushByTagRemovesIdentifiersTaggedWithGivenTagFromTagToIdentifiersSets()
Definition: RedisBackendTest.php:735
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setSavesCompressedDataWithEnabledCompression
‪setSavesCompressedDataWithEnabledCompression()
Definition: RedisBackendTest.php:405
‪TYPO3\CMS\Webhooks\Message\$identifier
‪identifier readonly string $identifier
Definition: FileAddedMessage.php:37
‪TYPO3\CMS\Core\Utility\StringUtility\getUniqueId
‪static getUniqueId(string $prefix='')
Definition: StringUtility.php:57
‪TYPO3\CMS\Core\Cache\Exception
Definition: Exception.php:21
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setConnectionTimeoutThrowsExceptionIfConnectionTimeoutIsNegative
‪setConnectionTimeoutThrowsExceptionIfConnectionTimeoutIsNegative()
Definition: RedisBackendTest.php:126
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\setThrowsExceptionIfLifetimeIsNotNullOrAnInteger
‪setThrowsExceptionIfLifetimeIsNotNullOrAnInteger()
Definition: RedisBackendTest.php:161
‪TYPO3\CMS\Core\Tests\Functional\Cache\Backend\RedisBackendTest\findIdentifiersByTagThrowsExceptionIfTagIsNotAString
‪findIdentifiersByTagThrowsExceptionIfTagIsNotAString()
Definition: RedisBackendTest.php:579