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