| // 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 <memory> | |
| #include "base/callback.h" | |
| #include "base/compiler_specific.h" | |
| #include "base/macros.h" | |
| #include "net/base/completion_callback.h" | |
| #include "net/base/net_errors.h" | |
| #include "starboard/types.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. Uses a RunLoop to spin the | |
| // current MessageLoop while waiting. The callback must be invoked on the same | |
| // thread WaitForResult is called on. | |
| // | |
| // 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 base { | |
| class RunLoop; | |
| } | |
| namespace net { | |
| class IOBuffer; | |
| namespace internal { | |
| class TestCompletionCallbackBaseInternal { | |
| public: | |
| bool have_result() const { return have_result_; } | |
| protected: | |
| TestCompletionCallbackBaseInternal(); | |
| virtual ~TestCompletionCallbackBaseInternal(); | |
| void DidSetResult(); | |
| void WaitForResult(); | |
| private: | |
| // RunLoop. Only non-NULL during the call to WaitForResult, so the class is | |
| // reusable. | |
| std::unique_ptr<base::RunLoop> run_loop_; | |
| bool have_result_; | |
| DISALLOW_COPY_AND_ASSIGN(TestCompletionCallbackBaseInternal); | |
| }; | |
| template <typename R> | |
| class TestCompletionCallbackTemplate | |
| : public TestCompletionCallbackBaseInternal { | |
| public: | |
| virtual ~TestCompletionCallbackTemplate() override {} | |
| R WaitForResult() { | |
| TestCompletionCallbackBaseInternal::WaitForResult(); | |
| return result_; | |
| } | |
| R GetResult(R result) { | |
| if (ERR_IO_PENDING != result) | |
| return result; | |
| return WaitForResult(); | |
| } | |
| protected: | |
| TestCompletionCallbackTemplate() : result_(R()) {} | |
| // Override this method to gain control as the callback is running. | |
| virtual void SetResult(R result) { | |
| result_ = result; | |
| DidSetResult(); | |
| } | |
| private: | |
| R result_; | |
| DISALLOW_COPY_AND_ASSIGN(TestCompletionCallbackTemplate); | |
| }; | |
| } // namespace internal | |
| class TestClosure : public internal::TestCompletionCallbackBaseInternal { | |
| public: | |
| using internal::TestCompletionCallbackBaseInternal::WaitForResult; | |
| TestClosure(); | |
| ~TestClosure() override; | |
| const base::Closure& closure() const { return closure_; } | |
| private: | |
| const base::Closure closure_; | |
| DISALLOW_COPY_AND_ASSIGN(TestClosure); | |
| }; | |
| // Base class overridden by custom implementations of TestCompletionCallback. | |
| typedef internal::TestCompletionCallbackTemplate<int> | |
| TestCompletionCallbackBase; | |
| typedef internal::TestCompletionCallbackTemplate<int64_t> | |
| TestInt64CompletionCallbackBase; | |
| class TestCompletionCallback : public TestCompletionCallbackBase { | |
| public: | |
| TestCompletionCallback(); | |
| ~TestCompletionCallback() override; | |
| const CompletionCallback& callback() const { return callback_; } | |
| private: | |
| const CompletionCallback callback_; | |
| DISALLOW_COPY_AND_ASSIGN(TestCompletionCallback); | |
| }; | |
| class TestInt64CompletionCallback : public TestInt64CompletionCallbackBase { | |
| public: | |
| TestInt64CompletionCallback(); | |
| ~TestInt64CompletionCallback() override; | |
| const Int64CompletionCallback& callback() const { return callback_; } | |
| private: | |
| const Int64CompletionCallback callback_; | |
| DISALLOW_COPY_AND_ASSIGN(TestInt64CompletionCallback); | |
| }; | |
| // Makes sure that the buffer is not referenced when the callback runs. | |
| class ReleaseBufferCompletionCallback: public TestCompletionCallback { | |
| public: | |
| explicit ReleaseBufferCompletionCallback(IOBuffer* buffer); | |
| ~ReleaseBufferCompletionCallback() override; | |
| private: | |
| void SetResult(int result) override; | |
| IOBuffer* buffer_; | |
| DISALLOW_COPY_AND_ASSIGN(ReleaseBufferCompletionCallback); | |
| }; | |
| } // namespace net | |
| #endif // NET_BASE_TEST_COMPLETION_CALLBACK_H_ |