@@ -204,6 +204,67 @@ public function testCheckpointSavedInBrokenLoop()
204
204
$ this ->assertEquals (self ::makeDateTime ('22:13:00 ' ), $ checkpoint ->time ());
205
205
}
206
206
207
+ public function testCheckpointSavedInBigBrokenLoop ()
208
+ {
209
+ $ clock = new MockClock (self ::makeDateTime ('22:15:00 ' ));
210
+
211
+ $ message = RecurringMessage::every ('1 minute ' , (object ) ['id ' => 'message ' ]);
212
+ $ schedule = (new Schedule ())->add ($ message );
213
+
214
+ $ cache = new ArrayAdapter ();
215
+ $ schedule ->stateful ($ cache );
216
+ $ checkpoint = new Checkpoint ('dummy ' , cache: $ cache );
217
+
218
+ $ scheduler = new MessageGenerator ($ schedule , 'dummy ' , clock: $ clock , checkpoint: $ checkpoint );
219
+
220
+ // Warmup. The first run is always returns nothing.
221
+ $ this ->assertSame ([], iterator_to_array ($ scheduler ->getMessages (), false ));
222
+ $ this ->assertEquals (self ::makeDateTime ('22:15:00 ' ), $ checkpoint ->time ());
223
+
224
+ $ clock ->sleep (60 + 10 ); // 22:16:10
225
+
226
+ $ this ->assertCount (1 , iterator_to_array ($ scheduler ->getMessages (), false ));
227
+
228
+ $ clock ->sleep (2 * 60 ); // 22:18:10
229
+
230
+ $ this ->assertCount (2 , iterator_to_array ($ scheduler ->getMessages (), false ));
231
+
232
+ $ clock ->sleep (5 * 60 ); // 22:23:10
233
+
234
+ $ this ->assertCount (5 , iterator_to_array ($ scheduler ->getMessages (), false ));
235
+
236
+ $ this ->assertEquals (self ::makeDateTime ('22:23:00 ' ), $ checkpoint ->time ());
237
+ }
238
+
239
+ public function testCheckpointSavedInBigBrokenLoopWithOnlyLastMissed ()
240
+ {
241
+ $ clock = new MockClock (self ::makeDateTime ('22:15:00 ' ));
242
+
243
+ $ message = RecurringMessage::every ('1 minute ' , (object ) ['id ' => 'message ' ]);
244
+ $ schedule = (new Schedule ())->add ($ message );
245
+
246
+ $ cache = new ArrayAdapter ();
247
+ $ schedule ->stateful ($ cache )->processOnlyLastMissedRun (true );
248
+ $ checkpoint = new Checkpoint ('dummy ' , cache: $ cache );
249
+
250
+ $ scheduler = new MessageGenerator ($ schedule , 'dummy ' , clock: $ clock , checkpoint: $ checkpoint );
251
+
252
+ // Warmup. The first run is always returns nothing.
253
+ $ this ->assertSame ([], iterator_to_array ($ scheduler ->getMessages (), false ));
254
+ $ this ->assertEquals (self ::makeDateTime ('22:15:00 ' ), $ clock ->now ());
255
+
256
+ $ clock ->sleep (60 + 10 ); // 22:16:10
257
+ $ this ->assertCount (1 , iterator_to_array ($ scheduler ->getMessages (), false ));
258
+
259
+ $ clock ->sleep (2 * 60 ); // 22:18:10
260
+ $ this ->assertCount (1 , iterator_to_array ($ scheduler ->getMessages (), false ));
261
+
262
+ $ clock ->sleep (5 * 60 ); // 22:23:10
263
+ $ this ->assertCount (1 , iterator_to_array ($ scheduler ->getMessages (), false ));
264
+
265
+ $ this ->assertEquals (self ::makeDateTime ('22:23:10 ' ), $ clock ->now ());
266
+ }
267
+
207
268
public static function messagesProvider (): \Generator
208
269
{
209
270
$ first = (object ) ['id ' => 'first ' ];
0 commit comments