@@ -204,6 +204,67 @@ public function testCheckpointSavedInBrokenLoop()
204204 $ this ->assertEquals (self ::makeDateTime ('22:13:00 ' ), $ checkpoint ->time ());
205205 }
206206
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+
207268 public static function messagesProvider (): \Generator
208269 {
209270 $ first = (object ) ['id ' => 'first ' ];
0 commit comments