3 * Tests for page dumps of BackupDumper
10 class BackupDumperPageTest
extends DumpTestCase
{
12 // We'll add several pages, revision and texts. The following variables hold the
14 private $pageId1, $pageId2, $pageId3, $pageId4, $pageId5;
15 private $pageTitle1, $pageTitle2, $pageTitle3, $pageTitle4, $pageTitle5;
16 private $revId1_1, $textId1_1;
17 private $revId2_1, $textId2_1, $revId2_2, $textId2_2;
18 private $revId2_3, $textId2_3, $revId2_4, $textId2_4;
19 private $revId3_1, $textId3_1, $revId3_2, $textId3_2;
20 private $revId4_1, $textId4_1;
21 private $namespace, $talk_namespace;
23 function addDBData() {
24 // be sure, titles created here using english namespace names
25 $this->setMwGlobals( array(
26 'wgLanguageCode' => 'en',
27 'wgContLang' => Language
::factory( 'en' ),
30 $this->tablesUsed
[] = 'page';
31 $this->tablesUsed
[] = 'revision';
32 $this->tablesUsed
[] = 'text';
35 $this->namespace = $this->getDefaultWikitextNS();
36 $this->talk_namespace
= NS_TALK
;
38 if ( $this->namespace === $this->talk_namespace
) {
39 // @todo work around this.
40 throw new MWException( "The default wikitext namespace is the talk namespace. "
41 . " We can't currently deal with that." );
44 $this->pageTitle1
= Title
::newFromText( 'BackupDumperTestP1', $this->namespace );
45 $page = WikiPage
::factory( $this->pageTitle1
);
46 list( $this->revId1_1
, $this->textId1_1
) = $this->addRevision( $page,
47 "BackupDumperTestP1Text1", "BackupDumperTestP1Summary1" );
48 $this->pageId1
= $page->getId();
50 $this->pageTitle2
= Title
::newFromText( 'BackupDumperTestP2', $this->namespace );
51 $page = WikiPage
::factory( $this->pageTitle2
);
52 list( $this->revId2_1
, $this->textId2_1
) = $this->addRevision( $page,
53 "BackupDumperTestP2Text1", "BackupDumperTestP2Summary1" );
54 list( $this->revId2_2
, $this->textId2_2
) = $this->addRevision( $page,
55 "BackupDumperTestP2Text2", "BackupDumperTestP2Summary2" );
56 list( $this->revId2_3
, $this->textId2_3
) = $this->addRevision( $page,
57 "BackupDumperTestP2Text3", "BackupDumperTestP2Summary3" );
58 list( $this->revId2_4
, $this->textId2_4
) = $this->addRevision( $page,
59 "BackupDumperTestP2Text4 some additional Text ",
60 "BackupDumperTestP2Summary4 extra " );
61 $this->pageId2
= $page->getId();
63 $this->pageTitle3
= Title
::newFromText( 'BackupDumperTestP3', $this->namespace );
64 $page = WikiPage
::factory( $this->pageTitle3
);
65 list( $this->revId3_1
, $this->textId3_1
) = $this->addRevision( $page,
66 "BackupDumperTestP3Text1", "BackupDumperTestP2Summary1" );
67 list( $this->revId3_2
, $this->textId3_2
) = $this->addRevision( $page,
68 "BackupDumperTestP3Text2", "BackupDumperTestP2Summary2" );
69 $this->pageId3
= $page->getId();
70 $page->doDeleteArticle( "Testing ;)" );
72 $this->pageTitle4
= Title
::newFromText( 'BackupDumperTestP1', $this->talk_namespace
);
73 $page = WikiPage
::factory( $this->pageTitle4
);
74 list( $this->revId4_1
, $this->textId4_1
) = $this->addRevision( $page,
75 "Talk about BackupDumperTestP1 Text1",
76 "Talk BackupDumperTestP1 Summary1" );
77 $this->pageId4
= $page->getId();
78 } catch ( Exception
$e ) {
79 // We'd love to pass $e directly. However, ... see
80 // documentation of exceptionFromAddDBData in
82 $this->exceptionFromAddDBData
= $e;
86 protected function setUp() {
89 // Since we will restrict dumping by page ranges (to allow
90 // working tests, even if the db gets prepopulated by a base
91 // class), we have to assert, that the page id are consecutively
94 array( $this->pageId2
, $this->pageId3
, $this->pageId4
),
95 array( $this->pageId1 +
1, $this->pageId2 +
1, $this->pageId3 +
1 ),
96 "Page ids increasing without holes" );
99 function testFullTextPlain() {
100 // Preparing the dump
101 $fname = $this->getNewTempFile();
103 $dumper = new DumpBackup();
104 $dumper->loadWithArgv( array( '--full', '--quiet', '--output', 'file:' . $fname ) );
105 $dumper->startId
= $this->pageId1
;
106 $dumper->endId
= $this->pageId4 +
1;
107 $dumper->setDb( $this->db
);
109 // Performing the dump
112 // Checking the dumped data
113 $this->assertDumpStart( $fname );
116 $this->assertPageStart( $this->pageId1
, $this->namespace, $this->pageTitle1
->getPrefixedText() );
117 $this->assertRevision( $this->revId1_1
, "BackupDumperTestP1Summary1",
118 $this->textId1_1
, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87",
119 "BackupDumperTestP1Text1" );
120 $this->assertPageEnd();
123 $this->assertPageStart( $this->pageId2
, $this->namespace, $this->pageTitle2
->getPrefixedText() );
124 $this->assertRevision( $this->revId2_1
, "BackupDumperTestP2Summary1",
125 $this->textId2_1
, 23, "jprywrymfhysqllua29tj3sc7z39dl2",
126 "BackupDumperTestP2Text1" );
127 $this->assertRevision( $this->revId2_2
, "BackupDumperTestP2Summary2",
128 $this->textId2_2
, 23, "b7vj5ks32po5m1z1t1br4o7scdwwy95",
129 "BackupDumperTestP2Text2", $this->revId2_1
);
130 $this->assertRevision( $this->revId2_3
, "BackupDumperTestP2Summary3",
131 $this->textId2_3
, 23, "jfunqmh1ssfb8rs43r19w98k28gg56r",
132 "BackupDumperTestP2Text3", $this->revId2_2
);
133 $this->assertRevision( $this->revId2_4
, "BackupDumperTestP2Summary4 extra",
134 $this->textId2_4
, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv",
135 "BackupDumperTestP2Text4 some additional Text", $this->revId2_3
);
136 $this->assertPageEnd();
139 // -> Page is marked deleted. Hence not visible
142 $this->assertPageStart(
144 $this->talk_namespace
,
145 $this->pageTitle4
->getPrefixedText()
147 $this->assertRevision( $this->revId4_1
, "Talk BackupDumperTestP1 Summary1",
148 $this->textId4_1
, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe",
149 "Talk about BackupDumperTestP1 Text1" );
150 $this->assertPageEnd();
152 $this->assertDumpEnd();
155 function testFullStubPlain() {
156 // Preparing the dump
157 $fname = $this->getNewTempFile();
159 $dumper = new DumpBackup();
160 $dumper->loadWithArgv( array( '--full', '--quiet', '--output', 'file:' . $fname, '--stub' ) );
161 $dumper->startId
= $this->pageId1
;
162 $dumper->endId
= $this->pageId4 +
1;
163 $dumper->setDb( $this->db
);
165 // Performing the dump
168 // Checking the dumped data
169 $this->assertDumpStart( $fname );
172 $this->assertPageStart( $this->pageId1
, $this->namespace, $this->pageTitle1
->getPrefixedText() );
173 $this->assertRevision( $this->revId1_1
, "BackupDumperTestP1Summary1",
174 $this->textId1_1
, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
175 $this->assertPageEnd();
178 $this->assertPageStart( $this->pageId2
, $this->namespace, $this->pageTitle2
->getPrefixedText() );
179 $this->assertRevision( $this->revId2_1
, "BackupDumperTestP2Summary1",
180 $this->textId2_1
, 23, "jprywrymfhysqllua29tj3sc7z39dl2" );
181 $this->assertRevision( $this->revId2_2
, "BackupDumperTestP2Summary2",
182 $this->textId2_2
, 23, "b7vj5ks32po5m1z1t1br4o7scdwwy95", false, $this->revId2_1
);
183 $this->assertRevision( $this->revId2_3
, "BackupDumperTestP2Summary3",
184 $this->textId2_3
, 23, "jfunqmh1ssfb8rs43r19w98k28gg56r", false, $this->revId2_2
);
185 $this->assertRevision( $this->revId2_4
, "BackupDumperTestP2Summary4 extra",
186 $this->textId2_4
, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3
);
187 $this->assertPageEnd();
190 // -> Page is marked deleted. Hence not visible
193 $this->assertPageStart(
195 $this->talk_namespace
,
196 $this->pageTitle4
->getPrefixedText()
198 $this->assertRevision( $this->revId4_1
, "Talk BackupDumperTestP1 Summary1",
199 $this->textId4_1
, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
200 $this->assertPageEnd();
202 $this->assertDumpEnd();
205 function testCurrentStubPlain() {
206 // Preparing the dump
207 $fname = $this->getNewTempFile();
209 $dumper = new DumpBackup( array( '--output', 'file:' . $fname ) );
210 $dumper->startId
= $this->pageId1
;
211 $dumper->endId
= $this->pageId4 +
1;
212 $dumper->reporting
= false;
213 $dumper->setDb( $this->db
);
215 // Performing the dump
216 $dumper->dump( WikiExporter
::CURRENT
, WikiExporter
::STUB
);
218 // Checking the dumped data
219 $this->assertDumpStart( $fname );
222 $this->assertPageStart( $this->pageId1
, $this->namespace, $this->pageTitle1
->getPrefixedText() );
223 $this->assertRevision( $this->revId1_1
, "BackupDumperTestP1Summary1",
224 $this->textId1_1
, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
225 $this->assertPageEnd();
228 $this->assertPageStart( $this->pageId2
, $this->namespace, $this->pageTitle2
->getPrefixedText() );
229 $this->assertRevision( $this->revId2_4
, "BackupDumperTestP2Summary4 extra",
230 $this->textId2_4
, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3
);
231 $this->assertPageEnd();
234 // -> Page is marked deleted. Hence not visible
237 $this->assertPageStart(
239 $this->talk_namespace
,
240 $this->pageTitle4
->getPrefixedText()
242 $this->assertRevision( $this->revId4_1
, "Talk BackupDumperTestP1 Summary1",
243 $this->textId4_1
, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
244 $this->assertPageEnd();
246 $this->assertDumpEnd();
249 function testCurrentStubGzip() {
250 $this->checkHasGzip();
252 // Preparing the dump
253 $fname = $this->getNewTempFile();
255 $dumper = new DumpBackup( array( '--output', 'gzip:' . $fname ) );
256 $dumper->startId
= $this->pageId1
;
257 $dumper->endId
= $this->pageId4 +
1;
258 $dumper->reporting
= false;
259 $dumper->setDb( $this->db
);
261 // Performing the dump
262 $dumper->dump( WikiExporter
::CURRENT
, WikiExporter
::STUB
);
264 // Checking the dumped data
265 $this->gunzip( $fname );
266 $this->assertDumpStart( $fname );
269 $this->assertPageStart( $this->pageId1
, $this->namespace, $this->pageTitle1
->getPrefixedText() );
270 $this->assertRevision( $this->revId1_1
, "BackupDumperTestP1Summary1",
271 $this->textId1_1
, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
272 $this->assertPageEnd();
275 $this->assertPageStart( $this->pageId2
, $this->namespace, $this->pageTitle2
->getPrefixedText() );
276 $this->assertRevision( $this->revId2_4
, "BackupDumperTestP2Summary4 extra",
277 $this->textId2_4
, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3
);
278 $this->assertPageEnd();
281 // -> Page is marked deleted. Hence not visible
284 $this->assertPageStart(
286 $this->talk_namespace
,
287 $this->pageTitle4
->getPrefixedText()
289 $this->assertRevision( $this->revId4_1
, "Talk BackupDumperTestP1 Summary1",
290 $this->textId4_1
, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
291 $this->assertPageEnd();
293 $this->assertDumpEnd();
297 * xmldumps-backup typically performs a single dump that that writes
299 * - gzipped stubs of everything (meta-history)
300 * - gzipped stubs of latest revisions of all pages (meta-current)
301 * - gzipped stubs of latest revisions of all pages of namespage 0
304 * We reproduce such a setup with our mini fixture, although we omit
305 * chunks, and all the other gimmicks of xmldumps-backup.
307 function testXmlDumpsBackupUseCase() {
308 $this->checkHasGzip();
310 $fnameMetaHistory = $this->getNewTempFile();
311 $fnameMetaCurrent = $this->getNewTempFile();
312 $fnameArticles = $this->getNewTempFile();
314 $dumper = new DumpBackup( array( "--full", "--stub", "--output=gzip:" . $fnameMetaHistory,
315 "--output=gzip:" . $fnameMetaCurrent, "--filter=latest",
316 "--output=gzip:" . $fnameArticles, "--filter=latest",
317 "--filter=notalk", "--filter=namespace:!NS_USER",
318 "--reporting=1000" ) );
319 $dumper->startId
= $this->pageId1
;
320 $dumper->endId
= $this->pageId4 +
1;
321 $dumper->setDb( $this->db
);
323 // xmldumps-backup uses reporting. We will not check the exact reported
324 // message, as they are dependent on the processing power of the used
325 // computer. We only check that reporting does not crash the dumping
326 // and that something is reported
327 $dumper->stderr
= fopen( 'php://output', 'a' );
328 if ( $dumper->stderr
=== false ) {
329 $this->fail( "Could not open stream for stderr" );
332 // Performing the dump
333 $dumper->dump( WikiExporter
::FULL
, WikiExporter
::STUB
);
335 $this->assertTrue( fclose( $dumper->stderr
), "Closing stderr handle" );
337 // Checking meta-history -------------------------------------------------
339 $this->gunzip( $fnameMetaHistory );
340 $this->assertDumpStart( $fnameMetaHistory );
343 $this->assertPageStart( $this->pageId1
, $this->namespace, $this->pageTitle1
->getPrefixedText() );
344 $this->assertRevision( $this->revId1_1
, "BackupDumperTestP1Summary1",
345 $this->textId1_1
, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
346 $this->assertPageEnd();
349 $this->assertPageStart( $this->pageId2
, $this->namespace, $this->pageTitle2
->getPrefixedText() );
350 $this->assertRevision( $this->revId2_1
, "BackupDumperTestP2Summary1",
351 $this->textId2_1
, 23, "jprywrymfhysqllua29tj3sc7z39dl2" );
352 $this->assertRevision( $this->revId2_2
, "BackupDumperTestP2Summary2",
353 $this->textId2_2
, 23, "b7vj5ks32po5m1z1t1br4o7scdwwy95", false, $this->revId2_1
);
354 $this->assertRevision( $this->revId2_3
, "BackupDumperTestP2Summary3",
355 $this->textId2_3
, 23, "jfunqmh1ssfb8rs43r19w98k28gg56r", false, $this->revId2_2
);
356 $this->assertRevision( $this->revId2_4
, "BackupDumperTestP2Summary4 extra",
357 $this->textId2_4
, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3
);
358 $this->assertPageEnd();
361 // -> Page is marked deleted. Hence not visible
364 $this->assertPageStart(
366 $this->talk_namespace
,
367 $this->pageTitle4
->getPrefixedText()
369 $this->assertRevision( $this->revId4_1
, "Talk BackupDumperTestP1 Summary1",
370 $this->textId4_1
, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
371 $this->assertPageEnd();
373 $this->assertDumpEnd();
375 // Checking meta-current -------------------------------------------------
377 $this->gunzip( $fnameMetaCurrent );
378 $this->assertDumpStart( $fnameMetaCurrent );
381 $this->assertPageStart( $this->pageId1
, $this->namespace, $this->pageTitle1
->getPrefixedText() );
382 $this->assertRevision( $this->revId1_1
, "BackupDumperTestP1Summary1",
383 $this->textId1_1
, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
384 $this->assertPageEnd();
387 $this->assertPageStart( $this->pageId2
, $this->namespace, $this->pageTitle2
->getPrefixedText() );
388 $this->assertRevision( $this->revId2_4
, "BackupDumperTestP2Summary4 extra",
389 $this->textId2_4
, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3
);
390 $this->assertPageEnd();
393 // -> Page is marked deleted. Hence not visible
396 $this->assertPageStart(
398 $this->talk_namespace
,
399 $this->pageTitle4
->getPrefixedText()
401 $this->assertRevision( $this->revId4_1
, "Talk BackupDumperTestP1 Summary1",
402 $this->textId4_1
, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
403 $this->assertPageEnd();
405 $this->assertDumpEnd();
407 // Checking articles -------------------------------------------------
409 $this->gunzip( $fnameArticles );
410 $this->assertDumpStart( $fnameArticles );
413 $this->assertPageStart( $this->pageId1
, $this->namespace, $this->pageTitle1
->getPrefixedText() );
414 $this->assertRevision( $this->revId1_1
, "BackupDumperTestP1Summary1",
415 $this->textId1_1
, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
416 $this->assertPageEnd();
419 $this->assertPageStart( $this->pageId2
, $this->namespace, $this->pageTitle2
->getPrefixedText() );
420 $this->assertRevision( $this->revId2_4
, "BackupDumperTestP2Summary4 extra",
421 $this->textId2_4
, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3
);
422 $this->assertPageEnd();
425 // -> Page is marked deleted. Hence not visible
428 // -> Page is not in $this->namespace. Hence not visible
430 $this->assertDumpEnd();
432 $this->expectETAOutput();