blob: b7ab55f2652a3e0840ac3aea9f7b28860141c210 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/download/public/common/download_utils.h"
#include "base/test/scoped_feature_list.h"
#include "components/download/public/common/download_features.h"
#include "net/http/http_response_headers.h"
#include "net/http/http_status_code.h"
#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
#include "services/network/public/cpp/resource_request.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
namespace download {
namespace {
TEST(DownloadUtilsTest, HandleServerResponse200) {
scoped_refptr<net::HttpResponseHeaders> headers(
new net::HttpResponseHeaders("HTTP/1.1 200 OK"));
EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE,
HandleSuccessfulServerResponse(*headers.get(), nullptr,
/*fetch_error_body=*/false));
}
TEST(DownloadUtilsTest, HandleServerResponse200_RangeRequest) {
base::test::ScopedFeatureList feature_list;
feature_list.InitAndEnableFeature(features::kDownloadRange);
// Arbitrary range request must expect HTTP 206 as a successful response.
scoped_refptr<net::HttpResponseHeaders> headers(
new net::HttpResponseHeaders("HTTP/1.1 200 OK"));
DownloadSaveInfo save_info;
save_info.range_request_to = 100;
EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT,
HandleSuccessfulServerResponse(*headers.get(), &save_info,
/*fetch_error_body=*/false));
}
TEST(DownloadUtilsTest, HandleServerResponse206_RangeRequest) {
base::test::ScopedFeatureList feature_list;
feature_list.InitAndEnableFeature(features::kDownloadRange);
scoped_refptr<net::HttpResponseHeaders> headers(
new net::HttpResponseHeaders("HTTP/1.1 206 Partial Content"));
headers->AddHeader("Content-Range", "bytes 105-125/500");
DownloadSaveInfo save_info;
save_info.range_request_from = 100;
EXPECT_TRUE(save_info.IsArbitraryRangeRequest());
EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE,
HandleSuccessfulServerResponse(*headers.get(), &save_info,
/*fetch_error_body=*/false));
}
void VerifyRangeHeader(DownloadUrlParameters* params,
const std::string& expected_range_header) {
auto resource_request = CreateResourceRequest(params);
std::string header_value;
ASSERT_TRUE(resource_request->headers.GetHeader(
net::HttpRequestHeaders::kRange, &header_value));
ASSERT_FALSE(
resource_request->headers.HasHeader(net::HttpRequestHeaders::kIfRange));
EXPECT_EQ(expected_range_header, header_value);
}
TEST(DownloadUtilsTest, CreateResourceRequest) {
base::test::ScopedFeatureList feature_list;
feature_list.InitAndEnableFeature(features::kDownloadRange);
auto params = std::make_unique<DownloadUrlParameters>(
GURL(), TRAFFIC_ANNOTATION_FOR_TESTS);
params->set_use_if_range(false);
params->set_range_request_offset(100, kInvalidRange);
VerifyRangeHeader(params.get(), "bytes=100-");
params->set_offset(5);
VerifyRangeHeader(params.get(), "bytes=105-");
params->set_offset(0);
params->set_range_request_offset(100, 200);
VerifyRangeHeader(params.get(), "bytes=100-200");
params->set_offset(5);
VerifyRangeHeader(params.get(), "bytes=105-200");
params->set_offset(0);
params->set_range_request_offset(kInvalidRange, 200);
VerifyRangeHeader(params.get(), "bytes=-200");
params->set_offset(5);
VerifyRangeHeader(params.get(), "bytes=-195");
}
} // namespace
} // namespace download