Index: components/history/core/browser/history_backend_db_unittest.cc |
diff --git a/components/history/core/browser/history_backend_db_unittest.cc b/components/history/core/browser/history_backend_db_unittest.cc |
index fd033d7f8a2f867938a5b93dfc0bea2c8b864961..2fbd5d028a54ea958cb227804033612a201b63b1 100644 |
--- a/components/history/core/browser/history_backend_db_unittest.cc |
+++ b/components/history/core/browser/history_backend_db_unittest.cc |
@@ -726,6 +726,45 @@ TEST_F(HistoryBackendDBTest, MigrateDownloadSiteInstanceUrl) { |
} |
} |
+// Tests that downloads_slices table are automatically added when migrating to |
+// version 33. |
+TEST_F(HistoryBackendDBTest, MigrateDownloadsSlicesTable) { |
+ ASSERT_NO_FATAL_FAILURE(CreateDBVersion(32)); |
+ { |
+ sql::Connection db; |
+ ASSERT_TRUE(db.Open(history_dir_.Append(kHistoryFilename))); |
+ } |
+ |
+ // Re-open the db using the HistoryDatabase, which should migrate to the |
+ // current version, creating the downloads_slices table. |
+ CreateBackendAndDatabase(); |
+ DeleteBackend(); |
+ { |
+ // Re-open the db for manual manipulation. |
+ sql::Connection db; |
+ ASSERT_TRUE(db.Open(history_dir_.Append(kHistoryFilename))); |
+ // The version should have been updated. |
+ int cur_version = HistoryDatabase::GetCurrentVersion(); |
+ ASSERT_LE(32, cur_version); |
+ { |
+ sql::Statement s(db.GetUniqueStatement( |
+ "SELECT value FROM meta WHERE key = 'version'")); |
+ EXPECT_TRUE(s.Step()); |
+ EXPECT_EQ(cur_version, s.ColumnInt(0)); |
+ } |
+ { |
+ // The downloads_slices table should be ready for use. |
+ sql::Statement s1(db.GetUniqueStatement( |
+ "SELECT COUNT(*) from downloads_slices")); |
+ EXPECT_TRUE(s1.Step()); |
+ EXPECT_EQ(0, s1.ColumnInt(0)); |
+ const char kInsertStatement[] = "INSERT INTO downloads_slices " |
+ "(download_id, offset, received_bytes) VALUES (1, 0, 100)"; |
+ ASSERT_TRUE(db.Execute(kInsertStatement)); |
+ } |
+ } |
+} |
+ |
TEST_F(HistoryBackendDBTest, DownloadCreateAndQuery) { |
CreateBackendAndDatabase(); |
@@ -749,7 +788,7 @@ TEST_F(HistoryBackendDBTest, DownloadCreateAndQuery) { |
100, 1000, DownloadState::INTERRUPTED, DownloadDangerType::NOT_DANGEROUS, |
kTestDownloadInterruptReasonCrash, "hash-value1", 1, |
"FE672168-26EF-4275-A149-FEC25F6A75F9", false, "extension-id", |
- "extension-name"); |
+ "extension-name", std::vector<DownloadSliceInfo>()); |
ASSERT_TRUE(db_->CreateDownload(download_A)); |
url_chain.push_back(GURL("http://example.com/d")); |
@@ -767,7 +806,7 @@ TEST_F(HistoryBackendDBTest, DownloadCreateAndQuery) { |
1001, 1001, DownloadState::COMPLETE, DownloadDangerType::DANGEROUS_FILE, |
kTestDownloadInterruptReasonNone, std::string(), 2, |
"b70f3869-7d75-4878-acb4-4caf7026d12b", false, "extension-id", |
- "extension-name"); |
+ "extension-name", std::vector<DownloadSliceInfo>()); |
ASSERT_TRUE(db_->CreateDownload(download_B)); |
EXPECT_EQ(2u, db_->CountDownloads()); |
@@ -806,7 +845,7 @@ TEST_F(HistoryBackendDBTest, DownloadCreateAndUpdate_VolatileFields) { |
"original/mime-type", start_time, end_time, "etag1", "last_modified_1", |
100, 1000, DownloadState::INTERRUPTED, DownloadDangerType::NOT_DANGEROUS, |
3, "some-hash-value", 1, "FE672168-26EF-4275-A149-FEC25F6A75F9", false, |
- "extension-id", "extension-name"); |
+ "extension-id", "extension-name", std::vector<DownloadSliceInfo>()); |
db_->CreateDownload(download); |
download.current_path = |
@@ -847,6 +886,13 @@ TEST_F(HistoryBackendDBTest, ConfirmDownloadRowCreateAndDelete) { |
"05AF6C8E-E4E0-45D7-B5CE-BC99F7019918", |
DownloadState::COMPLETE, |
now); |
+ std::vector<DownloadRow> results; |
+ db_->QueryDownloads(&results); |
+ ASSERT_EQ(1u, results.size()); |
+ // Add a download slice and update the DB |
+ results[0].download_slice_info.push_back(DownloadSliceInfo(id1, 500, 100)); |
+ ASSERT_TRUE(db_->UpdateDownload(results[0])); |
+ |
AddDownload(id2, |
"05AF6C8E-E4E0-45D7-B5CE-BC99F7019919", |
DownloadState::COMPLETE, |
@@ -870,12 +916,17 @@ TEST_F(HistoryBackendDBTest, ConfirmDownloadRowCreateAndDelete) { |
"Select Count(*) from downloads_url_chains")); |
EXPECT_TRUE(statement1.Step()); |
EXPECT_EQ(3, statement1.ColumnInt(0)); |
+ |
+ sql::Statement statement2(db.GetUniqueStatement( |
+ "Select Count(*) from downloads_slices")); |
+ EXPECT_TRUE(statement2.Step()); |
+ EXPECT_EQ(1, statement2.ColumnInt(0)); |
} |
// Delete some rows and make sure the results are still correct. |
CreateBackendAndDatabase(); |
+ db_->RemoveDownload(id1); |
db_->RemoveDownload(id2); |
- db_->RemoveDownload(id3); |
DeleteBackend(); |
{ |
sql::Connection db; |
@@ -889,6 +940,11 @@ TEST_F(HistoryBackendDBTest, ConfirmDownloadRowCreateAndDelete) { |
"Select Count(*) from downloads_url_chains")); |
EXPECT_TRUE(statement1.Step()); |
EXPECT_EQ(1, statement1.ColumnInt(0)); |
+ |
+ sql::Statement statement2(db.GetUniqueStatement( |
+ "Select Count(*) from downloads_slices")); |
+ EXPECT_TRUE(statement2.Step()); |
+ EXPECT_EQ(0, statement2.ColumnInt(0)); |
} |
} |
@@ -904,7 +960,8 @@ TEST_F(HistoryBackendDBTest, DownloadNukeRecordsMissingURLs) { |
"application/octet-stream", now, now, std::string(), std::string(), 0, |
512, DownloadState::COMPLETE, DownloadDangerType::NOT_DANGEROUS, |
kTestDownloadInterruptReasonNone, std::string(), 1, |
- "05AF6C8E-E4E0-45D7-B5CE-BC99F7019918", 0, "by_ext_id", "by_ext_name"); |
+ "05AF6C8E-E4E0-45D7-B5CE-BC99F7019918", 0, "by_ext_id", "by_ext_name", |
+ std::vector<DownloadSliceInfo>()); |
// Creating records without any urls should fail. |
EXPECT_FALSE(db_->CreateDownload(download)); |
@@ -947,10 +1004,17 @@ TEST_F(HistoryBackendDBTest, ConfirmDownloadInProgressCleanup) { |
base::Time now(base::Time::Now()); |
// Put an IN_PROGRESS download in the DB. |
- AddDownload(1, |
+ DownloadId id = 1; |
+ AddDownload(id, |
"05AF6C8E-E4E0-45D7-B5CE-BC99F7019918", |
DownloadState::IN_PROGRESS, |
now); |
+ std::vector<DownloadRow> results; |
+ db_->QueryDownloads(&results); |
+ ASSERT_EQ(1u, results.size()); |
+ // Add a download slice and update the DB |
+ results[0].download_slice_info.push_back(DownloadSliceInfo(id, 500, 100)); |
+ ASSERT_TRUE(db_->UpdateDownload(results[0])); |
// Confirm that they made it into the DB unchanged. |
DeleteBackend(); |
@@ -975,7 +1039,6 @@ TEST_F(HistoryBackendDBTest, ConfirmDownloadInProgressCleanup) { |
// Read in the DB through query downloads, then test that the |
// right transformation was returned. |
CreateBackendAndDatabase(); |
- std::vector<DownloadRow> results; |
db_->QueryDownloads(&results); |
ASSERT_EQ(1u, results.size()); |
EXPECT_EQ(DownloadState::INTERRUPTED, results[0].state); |
@@ -1004,6 +1067,119 @@ TEST_F(HistoryBackendDBTest, ConfirmDownloadInProgressCleanup) { |
} |
} |
+TEST_F(HistoryBackendDBTest, CreateAndUpdateDownloadingSlice) { |
+ CreateBackendAndDatabase(); |
+ |
+ std::vector<GURL> url_chain; |
+ url_chain.push_back(GURL("http://example.com/a")); |
+ |
+ DownloadId id = 1; |
+ std::vector<DownloadSliceInfo> slice_info; |
+ int64_t received = 10; |
+ slice_info.push_back(DownloadSliceInfo(id, 500, received)); |
+ base::Time start_time(base::Time::Now()); |
+ base::Time end_time(start_time + base::TimeDelta::FromHours(1)); |
+ |
+ DownloadRow download( |
+ base::FilePath(FILE_PATH_LITERAL("/path/1")), |
+ base::FilePath(FILE_PATH_LITERAL("/path/2")), url_chain, |
+ GURL("http://example.com/referrer"), GURL("http://example.com"), |
+ GURL("http://example.com/tab-url"), |
+ GURL("http://example.com/tab-referrer"), "GET", "mime/type", |
+ "original/mime-type", start_time, end_time, "etag1", "last_modified_1", |
+ received, 1500, DownloadState::INTERRUPTED, |
+ DownloadDangerType::NOT_DANGEROUS, kTestDownloadInterruptReasonCrash, |
+ "hash-value1", id, "FE672168-26EF-4275-A149-FEC25F6A75F9", |
+ false, "extension-id", "extension-name", slice_info); |
+ ASSERT_TRUE(db_->CreateDownload(download)); |
+ std::vector<DownloadRow> results; |
+ db_->QueryDownloads(&results); |
+ ASSERT_EQ(1u, results.size()); |
+ EXPECT_EQ(download, results[0]); |
+ |
+ download.received_bytes += 10; |
+ download.download_slice_info[0].received_bytes = download.received_bytes; |
+ ASSERT_TRUE(db_->UpdateDownload(download)); |
+ db_->QueryDownloads(&results); |
+ ASSERT_EQ(1u, results.size()); |
+ EXPECT_EQ(download, results[0]); |
+} |
+ |
+// Test calling UpdateDownload with a new download slice. |
+TEST_F(HistoryBackendDBTest, UpdateDownloadWithNewSlice) { |
+ CreateBackendAndDatabase(); |
+ |
+ std::vector<GURL> url_chain; |
+ url_chain.push_back(GURL("http://example.com/a")); |
+ |
+ DownloadId id = 1; |
+ base::Time start_time(base::Time::Now()); |
+ base::Time end_time(start_time + base::TimeDelta::FromHours(1)); |
+ DownloadRow download( |
+ base::FilePath(FILE_PATH_LITERAL("/path/1")), |
+ base::FilePath(FILE_PATH_LITERAL("/path/2")), url_chain, |
+ GURL("http://example.com/referrer"), GURL("http://example.com"), |
+ GURL("http://example.com/tab-url"), |
+ GURL("http://example.com/tab-referrer"), "GET", "mime/type", |
+ "original/mime-type", start_time, end_time, "etag1", "last_modified_1", |
+ 0, 1500, DownloadState::INTERRUPTED, DownloadDangerType::NOT_DANGEROUS, |
+ kTestDownloadInterruptReasonCrash, "hash-value1", id, |
+ "FE672168-26EF-4275-A149-FEC25F6A75F9", false, "extension-id", |
+ "extension-name", std::vector<DownloadSliceInfo>()); |
+ ASSERT_TRUE(db_->CreateDownload(download)); |
+ |
+ // Add a new slice and call UpdateDownload(). |
+ download.download_slice_info.push_back(DownloadSliceInfo(id, 500, 100)); |
+ ASSERT_TRUE(db_->UpdateDownload(download)); |
+ std::vector<DownloadRow> results; |
+ db_->QueryDownloads(&results); |
+ ASSERT_EQ(1u, results.size()); |
+ EXPECT_EQ(download.download_slice_info[0], results[0].download_slice_info[0]); |
+} |
+ |
+TEST_F(HistoryBackendDBTest, DownloadSliceDeletedIfEmpty) { |
+ CreateBackendAndDatabase(); |
+ |
+ std::vector<GURL> url_chain; |
+ url_chain.push_back(GURL("http://example.com/a")); |
+ |
+ DownloadId id = 1; |
+ std::vector<DownloadSliceInfo> slice_info; |
+ int64_t received = 10; |
+ slice_info.push_back(DownloadSliceInfo(id, 0, received)); |
+ slice_info.push_back(DownloadSliceInfo(id, 500, received)); |
+ slice_info.push_back(DownloadSliceInfo(id, 100, received)); |
+ // The empty slice will not be inserted. |
+ slice_info.push_back(DownloadSliceInfo(id, 1500, 0)); |
+ base::Time start_time(base::Time::Now()); |
+ base::Time end_time(start_time + base::TimeDelta::FromHours(1)); |
+ |
+ DownloadRow download( |
+ base::FilePath(FILE_PATH_LITERAL("/path/1")), |
+ base::FilePath(FILE_PATH_LITERAL("/path/2")), url_chain, |
+ GURL("http://example.com/referrer"), GURL("http://example.com"), |
+ GURL("http://example.com/tab-url"), |
+ GURL("http://example.com/tab-referrer"), "GET", "mime/type", |
+ "original/mime-type", start_time, end_time, "etag1", "last_modified_1", |
+ received, 1500, DownloadState::INTERRUPTED, |
+ DownloadDangerType::NOT_DANGEROUS, kTestDownloadInterruptReasonCrash, |
+ "hash-value1", id, "FE672168-26EF-4275-A149-FEC25F6A75F9", |
+ false, "extension-id", "extension-name", slice_info); |
+ ASSERT_TRUE(db_->CreateDownload(download)); |
+ std::vector<DownloadRow> results; |
+ db_->QueryDownloads(&results); |
+ ASSERT_EQ(1u, results.size()); |
+ // Only 3 slices are inserted. |
+ EXPECT_EQ(3u, results[0].download_slice_info.size()); |
+ |
+ // If slice info vector is empty, all slice entries will be removed. |
+ download.download_slice_info.clear(); |
+ ASSERT_TRUE(db_->UpdateDownload(download)); |
+ db_->QueryDownloads(&results); |
+ ASSERT_EQ(1u, results.size()); |
+ EXPECT_EQ(0u, results[0].download_slice_info.size()); |
+} |
+ |
TEST_F(HistoryBackendDBTest, MigratePresentations) { |
// Create the db we want. Use 22 since segments didn't change in that time |
// frame. |