Fix simulation sent_time and add a test
It was hard-coded to the actual monotonic_clock::now() call, which
doesn't work well with actual simulation when you don't use fake time.
And we want to kill fake time.
Change-Id: If5785679d54100e5021bea86df763d98d44f7c3d
diff --git a/aos/events/simulated-event-loop.h b/aos/events/simulated-event-loop.h
index b5c94bf..9a0aa6e 100644
--- a/aos/events/simulated-event-loop.h
+++ b/aos/events/simulated-event-loop.h
@@ -95,7 +95,7 @@
void Exit() { is_running_ = false; }
- ::aos::monotonic_clock::time_point now() { return now_; }
+ ::aos::monotonic_clock::time_point monotonic_now() const { return now_; }
private:
::aos::monotonic_clock::time_point now_ = ::aos::monotonic_clock::epoch();
@@ -109,17 +109,18 @@
EventScheduler *scheduler)
: type_(type), name_(name), scheduler_(scheduler){};
- std::unique_ptr<RawSender> MakeRawSender();
+ ::std::unique_ptr<RawSender> MakeRawSender(EventLoop *event_loop);
- std::unique_ptr<RawFetcher> MakeRawFetcher();
+ ::std::unique_ptr<RawFetcher> MakeRawFetcher();
- void MakeRawWatcher(std::function<void(const aos::Message *message)> watcher);
+ void MakeRawWatcher(
+ ::std::function<void(const ::aos::Message *message)> watcher);
void Send(RefCountedBuffer message) {
index_++;
latest_message_ = message;
for (auto &watcher : watchers_) {
- scheduler_->Schedule(scheduler_->now(),
+ scheduler_->Schedule(scheduler_->monotonic_now(),
[watcher, message]() { watcher(message.get()); });
}
}
@@ -141,116 +142,21 @@
EventScheduler *scheduler_;
};
-class SimulatedTimerHandler : public TimerHandler {
- public:
- explicit SimulatedTimerHandler(EventScheduler *scheduler,
- ::std::function<void()> fn)
- : scheduler_(scheduler), fn_(fn) {}
- ~SimulatedTimerHandler() {}
-
- void Setup(monotonic_clock::time_point base,
- monotonic_clock::duration repeat_offset) override {
- Disable();
- auto now = scheduler_->now();
- base_ = base;
- repeat_offset_ = repeat_offset;
- if (base < now) {
- token_ = scheduler_->Schedule(now, [this]() { HandleEvent(); });
- } else {
- token_ = scheduler_->Schedule(base, [this]() { HandleEvent(); });
- }
- }
-
- void HandleEvent() {
- auto now = scheduler_->now();
- if (repeat_offset_ != ::aos::monotonic_clock::zero()) {
- // Reschedule.
- while (base_ <= now) base_ += repeat_offset_;
- token_ = scheduler_->Schedule(base_, [this]() { HandleEvent(); });
- } else {
- token_ = EventScheduler::Token();
- }
- fn_();
- }
-
- void Disable() override {
- if (token_ != EventScheduler::Token()) {
- scheduler_->Deschedule(token_);
- token_ = EventScheduler::Token();
- }
- }
-
- private:
- EventScheduler *scheduler_;
- EventScheduler::Token token_;
- // Function to be run on the thread
- ::std::function<void()> fn_;
- monotonic_clock::time_point base_;
- monotonic_clock::duration repeat_offset_;
-};
-
-class SimulatedEventLoop : public EventLoop {
- public:
- explicit SimulatedEventLoop(
- EventScheduler *scheduler,
- ::std::map<::std::pair<::std::string, QueueTypeInfo>, SimulatedQueue>
- *queues) : scheduler_(scheduler), queues_(queues){};
- ~SimulatedEventLoop() override{};
-
- ::aos::monotonic_clock::time_point monotonic_now() override {
- return scheduler_->now();
- }
-
- std::unique_ptr<RawSender> MakeRawSender(const std::string &path,
- const QueueTypeInfo &type) override;
-
- std::unique_ptr<RawFetcher> MakeRawFetcher(
- const std::string &path, const QueueTypeInfo &type) override;
-
- void MakeRawWatcher(
- const std::string &path, const QueueTypeInfo &type,
- std::function<void(const aos::Message *message)> watcher) override;
-
- TimerHandler *AddTimer(::std::function<void()> callback) override {
- timers_.emplace_back(new SimulatedTimerHandler(scheduler_, callback));
- return timers_.back().get();
- }
-
- void OnRun(std::function<void()> on_run) override {
- scheduler_->Schedule(scheduler_->now(), on_run);
- }
- void Run() override {
- set_is_running(true);
- scheduler_->Run();
- }
- void Exit() override {
- set_is_running(false);
- scheduler_->Exit();
- }
-
- SimulatedQueue *GetSimulatedQueue(
- const ::std::pair<::std::string, QueueTypeInfo> &);
-
- void Take(const ::std::string &path);
-
- private:
- EventScheduler *scheduler_;
- ::std::map<::std::pair<::std::string, QueueTypeInfo>, SimulatedQueue>
- *queues_;
- ::std::vector<std::string> taken_;
- ::std::vector<std::unique_ptr<TimerHandler>> timers_;
-};
-
class SimulatedEventLoopFactory {
public:
- ::std::unique_ptr<EventLoop> CreateEventLoop() {
- return ::std::unique_ptr<EventLoop>(
- new SimulatedEventLoop(&scheduler_, &queues_));
+ ::std::unique_ptr<EventLoop> MakeEventLoop();
+
+ void Run() { scheduler_.Run(); }
+
+ monotonic_clock::time_point monotonic_now() const {
+ return scheduler_.monotonic_now();
}
private:
EventScheduler scheduler_;
::std::map<::std::pair<::std::string, QueueTypeInfo>, SimulatedQueue> queues_;
};
+
} // namespace aos
+
#endif //_AOS_EVENTS_TEST_EVENT_LOOP_H_