15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_BASE_TEST_COMPLETION_CALLBACK_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_BASE_TEST_COMPLETION_CALLBACK_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/tuple.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/completion_callback.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//-----------------------------------------------------------------------------
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// completion callback helper
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A helper class for completion callbacks, designed to make it easy to run
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tests involving asynchronous operations.  Just call WaitForResult to wait
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for the asynchronous operation to complete.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: Since this runs a message loop to wait for the completion callback,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// there could be other side-effects resulting from WaitForResult.  For this
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reason, this class is probably not ideal for a general application.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class IOBuffer;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestCompletionCallbackBaseInternal {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool have_result() const { return have_result_; }
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallbackBaseInternal();
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidSetResult();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WaitForResult();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool have_result_;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool waiting_for_result_;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestCompletionCallbackBaseInternal);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R>
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestCompletionCallbackTemplate
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public TestCompletionCallbackBaseInternal {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestCompletionCallbackTemplate() {}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  R WaitForResult() {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallbackBaseInternal::WaitForResult();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result_;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  R GetResult(R result) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (net::ERR_IO_PENDING != result)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return result;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WaitForResult();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Override this method to gain control as the callback is running.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetResult(R result) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result_ = result;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DidSetResult();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallbackTemplate() : result_(R()) {}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  R result_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestCompletionCallbackTemplate);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Base class overridden by custom implementations of TestCompletionCallback.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef internal::TestCompletionCallbackTemplate<int>
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallbackBase;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef internal::TestCompletionCallbackTemplate<int64>
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestInt64CompletionCallbackBase;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestCompletionCallback : public TestCompletionCallbackBase {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallback();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestCompletionCallback();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const CompletionCallback& callback() const { return callback_; }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const CompletionCallback callback_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestCompletionCallback);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestInt64CompletionCallback : public TestInt64CompletionCallbackBase {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInt64CompletionCallback();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestInt64CompletionCallback();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Int64CompletionCallback& callback() const { return callback_; }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Int64CompletionCallback callback_;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestInt64CompletionCallback);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Makes sure that the buffer is not referenced when the callback runs.
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ReleaseBufferCompletionCallback: public TestCompletionCallback {
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit ReleaseBufferCompletionCallback(IOBuffer* buffer);
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ReleaseBufferCompletionCallback();
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetResult(int result) OVERRIDE;
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IOBuffer* buffer_;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ReleaseBufferCompletionCallback);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_BASE_TEST_COMPLETION_CALLBACK_H_
129