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