// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "services/network/test_chunked_data_pipe_getter.h"

#include "base/check.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace network {

TestChunkedDataPipeGetter::TestChunkedDataPipeGetter() = default;

TestChunkedDataPipeGetter::~TestChunkedDataPipeGetter() = default;

mojo::PendingRemote<mojom::ChunkedDataPipeGetter>
TestChunkedDataPipeGetter::GetDataPipeGetterRemote() {
  EXPECT_FALSE(receiver_.is_bound());
  return receiver_.BindNewPipeAndPassRemote();
}

void TestChunkedDataPipeGetter::ClosePipe() {
  receiver_.reset();
}

mojom::ChunkedDataPipeGetter::GetSizeCallback
TestChunkedDataPipeGetter::WaitForGetSize() {
  DCHECK(!get_size_run_loop_);

  if (!get_size_callback_) {
    get_size_run_loop_ = std::make_unique<base::RunLoop>();
    get_size_run_loop_->Run();
    get_size_run_loop_.reset();
  }

  EXPECT_TRUE(get_size_callback_);

  return std::move(get_size_callback_);
}

mojo::ScopedDataPipeProducerHandle
TestChunkedDataPipeGetter::WaitForStartReading() {
  DCHECK(!start_reading_run_loop_);

  if (!write_pipe_.is_valid()) {
    start_reading_run_loop_ = std::make_unique<base::RunLoop>();
    start_reading_run_loop_->Run();
    start_reading_run_loop_.reset();
  }

  EXPECT_TRUE(write_pipe_.is_valid());

  return std::move(write_pipe_);
}

void TestChunkedDataPipeGetter::GetSize(GetSizeCallback get_size_callback) {
  EXPECT_FALSE(received_size_callback_);
  EXPECT_FALSE(get_size_callback_);

  received_size_callback_ = true;
  get_size_callback_ = std::move(get_size_callback);

  if (get_size_run_loop_)
    get_size_run_loop_->Quit();
}

void TestChunkedDataPipeGetter::StartReading(
    mojo::ScopedDataPipeProducerHandle pipe) {
  EXPECT_FALSE(write_pipe_.is_valid());
  EXPECT_TRUE(received_size_callback_);

  write_pipe_ = std::move(pipe);

  if (start_reading_run_loop_)
    start_reading_run_loop_->Quit();
}

}  // namespace network