MediaWiki
master
|
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 }