blob: 0dfbd56330599fe5d8e68c4bcdf8e3a4ff288386 [file] [log] [blame]
// Copyright 2017 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 "components/download/database/download_db_conversions.h"
#include "components/download/public/common/download_url_parameters.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace download {
namespace {
InProgressInfo CreateInProgressInfo() {
InProgressInfo info;
// InProgressInfo with valid fields.
info.current_path = base::FilePath(FILE_PATH_LITERAL("/tmp.crdownload"));
info.target_path = base::FilePath(FILE_PATH_LITERAL("/tmp"));
info.url_chain.emplace_back("http://foo");
info.url_chain.emplace_back("http://foo2");
info.referrer_url = GURL("http://foo1.com");
info.site_url = GURL("http://foo.com");
info.tab_url = GURL("http://foo.com");
info.tab_referrer_url = GURL("http://abc.com");
info.start_time = base::Time::NowFromSystemTime().LocalMidnight();
info.end_time = base::Time();
info.etag = "A";
info.last_modified = "Wed, 1 Oct 2018 07:00:00 GMT";
info.received_bytes = 1000;
info.mime_type = "text/html";
info.original_mime_type = "text/html";
info.total_bytes = 10000;
info.state = DownloadItem::IN_PROGRESS;
info.danger_type = DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS;
info.interrupt_reason = DOWNLOAD_INTERRUPT_REASON_NONE;
info.transient = false;
info.paused = false;
info.hash = "abcdefg";
info.metered = true;
info.received_slices.emplace_back(0, 500, false);
info.received_slices.emplace_back(5000, 500, false);
info.bytes_wasted = 1234;
info.auto_resume_count = 3;
info.fetch_error_body = true;
info.request_headers.emplace_back(
std::make_pair<std::string, std::string>("123", "456"));
info.request_headers.emplace_back(
std::make_pair<std::string, std::string>("ABC", "def"));
return info;
}
DownloadInfo CreateDownloadInfo() {
DownloadInfo info;
info.guid = "abcdefg";
info.id = 1234567;
info.in_progress_info = CreateInProgressInfo();
info.ukm_info = UkmInfo(DownloadSource::FROM_RENDERER, 100);
return info;
}
} // namespace
class DownloadDBConversionsTest : public testing::Test,
public DownloadDBConversions {
public:
~DownloadDBConversionsTest() override {}
};
TEST_F(DownloadDBConversionsTest, DownloadEntry) {
// Entry with no fields.
DownloadEntry entry;
EXPECT_EQ(false, entry.fetch_error_body);
EXPECT_TRUE(entry.request_headers.empty());
EXPECT_EQ(entry, DownloadEntryFromProto(DownloadEntryToProto(entry)));
// Entry with guid, request origin and download source.
entry.guid = "guid";
entry.request_origin = "request origin";
entry.download_source = DownloadSource::DRAG_AND_DROP;
entry.ukm_download_id = 123;
entry.bytes_wasted = 1234;
entry.fetch_error_body = true;
entry.request_headers.emplace_back(
std::make_pair<std::string, std::string>("123", "456"));
entry.request_headers.emplace_back(
std::make_pair<std::string, std::string>("ABC", "def"));
EXPECT_EQ(entry, DownloadEntryFromProto(DownloadEntryToProto(entry)));
}
TEST_F(DownloadDBConversionsTest, DownloadEntries) {
// Entries vector with no entries.
std::vector<DownloadEntry> entries;
EXPECT_EQ(entries, DownloadEntriesFromProto(DownloadEntriesToProto(entries)));
// Entries vector with one entry.
DownloadUrlParameters::RequestHeadersType request_headers;
entries.push_back(DownloadEntry("guid", "request origin",
DownloadSource::UNKNOWN, false,
request_headers, 123));
EXPECT_EQ(entries, DownloadEntriesFromProto(DownloadEntriesToProto(entries)));
// Entries vector with multiple entries.
request_headers.emplace_back(
DownloadUrlParameters::RequestHeadersNameValuePair("key", "value"));
entries.push_back(DownloadEntry("guid2", "request origin",
DownloadSource::UNKNOWN, true,
request_headers, 456));
EXPECT_EQ(entries, DownloadEntriesFromProto(DownloadEntriesToProto(entries)));
}
TEST_F(DownloadDBConversionsTest, DownloadSource) {
DownloadSource sources[] = {
DownloadSource::UNKNOWN, DownloadSource::NAVIGATION,
DownloadSource::DRAG_AND_DROP, DownloadSource::FROM_RENDERER,
DownloadSource::EXTENSION_API, DownloadSource::EXTENSION_INSTALLER,
DownloadSource::INTERNAL_API, DownloadSource::WEB_CONTENTS_API,
DownloadSource::OFFLINE_PAGE, DownloadSource::CONTEXT_MENU};
for (auto source : sources) {
EXPECT_EQ(source, DownloadSourceFromProto(DownloadSourceToProto(source)));
}
}
TEST_F(DownloadDBConversionsTest, HttpRequestHeaders) {
std::pair<std::string, std::string> header;
EXPECT_EQ(header,
HttpRequestHeaderFromProto(HttpRequestHeaderToProto(header)));
header = std::make_pair("123", "456");
EXPECT_EQ(header,
HttpRequestHeaderFromProto(HttpRequestHeaderToProto(header)));
}
TEST_F(DownloadDBConversionsTest, InProgressInfo) {
// InProgressInfo with no fields.
InProgressInfo info;
EXPECT_EQ(false, info.fetch_error_body);
EXPECT_TRUE(info.request_headers.empty());
EXPECT_EQ(info, InProgressInfoFromProto(InProgressInfoToProto(info)));
// InProgressInfo with valid fields.
info = CreateInProgressInfo();
EXPECT_EQ(info, InProgressInfoFromProto(InProgressInfoToProto(info)));
}
TEST_F(DownloadDBConversionsTest, UkmInfo) {
UkmInfo info(DownloadSource::FROM_RENDERER, 100);
EXPECT_EQ(info, UkmInfoFromProto(UkmInfoToProto(info)));
}
TEST_F(DownloadDBConversionsTest, DownloadInfo) {
DownloadInfo info;
EXPECT_EQ(info, DownloadInfoFromProto(DownloadInfoToProto(info)));
info = CreateDownloadInfo();
EXPECT_EQ(info, DownloadInfoFromProto(DownloadInfoToProto(info)));
}
TEST_F(DownloadDBConversionsTest, DownloadDBEntry) {
DownloadDBEntry entry;
EXPECT_EQ(entry, DownloadDBEntryFromProto(DownloadDBEntryToProto(entry)));
entry.download_info = CreateDownloadInfo();
EXPECT_EQ(entry, DownloadDBEntryFromProto(DownloadDBEntryToProto(entry)));
}
} // namespace download