Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F585003
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/tests/phpunit/maintenance/CopyJobQueueTest.php b/tests/phpunit/maintenance/CopyJobQueueTest.php
new file mode 100644
index 00000000000..0b95461f136
--- /dev/null
+++ b/tests/phpunit/maintenance/CopyJobQueueTest.php
@@ -0,0 +1,154 @@
+<?php
+
+namespace MediaWiki\Tests\Maintenance;
+
+use CopyJobQueue;
+use MediaWiki\JobQueue\JobQueueDB;
+use MediaWiki\JobQueue\JobQueueMemory;
+use MediaWiki\JobQueue\Jobs\NullJob;
+use Wikimedia\TestingAccessWrapper;
+
+/**
+ * @covers \CopyJobQueue
+ * @group Database
+ * @author Dreamy Jazz
+ */
+class CopyJobQueueTest extends MaintenanceBaseTestCase {
+
+ protected function getMaintenanceClass() {
+ return CopyJobQueue::class;
+ }
+
+ /** @dataProvider provideExecuteForFatalError */
+ public function testExecuteForFatalError( $jobQueueMigrationConfig, $options, $expectedOutputRegex ) {
+ $this->overrideConfigValue( 'JobQueueMigrationConfig', $jobQueueMigrationConfig );
+ foreach ( $options as $name => $value ) {
+ $this->maintenance->setOption( $name, $value );
+ }
+ $this->expectOutputRegex( $expectedOutputRegex );
+ $this->expectCallToFatalError();
+ $this->maintenance->execute();
+ }
+
+ public static function provideExecuteForFatalError() {
+ return [
+ 'Job queue migration config empty' => [
+ [], [ 'src' => 'source', 'dst' => 'dest' ], "/wgJobQueueMigrationConfig not set for 'source'/",
+ ],
+ 'Job queue migration config set but src does not match' => [
+ [ 'source' => 'test', 'dest' => 'test' ], [ 'src' => 'abcd', 'dst' => 'dest' ],
+ "/wgJobQueueMigrationConfig not set for 'abcd'/",
+ ],
+ 'Job queue migration config set but dst does not match' => [
+ [ 'source' => 'test', 'dest' => 'test' ], [ 'src' => 'source', 'dst' => 'abc' ],
+ "/wgJobQueueMigrationConfig not set for 'abc'/",
+ ],
+ ];
+ }
+
+ /**
+ * Sets the job queue migration configuration to move jobs from a memory based queue to a DB based queue,
+ * along with setting the job queue configuration to be memory based (to allow inserting test jobs to migrate).
+ *
+ * This also sets the maintenance script options to be in-line with the migration config.
+ *
+ * @return void
+ */
+ private function setMigrationConfig() {
+ $this->overrideConfigValue( 'JobTypeConf', [
+ 'default' => [ 'class' => JobQueueMemory::class ],
+ ] );
+ $this->overrideConfigValue( 'JobQueueMigrationConfig', [
+ 'source' => [
+ 'class' => JobQueueMemory::class,
+ 'idGenerator' => $this->getServiceContainer()->getGlobalIdGenerator(),
+ ],
+ 'dest' => [
+ 'class' => JobQueueDB::class, 'idGenerator' => $this->getServiceContainer()->getGlobalIdGenerator(),
+ ],
+ ] );
+ $this->maintenance->setOption( 'src', 'source' );
+ $this->maintenance->setOption( 'dst', 'dest' );
+ }
+
+ public function testExecuteWhenNoJobsPresent() {
+ $this->setMigrationConfig();
+
+ $this->maintenance->setOption( 'type', 'all' );
+ $this->maintenance->execute();
+
+ // Check that all jobs were copied by checking a subset of jobs defined by MediaWiki core are in the output.
+ $actualOutput = $this->getActualOutputForAssertion();
+ $this->assertStringContainsString( 'Copied 0/0 queued null jobs', $actualOutput );
+ $this->assertStringContainsString( 'Copied 0/0 delayed null jobs', $actualOutput );
+ $this->assertStringContainsString( 'Copied 0/0 queued categoryMembershipChange jobs', $actualOutput );
+ $this->assertStringContainsString( 'Copied 0/0 delayed categoryMembershipChange jobs', $actualOutput );
+ }
+
+ public function testExecuteWhenJobsPresentButTypeDoesNotMatch() {
+ $this->setMigrationConfig();
+
+ // Add a 'null' job to the in memory queue
+ $nullJobQueueGroup = $this->getServiceContainer()->getJobQueueGroup()->get( 'null' );
+ $nullJobQueueGroup->push( new NullJob( [] ) );
+
+ $this->maintenance->setOption( 'type', 'categoryMembershipChange' );
+ $this->maintenance->execute();
+
+ // Check that no jobs were copied as the only jobs existing did not match the specified type.
+ $actualOutput = $this->getActualOutputForAssertion();
+ $this->assertStringContainsString( 'Copied 0/0 queued categoryMembershipChange jobs', $actualOutput );
+ $this->assertStringContainsString( 'Copied 0/0 delayed categoryMembershipChange jobs', $actualOutput );
+ }
+
+ /** @dataProvider provideBatchSizeValues */
+ public function testExecuteWhenJobsPresentAndCopied( $batchSize ) {
+ $this->setMigrationConfig();
+
+ // Add two 'null' jobs to the in memory queue
+ $nullJobQueueGroup = $this->getServiceContainer()->getJobQueueGroup()->get( 'null' );
+ $nullJobQueueGroup->push( new NullJob( [] ) );
+ $nullJobQueueGroup->push( new NullJob( [] ) );
+
+ // Check that the above jobs were inserted to memory and not the DB. This is needed so that we can
+ // assert that the jobs appear in the DB table after the maintenance script has been run.
+ $this->newSelectQueryBuilder()
+ ->select( 'COUNT(*)' )
+ ->from( 'job' )
+ ->caller( __METHOD__ )
+ ->assertFieldValue( 0 );
+
+ // Run the script. We use a local variable to reference the object as $this->maintenance does not indicate
+ // that the type of the object is TestingAccessWrapper (so will cause errors in IDEs).
+ /** @var TestingAccessWrapper $maintenance */
+ $maintenance = $this->maintenance;
+ $maintenance->setBatchSize( $batchSize );
+ $maintenance->setOption( 'type', 'null' );
+ $maintenance->execute();
+
+ // Check that the jobs now exist in the DB and were marked as copied in the output.
+ $actualOutput = $this->getActualOutputForAssertion();
+ $this->assertStringContainsString( 'Copied 2/2 queued null jobs', $actualOutput );
+ $this->assertStringContainsString( 'Copied 0/0 delayed null jobs', $actualOutput );
+
+ $this->newSelectQueryBuilder()
+ ->select( 'COUNT(*)' )
+ ->from( 'job' )
+ ->where( [ 'job_cmd' => 'null' ] )
+ ->caller( __METHOD__ )
+ ->assertFieldValue( 2 );
+
+ // Finally, run the jobs using the DB job queue configuration to ensure that the move did not corrupt the jobs.
+ $this->overrideConfigValue( 'JobTypeConf', [
+ 'default' => [ 'class' => JobQueueDB::class ],
+ ] );
+ $this->runJobs( [ 'minJobs' => 2 ] );
+ }
+
+ public static function provideBatchSizeValues() {
+ return [
+ 'Batch size of 1' => [ 1 ],
+ 'Batch size of 10' => [ 10 ],
+ ];
+ }
+}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sat, Jul 5, 5:31 AM (11 h, 44 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
227463
Default Alt Text
(6 KB)
Attached To
Mode
rMW mediawiki
Attached
Detach File
Event Timeline
Log In to Comment