30 $update1 = $this->getMockBuilder( MergeableUpdate::class )
31 ->setMethods( [
'merge',
'doUpdate' ] )->getMock();
32 $update1->expects( $this->once() )->method(
'merge' );
33 $update1->expects( $this->never() )->method(
'doUpdate' );
35 $update2 = $this->getMockBuilder( MergeableUpdate::class )
36 ->setMethods( [
'merge',
'doUpdate' ] )->getMock();
37 $update2->expects( $this->never() )->method(
'merge' );
38 $update2->expects( $this->never() )->method(
'doUpdate' );
40 DeferredUpdates::addUpdate( $update1 );
41 DeferredUpdates::addUpdate( $update2 );
68 $pre = DeferredUpdates::PRESEND;
69 $post = DeferredUpdates::POSTSEND;
70 $all = DeferredUpdates::ALL;
72 $update = $this->getMock( DeferrableUpdate::class );
73 $update->expects( $this->never() )
74 ->method(
'doUpdate' );
76 DeferredUpdates::addUpdate( $update,
$pre );
77 $this->assertCount( 1, DeferredUpdates::getPendingUpdates(
$pre ) );
78 $this->assertCount( 0, DeferredUpdates::getPendingUpdates( $post ) );
79 $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $all ) );
80 $this->assertCount( 1, DeferredUpdates::getPendingUpdates() );
81 DeferredUpdates::clearPendingUpdates();
82 $this->assertCount( 0, DeferredUpdates::getPendingUpdates() );
84 DeferredUpdates::addUpdate( $update, $post );
85 $this->assertCount( 0, DeferredUpdates::getPendingUpdates(
$pre ) );
86 $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $post ) );
87 $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $all ) );
88 $this->assertCount( 1, DeferredUpdates::getPendingUpdates() );
89 DeferredUpdates::clearPendingUpdates();
90 $this->assertCount( 0, DeferredUpdates::getPendingUpdates() );
102 '1' =>
"deferred update 1;\n",
103 '2' =>
"deferred update 2;\n",
104 '2-1' =>
"deferred update 1 within deferred update 2;\n",
105 '2-2' =>
"deferred update 2 within deferred update 2;\n",
106 '3' =>
"deferred update 3;\n",
107 '3-1' =>
"deferred update 1 within deferred update 3;\n",
108 '3-2' =>
"deferred update 2 within deferred update 3;\n",
109 '3-1-1' =>
"deferred update 1 within deferred update 1 within deferred update 3;\n",
110 '3-2-1' =>
"deferred update 1 within deferred update 2 with deferred update 3;\n",
112 DeferredUpdates::addCallableUpdate(
113 function () use ( $updates ) {
117 DeferredUpdates::addCallableUpdate(
118 function () use ( $updates ) {
120 DeferredUpdates::addCallableUpdate(
121 function () use ( $updates ) {
122 echo $updates[
'2-1'];
125 DeferredUpdates::addCallableUpdate(
126 function () use ( $updates ) {
127 echo $updates[
'2-2'];
132 DeferredUpdates::addCallableUpdate(
133 function () use ( $updates ) {
135 DeferredUpdates::addCallableUpdate(
136 function () use ( $updates ) {
137 echo $updates[
'3-1'];
138 DeferredUpdates::addCallableUpdate(
139 function () use ( $updates ) {
140 echo $updates[
'3-1-1'];
145 DeferredUpdates::addCallableUpdate(
146 function () use ( $updates ) {
147 echo $updates[
'3-2'];
148 DeferredUpdates::addCallableUpdate(
149 function () use ( $updates ) {
150 echo $updates[
'3-2-1'];
158 $this->assertEquals( 3, DeferredUpdates::pendingUpdatesCount() );
160 $this->expectOutputString( implode(
'', $updates ) );
162 DeferredUpdates::doUpdates();
166 DeferredUpdates::addCallableUpdate(
167 function () use ( &$x ) {
170 DeferredUpdates::PRESEND
172 DeferredUpdates::addCallableUpdate(
173 function () use ( &$y ) {
176 DeferredUpdates::POSTSEND
179 $this->assertNull( $x,
"Update not run yet" );
180 $this->assertNull( $y,
"Update not run yet" );
182 DeferredUpdates::doUpdates(
'run', DeferredUpdates::PRESEND );
183 $this->assertEquals(
"Sherity", $x,
"PRESEND update ran" );
184 $this->assertNull( $y,
"POSTSEND update not run yet" );
186 DeferredUpdates::doUpdates(
'run', DeferredUpdates::POSTSEND );
187 $this->assertEquals(
"Marychu", $y,
"POSTSEND update ran" );
198 '1' =>
"deferred update 1;\n",
199 '2' =>
"deferred update 2;\n",
200 '2-1' =>
"deferred update 1 within deferred update 2;\n",
201 '2-2' =>
"deferred update 2 within deferred update 2;\n",
202 '3' =>
"deferred update 3;\n",
203 '3-1' =>
"deferred update 1 within deferred update 3;\n",
204 '3-2' =>
"deferred update 2 within deferred update 3;\n",
205 '3-1-1' =>
"deferred update 1 within deferred update 1 within deferred update 3;\n",
206 '3-2-1' =>
"deferred update 1 within deferred update 2 with deferred update 3;\n",
210 $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
211 $lbFactory->commitMasterChanges( __METHOD__ );
213 DeferredUpdates::addCallableUpdate(
214 function () use ( $updates ) {
218 DeferredUpdates::addCallableUpdate(
219 function () use ( $updates ) {
221 DeferredUpdates::addCallableUpdate(
222 function () use ( $updates ) {
223 echo $updates[
'2-1'];
226 DeferredUpdates::addCallableUpdate(
227 function () use ( $updates ) {
228 echo $updates[
'2-2'];
233 DeferredUpdates::addCallableUpdate(
234 function () use ( $updates ) {
236 DeferredUpdates::addCallableUpdate(
237 function () use ( $updates ) {
238 echo $updates[
'3-1'];
239 DeferredUpdates::addCallableUpdate(
240 function () use ( $updates ) {
241 echo $updates[
'3-1-1'];
246 DeferredUpdates::addCallableUpdate(
247 function () use ( $updates ) {
248 echo $updates[
'3-2'];
249 DeferredUpdates::addCallableUpdate(
250 function () use ( $updates ) {
251 echo $updates[
'3-2-1'];
259 $this->expectOutputString( implode(
'', $updates ) );
261 DeferredUpdates::doUpdates();
275 $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
276 $lbFactory->commitMasterChanges( __METHOD__ );
278 DeferredUpdates::addCallableUpdate(
279 function () use ( &$x, &$y ) {
281 DeferredUpdates::addCallableUpdate(
282 function () use ( &$y ) {
285 DeferredUpdates::PRESEND
288 DeferredUpdates::POSTSEND
291 DeferredUpdates::doUpdates();
293 $this->assertTrue( $x,
"Outer POSTSEND update ran" );
294 $this->assertTrue( $y,
"Nested PRESEND update ran" );
303 $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
304 $this->assertFalse( $lbFactory->hasTransactionRound(),
'Initial state' );
307 DeferredUpdates::addCallableUpdate(
function () use ( &$ran, $lbFactory ) {
309 $this->assertTrue( $lbFactory->hasTransactionRound(),
'Has transaction' );
311 DeferredUpdates::doUpdates();
313 $this->assertSame( 1, $ran,
'Update ran' );
314 $this->assertFalse( $lbFactory->hasTransactionRound(),
'Final state' );
324 $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
325 $this->assertFalse( $lbFactory->hasTransactionRound(),
'Initial state' );
329 function () use ( &$ran, $lbFactory ) {
331 $this->assertFalse( $lbFactory->hasTransactionRound(),
'No transaction' );
334 DeferredUpdates::doUpdates();
336 $this->assertSame( 1, $ran,
'Update ran' );