namespace folly {
+/**
+ * A class for tracking time durations in test code.
+ *
+ * This is primarily useful for testing timeout functionality. When comparing
+ * the differences between two TimePoints, it can exclude time spent waiting on
+ * the OS scheduler. This helps avoid spurious test failures when timeouts are
+ * exceeded by longer than expected simply because the underlying system was
+ * busy and could not schedule this thread in time.
+ */
class TimePoint {
public:
explicit TimePoint(bool set = true)
timeWaiting_.count() == 0);
}
- std::chrono::system_clock::time_point getTime() const {
+ std::chrono::steady_clock::time_point getTime() const {
return timeStart_;
}
- std::chrono::system_clock::time_point getTimeStart() const {
+ std::chrono::steady_clock::time_point getTimeStart() const {
return timeStart_;
}
- std::chrono::system_clock::time_point getTimeEnd() const {
+ std::chrono::steady_clock::time_point getTimeEnd() const {
return timeStart_;
}
- std::chrono::milliseconds getTimeWaiting() const {
+ std::chrono::nanoseconds getTimeWaiting() const {
return timeWaiting_;
}
}
private:
- std::chrono::system_clock::time_point timeStart_;
- std::chrono::system_clock::time_point timeEnd_;
- std::chrono::milliseconds timeWaiting_{0};
+ std::chrono::steady_clock::time_point timeStart_;
+ std::chrono::steady_clock::time_point timeEnd_;
+ std::chrono::nanoseconds timeWaiting_{0};
pid_t tid_;
};
std::ostream& operator<<(std::ostream& os, const TimePoint& timePoint);
-bool checkTimeout(const TimePoint& start,
- const TimePoint& end,
- std::chrono::milliseconds expectedMS,
- bool allowSmaller,
- std::chrono::milliseconds tolerance =
- std::chrono::milliseconds(5));
-
+bool checkTimeout(
+ const TimePoint& start,
+ const TimePoint& end,
+ std::chrono::nanoseconds expected,
+ bool allowSmaller,
+ std::chrono::nanoseconds tolerance = std::chrono::milliseconds(5));
}