diff --git a/libuavcan/test/common.hpp b/libuavcan/test/common.hpp index b3b9ab67cc..cafc0b50c3 100644 --- a/libuavcan/test/common.hpp +++ b/libuavcan/test/common.hpp @@ -11,15 +11,17 @@ class SystemClockMock : public uavcan::ISystemClock { public: - uint64_t monotonic; - uint64_t utc; + mutable uint64_t monotonic; + mutable uint64_t utc; + int64_t monotonic_auto_advance; SystemClockMock(uint64_t initial = 0) : monotonic(initial) , utc(initial) + , monotonic_auto_advance(0) { } - void advance(uint64_t usec) + void advance(uint64_t usec) const { monotonic += usec; utc += usec; @@ -28,7 +30,9 @@ public: uint64_t getMonotonicMicroseconds() const { assert(this); - return monotonic; + const uint64_t res = monotonic; + advance(monotonic_auto_advance); + return res; } uint64_t getUtcMicroseconds() const diff --git a/libuavcan/test/transport/dispatcher.cpp b/libuavcan/test/transport/dispatcher.cpp index 735a692fb8..87441bed14 100644 --- a/libuavcan/test/transport/dispatcher.cpp +++ b/libuavcan/test/transport/dispatcher.cpp @@ -221,3 +221,26 @@ TEST(Dispatcher, Transmission) ASSERT_TRUE(driver.ifaces.at(0).tx.empty()); ASSERT_TRUE(driver.ifaces.at(1).tx.empty()); } + + +TEST(Dispatcher, Spin) +{ + uavcan::PoolManager<1> poolmgr; + + SystemClockMock clockmock(100); + CanDriverMock driver(2, clockmock); + + uavcan::OutgoingTransferRegistry<8> out_trans_reg(&poolmgr); + + uavcan::Dispatcher dispatcher(&driver, &poolmgr, &clockmock, &out_trans_reg, SELF_NODE_ID); + + clockmock.monotonic_auto_advance = 100; + + ASSERT_EQ(100, clockmock.monotonic); + ASSERT_EQ(0, dispatcher.spin(1000)); + ASSERT_LE(1000, clockmock.monotonic); + ASSERT_EQ(0, dispatcher.spin(0)); + ASSERT_LE(1000, clockmock.monotonic); + ASSERT_EQ(0, dispatcher.spin(1100)); + ASSERT_LE(1100, clockmock.monotonic); +}