123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440 |
- <?php
- namespace MediaWiki\Tests\Maintenance;
- use DumpBackup;
- use Title;
- use WikiExporter;
- use WikiPage;
- /**
- * Tests for page dumps of BackupDumper
- *
- * @group Database
- * @group Dump
- * @covers BackupDumper
- */
- class BackupDumperPageTest extends DumpTestCase {
- // We'll add several pages, revision and texts. The following variables hold the
- // corresponding ids.
- private $pageId1, $pageId2, $pageId3, $pageId4;
- private $pageTitle1, $pageTitle2, $pageTitle3, $pageTitle4;
- private $revId1_1, $textId1_1;
- private $revId2_1, $textId2_1, $revId2_2, $textId2_2;
- private $revId2_3, $textId2_3, $revId2_4, $textId2_4;
- private $revId3_1, $textId3_1, $revId3_2, $textId3_2;
- private $revId4_1, $textId4_1;
- private $namespace, $talk_namespace;
- function addDBData() {
- // be sure, titles created here using english namespace names
- $this->setContentLang( 'en' );
- $this->tablesUsed[] = 'page';
- $this->tablesUsed[] = 'revision';
- $this->tablesUsed[] = 'ip_changes';
- $this->tablesUsed[] = 'text';
- try {
- $this->namespace = $this->getDefaultWikitextNS();
- $this->talk_namespace = NS_TALK;
- if ( $this->namespace === $this->talk_namespace ) {
- // @todo work around this.
- throw new MWException( "The default wikitext namespace is the talk namespace. "
- . " We can't currently deal with that." );
- }
- $this->pageTitle1 = Title::newFromText( 'BackupDumperTestP1', $this->namespace );
- $page = WikiPage::factory( $this->pageTitle1 );
- list( $this->revId1_1, $this->textId1_1 ) = $this->addRevision( $page,
- "BackupDumperTestP1Text1", "BackupDumperTestP1Summary1" );
- $this->pageId1 = $page->getId();
- $this->pageTitle2 = Title::newFromText( 'BackupDumperTestP2', $this->namespace );
- $page = WikiPage::factory( $this->pageTitle2 );
- list( $this->revId2_1, $this->textId2_1 ) = $this->addRevision( $page,
- "BackupDumperTestP2Text1", "BackupDumperTestP2Summary1" );
- list( $this->revId2_2, $this->textId2_2 ) = $this->addRevision( $page,
- "BackupDumperTestP2Text2", "BackupDumperTestP2Summary2" );
- list( $this->revId2_3, $this->textId2_3 ) = $this->addRevision( $page,
- "BackupDumperTestP2Text3", "BackupDumperTestP2Summary3" );
- list( $this->revId2_4, $this->textId2_4 ) = $this->addRevision( $page,
- "BackupDumperTestP2Text4 some additional Text ",
- "BackupDumperTestP2Summary4 extra " );
- $this->pageId2 = $page->getId();
- $this->pageTitle3 = Title::newFromText( 'BackupDumperTestP3', $this->namespace );
- $page = WikiPage::factory( $this->pageTitle3 );
- list( $this->revId3_1, $this->textId3_1 ) = $this->addRevision( $page,
- "BackupDumperTestP3Text1", "BackupDumperTestP2Summary1" );
- list( $this->revId3_2, $this->textId3_2 ) = $this->addRevision( $page,
- "BackupDumperTestP3Text2", "BackupDumperTestP2Summary2" );
- $this->pageId3 = $page->getId();
- $page->doDeleteArticle( "Testing ;)" );
- $this->pageTitle4 = Title::newFromText( 'BackupDumperTestP1', $this->talk_namespace );
- $page = WikiPage::factory( $this->pageTitle4 );
- list( $this->revId4_1, $this->textId4_1 ) = $this->addRevision( $page,
- "Talk about BackupDumperTestP1 Text1",
- "Talk BackupDumperTestP1 Summary1" );
- $this->pageId4 = $page->getId();
- } catch ( Exception $e ) {
- // We'd love to pass $e directly. However, ... see
- // documentation of exceptionFromAddDBData in
- // DumpTestCase
- $this->exceptionFromAddDBData = $e;
- }
- }
- protected function setUp() {
- parent::setUp();
- // Since we will restrict dumping by page ranges (to allow
- // working tests, even if the db gets prepopulated by a base
- // class), we have to assert, that the page id are consecutively
- // increasing
- $this->assertEquals(
- [ $this->pageId2, $this->pageId3, $this->pageId4 ],
- [ $this->pageId1 + 1, $this->pageId2 + 1, $this->pageId3 + 1 ],
- "Page ids increasing without holes" );
- }
- function testFullTextPlain() {
- // Preparing the dump
- $fname = $this->getNewTempFile();
- $dumper = new DumpBackup();
- $dumper->loadWithArgv( [ '--full', '--quiet', '--output', 'file:' . $fname ] );
- $dumper->startId = $this->pageId1;
- $dumper->endId = $this->pageId4 + 1;
- $dumper->setDB( $this->db );
- // Performing the dump
- $dumper->execute();
- // Checking the dumped data
- $this->assertDumpStart( $fname );
- // Page 1
- $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
- $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
- $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87",
- "BackupDumperTestP1Text1" );
- $this->assertPageEnd();
- // Page 2
- $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
- $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
- $this->textId2_1, 23, "jprywrymfhysqllua29tj3sc7z39dl2",
- "BackupDumperTestP2Text1" );
- $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
- $this->textId2_2, 23, "b7vj5ks32po5m1z1t1br4o7scdwwy95",
- "BackupDumperTestP2Text2", $this->revId2_1 );
- $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
- $this->textId2_3, 23, "jfunqmh1ssfb8rs43r19w98k28gg56r",
- "BackupDumperTestP2Text3", $this->revId2_2 );
- $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
- $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv",
- "BackupDumperTestP2Text4 some additional Text", $this->revId2_3 );
- $this->assertPageEnd();
- // Page 3
- // -> Page is marked deleted. Hence not visible
- // Page 4
- $this->assertPageStart(
- $this->pageId4,
- $this->talk_namespace,
- $this->pageTitle4->getPrefixedText()
- );
- $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
- $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe",
- "Talk about BackupDumperTestP1 Text1" );
- $this->assertPageEnd();
- $this->assertDumpEnd();
- }
- function testFullStubPlain() {
- // Preparing the dump
- $fname = $this->getNewTempFile();
- $dumper = new DumpBackup();
- $dumper->loadWithArgv( [ '--full', '--quiet', '--output', 'file:' . $fname, '--stub' ] );
- $dumper->startId = $this->pageId1;
- $dumper->endId = $this->pageId4 + 1;
- $dumper->setDB( $this->db );
- // Performing the dump
- $dumper->execute();
- // Checking the dumped data
- $this->assertDumpStart( $fname );
- // Page 1
- $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
- $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
- $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
- $this->assertPageEnd();
- // Page 2
- $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
- $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
- $this->textId2_1, 23, "jprywrymfhysqllua29tj3sc7z39dl2" );
- $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
- $this->textId2_2, 23, "b7vj5ks32po5m1z1t1br4o7scdwwy95", false, $this->revId2_1 );
- $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
- $this->textId2_3, 23, "jfunqmh1ssfb8rs43r19w98k28gg56r", false, $this->revId2_2 );
- $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
- $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
- $this->assertPageEnd();
- // Page 3
- // -> Page is marked deleted. Hence not visible
- // Page 4
- $this->assertPageStart(
- $this->pageId4,
- $this->talk_namespace,
- $this->pageTitle4->getPrefixedText()
- );
- $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
- $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
- $this->assertPageEnd();
- $this->assertDumpEnd();
- }
- function testCurrentStubPlain() {
- // Preparing the dump
- $fname = $this->getNewTempFile();
- $dumper = new DumpBackup( [ '--output', 'file:' . $fname ] );
- $dumper->startId = $this->pageId1;
- $dumper->endId = $this->pageId4 + 1;
- $dumper->reporting = false;
- $dumper->setDB( $this->db );
- // Performing the dump
- $dumper->dump( WikiExporter::CURRENT, WikiExporter::STUB );
- // Checking the dumped data
- $this->assertDumpStart( $fname );
- // Page 1
- $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
- $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
- $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
- $this->assertPageEnd();
- // Page 2
- $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
- $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
- $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
- $this->assertPageEnd();
- // Page 3
- // -> Page is marked deleted. Hence not visible
- // Page 4
- $this->assertPageStart(
- $this->pageId4,
- $this->talk_namespace,
- $this->pageTitle4->getPrefixedText()
- );
- $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
- $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
- $this->assertPageEnd();
- $this->assertDumpEnd();
- }
- function testCurrentStubGzip() {
- $this->checkHasGzip();
- // Preparing the dump
- $fname = $this->getNewTempFile();
- $dumper = new DumpBackup( [ '--output', 'gzip:' . $fname ] );
- $dumper->startId = $this->pageId1;
- $dumper->endId = $this->pageId4 + 1;
- $dumper->reporting = false;
- $dumper->setDB( $this->db );
- // Performing the dump
- $dumper->dump( WikiExporter::CURRENT, WikiExporter::STUB );
- // Checking the dumped data
- $this->gunzip( $fname );
- $this->assertDumpStart( $fname );
- // Page 1
- $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
- $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
- $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
- $this->assertPageEnd();
- // Page 2
- $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
- $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
- $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
- $this->assertPageEnd();
- // Page 3
- // -> Page is marked deleted. Hence not visible
- // Page 4
- $this->assertPageStart(
- $this->pageId4,
- $this->talk_namespace,
- $this->pageTitle4->getPrefixedText()
- );
- $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
- $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
- $this->assertPageEnd();
- $this->assertDumpEnd();
- }
- /**
- * xmldumps-backup typically performs a single dump that that writes
- * out three files
- * - gzipped stubs of everything (meta-history)
- * - gzipped stubs of latest revisions of all pages (meta-current)
- * - gzipped stubs of latest revisions of all pages of namespage 0
- * (articles)
- *
- * We reproduce such a setup with our mini fixture, although we omit
- * chunks, and all the other gimmicks of xmldumps-backup.
- */
- function testXmlDumpsBackupUseCase() {
- $this->checkHasGzip();
- $fnameMetaHistory = $this->getNewTempFile();
- $fnameMetaCurrent = $this->getNewTempFile();
- $fnameArticles = $this->getNewTempFile();
- $dumper = new DumpBackup( [ "--full", "--stub", "--output=gzip:" . $fnameMetaHistory,
- "--output=gzip:" . $fnameMetaCurrent, "--filter=latest",
- "--output=gzip:" . $fnameArticles, "--filter=latest",
- "--filter=notalk", "--filter=namespace:!NS_USER",
- "--reporting=1000" ] );
- $dumper->startId = $this->pageId1;
- $dumper->endId = $this->pageId4 + 1;
- $dumper->setDB( $this->db );
- // xmldumps-backup uses reporting. We will not check the exact reported
- // message, as they are dependent on the processing power of the used
- // computer. We only check that reporting does not crash the dumping
- // and that something is reported
- $dumper->stderr = fopen( 'php://output', 'a' );
- if ( $dumper->stderr === false ) {
- $this->fail( "Could not open stream for stderr" );
- }
- // Performing the dump
- $dumper->dump( WikiExporter::FULL, WikiExporter::STUB );
- $this->assertTrue( fclose( $dumper->stderr ), "Closing stderr handle" );
- // Checking meta-history -------------------------------------------------
- $this->gunzip( $fnameMetaHistory );
- $this->assertDumpStart( $fnameMetaHistory );
- // Page 1
- $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
- $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
- $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
- $this->assertPageEnd();
- // Page 2
- $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
- $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
- $this->textId2_1, 23, "jprywrymfhysqllua29tj3sc7z39dl2" );
- $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
- $this->textId2_2, 23, "b7vj5ks32po5m1z1t1br4o7scdwwy95", false, $this->revId2_1 );
- $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
- $this->textId2_3, 23, "jfunqmh1ssfb8rs43r19w98k28gg56r", false, $this->revId2_2 );
- $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
- $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
- $this->assertPageEnd();
- // Page 3
- // -> Page is marked deleted. Hence not visible
- // Page 4
- $this->assertPageStart(
- $this->pageId4,
- $this->talk_namespace,
- $this->pageTitle4->getPrefixedText()
- );
- $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
- $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
- $this->assertPageEnd();
- $this->assertDumpEnd();
- // Checking meta-current -------------------------------------------------
- $this->gunzip( $fnameMetaCurrent );
- $this->assertDumpStart( $fnameMetaCurrent );
- // Page 1
- $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
- $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
- $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
- $this->assertPageEnd();
- // Page 2
- $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
- $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
- $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
- $this->assertPageEnd();
- // Page 3
- // -> Page is marked deleted. Hence not visible
- // Page 4
- $this->assertPageStart(
- $this->pageId4,
- $this->talk_namespace,
- $this->pageTitle4->getPrefixedText()
- );
- $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
- $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
- $this->assertPageEnd();
- $this->assertDumpEnd();
- // Checking articles -------------------------------------------------
- $this->gunzip( $fnameArticles );
- $this->assertDumpStart( $fnameArticles );
- // Page 1
- $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
- $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
- $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
- $this->assertPageEnd();
- // Page 2
- $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
- $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
- $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
- $this->assertPageEnd();
- // Page 3
- // -> Page is marked deleted. Hence not visible
- // Page 4
- // -> Page is not in $this->namespace. Hence not visible
- $this->assertDumpEnd();
- $this->expectETAOutput();
- }
- }
|