Chromium Code Reviews| 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..e36d1d952e4b3c1fbc37e992ae73c63c5dfc9d06 100644 |
| --- a/components/history/core/browser/history_backend_db_unittest.cc |
| +++ b/components/history/core/browser/history_backend_db_unittest.cc |
| @@ -726,6 +726,67 @@ 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))); |
| + { |
| + sql::Statement s(db.GetUniqueStatement( |
| + "INSERT INTO downloads (" |
| + " id, guid, current_path, target_path, start_time, received_bytes," |
| + " total_bytes, state, danger_type, interrupt_reason, hash," |
| + " end_time, opened, referrer, site_url, tab_url, tab_referrer_url," |
| + " http_method, by_ext_id, by_ext_name, etag, last_modified," |
| + " mime_type, original_mime_type)" |
| + "VALUES(" |
| + " 1, '435A5C7A-F6B7-4DF2-8696-22E4FCBA3EB2', 'foo.txt', 'foo.txt'," |
| + " 13104873187307670, 11, 11, 1, 0, 0, X'', 13104873187521021, 0," |
| + " 'http://example.com/dl/', '', '', '', '', '', '', '', ''," |
| + " 'text/plain', 'text/plain')")); |
| + ASSERT_TRUE(s.Run()); |
| + } |
| + { |
| + sql::Statement s(db.GetUniqueStatement( |
| + "INSERT INTO downloads_url_chains (id, chain_index, url) VALUES " |
| + "(1, 0, 'url')")); |
| + ASSERT_TRUE(s.Run()); |
| + } |
|
Scott Hess - ex-Googler
2017/02/10 22:41:12
I see that this follows the style in this file, so
qinmin
2017/02/11 00:23:54
Switched to use execute.
|
| + } |
| + |
| + // 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)); |
| + sql::Statement s2(db.GetUniqueStatement( |
| + "INSERT INTO downloads_slices (download_id, offset, received_bytes) " |
| + "VALUES (1, 0, 100)")); |
| + ASSERT_TRUE(s2.Run()); |
|
Scott Hess - ex-Googler
2017/02/10 22:41:12
This could also be Execute(), unless the style of
qinmin
2017/02/11 00:23:54
Done.
|
| + } |
| + } |
| +} |
| + |
| TEST_F(HistoryBackendDBTest, DownloadCreateAndQuery) { |
| CreateBackendAndDatabase(); |
| @@ -749,7 +810,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 +828,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 +867,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 +908,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 +938,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 +962,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 +982,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 +1026,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 +1061,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 +1089,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. |