1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/base/test_completion_callback.h"
6
7#include "base/bind.h"
8#include "base/bind_helpers.h"
9#include "base/compiler_specific.h"
10#include "base/message_loop/message_loop.h"
11#include "net/base/io_buffer.h"
12
13namespace net {
14
15namespace internal {
16
17void TestCompletionCallbackBaseInternal::DidSetResult() {
18  have_result_ = true;
19  if (waiting_for_result_)
20    base::MessageLoop::current()->Quit();
21}
22
23void TestCompletionCallbackBaseInternal::WaitForResult() {
24  DCHECK(!waiting_for_result_);
25  while (!have_result_) {
26    waiting_for_result_ = true;
27    base::MessageLoop::current()->Run();
28    waiting_for_result_ = false;
29  }
30  have_result_ = false;  // Auto-reset for next callback.
31}
32
33TestCompletionCallbackBaseInternal::TestCompletionCallbackBaseInternal()
34    : have_result_(false),
35      waiting_for_result_(false) {
36}
37
38}  // namespace internal
39
40TestCompletionCallback::TestCompletionCallback()
41    : callback_(base::Bind(&TestCompletionCallback::SetResult,
42                base::Unretained(this))) {
43}
44
45TestCompletionCallback::~TestCompletionCallback() {
46}
47
48TestInt64CompletionCallback::TestInt64CompletionCallback()
49    : callback_(base::Bind(&TestInt64CompletionCallback::SetResult,
50                base::Unretained(this))) {
51}
52
53TestInt64CompletionCallback::~TestInt64CompletionCallback() {
54}
55
56ReleaseBufferCompletionCallback::ReleaseBufferCompletionCallback(
57    IOBuffer* buffer) : buffer_(buffer) {
58}
59
60ReleaseBufferCompletionCallback::~ReleaseBufferCompletionCallback() {
61}
62
63void ReleaseBufferCompletionCallback::SetResult(int result) {
64  if (!buffer_->HasOneRef())
65    result = net::ERR_FAILED;
66  TestCompletionCallback::SetResult(result);
67}
68
69}  // namespace net
70