@@ -529,6 +529,7 @@ TEST_F(TestCanTransport, sending_multiframe_payload_for_non_anonymous)
529
529
530
530
constexpr auto timeout = 1s;
531
531
532
+ // MTU size makes sure that 2 frames are needed - hence "multi-frame".
532
533
const auto payload = makeIotaArray<CANARD_MTU_CAN_CLASSIC>(b (' 0' ));
533
534
TransferTxMetadata metadata{{0x13 , Priority::Nominal}, {}};
534
535
@@ -537,6 +538,7 @@ TEST_F(TestCanTransport, sending_multiframe_payload_for_non_anonymous)
537
538
538
539
scheduler_.scheduleAt (1s, [&](const auto &) {
539
540
//
541
+ // Expect 1st frame pushing.
540
542
EXPECT_CALL (media_mock_, push (_, _, _)).WillOnce ([&](auto deadline, auto can_id, auto & pld) {
541
543
EXPECT_THAT (now (), metadata.deadline - timeout);
542
544
EXPECT_THAT (deadline, metadata.deadline );
@@ -549,15 +551,19 @@ TEST_F(TestCanTransport, sending_multiframe_payload_for_non_anonymous)
549
551
});
550
552
EXPECT_CALL (media_mock_, registerPushCallback (_)) //
551
553
.WillOnce (Invoke ([&](auto function) { //
552
- return scheduler_.registerAndScheduleNamedCallback (" " , now () + 10us, std::move (function));
554
+ return scheduler_.registerAndScheduleNamedCallback (" tx " , now () + 10us, std::move (function));
553
555
}));
554
556
557
+ // There was never any TX yet, so no callback should be registered.
558
+ EXPECT_FALSE (scheduler_.hasNamedCallback (" tx" ));
559
+
555
560
metadata.deadline = now () + timeout;
556
561
auto failure = session->send (metadata, makeSpansFrom (payload));
557
562
EXPECT_THAT (failure, Eq (cetl::nullopt));
558
563
});
559
564
scheduler_.scheduleAt (1s + 10us, [&](const auto &) {
560
565
//
566
+ // Expect 2nd frame pushing.
561
567
EXPECT_CALL (media_mock_, push (_, _, _)).WillOnce ([&](auto deadline, auto can_id, auto & pld) {
562
568
EXPECT_THAT (now (), metadata.deadline - timeout + 10us);
563
569
EXPECT_THAT (deadline, metadata.deadline );
@@ -569,6 +575,19 @@ TEST_F(TestCanTransport, sending_multiframe_payload_for_non_anonymous)
569
575
return IMedia::PushResult::Success{true /* is_accepted */ };
570
576
});
571
577
});
578
+ scheduler_.scheduleAt (1s + 20us, [&](const auto &) {
579
+ //
580
+ // Callback is still there b/c the 2nd frame was pushed.
581
+ ASSERT_TRUE (scheduler_.hasNamedCallback (" tx" ));
582
+
583
+ // Emulate that media done with the 2nd frame - this should remove the callback b/c TX queue is empty.
584
+ scheduler_.scheduleNamedCallback (" tx" , now ());
585
+ });
586
+ scheduler_.scheduleAt (1s + 20us + 1us, [&](const auto &) {
587
+ //
588
+ // TX pipeline encountered an empty queue - hence the callback should be dropped.
589
+ EXPECT_FALSE (scheduler_.hasNamedCallback (" tx" ));
590
+ });
572
591
scheduler_.spinFor (10s);
573
592
}
574
593
0 commit comments