• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef NET_TOOLS_QUIC_TEST_TOOLS_MOCK_EPOLL_SERVER_H_
6 #define NET_TOOLS_QUIC_TEST_TOOLS_MOCK_EPOLL_SERVER_H_
7 
8 #include "base/logging.h"
9 #include "net/tools/epoll_server/epoll_server.h"
10 #include "testing/gmock/include/gmock/gmock.h"
11 
12 namespace net {
13 namespace tools {
14 namespace test {
15 
16 // Unlike the full MockEpollServer, this only lies about the time but lets
17 // fd events operate normally.  Usefully when interacting with real backends
18 // but wanting to skip forward in time to trigger timeouts.
19 class FakeTimeEpollServer : public EpollServer {
20  public:
21   FakeTimeEpollServer();
22   virtual ~FakeTimeEpollServer();
23 
24   // Replaces the EpollServer NowInUsec.
25   virtual int64 NowInUsec() const OVERRIDE;
26 
set_now_in_usec(int64 nius)27   void set_now_in_usec(int64 nius) { now_in_usec_ = nius; }
28 
29   // Advances the virtual 'now' by advancement_usec.
AdvanceBy(int64 advancement_usec)30   void AdvanceBy(int64 advancement_usec) {
31     set_now_in_usec(NowInUsec() + advancement_usec);
32   }
33 
34   // Advances the virtual 'now' by advancement_usec, and
35   // calls WaitForEventAndExecteCallbacks.
36   // Note that the WaitForEventsAndExecuteCallbacks invocation
37   // may cause NowInUs to advance beyond what was specified here.
38   // If that is not desired, use the AdvanceByExactly calls.
AdvanceByAndCallCallbacks(int64 advancement_usec)39   void AdvanceByAndCallCallbacks(int64 advancement_usec) {
40     AdvanceBy(advancement_usec);
41     WaitForEventsAndExecuteCallbacks();
42   }
43 
44  private:
45   int64 now_in_usec_;
46 
47   DISALLOW_COPY_AND_ASSIGN(FakeTimeEpollServer);
48 };
49 
50 class MockEpollServer : public FakeTimeEpollServer {
51  public:  // type definitions
52   typedef base::hash_multimap<int64, struct epoll_event> EventQueue;
53 
54   MockEpollServer();
55   virtual ~MockEpollServer();
56 
57   // time_in_usec is the time at which the event specified
58   // by 'ee' will be delivered. Note that it -is- possible
59   // to add an event for a time which has already been passed..
60   // .. upon the next time that the callbacks are invoked,
61   // all events which are in the 'past' will be delivered.
AddEvent(int64 time_in_usec,const struct epoll_event & ee)62   void AddEvent(int64 time_in_usec, const struct epoll_event& ee) {
63     event_queue_.insert(std::make_pair(time_in_usec, ee));
64   }
65 
66   // Advances the virtual 'now' by advancement_usec,
67   // and ensure that the next invocation of
68   // WaitForEventsAndExecuteCallbacks goes no farther than
69   // advancement_usec from the current time.
AdvanceByExactly(int64 advancement_usec)70   void AdvanceByExactly(int64 advancement_usec) {
71     until_in_usec_ = NowInUsec() + advancement_usec;
72     set_now_in_usec(NowInUsec() + advancement_usec);
73   }
74 
75   // As above, except calls WaitForEventsAndExecuteCallbacks.
AdvanceByExactlyAndCallCallbacks(int64 advancement_usec)76   void AdvanceByExactlyAndCallCallbacks(int64 advancement_usec) {
77     AdvanceByExactly(advancement_usec);
78     WaitForEventsAndExecuteCallbacks();
79   }
80 
NumberOfAlarms()81   base::hash_set<AlarmCB*>::size_type NumberOfAlarms() const {
82     return all_alarms_.size();
83   }
84 
85  protected:  // functions
86   // These functions do nothing here, as we're not actually
87   // using the epoll_* syscalls.
DelFD(int fd)88   virtual void DelFD(int fd) const OVERRIDE {}
AddFD(int fd,int event_mask)89   virtual void AddFD(int fd, int event_mask) const OVERRIDE {}
ModFD(int fd,int event_mask)90   virtual void ModFD(int fd, int event_mask) const OVERRIDE {}
91 
92   // Replaces the epoll_server's epoll_wait_impl.
93   virtual int epoll_wait_impl(int epfd,
94                               struct epoll_event* events,
95                               int max_events,
96                               int timeout_in_ms) OVERRIDE;
SetNonblocking(int fd)97   virtual void SetNonblocking (int fd) OVERRIDE {}
98 
99  private:  // members
100   EventQueue event_queue_;
101   int64 until_in_usec_;
102 
103   DISALLOW_COPY_AND_ASSIGN(MockEpollServer);
104 };
105 
106 }  // namespace test
107 }  // namespace tools
108 }  // namespace net
109 
110 #endif  // NET_TOOLS_QUIC_TEST_TOOLS_MOCK_EPOLL_SERVER_H_
111