| Index: webrtc/base/timeutils_unittest.cc
|
| diff --git a/webrtc/base/timeutils_unittest.cc b/webrtc/base/timeutils_unittest.cc
|
| index d1b9ad4f967c220a1274483d3fb8f8ccd42c41bd..688658b32f71356b11570a14a2fe5a7b635b50c2 100644
|
| --- a/webrtc/base/timeutils_unittest.cc
|
| +++ b/webrtc/base/timeutils_unittest.cc
|
| @@ -10,6 +10,7 @@
|
|
|
| #include "webrtc/base/common.h"
|
| #include "webrtc/base/gunit.h"
|
| +#include "webrtc/base/helpers.h"
|
| #include "webrtc/base/thread.h"
|
| #include "webrtc/base/timeutils.h"
|
|
|
| @@ -166,4 +167,99 @@ TEST_F(TimestampWrapAroundHandlerTest, Unwrap) {
|
| EXPECT_EQ(unwrapped_ts, wraparound_handler_.Unwrap(ts));
|
| }
|
|
|
| +class TmToSeconds : public testing::Test {
|
| + public:
|
| + TmToSeconds() {
|
| + // Set use of the test RNG to get deterministic expiration timestamp.
|
| + rtc::SetRandomTestMode(true);
|
| + }
|
| + ~TmToSeconds() {
|
| + // Put it back for the next test.
|
| + rtc::SetRandomTestMode(false);
|
| + }
|
| +
|
| + void TestTmToSeconds(int times) {
|
| + static char mdays[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
|
| + for (int i = 0; i < times; i++) {
|
| +
|
| + // First generate something correct and check that TmToSeconds is happy.
|
| + int year = rtc::CreateRandomId() % 400 + 1970;
|
| +
|
| + bool leap_year = false;
|
| + if (year % 4 == 0)
|
| + leap_year = true;
|
| + if (year % 100 == 0)
|
| + leap_year = false;
|
| + if (year % 400 == 0)
|
| + leap_year = true;
|
| +
|
| + std::tm tm;
|
| + tm.tm_year = year - 1900; // std::tm is year 1900 based.
|
| + tm.tm_mon = rtc::CreateRandomId() % 12;
|
| + tm.tm_mday = rtc::CreateRandomId() % mdays[tm.tm_mon] + 1;
|
| + tm.tm_hour = rtc::CreateRandomId() % 24;
|
| + tm.tm_min = rtc::CreateRandomId() % 60;
|
| + tm.tm_sec = rtc::CreateRandomId() % 60;
|
| + int64_t t = rtc::TmToSeconds(tm);
|
| + EXPECT_TRUE(t >= 0);
|
| +
|
| + // Now damage a random field and check that TmToSeconds is unhappy.
|
| + switch (rtc::CreateRandomId() % 11) {
|
| + case 0:
|
| + tm.tm_year = 1969 - 1900;
|
| + break;
|
| + case 1:
|
| + tm.tm_mon = -1;
|
| + break;
|
| + case 2:
|
| + tm.tm_mon = 12;
|
| + break;
|
| + case 3:
|
| + tm.tm_mday = 0;
|
| + break;
|
| + case 4:
|
| + tm.tm_mday = mdays[tm.tm_mon] + (leap_year && tm.tm_mon == 1) + 1;
|
| + break;
|
| + case 5:
|
| + tm.tm_hour = -1;
|
| + break;
|
| + case 6:
|
| + tm.tm_hour = 24;
|
| + break;
|
| + case 7:
|
| + tm.tm_min = -1;
|
| + break;
|
| + case 8:
|
| + tm.tm_min = 60;
|
| + break;
|
| + case 9:
|
| + tm.tm_sec = -1;
|
| + break;
|
| + case 10:
|
| + tm.tm_sec = 60;
|
| + break;
|
| + }
|
| + EXPECT_EQ(rtc::TmToSeconds(tm), -1);
|
| + }
|
| + // Check consistency with the system gmtime_r. With time_t, we can only
|
| + // portably test dates until 2038, which is achieved by the % 0x80000000.
|
| + for (int i = 0; i < times; i++) {
|
| + time_t t = rtc::CreateRandomId() % 0x80000000;
|
| +#if defined(WEBRTC_WIN)
|
| + std::tm* tm = std::gmtime(&t);
|
| + EXPECT_TRUE(tm);
|
| + EXPECT_TRUE(rtc::TmToSeconds(*tm) == t);
|
| +#else
|
| + std::tm tm;
|
| + EXPECT_TRUE(gmtime_r(&t, &tm));
|
| + EXPECT_TRUE(rtc::TmToSeconds(tm) == t);
|
| +#endif
|
| + }
|
| + }
|
| +};
|
| +
|
| +TEST_F(TmToSeconds, TestTmToSeconds) {
|
| + TestTmToSeconds(100000);
|
| +}
|
| +
|
| } // namespace rtc
|
|
|