6 class CachedBagOStuffTest
extends PHPUnit_Framework_TestCase
{
9 * @covers CachedBagOStuff::__construct
10 * @covers CachedBagOStuff::doGet
12 public function testGetFromBackend() {
13 $backend = new HashBagOStuff
;
14 $cache = new CachedBagOStuff( $backend );
16 $backend->set( 'foo', 'bar' );
17 $this->assertEquals( 'bar', $cache->get( 'foo' ) );
19 $backend->set( 'foo', 'baz' );
20 $this->assertEquals( 'bar', $cache->get( 'foo' ), 'cached' );
24 * @covers CachedBagOStuff::set
25 * @covers CachedBagOStuff::delete
27 public function testSetAndDelete() {
28 $backend = new HashBagOStuff
;
29 $cache = new CachedBagOStuff( $backend );
31 for ( $i = 0; $i < 10; $i++
) {
32 $cache->set( "key$i", 1 );
33 $this->assertEquals( 1, $cache->get( "key$i" ) );
34 $this->assertEquals( 1, $backend->get( "key$i" ) );
35 $cache->delete( "key$i" );
36 $this->assertEquals( false, $cache->get( "key$i" ) );
37 $this->assertEquals( false, $backend->get( "key$i" ) );
42 * @covers CachedBagOStuff::set
43 * @covers CachedBagOStuff::delete
45 public function testWriteCacheOnly() {
46 $backend = new HashBagOStuff
;
47 $cache = new CachedBagOStuff( $backend );
49 $cache->set( 'foo', 'bar', 0, CachedBagOStuff
::WRITE_CACHE_ONLY
);
50 $this->assertEquals( 'bar', $cache->get( 'foo' ) );
51 $this->assertFalse( $backend->get( 'foo' ) );
53 $cache->set( 'foo', 'old' );
54 $this->assertEquals( 'old', $cache->get( 'foo' ) );
55 $this->assertEquals( 'old', $backend->get( 'foo' ) );
57 $cache->set( 'foo', 'new', 0, CachedBagOStuff
::WRITE_CACHE_ONLY
);
58 $this->assertEquals( 'new', $cache->get( 'foo' ) );
59 $this->assertEquals( 'old', $backend->get( 'foo' ) );
61 $cache->delete( 'foo', CachedBagOStuff
::WRITE_CACHE_ONLY
);
62 $this->assertEquals( 'old', $cache->get( 'foo' ) ); // Reloaded from backend
66 * @covers CachedBagOStuff::doGet
68 public function testCacheBackendMisses() {
69 $backend = new HashBagOStuff
;
70 $cache = new CachedBagOStuff( $backend );
72 // First hit primes the cache with miss from the backend
73 $this->assertEquals( false, $cache->get( 'foo' ) );
75 // Change the value in the backend
76 $backend->set( 'foo', true );
78 // Second hit returns the cached miss
79 $this->assertEquals( false, $cache->get( 'foo' ) );
81 // But a fresh value is read from the backend
82 $backend->set( 'bar', true );
83 $this->assertEquals( true, $cache->get( 'bar' ) );
87 * @covers CachedBagOStuff::makeKey
89 public function testMakeKey() {
90 $backend = $this->getMockBuilder( HashBagOStuff
::class )
91 ->setMethods( [ 'makeKey' ] )
93 $backend->method( 'makeKey' )
94 ->willReturn( 'special/logic' );
96 // CachedBagOStuff wraps any backend with a process cache
97 // using HashBagOStuff. Hash has no special key limitations,
98 // but backends often do. Make sure it uses the backend's
99 // makeKey() logic, not the one inherited from HashBagOStuff
100 $cache = new CachedBagOStuff( $backend );
102 $this->assertEquals( 'special/logic', $backend->makeKey( 'special', 'logic' ) );
103 $this->assertEquals( 'special/logic', $cache->makeKey( 'special', 'logic' ) );
107 * @covers CachedBagOStuff::makeGlobalKey
109 public function testMakeGlobalKey() {
110 $backend = $this->getMockBuilder( HashBagOStuff
::class )
111 ->setMethods( [ 'makeGlobalKey' ] )
113 $backend->method( 'makeGlobalKey' )
114 ->willReturn( 'special/logic' );
116 $cache = new CachedBagOStuff( $backend );
118 $this->assertEquals( 'special/logic', $backend->makeGlobalKey( 'special', 'logic' ) );
119 $this->assertEquals( 'special/logic', $cache->makeGlobalKey( 'special', 'logic' ) );