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/tools/quic/test_tools/mock_epoll_server.h" 6 7namespace net { 8namespace tools { 9namespace test { 10 11FakeTimeEpollServer::FakeTimeEpollServer(): now_in_usec_(0) { 12} 13 14FakeTimeEpollServer::~FakeTimeEpollServer() { 15} 16 17int64 FakeTimeEpollServer::NowInUsec() const { 18 return now_in_usec_; 19} 20 21MockEpollServer::MockEpollServer() : until_in_usec_(-1) { 22} 23 24MockEpollServer::~MockEpollServer() { 25} 26 27int MockEpollServer::epoll_wait_impl(int epfd, 28 struct epoll_event* events, 29 int max_events, 30 int timeout_in_ms) { 31 int num_events = 0; 32 while (!event_queue_.empty() && 33 num_events < max_events && 34 event_queue_.begin()->first <= NowInUsec() && 35 ((until_in_usec_ == -1) || 36 (event_queue_.begin()->first < until_in_usec_)) 37 ) { 38 int64 event_time_in_usec = event_queue_.begin()->first; 39 events[num_events] = event_queue_.begin()->second; 40 if (event_time_in_usec > NowInUsec()) { 41 set_now_in_usec(event_time_in_usec); 42 } 43 event_queue_.erase(event_queue_.begin()); 44 ++num_events; 45 } 46 if (num_events == 0) { // then we'd have waited 'till the timeout. 47 if (until_in_usec_ < 0) { // then we don't care what the final time is. 48 if (timeout_in_ms > 0) { 49 AdvanceBy(timeout_in_ms * 1000); 50 } 51 } else { // except we assume that we don't wait for the timeout 52 // period if until_in_usec_ is a positive number. 53 set_now_in_usec(until_in_usec_); 54 // And reset until_in_usec_ to signal no waiting (as 55 // the AdvanceByExactly* stuff is meant to be one-shot, 56 // as are all similar EpollServer functions) 57 until_in_usec_ = -1; 58 } 59 } 60 if (until_in_usec_ >= 0) { 61 CHECK(until_in_usec_ >= NowInUsec()); 62 } 63 return num_events; 64} 65 66} // namespace test 67} // namespace tools 68} // namespace net 69