OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/child/blob_storage/blob_transport_controller.h" | 5 #include "content/child/blob_storage/blob_transport_controller.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 #include <tuple> | 9 #include <tuple> |
10 | 10 |
(...skipping 19 matching lines...) Expand all Loading... |
30 #include "storage/common/blob_storage/blob_item_bytes_request.h" | 30 #include "storage/common/blob_storage/blob_item_bytes_request.h" |
31 #include "storage/common/blob_storage/blob_item_bytes_response.h" | 31 #include "storage/common/blob_storage/blob_item_bytes_response.h" |
32 #include "testing/gmock/include/gmock/gmock.h" | 32 #include "testing/gmock/include/gmock/gmock.h" |
33 #include "testing/gtest/include/gtest/gtest.h" | 33 #include "testing/gtest/include/gtest/gtest.h" |
34 | 34 |
35 using base::File; | 35 using base::File; |
36 using base::FilePath; | 36 using base::FilePath; |
37 using base::TestSimpleTaskRunner; | 37 using base::TestSimpleTaskRunner; |
38 using storage::BlobItemBytesRequest; | 38 using storage::BlobItemBytesRequest; |
39 using storage::BlobItemBytesResponse; | 39 using storage::BlobItemBytesResponse; |
| 40 using storage::BlobStatus; |
40 using storage::DataElement; | 41 using storage::DataElement; |
41 using storage::IPCBlobCreationCancelCode; | |
42 | 42 |
43 namespace content { | 43 namespace content { |
44 namespace { | 44 namespace { |
45 | 45 |
46 class OtherThreadTestSimpleTaskRunner : public base::TestSimpleTaskRunner { | 46 class OtherThreadTestSimpleTaskRunner : public base::TestSimpleTaskRunner { |
47 public: | 47 public: |
48 bool RunsTasksOnCurrentThread() const override { return false; } | 48 bool RunsTasksOnCurrentThread() const override { return false; } |
49 | 49 |
50 protected: | 50 protected: |
51 ~OtherThreadTestSimpleTaskRunner() override {} | 51 ~OtherThreadTestSimpleTaskRunner() override {} |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 FilePath path; | 122 FilePath path; |
123 EXPECT_TRUE(base::CreateTemporaryFile(&path)); | 123 EXPECT_TRUE(base::CreateTemporaryFile(&path)); |
124 files_opened_.push_back(path); | 124 files_opened_.push_back(path); |
125 return path; | 125 return path; |
126 } | 126 } |
127 | 127 |
128 void ExpectRegisterAndStartMessage(const std::string& expected_uuid, | 128 void ExpectRegisterAndStartMessage(const std::string& expected_uuid, |
129 const std::string& expected_content_type, | 129 const std::string& expected_content_type, |
130 std::vector<DataElement>* descriptions) { | 130 std::vector<DataElement>* descriptions) { |
131 const IPC::Message* register_message = | 131 const IPC::Message* register_message = |
132 sink_.GetUniqueMessageMatching(BlobStorageMsg_RegisterBlobUUID::ID); | 132 sink_.GetUniqueMessageMatching(BlobStorageMsg_RegisterBlob::ID); |
133 const IPC::Message* start_message = | |
134 sink_.GetUniqueMessageMatching(BlobStorageMsg_StartBuildingBlob::ID); | |
135 ASSERT_TRUE(register_message); | 133 ASSERT_TRUE(register_message); |
136 ASSERT_TRUE(start_message); | 134 std::tuple<std::string, std::string, std::string, std::vector<DataElement>> |
137 std::tuple<std::string, std::string, std::string, std::set<std::string>> | |
138 register_contents; | 135 register_contents; |
139 std::tuple<std::string, std::vector<DataElement>> start_contents; | 136 BlobStorageMsg_RegisterBlob::Read(register_message, ®ister_contents); |
140 BlobStorageMsg_RegisterBlobUUID::Read(register_message, ®ister_contents); | |
141 BlobStorageMsg_StartBuildingBlob::Read(start_message, &start_contents); | |
142 EXPECT_EQ(expected_uuid, std::get<0>(register_contents)); | 137 EXPECT_EQ(expected_uuid, std::get<0>(register_contents)); |
143 EXPECT_EQ(expected_uuid, std::get<0>(start_contents)); | |
144 EXPECT_EQ(expected_content_type, std::get<1>(register_contents)); | 138 EXPECT_EQ(expected_content_type, std::get<1>(register_contents)); |
145 if (descriptions) | 139 if (descriptions) |
146 *descriptions = std::get<1>(start_contents); | 140 *descriptions = std::get<3>(register_contents); |
147 // We don't have dispositions from the renderer. | 141 // We don't have dispositions from the renderer. |
148 EXPECT_TRUE(std::get<2>(register_contents).empty()); | 142 EXPECT_TRUE(std::get<2>(register_contents).empty()); |
149 sink_.ClearMessages(); | 143 sink_.ClearMessages(); |
150 } | 144 } |
151 | 145 |
152 void ExpectMemoryResponses( | 146 void ExpectMemoryResponses( |
153 const std::string& expected_uuid, | 147 const std::string& expected_uuid, |
154 std::vector<storage::BlobItemBytesResponse> expected_responses) { | 148 std::vector<storage::BlobItemBytesResponse> expected_responses) { |
155 const IPC::Message* responses_message = | 149 const IPC::Message* responses_message = |
156 sink_.GetUniqueMessageMatching(BlobStorageMsg_MemoryItemResponse::ID); | 150 sink_.GetUniqueMessageMatching(BlobStorageMsg_MemoryItemResponse::ID); |
157 ASSERT_TRUE(responses_message); | 151 ASSERT_TRUE(responses_message); |
158 std::tuple<std::string, std::vector<storage::BlobItemBytesResponse>> | 152 std::tuple<std::string, std::vector<storage::BlobItemBytesResponse>> |
159 responses_content; | 153 responses_content; |
160 BlobStorageMsg_MemoryItemResponse::Read(responses_message, | 154 BlobStorageMsg_MemoryItemResponse::Read(responses_message, |
161 &responses_content); | 155 &responses_content); |
162 EXPECT_EQ(expected_uuid, std::get<0>(responses_content)); | 156 EXPECT_EQ(expected_uuid, std::get<0>(responses_content)); |
163 EXPECT_EQ(expected_responses, std::get<1>(responses_content)); | 157 EXPECT_EQ(expected_responses, std::get<1>(responses_content)); |
164 sink_.ClearMessages(); | 158 sink_.ClearMessages(); |
165 } | 159 } |
166 | 160 |
167 void ExpectCancel(const std::string& expected_uuid, | 161 void ExpectCancel(const std::string& expected_uuid, |
168 storage::IPCBlobCreationCancelCode expected_code) { | 162 storage::BlobStatus expected_code) { |
169 const IPC::Message* cancel_message = | 163 const IPC::Message* cancel_message = |
170 sink_.GetUniqueMessageMatching(BlobStorageMsg_CancelBuildingBlob::ID); | 164 sink_.GetUniqueMessageMatching(BlobStorageMsg_SendBlobStatus::ID); |
171 ASSERT_TRUE(cancel_message); | 165 ASSERT_TRUE(cancel_message); |
172 std::tuple<std::string, storage::IPCBlobCreationCancelCode> cancel_content; | 166 std::tuple<std::string, storage::BlobStatus> cancel_content; |
173 BlobStorageMsg_CancelBuildingBlob::Read(cancel_message, &cancel_content); | 167 BlobStorageMsg_SendBlobStatus::Read(cancel_message, &cancel_content); |
174 EXPECT_EQ(expected_uuid, std::get<0>(cancel_content)); | 168 EXPECT_EQ(expected_uuid, std::get<0>(cancel_content)); |
175 EXPECT_EQ(expected_code, std::get<1>(cancel_content)); | 169 EXPECT_EQ(expected_code, std::get<1>(cancel_content)); |
176 } | 170 } |
177 | 171 |
178 void TearDown() override { | 172 void TearDown() override { |
179 BlobTransportController::GetInstance()->CancelAllBlobTransfers(); | 173 BlobTransportController::GetInstance()->CancelAllBlobTransfers(); |
180 for (const FilePath& path : files_opened_) { | 174 for (const FilePath& path : files_opened_) { |
181 EXPECT_TRUE(base::DeleteFile(path, false)); | 175 EXPECT_TRUE(base::DeleteFile(path, false)); |
182 } | 176 } |
183 EXPECT_FALSE(io_thread_runner_->HasPendingTask()); | 177 EXPECT_FALSE(io_thread_runner_->HasPendingTask()); |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
377 EXPECT_FALSE(file2.IsValid()); | 371 EXPECT_FALSE(file2.IsValid()); |
378 file_handles.push_back(IPC::TakePlatformFileForTransit(std::move(file2))); | 372 file_handles.push_back(IPC::TakePlatformFileForTransit(std::move(file2))); |
379 OnMemoryRequest(holder, kBlobUUID, requests, &memory_handles, file_handles); | 373 OnMemoryRequest(holder, kBlobUUID, requests, &memory_handles, file_handles); |
380 EXPECT_TRUE(file_thread_runner_->HasPendingTask()); | 374 EXPECT_TRUE(file_thread_runner_->HasPendingTask()); |
381 file_thread_runner_->RunPendingTasks(); | 375 file_thread_runner_->RunPendingTasks(); |
382 EXPECT_TRUE(io_thread_runner_->HasPendingTask()); | 376 EXPECT_TRUE(io_thread_runner_->HasPendingTask()); |
383 io_thread_runner_->RunPendingTasks(); | 377 io_thread_runner_->RunPendingTasks(); |
384 // Clear the main thread task, as it has the AddRef job. | 378 // Clear the main thread task, as it has the AddRef job. |
385 EXPECT_TRUE(main_thread_runner_->HasPendingTask()); | 379 EXPECT_TRUE(main_thread_runner_->HasPendingTask()); |
386 main_thread_runner_->ClearPendingTasks(); | 380 main_thread_runner_->ClearPendingTasks(); |
387 ExpectCancel(kBlobUUID, IPCBlobCreationCancelCode::FILE_WRITE_FAILED); | 381 ExpectCancel(kBlobUUID, BlobStatus::ERR_FILE_WRITE_FAILED); |
388 } | 382 } |
389 | 383 |
390 TEST_F(BlobTransportControllerTest, PublicMethods) { | 384 TEST_F(BlobTransportControllerTest, PublicMethods) { |
391 const std::string kBlobUUID = "uuid"; | 385 const std::string kBlobUUID = "uuid"; |
392 const std::string kBlobContentType = "content_type"; | 386 const std::string kBlobContentType = "content_type"; |
393 const std::string kBlob2UUID = "uuid2"; | 387 const std::string kBlob2UUID = "uuid2"; |
394 const std::string kBlob2ContentType = "content_type2"; | 388 const std::string kBlob2ContentType = "content_type2"; |
395 const std::string KRefBlobUUID = "refuuid"; | 389 const std::string KRefBlobUUID = "refuuid"; |
396 const std::string kDataPart1 = "Hello"; | 390 const std::string kDataPart1 = "Hello"; |
397 const std::string kDataPart2 = "Hello2"; | 391 const std::string kDataPart2 = "Hello2"; |
(...skipping 18 matching lines...) Expand all Loading... |
416 main_thread_runner_->ClearPendingTasks(); | 410 main_thread_runner_->ClearPendingTasks(); |
417 | 411 |
418 // Check that we got the correct start message. | 412 // Check that we got the correct start message. |
419 EXPECT_FALSE(holder->IsTransporting(kBlobUUID)); | 413 EXPECT_FALSE(holder->IsTransporting(kBlobUUID)); |
420 io_thread_runner_->RunPendingTasks(); | 414 io_thread_runner_->RunPendingTasks(); |
421 EXPECT_TRUE(holder->IsTransporting(kBlobUUID)); | 415 EXPECT_TRUE(holder->IsTransporting(kBlobUUID)); |
422 std::tuple<std::string, std::vector<DataElement>> message_contents; | 416 std::tuple<std::string, std::vector<DataElement>> message_contents; |
423 EXPECT_TRUE(holder->IsTransporting(kBlobUUID)); | 417 EXPECT_TRUE(holder->IsTransporting(kBlobUUID)); |
424 EXPECT_EQ(MakeBlobElement(KRefBlobUUID, 10, 10), message_descriptions[0]); | 418 EXPECT_EQ(MakeBlobElement(KRefBlobUUID, 10, 10), message_descriptions[0]); |
425 | 419 |
426 holder->OnCancel(kBlobUUID, IPCBlobCreationCancelCode::OUT_OF_MEMORY); | 420 holder->OnBlobFinalStatus(kBlobUUID, BlobStatus::ERR_OUT_OF_MEMORY); |
427 EXPECT_FALSE(holder->IsTransporting(kBlobUUID)); | 421 EXPECT_FALSE(holder->IsTransporting(kBlobUUID)); |
428 // Check we have the 'decrease ref' task. | 422 // Check we have the 'decrease ref' task. |
429 EXPECT_TRUE(main_thread_runner_->HasPendingTask()); | 423 EXPECT_TRUE(main_thread_runner_->HasPendingTask()); |
430 main_thread_runner_->ClearPendingTasks(); | 424 main_thread_runner_->ClearPendingTasks(); |
431 sink_.ClearMessages(); | 425 sink_.ClearMessages(); |
432 | 426 |
433 // Add the second. | 427 // Add the second. |
434 scoped_refptr<BlobConsolidation> consolidation2 = new BlobConsolidation(); | 428 scoped_refptr<BlobConsolidation> consolidation2 = new BlobConsolidation(); |
435 consolidation2->AddBlobItem(KRefBlobUUID, 10, 10); | 429 consolidation2->AddBlobItem(KRefBlobUUID, 10, 10); |
436 // These items should be combined. | 430 // These items should be combined. |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
468 OnMemoryRequest(holder, kBlob2UUID, requests, &memory_handles, file_handles); | 462 OnMemoryRequest(holder, kBlob2UUID, requests, &memory_handles, file_handles); |
469 | 463 |
470 std::vector<BlobItemBytesResponse> expected_responses; | 464 std::vector<BlobItemBytesResponse> expected_responses; |
471 BlobItemBytesResponse expected(0); | 465 BlobItemBytesResponse expected(0); |
472 expected.inline_data = std::vector<char>(kData.begin(), kData.end()); | 466 expected.inline_data = std::vector<char>(kData.begin(), kData.end()); |
473 expected_responses.push_back(expected); | 467 expected_responses.push_back(expected); |
474 ExpectMemoryResponses(kBlob2UUID, expected_responses); | 468 ExpectMemoryResponses(kBlob2UUID, expected_responses); |
475 EXPECT_FALSE(main_thread_runner_->HasPendingTask()); | 469 EXPECT_FALSE(main_thread_runner_->HasPendingTask()); |
476 | 470 |
477 // Finish the second one. | 471 // Finish the second one. |
478 holder->OnDone(kBlob2UUID); | 472 holder->OnBlobFinalStatus(kBlob2UUID, BlobStatus::DONE); |
479 EXPECT_FALSE(holder->IsTransporting(kBlob2UUID)); | 473 EXPECT_FALSE(holder->IsTransporting(kBlob2UUID)); |
480 EXPECT_TRUE(main_thread_runner_->HasPendingTask()); | 474 EXPECT_TRUE(main_thread_runner_->HasPendingTask()); |
481 main_thread_runner_->ClearPendingTasks(); | 475 main_thread_runner_->ClearPendingTasks(); |
482 } | 476 } |
483 | 477 |
484 } // namespace content | 478 } // namespace content |
OLD | NEW |