global $wgJobTypeConf;
parent::setUp();
- $this->setMwGlobals( 'wgMemc', new HashBagOStuff() );
-
- if ( $this->getCliArg( 'use-jobqueue=' ) ) {
- $name = $this->getCliArg( 'use-jobqueue=' );
+ if ( $this->getCliArg( 'use-jobqueue' ) ) {
+ $name = $this->getCliArg( 'use-jobqueue' );
if ( !isset( $wgJobTypeConf[$name] ) ) {
throw new MWException( "No \$wgJobTypeConf entry for '$name'." );
}
$queue->flushCaches();
if ( $recycles ) {
$this->assertEquals( 1, $queue->getAcquiredCount(), "Active job count ($desc)" );
- } else {
- $this->assertEquals( 0, $queue->getAcquiredCount(), "Active job count ($desc)" );
}
$job2 = $queue->pop();
$queue->flushCaches();
if ( $recycles ) {
$this->assertEquals( 2, $queue->getAcquiredCount(), "Active job count ($desc)" );
- } else {
- $this->assertEquals( 0, $queue->getAcquiredCount(), "Active job count ($desc)" );
}
$queue->ack( $job1 );
$queue->flushCaches();
if ( $recycles ) {
$this->assertEquals( 1, $queue->getAcquiredCount(), "Active job count ($desc)" );
- } else {
- $this->assertEquals( 0, $queue->getAcquiredCount(), "Active job count ($desc)" );
}
$queue->ack( $job2 );
$this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
if ( $recycles ) {
$this->assertEquals( 1, $queue->getAcquiredCount(), "Active job count ($desc)" );
- } else {
- $this->assertEquals( 0, $queue->getAcquiredCount(), "Active job count ($desc)" );
}
$queue->ack( $job1 );
$this->assertEquals( 0, $queue->getAcquiredCount(), "Active job count ($desc)" );
}
+ /**
+ * @dataProvider provider_queueLists
+ * @covers JobQueue
+ */
+ public function testDeduplicationWhileClaimed( $queue, $recycles, $desc ) {
+ $queue = $this->$queue;
+ if ( !$queue ) {
+ $this->markTestSkipped( $desc );
+ }
+
+ $job = $this->newDedupedJob();
+ $queue->push( $job );
+
+ // De-duplication does not apply to already-claimed jobs
+ $j = $queue->pop();
+ $queue->push( $job );
+ $queue->ack( $j );
+
+ $j = $queue->pop();
+ // Make sure ack() of the twin did not delete the sibling data
+ $this->assertType( 'NullJob', $j );
+ }
+
/**
* @dataProvider provider_queueLists
* @covers JobQueue
$this->assertNull( $queue->push( $this->newJob( 0, $root1 ) ), "Push worked ($desc)" );
}
$queue->deduplicateRootJob( $this->newJob( 0, $root1 ) );
- sleep( 1 ); // roo job timestamp will increase
- $root2 = Job::newRootJobParams( "nulljobspam:$id" ); // task ID/timestamp
+
+ $root2 = $root1;
+ # Add a second to UNIX epoch and format back to TS_MW
+ $root2_ts = strtotime( $root2['rootJobTimestamp'] );
+ $root2_ts++;
+ $root2['rootJobTimestamp'] = wfTimestamp( TS_MW, $root2_ts );
+
$this->assertNotEquals( $root1['rootJobTimestamp'], $root2['rootJobTimestamp'],
"Root job signatures have different timestamps." );
for ( $i = 0; $i < 5; ++$i ) {
$this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
}
+ /**
+ * @covers JobQueue
+ */
+ public function testQueueAggregateTable() {
+ $queue = $this->queueFifo;
+ if ( !$queue || !method_exists( $queue, 'getServerQueuesWithJobs' ) ) {
+ $this->markTestSkipped();
+ }
+
+ $this->assertArrayEquals( array(), $queue->getServerQueuesWithJobs() );
+
+ $queue->push( $this->newJob( 0 ) );
+
+ $this->assertArrayEquals(
+ array( array( $queue->getType(), $queue->getWiki() ) ),
+ $queue->getServerQueuesWithJobs()
+ );
+ }
+
public static function provider_queueLists() {
return array(
array( 'queueRand', false, 'Random queue without ack()' ),