Home | History | Annotate | Download | only in test_tools
      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 
     27   void set_now_in_usec(int64 nius) { now_in_usec_ = nius; }
     28 
     29   // Advances the virtual 'now' by 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.
     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.
     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.
     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.
     76   void AdvanceByExactlyAndCallCallbacks(int64 advancement_usec) {
     77     AdvanceByExactly(advancement_usec);
     78     WaitForEventsAndExecuteCallbacks();
     79   }
     80 
     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.
     88   virtual void DelFD(int fd) const OVERRIDE {}
     89   virtual void AddFD(int fd, int event_mask) const OVERRIDE {}
     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;
     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