| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef NET_BASE_TEST_COMPLETION_CALLBACK_H_ |
| #define NET_BASE_TEST_COMPLETION_CALLBACK_H_ |
| |
| #include "base/compiler_specific.h" |
| #include "base/tuple.h" |
| #include "net/base/completion_callback.h" |
| #include "net/base/net_errors.h" |
| |
| //----------------------------------------------------------------------------- |
| // completion callback helper |
| |
| // A helper class for completion callbacks, designed to make it easy to run |
| // tests involving asynchronous operations. Just call WaitForResult to wait |
| // for the asynchronous operation to complete. |
| // |
| // NOTE: Since this runs a message loop to wait for the completion callback, |
| // there could be other side-effects resulting from WaitForResult. For this |
| // reason, this class is probably not ideal for a general application. |
| // |
| |
| namespace net { |
| |
| namespace internal { |
| |
| class TestCompletionCallbackBaseInternal { |
| public: |
| bool have_result() const { return have_result_; } |
| |
| protected: |
| TestCompletionCallbackBaseInternal(); |
| void DidSetResult(); |
| void WaitForResult(); |
| |
| bool have_result_; |
| bool waiting_for_result_; |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(TestCompletionCallbackBaseInternal); |
| }; |
| |
| template <typename R> |
| class TestCompletionCallbackTemplate |
| : public TestCompletionCallbackBaseInternal { |
| public: |
| virtual ~TestCompletionCallbackTemplate() {} |
| |
| R WaitForResult() { |
| TestCompletionCallbackBaseInternal::WaitForResult(); |
| return result_; |
| } |
| |
| R GetResult(R result) { |
| if (net::ERR_IO_PENDING != result) |
| return result; |
| return WaitForResult(); |
| } |
| |
| protected: |
| // Override this method to gain control as the callback is running. |
| virtual void SetResult(R result) { |
| result_ = result; |
| DidSetResult(); |
| } |
| |
| TestCompletionCallbackTemplate() : result_(R()) {} |
| R result_; |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(TestCompletionCallbackTemplate); |
| }; |
| |
| } // namespace internal |
| |
| // Base class overridden by custom implementations of TestCompletionCallback. |
| typedef internal::TestCompletionCallbackTemplate<int> |
| TestCompletionCallbackBase; |
| |
| typedef internal::TestCompletionCallbackTemplate<int64> |
| TestInt64CompletionCallbackBase; |
| |
| class TestCompletionCallback : public TestCompletionCallbackBase { |
| public: |
| TestCompletionCallback(); |
| virtual ~TestCompletionCallback(); |
| |
| const CompletionCallback& callback() const { return callback_; } |
| |
| private: |
| const CompletionCallback callback_; |
| |
| DISALLOW_COPY_AND_ASSIGN(TestCompletionCallback); |
| }; |
| |
| class TestInt64CompletionCallback : public TestInt64CompletionCallbackBase { |
| public: |
| TestInt64CompletionCallback(); |
| virtual ~TestInt64CompletionCallback(); |
| |
| const Int64CompletionCallback& callback() const { return callback_; } |
| |
| private: |
| const Int64CompletionCallback callback_; |
| |
| DISALLOW_COPY_AND_ASSIGN(TestInt64CompletionCallback); |
| }; |
| |
| } // namespace net |
| |
| #endif // NET_BASE_TEST_COMPLETION_CALLBACK_H_ |