910e62b5创建于 1月15日历史提交
// Copyright 2016 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/test_url_loader_client.h"

#include "base/functional/bind.h"
#include "base/memory/ref_counted.h"
#include "base/run_loop.h"
#include "services/network/public/mojom/early_hints.mojom.h"
#include "services/network/public/mojom/url_response_head.mojom.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace network {

TestURLLoaderClient::TestURLLoaderClient() = default;
TestURLLoaderClient::~TestURLLoaderClient() = default;

void TestURLLoaderClient::OnReceiveEarlyHints(
    network::mojom::EarlyHintsPtr early_hints) {
  EXPECT_FALSE(has_received_response_);
  EXPECT_FALSE(has_received_completion_);
  has_received_early_hints_ = true;
  early_hints_.push_back(std::move(early_hints));
}

void TestURLLoaderClient::OnReceiveResponse(
    mojom::URLResponseHeadPtr response_head,
    mojo::ScopedDataPipeConsumerHandle body,
    std::optional<mojo_base::BigBuffer> cached_metadata) {
  EXPECT_FALSE(has_received_response_);
  EXPECT_FALSE(has_received_completion_);
  has_received_response_ = true;
  response_head_ = std::move(response_head);
  if (cached_metadata) {
    cached_metadata_ =
        std::string(reinterpret_cast<const char*>(cached_metadata->data()),
                    cached_metadata->size());
  }
  if (quit_closure_for_on_receive_response_)
    std::move(quit_closure_for_on_receive_response_).Run();

  response_body_ = std::move(body);
  if (quit_closure_for_on_start_loading_response_body_)
    std::move(quit_closure_for_on_start_loading_response_body_).Run();

  if (response_received_callback_) {
    std::move(response_received_callback_).Run();
  }
}

void TestURLLoaderClient::OnReceiveRedirect(
    const net::RedirectInfo& redirect_info,
    mojom::URLResponseHeadPtr response_head) {
  EXPECT_FALSE(response_body_.is_valid());
  EXPECT_FALSE(has_received_response_);
  // Use ClearHasReceivedRedirect to accept more redirects.
  EXPECT_FALSE(has_received_redirect_);
  EXPECT_FALSE(has_received_completion_);
  has_received_redirect_ = true;
  redirect_info_ = redirect_info;
  response_head_ = std::move(response_head);
  if (quit_closure_for_on_receive_redirect_)
    std::move(quit_closure_for_on_receive_redirect_).Run();
}

void TestURLLoaderClient::OnTransferSizeUpdated(int32_t transfer_size_diff) {
  EXPECT_FALSE(has_received_completion_);
  EXPECT_GT(transfer_size_diff, 0);
  body_transfer_size_ += transfer_size_diff;
  if (quit_closure_for_on_transfer_size_updated_)
    std::move(quit_closure_for_on_transfer_size_updated_).Run();
}

void TestURLLoaderClient::OnUploadProgress(
    int64_t current_position,
    int64_t total_size,
    OnUploadProgressCallback ack_callback) {
  EXPECT_TRUE(ack_callback);
  EXPECT_FALSE(has_received_response_);
  EXPECT_FALSE(has_received_completion_);
  EXPECT_LT(0, current_position);
  EXPECT_LE(current_position, total_size);

  has_received_upload_progress_ = true;
  current_upload_position_ = current_position;
  total_upload_size_ = total_size;
  std::move(ack_callback).Run();
}

void TestURLLoaderClient::OnComplete(const URLLoaderCompletionStatus& status) {
  EXPECT_FALSE(has_received_completion_);
  has_received_completion_ = true;
  completion_status_ = status;
  if (quit_closure_for_on_complete_)
    std::move(quit_closure_for_on_complete_).Run();
}

void TestURLLoaderClient::ClearHasReceivedRedirect() {
  has_received_redirect_ = false;
}

mojo::PendingRemote<mojom::URLLoaderClient>
TestURLLoaderClient::CreateRemote() {
  mojo::PendingRemote<mojom::URLLoaderClient> client_remote;
  receiver_.Bind(client_remote.InitWithNewPipeAndPassReceiver());
  receiver_.set_disconnect_handler(base::BindOnce(
      &TestURLLoaderClient::OnMojoDisconnect, base::Unretained(this)));
  return client_remote;
}

void TestURLLoaderClient::Unbind() {
  receiver_.reset();
  response_body_.reset();
}

void TestURLLoaderClient::RunUntilResponseReceived() {
  if (has_received_response_)
    return;
  base::RunLoop run_loop;
  quit_closure_for_on_receive_response_ = run_loop.QuitClosure();
  run_loop.Run();
}

void TestURLLoaderClient::RunUntilRedirectReceived() {
  if (has_received_redirect_)
    return;
  base::RunLoop run_loop;
  quit_closure_for_on_receive_redirect_ = run_loop.QuitClosure();
  run_loop.Run();
}

void TestURLLoaderClient::RunUntilResponseBodyArrived() {
  if (response_body_.is_valid())
    return;
  base::RunLoop run_loop;
  quit_closure_for_on_start_loading_response_body_ = run_loop.QuitClosure();
  run_loop.Run();
}

void TestURLLoaderClient::RunUntilComplete() {
  if (has_received_completion_)
    return;
  base::RunLoop run_loop;
  quit_closure_for_on_complete_ = run_loop.QuitClosure();
  run_loop.Run();
}

void TestURLLoaderClient::RunUntilDisconnect() {
  if (has_received_disconnect_)
    return;
  base::RunLoop run_loop;
  quit_closure_for_disconnect_ = run_loop.QuitClosure();
  run_loop.Run();
}

void TestURLLoaderClient::RunUntilTransferSizeUpdated() {
  base::RunLoop run_loop;
  quit_closure_for_on_transfer_size_updated_ = run_loop.QuitClosure();
  run_loop.Run();
}

void TestURLLoaderClient::OnMojoDisconnect() {
  if (has_received_disconnect_)
    return;
  has_received_disconnect_ = true;
  if (quit_closure_for_disconnect_)
    std::move(quit_closure_for_disconnect_).Run();
}

void TestURLLoaderClient::SetResponseReceivedCallback(
    base::OnceClosure response_received_callback) {
  response_received_callback_ = std::move(response_received_callback);
}

base::WeakPtr<mojom::URLLoaderClient>
TestURLLoaderClient::GetSyncClientWeakPtr() {
  return weak_ptr_factory_.GetWeakPtr();
}

}  // namespace network