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