// Copyright (c) 2011 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.

#include "net/base/test_completion_callback.h"

#include "base/message_loop.h"
#include "net/base/net_errors.h"

TestCompletionCallback::TestCompletionCallback()
    : result_(0),
      have_result_(false),
      waiting_for_result_(false) {
}

TestCompletionCallback::~TestCompletionCallback() {}

int TestCompletionCallback::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 TestCompletionCallback::GetResult(int result) {
  if (net::ERR_IO_PENDING != result)
    return result;
  return WaitForResult();
}

void TestCompletionCallback::RunWithParams(const Tuple1<int>& params) {
  result_ = params.a;
  have_result_ = true;
  if (waiting_for_result_)
    MessageLoop::current()->Quit();
}