1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "net/quic/platform/impl/quic_epoll_clock.h"
6
7 #include "net/third_party/quiche/src/epoll_server/fake_simple_epoll_server.h"
8 #include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
9 #include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
10
11 namespace quic {
12 namespace test {
13
14 class QuicEpollClockTest : public QuicTest {};
15
TEST_F(QuicEpollClockTest,ApproximateNowInUsec)16 TEST_F(QuicEpollClockTest, ApproximateNowInUsec) {
17 epoll_server::test::FakeSimpleEpollServer epoll_server;
18 QuicEpollClock clock(&epoll_server);
19
20 epoll_server.set_now_in_usec(1000000);
21 EXPECT_EQ(1000000,
22 (clock.ApproximateNow() - QuicTime::Zero()).ToMicroseconds());
23 EXPECT_EQ(1u, clock.WallNow().ToUNIXSeconds());
24 EXPECT_EQ(1000000u, clock.WallNow().ToUNIXMicroseconds());
25
26 epoll_server.AdvanceBy(5);
27 EXPECT_EQ(1000005,
28 (clock.ApproximateNow() - QuicTime::Zero()).ToMicroseconds());
29 EXPECT_EQ(1u, clock.WallNow().ToUNIXSeconds());
30 EXPECT_EQ(1000005u, clock.WallNow().ToUNIXMicroseconds());
31
32 epoll_server.AdvanceBy(10 * 1000000);
33 EXPECT_EQ(11u, clock.WallNow().ToUNIXSeconds());
34 EXPECT_EQ(11000005u, clock.WallNow().ToUNIXMicroseconds());
35 }
36
TEST_F(QuicEpollClockTest,NowInUsec)37 TEST_F(QuicEpollClockTest, NowInUsec) {
38 epoll_server::test::FakeSimpleEpollServer epoll_server;
39 QuicEpollClock clock(&epoll_server);
40
41 epoll_server.set_now_in_usec(1000000);
42 EXPECT_EQ(1000000, (clock.Now() - QuicTime::Zero()).ToMicroseconds());
43
44 epoll_server.AdvanceBy(5);
45 EXPECT_EQ(1000005, (clock.Now() - QuicTime::Zero()).ToMicroseconds());
46 }
47
TEST_F(QuicEpollClockTest,MonotonicityWithRealEpollClock)48 TEST_F(QuicEpollClockTest, MonotonicityWithRealEpollClock) {
49 epoll_server::SimpleEpollServer epoll_server;
50 QuicEpollClock clock(&epoll_server);
51
52 quic::QuicTime last_now = clock.Now();
53 for (int i = 0; i < 1e5; ++i) {
54 quic::QuicTime now = clock.Now();
55
56 ASSERT_LE(last_now, now);
57
58 last_now = now;
59 }
60 }
61
TEST_F(QuicEpollClockTest,MonotonicityWithFakeEpollClock)62 TEST_F(QuicEpollClockTest, MonotonicityWithFakeEpollClock) {
63 epoll_server::test::FakeSimpleEpollServer epoll_server;
64 QuicEpollClock clock(&epoll_server);
65
66 epoll_server.set_now_in_usec(100);
67 quic::QuicTime last_now = clock.Now();
68
69 epoll_server.set_now_in_usec(90);
70 quic::QuicTime now = clock.Now();
71
72 ASSERT_EQ(last_now, now);
73 }
74
75 } // namespace test
76 } // namespace quic
77