• 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_BASE_TEST_COMPLETION_CALLBACK_H_
6 #define NET_BASE_TEST_COMPLETION_CALLBACK_H_
7 
8 #include "base/compiler_specific.h"
9 #include "base/tuple.h"
10 #include "net/base/completion_callback.h"
11 #include "net/base/net_errors.h"
12 
13 //-----------------------------------------------------------------------------
14 // completion callback helper
15 
16 // A helper class for completion callbacks, designed to make it easy to run
17 // tests involving asynchronous operations.  Just call WaitForResult to wait
18 // for the asynchronous operation to complete.
19 //
20 // NOTE: Since this runs a message loop to wait for the completion callback,
21 // there could be other side-effects resulting from WaitForResult.  For this
22 // reason, this class is probably not ideal for a general application.
23 //
24 
25 namespace net {
26 
27 class IOBuffer;
28 
29 namespace internal {
30 
31 class TestCompletionCallbackBaseInternal {
32  public:
have_result()33   bool have_result() const { return have_result_; }
34 
35  protected:
36   TestCompletionCallbackBaseInternal();
37   void DidSetResult();
38   void WaitForResult();
39 
40   bool have_result_;
41   bool waiting_for_result_;
42 
43  private:
44   DISALLOW_COPY_AND_ASSIGN(TestCompletionCallbackBaseInternal);
45 };
46 
47 template <typename R>
48 class TestCompletionCallbackTemplate
49     : public TestCompletionCallbackBaseInternal {
50  public:
~TestCompletionCallbackTemplate()51   virtual ~TestCompletionCallbackTemplate() {}
52 
WaitForResult()53   R WaitForResult() {
54     TestCompletionCallbackBaseInternal::WaitForResult();
55     return result_;
56   }
57 
GetResult(R result)58   R GetResult(R result) {
59     if (net::ERR_IO_PENDING != result)
60       return result;
61     return WaitForResult();
62   }
63 
64  protected:
65   // Override this method to gain control as the callback is running.
SetResult(R result)66   virtual void SetResult(R result) {
67     result_ = result;
68     DidSetResult();
69   }
70 
TestCompletionCallbackTemplate()71   TestCompletionCallbackTemplate() : result_(R()) {}
72   R result_;
73 
74  private:
75   DISALLOW_COPY_AND_ASSIGN(TestCompletionCallbackTemplate);
76 };
77 
78 }  // namespace internal
79 
80 // Base class overridden by custom implementations of TestCompletionCallback.
81 typedef internal::TestCompletionCallbackTemplate<int>
82     TestCompletionCallbackBase;
83 
84 typedef internal::TestCompletionCallbackTemplate<int64>
85     TestInt64CompletionCallbackBase;
86 
87 class TestCompletionCallback : public TestCompletionCallbackBase {
88  public:
89   TestCompletionCallback();
90   virtual ~TestCompletionCallback();
91 
callback()92   const CompletionCallback& callback() const { return callback_; }
93 
94  private:
95   const CompletionCallback callback_;
96 
97   DISALLOW_COPY_AND_ASSIGN(TestCompletionCallback);
98 };
99 
100 class TestInt64CompletionCallback : public TestInt64CompletionCallbackBase {
101  public:
102   TestInt64CompletionCallback();
103   virtual ~TestInt64CompletionCallback();
104 
callback()105   const Int64CompletionCallback& callback() const { return callback_; }
106 
107  private:
108   const Int64CompletionCallback callback_;
109 
110   DISALLOW_COPY_AND_ASSIGN(TestInt64CompletionCallback);
111 };
112 
113 // Makes sure that the buffer is not referenced when the callback runs.
114 class ReleaseBufferCompletionCallback: public TestCompletionCallback {
115  public:
116   explicit ReleaseBufferCompletionCallback(IOBuffer* buffer);
117   virtual ~ReleaseBufferCompletionCallback();
118 
119  private:
120   virtual void SetResult(int result) OVERRIDE;
121 
122   IOBuffer* buffer_;
123   DISALLOW_COPY_AND_ASSIGN(ReleaseBufferCompletionCallback);
124 };
125 
126 }  // namespace net
127 
128 #endif  // NET_BASE_TEST_COMPLETION_CALLBACK_H_
129