1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/tools/quic/quic_epoll_connection_helper.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/crypto/quic_random.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/tools/quic/test_tools/mock_epoll_server.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using net::tools::test::MockEpollServer;
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace net {
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace tools {
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace test {
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class TestDelegate : public QuicAlarm::Delegate {
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestDelegate() : fired_(false) {}
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual QuicTime OnAlarm() OVERRIDE {
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    fired_ = true;
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return QuicTime::Zero();
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool fired() const { return fired_; }
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool fired_;
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
33a3f7b4e666c476898878fa745f637129375cd889Ben Murdochclass QuicEpollConnectionHelperTest : public ::testing::Test {
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  QuicEpollConnectionHelperTest() : helper_(&epoll_server_) {}
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockEpollServer epoll_server_;
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  QuicEpollConnectionHelper helper_;
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(QuicEpollConnectionHelperTest, GetClock) {
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const QuicClock* clock = helper_.GetClock();
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  QuicTime start = clock->Now();
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  QuicTime::Delta delta = QuicTime::Delta::FromMilliseconds(5);
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  epoll_server_.AdvanceBy(delta.ToMicroseconds());
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(start.Add(delta), clock->Now());
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(QuicEpollConnectionHelperTest, GetRandomGenerator) {
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  QuicRandom* random = helper_.GetRandomGenerator();
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(QuicRandom::GetInstance(), random);
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(QuicEpollConnectionHelperTest, CreateAlarm) {
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestDelegate* delegate = new TestDelegate();
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<QuicAlarm> alarm(helper_.CreateAlarm(delegate));
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const QuicClock* clock = helper_.GetClock();
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  QuicTime start = clock->Now();
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  QuicTime::Delta delta = QuicTime::Delta::FromMicroseconds(1);
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  alarm->Set(start.Add(delta));
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  epoll_server_.AdvanceByAndCallCallbacks(delta.ToMicroseconds());
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(start.Add(delta), clock->Now());
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(QuicEpollConnectionHelperTest, CreateAlarmAndCancel) {
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestDelegate* delegate = new TestDelegate();
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<QuicAlarm> alarm(helper_.CreateAlarm(delegate));
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const QuicClock* clock = helper_.GetClock();
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  QuicTime start = clock->Now();
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  QuicTime::Delta delta = QuicTime::Delta::FromMicroseconds(1);
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  alarm->Set(start.Add(delta));
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  alarm->Cancel();
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  epoll_server_.AdvanceByExactlyAndCallCallbacks(delta.ToMicroseconds());
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(start.Add(delta), clock->Now());
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(delegate->fired());
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(QuicEpollConnectionHelperTest, CreateAlarmAndReset) {
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestDelegate* delegate = new TestDelegate();
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<QuicAlarm> alarm(helper_.CreateAlarm(delegate));
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const QuicClock* clock = helper_.GetClock();
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  QuicTime start = clock->Now();
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  QuicTime::Delta delta = QuicTime::Delta::FromMicroseconds(1);
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  alarm->Set(clock->Now().Add(delta));
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  alarm->Cancel();
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  QuicTime::Delta new_delta = QuicTime::Delta::FromMicroseconds(3);
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  alarm->Set(clock->Now().Add(new_delta));
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  epoll_server_.AdvanceByExactlyAndCallCallbacks(delta.ToMicroseconds());
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(start.Add(delta), clock->Now());
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(delegate->fired());
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  epoll_server_.AdvanceByExactlyAndCallCallbacks(
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new_delta.Subtract(delta).ToMicroseconds());
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(start.Add(new_delta), clock->Now());
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(delegate->fired());
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace test
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace tools
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace net
110