MediaWiki  REL1_24
CdbTest.php
Go to the documentation of this file.
00001 <?php
00002 
00008 class CdbTest extends MediaWikiTestCase {
00009 
00010     protected function setUp() {
00011         parent::setUp();
00012         if ( !CdbReader::haveExtension() ) {
00013             $this->markTestSkipped( 'Native CDB support is not available' );
00014         }
00015     }
00016 
00020     public function testCdb() {
00021         $dir = wfTempDir();
00022         if ( !is_writable( $dir ) ) {
00023             $this->markTestSkipped( "Temp dir isn't writable" );
00024         }
00025 
00026         $phpcdbfile = $this->getNewTempFile();
00027         $dbacdbfile = $this->getNewTempFile();
00028 
00029         $w1 = new CdbWriterPHP( $phpcdbfile );
00030         $w2 = new CdbWriterDBA( $dbacdbfile );
00031 
00032         $data = array();
00033         for ( $i = 0; $i < 1000; $i++ ) {
00034             $key = $this->randomString();
00035             $value = $this->randomString();
00036             $w1->set( $key, $value );
00037             $w2->set( $key, $value );
00038 
00039             if ( !isset( $data[$key] ) ) {
00040                 $data[$key] = $value;
00041             }
00042         }
00043 
00044         $w1->close();
00045         $w2->close();
00046 
00047         $this->assertEquals(
00048             md5_file( $phpcdbfile ),
00049             md5_file( $dbacdbfile ),
00050             'same hash'
00051         );
00052 
00053         $r1 = new CdbReaderPHP( $phpcdbfile );
00054         $r2 = new CdbReaderDBA( $dbacdbfile );
00055 
00056         foreach ( $data as $key => $value ) {
00057             if ( $key === '' ) {
00058                 // Known bug
00059                 continue;
00060             }
00061             $v1 = $r1->get( $key );
00062             $v2 = $r2->get( $key );
00063 
00064             $v1 = $v1 === false ? '(not found)' : $v1;
00065             $v2 = $v2 === false ? '(not found)' : $v2;
00066 
00067             # cdbAssert( 'Mismatch', $key, $v1, $v2 );
00068             $this->cdbAssert( "PHP error", $key, $v1, $value );
00069             $this->cdbAssert( "DBA error", $key, $v2, $value );
00070         }
00071     }
00072 
00073     private function randomString() {
00074         $len = mt_rand( 0, 10 );
00075         $s = '';
00076         for ( $j = 0; $j < $len; $j++ ) {
00077             $s .= chr( mt_rand( 0, 255 ) );
00078         }
00079 
00080         return $s;
00081     }
00082 
00083     private function cdbAssert( $msg, $key, $v1, $v2 ) {
00084         $this->assertEquals(
00085             $v2,
00086             $v1,
00087             $msg . ', k=' . bin2hex( $key )
00088         );
00089     }
00090 }