blob: 2ff8b21589a68b944a14270dd0326f0dd03453c0 [file] [log] [blame]
// Copyright 2019 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 "third_party/blink/renderer/platform/loader/static_data_navigation_body_loader.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
namespace blink {
class StaticDataNavigationBodyLoaderTest
: public ::testing::Test,
public WebNavigationBodyLoader::Client {
protected:
void SetUp() override {
loader_ = std::make_unique<StaticDataNavigationBodyLoader>();
}
void Write(const String& buffer) {
std::string string = buffer.Utf8();
loader_->Write(string.c_str(), string.length());
}
void BodyCodeCacheReceived(mojo_base::BigBuffer data) override {}
void BodyDataReceived(base::span<const char> data) override {
ASSERT_TRUE(expecting_data_received_);
expecting_data_received_ = false;
data_received_ =
data_received_ + String::FromUTF8(data.data(), data.size());
TakeActions();
}
void BodyLoadingFinished(
base::TimeTicks completion_time,
int64_t total_encoded_data_length,
int64_t total_encoded_body_length,
int64_t total_decoded_body_length,
bool should_report_corb_blocking,
const absl::optional<blink::WebURLError>& error) override {
ASSERT_TRUE(expecting_finished_);
expecting_finished_ = false;
ASSERT_TRUE(!did_finish_);
did_finish_ = true;
TakeActions();
}
void TakeActions() {
if (set_defers_loading_ != WebURLLoader::DeferType::kNotDeferred) {
set_defers_loading_ = WebURLLoader::DeferType::kNotDeferred;
loader_->SetDefersLoading(WebURLLoader::DeferType::kDeferred);
}
if (!buffer_to_write_.IsEmpty()) {
String buffer = buffer_to_write_;
buffer_to_write_ = String();
expecting_data_received_ = true;
Write(buffer);
}
if (destroy_loader_) {
destroy_loader_ = false;
loader_.reset();
}
}
String TakeDataReceived() {
String data = data_received_;
data_received_ = g_empty_string;
return data;
}
std::unique_ptr<StaticDataNavigationBodyLoader> loader_;
bool expecting_data_received_ = false;
bool expecting_finished_ = false;
bool did_finish_ = false;
String buffer_to_write_;
WebURLLoader::DeferType set_defers_loading_ =
WebURLLoader::DeferType::kNotDeferred;
bool destroy_loader_ = false;
String data_received_;
};
TEST_F(StaticDataNavigationBodyLoaderTest, DataReceived) {
loader_->StartLoadingBody(this, false);
expecting_data_received_ = true;
Write("hello");
EXPECT_EQ("hello", TakeDataReceived());
}
TEST_F(StaticDataNavigationBodyLoaderTest, WriteFromDataReceived) {
loader_->StartLoadingBody(this, false);
expecting_data_received_ = true;
buffer_to_write_ = "world";
Write("hello");
EXPECT_EQ("helloworld", TakeDataReceived());
}
TEST_F(StaticDataNavigationBodyLoaderTest,
SetDefersLoadingAndWriteFromDataReceived) {
loader_->StartLoadingBody(this, false);
expecting_data_received_ = true;
set_defers_loading_ = WebURLLoader::DeferType::kDeferred;
buffer_to_write_ = "world";
Write("hello");
EXPECT_EQ("hello", TakeDataReceived());
loader_->SetDefersLoading(WebURLLoader::DeferType::kNotDeferred);
EXPECT_EQ("world", TakeDataReceived());
}
TEST_F(StaticDataNavigationBodyLoaderTest,
SetDefersLoadingWithBfcacheAndWriteFromDataReceived) {
loader_->StartLoadingBody(this, false);
expecting_data_received_ = true;
set_defers_loading_ = WebURLLoader::DeferType::kDeferredWithBackForwardCache;
buffer_to_write_ = "world";
Write("hello");
EXPECT_EQ("hello", TakeDataReceived());
loader_->SetDefersLoading(WebURLLoader::DeferType::kNotDeferred);
EXPECT_EQ("world", TakeDataReceived());
}
TEST_F(StaticDataNavigationBodyLoaderTest, DestroyFromDataReceived) {
loader_->StartLoadingBody(this, false);
expecting_data_received_ = true;
destroy_loader_ = false;
Write("hello");
EXPECT_EQ("hello", TakeDataReceived());
}
TEST_F(StaticDataNavigationBodyLoaderTest, SetDefersLoadingFromDataReceived) {
loader_->StartLoadingBody(this, false);
expecting_data_received_ = true;
set_defers_loading_ = WebURLLoader::DeferType::kDeferred;
Write("hello");
EXPECT_EQ("hello", TakeDataReceived());
Write("world");
EXPECT_EQ("", TakeDataReceived());
}
TEST_F(StaticDataNavigationBodyLoaderTest,
SetDefersLoadingWithBfcacheFromDataReceived) {
loader_->StartLoadingBody(this, false);
expecting_data_received_ = true;
set_defers_loading_ = WebURLLoader::DeferType::kDeferredWithBackForwardCache;
Write("hello");
EXPECT_EQ("hello", TakeDataReceived());
Write("world");
EXPECT_EQ("", TakeDataReceived());
}
TEST_F(StaticDataNavigationBodyLoaderTest, WriteThenStart) {
Write("hello");
expecting_data_received_ = true;
loader_->StartLoadingBody(this, false);
EXPECT_EQ("hello", TakeDataReceived());
expecting_finished_ = true;
loader_->Finish();
EXPECT_EQ("", TakeDataReceived());
EXPECT_TRUE(did_finish_);
}
TEST_F(StaticDataNavigationBodyLoaderTest,
SetDefersLoadingFromFinishedDataReceived) {
Write("hello");
loader_->Finish();
expecting_data_received_ = true;
set_defers_loading_ = WebURLLoader::DeferType::kDeferred;
loader_->StartLoadingBody(this, false);
EXPECT_EQ("hello", TakeDataReceived());
expecting_finished_ = true;
loader_->SetDefersLoading(WebURLLoader::DeferType::kNotDeferred);
EXPECT_EQ("", TakeDataReceived());
EXPECT_TRUE(did_finish_);
}
TEST_F(StaticDataNavigationBodyLoaderTest,
SetDefersLoadingWithBfcacheFromFinishedDataReceived) {
Write("hello");
loader_->Finish();
expecting_data_received_ = true;
set_defers_loading_ = WebURLLoader::DeferType::kDeferredWithBackForwardCache;
loader_->StartLoadingBody(this, false);
EXPECT_EQ("hello", TakeDataReceived());
expecting_finished_ = true;
loader_->SetDefersLoading(WebURLLoader::DeferType::kNotDeferred);
EXPECT_EQ("", TakeDataReceived());
EXPECT_TRUE(did_finish_);
}
TEST_F(StaticDataNavigationBodyLoaderTest, StartDeferred) {
loader_->SetDefersLoading(WebURLLoader::DeferType::kDeferred);
loader_->StartLoadingBody(this, false);
Write("hello");
expecting_data_received_ = true;
loader_->SetDefersLoading(WebURLLoader::DeferType::kNotDeferred);
EXPECT_EQ("hello", TakeDataReceived());
}
TEST_F(StaticDataNavigationBodyLoaderTest, StartDeferredWithBackForwardCache) {
loader_->SetDefersLoading(
WebURLLoader::DeferType::kDeferredWithBackForwardCache);
loader_->StartLoadingBody(this, false);
Write("hello");
expecting_data_received_ = true;
loader_->SetDefersLoading(WebURLLoader::DeferType::kNotDeferred);
EXPECT_EQ("hello", TakeDataReceived());
}
TEST_F(StaticDataNavigationBodyLoaderTest, DestroyFromFinished) {
loader_->StartLoadingBody(this, false);
expecting_finished_ = true;
destroy_loader_ = true;
loader_->Finish();
EXPECT_TRUE(did_finish_);
}
TEST_F(StaticDataNavigationBodyLoaderTest, SetDefersLoadingFromFinished) {
loader_->StartLoadingBody(this, false);
expecting_finished_ = true;
set_defers_loading_ = WebURLLoader::DeferType::kDeferred;
loader_->Finish();
EXPECT_TRUE(did_finish_);
}
TEST_F(StaticDataNavigationBodyLoaderTest,
SetDefersLoadingWithBfcacheFromFinished) {
loader_->StartLoadingBody(this, false);
expecting_finished_ = true;
set_defers_loading_ = WebURLLoader::DeferType::kDeferredWithBackForwardCache;
loader_->Finish();
EXPECT_TRUE(did_finish_);
}
} // namespace blink