| // Copyright (c) 2006-2008 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/message_loop.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. |
| // |
| class TestCompletionCallback : public CallbackRunner< Tuple1<int> > { |
| public: |
| TestCompletionCallback() |
| : result_(0), |
| have_result_(false), |
| waiting_for_result_(false) { |
| } |
| |
| int WaitForResult() { |
| DCHECK(!waiting_for_result_); |
| while (!have_result_) { |
| waiting_for_result_ = true; |
| MessageLoop::current()->Run(); |
| waiting_for_result_ = false; |
| } |
| have_result_ = false; // auto-reset for next callback |
| return result_; |
| } |
| |
| int GetResult(int result) { |
| if (net::ERR_IO_PENDING != result) |
| return result; |
| return WaitForResult(); |
| } |
| |
| bool have_result() const { return have_result_; } |
| |
| virtual void RunWithParams(const Tuple1<int>& params) { |
| result_ = params.a; |
| have_result_ = true; |
| if (waiting_for_result_) |
| MessageLoop::current()->Quit(); |
| } |
| |
| private: |
| int result_; |
| bool have_result_; |
| bool waiting_for_result_; |
| }; |
| |
| #endif // NET_BASE_TEST_COMPLETION_CALLBACK_H_ |