00001 <?php
00002
00007 class CdbTest extends PHPUnit_Framework_TestCase {
00008
00009 public function setup() {
00010 if ( !CdbReader::haveExtension() ) {
00011 $this->markTestIncomplete( 'This test requires native CDB support to be present.' );
00012 }
00013 }
00014
00015 public function testCdb() {
00016 $w1 = new CdbWriter_PHP( 'php.cdb' );
00017 $w2 = new CdbWriter_DBA( 'dba.cdb' );
00018
00019 $data = array();
00020 for ( $i = 0; $i < 1000; $i++ ) {
00021 $key = $this->randomString();
00022 $value = $this->randomString();
00023 $w1->set( $key, $value );
00024 $w2->set( $key, $value );
00025
00026 if ( !isset( $data[$key] ) ) {
00027 $data[$key] = $value;
00028 }
00029 }
00030
00031 $w1->close();
00032 $w2->close();
00033
00034 $this->assertEquals(
00035 md5_file( 'dba.cdb' ),
00036 md5_file( 'php.cdb' ),
00037 'same hash'
00038 );
00039
00040 $r1 = new CdbReader_PHP( 'php.cdb' );
00041 $r2 = new CdbReader_DBA( 'dba.cdb' );
00042
00043 foreach ( $data as $key => $value ) {
00044 if ( $key === '' ) {
00045
00046 continue;
00047 }
00048 $v1 = $r1->get( $key );
00049 $v2 = $r2->get( $key );
00050
00051 $v1 = $v1 === false ? '(not found)' : $v1;
00052 $v2 = $v2 === false ? '(not found)' : $v2;
00053
00054 #cdbAssert( 'Mismatch', $key, $v1, $v2 );
00055 $this->cdbAssert( "PHP error", $key, $v1, $value );
00056 $this->cdbAssert( "DBA error", $key, $v2, $value );
00057 }
00058
00059 unlink( 'dba.cdb' );
00060 unlink( 'php.cdb' );
00061 }
00062
00063 private function randomString() {
00064 $len = mt_rand( 0, 10 );
00065 $s = '';
00066 for ( $j = 0; $j < $len; $j++ ) {
00067 $s .= chr( mt_rand( 0, 255 ) );
00068 }
00069 return $s;
00070 }
00071
00072 private function cdbAssert( $msg, $key, $v1, $v2 ) {
00073 $this->assertEquals(
00074 $v2,
00075 $v1,
00076 $msg . ', k=' . bin2hex( $key )
00077 );
00078 }
00079 }