Merge "SpecialMovepage: Convert form to use OOUI controls"
[lhc/web/wiklou.git] / tests / phpunit / includes / objectcache / BagOStuffTest.php
index 4516bb4..b684006 100644 (file)
@@ -1,8 +1,10 @@
 <?php
 /**
  * @author Matthias Mullie <mmullie@wikimedia.org>
+ * @group BagOStuff
  */
 class BagOStuffTest extends MediaWikiTestCase {
+       /** @var BagOStuff */
        private $cache;
 
        protected function setUp() {
@@ -136,20 +138,48 @@ class BagOStuffTest extends MediaWikiTestCase {
        public function testGetMulti() {
                $value1 = array( 'this' => 'is', 'a' => 'test' );
                $value2 = array( 'this' => 'is', 'another' => 'test' );
+               $value3 = array( 'testing a key that may be encoded when sent to cache backend' );
 
                $key1 = wfMemcKey( 'test1' );
                $key2 = wfMemcKey( 'test2' );
+               $key3 = wfMemcKey( 'will-%-encode' ); // internally, MemcachedBagOStuffs will encode to will-%25-encode
 
                $this->cache->add( $key1, $value1 );
                $this->cache->add( $key2, $value2 );
+               $this->cache->add( $key3, $value3 );
 
                $this->assertEquals(
-                       $this->cache->getMulti( array( $key1, $key2 ) ),
-                       array( $key1 => $value1, $key2 => $value2 )
+                       array( $key1 => $value1, $key2 => $value2, $key3 => $value3 ),
+                       $this->cache->getMulti( array( $key1, $key2, $key3 ) )
                );
 
                // cleanup
                $this->cache->delete( $key1 );
                $this->cache->delete( $key2 );
+               $this->cache->delete( $key3 );
+       }
+
+       /**
+        * @covers BagOStuff::getScopedLock
+        */
+       public function testGetScopedLock() {
+               $key = wfMemcKey( 'test' );
+               $value1 = $this->cache->getScopedLock( $key, 0 );
+               $value2 = $this->cache->getScopedLock( $key, 0 );
+
+               $this->assertType( 'ScopedCallback', $value1, 'First call returned lock' );
+               $this->assertNull( $value2, 'Duplicate call returned no lock' );
+
+               unset( $value1 );
+
+               $value3 = $this->cache->getScopedLock( $key, 0 );
+               $this->assertType( 'ScopedCallback', $value3, 'Lock returned callback after release' );
+               unset( $value3 );
+
+               $value1 = $this->cache->getScopedLock( $key, 0, 5, 'reentry' );
+               $value2 = $this->cache->getScopedLock( $key, 0, 5, 'reentry' );
+
+               $this->assertType( 'ScopedCallback', $value1, 'First reentrant call returned lock' );
+               $this->assertType( 'ScopedCallback', $value1, 'Second reentrant call returned lock' );
        }
 }