// 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_