MediaWiki
REL1_20
|
00001 <?php 00002 00003 require_once __DIR__ . "/../../../maintenance/backupPrefetch.inc"; 00004 00010 class BaseDumpTest extends MediaWikiTestCase { 00011 00017 private $dump = null; 00018 00019 protected function tearDown() { 00020 if ( $this->dump !== null ) { 00021 $this->dump->close(); 00022 } 00023 00024 // Bug 37458, parent teardown need to be done after closing the 00025 // dump or it might cause some permissions errors. 00026 parent::tearDown(); 00027 } 00028 00036 private function assertPrefetchEquals( $expected, $page, $revision ) { 00037 $this->assertEquals( $expected, $this->dump->prefetch( $page, $revision ), 00038 "Prefetch of page $page revision $revision" ); 00039 00040 } 00041 00042 function testSequential() { 00043 $fname = $this->setUpPrefetch(); 00044 $this->dump = new BaseDump( $fname ); 00045 00046 $this->assertPrefetchEquals( "BackupDumperTestP1Text1", 1, 1 ); 00047 $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 ); 00048 $this->assertPrefetchEquals( "BackupDumperTestP2Text4 some additional Text", 2, 5 ); 00049 $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 ); 00050 } 00051 00052 function testSynchronizeRevisionMissToRevision() { 00053 $fname = $this->setUpPrefetch(); 00054 $this->dump = new BaseDump( $fname ); 00055 00056 $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 ); 00057 $this->assertPrefetchEquals( null, 2, 3 ); 00058 $this->assertPrefetchEquals( "BackupDumperTestP2Text4 some additional Text", 2, 5 ); 00059 } 00060 00061 function testSynchronizeRevisionMissToPage() { 00062 $fname = $this->setUpPrefetch(); 00063 $this->dump = new BaseDump( $fname ); 00064 00065 $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 ); 00066 $this->assertPrefetchEquals( null, 2, 40 ); 00067 $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 ); 00068 } 00069 00070 function testSynchronizePageMiss() { 00071 $fname = $this->setUpPrefetch(); 00072 $this->dump = new BaseDump( $fname ); 00073 00074 $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 ); 00075 $this->assertPrefetchEquals( null, 3, 40 ); 00076 $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 ); 00077 } 00078 00079 function testPageMissAtEnd() { 00080 $fname = $this->setUpPrefetch(); 00081 $this->dump = new BaseDump( $fname ); 00082 00083 $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 ); 00084 $this->assertPrefetchEquals( null, 6, 40 ); 00085 } 00086 00087 function testRevisionMissAtEnd() { 00088 $fname = $this->setUpPrefetch(); 00089 $this->dump = new BaseDump( $fname ); 00090 00091 $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 ); 00092 $this->assertPrefetchEquals( null, 4, 40 ); 00093 } 00094 00095 function testSynchronizePageMissAtStart() { 00096 $fname = $this->setUpPrefetch(); 00097 $this->dump = new BaseDump( $fname ); 00098 00099 $this->assertPrefetchEquals( null, 0, 2 ); 00100 $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 ); 00101 } 00102 00103 function testSynchronizeRevisionMissAtStart() { 00104 $fname = $this->setUpPrefetch(); 00105 $this->dump = new BaseDump( $fname ); 00106 00107 $this->assertPrefetchEquals( null, 1, -2 ); 00108 $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 ); 00109 } 00110 00111 function testSequentialAcrossFiles() { 00112 $fname1 = $this->setUpPrefetch( array( 1 ) ); 00113 $fname2 = $this->setUpPrefetch( array( 2, 4 ) ); 00114 $this->dump = new BaseDump( $fname1 . ";" . $fname2 ); 00115 00116 $this->assertPrefetchEquals( "BackupDumperTestP1Text1", 1, 1 ); 00117 $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 ); 00118 $this->assertPrefetchEquals( "BackupDumperTestP2Text4 some additional Text", 2, 5 ); 00119 $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 ); 00120 } 00121 00122 function testSynchronizeSkipAcrossFile() { 00123 $fname1 = $this->setUpPrefetch( array( 1 ) ); 00124 $fname2 = $this->setUpPrefetch( array( 2 ) ); 00125 $fname3 = $this->setUpPrefetch( array( 4 ) ); 00126 $this->dump = new BaseDump( $fname1 . ";" . $fname2 . ";" . $fname3 ); 00127 00128 $this->assertPrefetchEquals( "BackupDumperTestP1Text1", 1, 1 ); 00129 $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 ); 00130 } 00131 00132 function testSynchronizeMissInWholeFirstFile() { 00133 $fname1 = $this->setUpPrefetch( array( 1 ) ); 00134 $fname2 = $this->setUpPrefetch( array( 2 ) ); 00135 $this->dump = new BaseDump( $fname1 . ";" . $fname2 ); 00136 00137 $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 ); 00138 } 00139 00140 00150 private function setUpPrefetch( $requested_pages = array( 1, 2, 4 ) ) { 00151 // The file name, where we store the prepared prefetch file 00152 $fname = $this->getNewTempFile(); 00153 00154 // The header of every prefetch file 00155 $header = '<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.7/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.7/ http://www.mediawiki.org/xml/export-0.7.xsd" version="0.7" xml:lang="en"> 00156 <siteinfo> 00157 <sitename>wikisvn</sitename> 00158 <base>http://localhost/wiki-svn/index.php/Main_Page</base> 00159 <generator>MediaWiki 1.20alpha</generator> 00160 <case>first-letter</case> 00161 <namespaces> 00162 <namespace key="-2" case="first-letter">Media</namespace> 00163 <namespace key="-1" case="first-letter">Special</namespace> 00164 <namespace key="0" case="first-letter" /> 00165 <namespace key="1" case="first-letter">Talk</namespace> 00166 <namespace key="2" case="first-letter">User</namespace> 00167 <namespace key="3" case="first-letter">User talk</namespace> 00168 <namespace key="4" case="first-letter">Wikisvn</namespace> 00169 <namespace key="5" case="first-letter">Wikisvn talk</namespace> 00170 <namespace key="6" case="first-letter">File</namespace> 00171 <namespace key="7" case="first-letter">File talk</namespace> 00172 <namespace key="8" case="first-letter">MediaWiki</namespace> 00173 <namespace key="9" case="first-letter">MediaWiki talk</namespace> 00174 <namespace key="10" case="first-letter">Template</namespace> 00175 <namespace key="11" case="first-letter">Template talk</namespace> 00176 <namespace key="12" case="first-letter">Help</namespace> 00177 <namespace key="13" case="first-letter">Help talk</namespace> 00178 <namespace key="14" case="first-letter">Category</namespace> 00179 <namespace key="15" case="first-letter">Category talk</namespace> 00180 </namespaces> 00181 </siteinfo> 00182 '; 00183 00184 00185 // An array holding the pages that are available for prefetch 00186 $available_pages = array(); 00187 00188 // Simple plain page 00189 $available_pages[1] = ' <page> 00190 <title>BackupDumperTestP1</title> 00191 <ns>0</ns> 00192 <id>1</id> 00193 <revision> 00194 <id>1</id> 00195 <timestamp>2012-04-01T16:46:05Z</timestamp> 00196 <contributor> 00197 <ip>127.0.0.1</ip> 00198 </contributor> 00199 <comment>BackupDumperTestP1Summary1</comment> 00200 <sha1>0bolhl6ol7i6x0e7yq91gxgaan39j87</sha1> 00201 <text xml:space="preserve">BackupDumperTestP1Text1</text> 00202 </revision> 00203 </page> 00204 '; 00205 // Page with more than one revisions. Hole in rev ids. 00206 $available_pages[2] = ' <page> 00207 <title>BackupDumperTestP2</title> 00208 <ns>0</ns> 00209 <id>2</id> 00210 <revision> 00211 <id>2</id> 00212 <timestamp>2012-04-01T16:46:05Z</timestamp> 00213 <contributor> 00214 <ip>127.0.0.1</ip> 00215 </contributor> 00216 <comment>BackupDumperTestP2Summary1</comment> 00217 <sha1>jprywrymfhysqllua29tj3sc7z39dl2</sha1> 00218 <text xml:space="preserve">BackupDumperTestP2Text1</text> 00219 </revision> 00220 <revision> 00221 <id>5</id> 00222 <parentid>2</parentid> 00223 <timestamp>2012-04-01T16:46:05Z</timestamp> 00224 <contributor> 00225 <ip>127.0.0.1</ip> 00226 </contributor> 00227 <comment>BackupDumperTestP2Summary4 extra</comment> 00228 <sha1>6o1ciaxa6pybnqprmungwofc4lv00wv</sha1> 00229 <text xml:space="preserve">BackupDumperTestP2Text4 some additional Text</text> 00230 </revision> 00231 </page> 00232 '; 00233 // Page with id higher than previous id + 1 00234 $available_pages[4] = ' <page> 00235 <title>Talk:BackupDumperTestP1</title> 00236 <ns>1</ns> 00237 <id>4</id> 00238 <revision> 00239 <id>8</id> 00240 <timestamp>2012-04-01T16:46:05Z</timestamp> 00241 <contributor> 00242 <ip>127.0.0.1</ip> 00243 </contributor> 00244 <comment>Talk BackupDumperTestP1 Summary1</comment> 00245 <sha1>nktofwzd0tl192k3zfepmlzxoax1lpe</sha1> 00246 <text xml:space="preserve">Talk about BackupDumperTestP1 Text1</text> 00247 </revision> 00248 </page> 00249 '; 00250 00251 // The common ending for all files 00252 $tail = '</mediawiki> 00253 '; 00254 00255 // Putting together the content of the prefetch files 00256 $content = $header; 00257 foreach ( $requested_pages as $i ) { 00258 $this->assertTrue( array_key_exists( $i, $available_pages ), 00259 "Check for availability of requested page " . $i ); 00260 $content .= $available_pages[ $i ]; 00261 } 00262 $content .= $tail; 00263 00264 $this->assertEquals( strlen( $content ), file_put_contents( 00265 $fname, $content ), "Length of prepared prefetch" ); 00266 00267 return $fname; 00268 } 00269 00270 }