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