1 #pragma once 2 #include <memory> 3 4 struct alarm_t; 5 6 class AlarmMock { 7 public: 8 MOCK_METHOD1(AlarmNew, alarm_t*(const char*)); 9 MOCK_METHOD1(AlarmFree, void(alarm_t*)); 10 MOCK_METHOD1(AlarmCancel, void(alarm_t*)); 11 MOCK_METHOD4(AlarmSetOnMloop, void(alarm_t* alarm, uint64_t interval_ms, 12 alarm_callback_t cb, void* data)); 13 14 alarm_t* AlarmNewImpl(const char* name) { 15 AlarmNew(name); 16 // We must return something from alarm_new in tests, if we just return null, 17 // unique_ptr will misbehave. Just reserve few bits they will be freed in 18 // AlarmFreeImpl 19 return (alarm_t*)new uint8_t[30]; 20 } 21 22 void AlarmFreeImpl(alarm_t* alarm) { 23 uint8_t* ptr = (uint8_t*)alarm; 24 delete[] ptr; 25 return AlarmFree(alarm); 26 } 27 28 static inline AlarmMock* Get() { 29 if (!localAlarmMock) { 30 localAlarmMock = std::make_unique<AlarmMock>(); 31 } 32 return localAlarmMock.get(); 33 } 34 35 static inline void Reset() { localAlarmMock = std::make_unique<AlarmMock>(); } 36 37 private: 38 static std::unique_ptr<AlarmMock> localAlarmMock; 39 }; 40 41 std::unique_ptr<AlarmMock> AlarmMock::localAlarmMock; 42 43 alarm_t* alarm_new(const char* name) { 44 return AlarmMock::Get()->AlarmNewImpl(name); 45 } 46 47 void alarm_free(alarm_t* alarm) { AlarmMock::Get()->AlarmFreeImpl(alarm); } 48 49 void alarm_set_on_mloop(alarm_t* alarm, uint64_t interval_ms, 50 alarm_callback_t cb, void* data) { 51 AlarmMock::Get()->AlarmSetOnMloop(alarm, interval_ms, cb, data); 52 } 53