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