Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / net / tools / quic / test_tools / mock_epoll_server.h
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   ~FakeTimeEpollServer() override;
23
24   // Replaces the EpollServer NowInUsec.
25   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   ~MockEpollServer() override;
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   void DelFD(int fd) const override {}
89   void AddFD(int fd, int event_mask) const override {}
90   void ModFD(int fd, int event_mask) const override {}
91
92   // Replaces the epoll_server's epoll_wait_impl.
93   int epoll_wait_impl(int epfd,
94                       struct epoll_event* events,
95                       int max_events,
96                       int timeout_in_ms) override;
97   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_