| 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 "base/memory/shared_memory.h" | 7 #include "base/memory/shared_memory.h" |
| 8 #include "content/child/blob_storage/blob_consolidation.h" | 8 #include "content/child/blob_storage/blob_consolidation.h" |
| 9 #include "content/common/fileapi/webblob_messages.h" |
| 10 #include "ipc/ipc_sender.h" |
| 9 #include "storage/common/blob_storage/blob_item_bytes_request.h" | 11 #include "storage/common/blob_storage/blob_item_bytes_request.h" |
| 10 #include "storage/common/blob_storage/blob_item_bytes_response.h" | 12 #include "storage/common/blob_storage/blob_item_bytes_response.h" |
| 11 #include "testing/gmock/include/gmock/gmock.h" | 13 #include "testing/gmock/include/gmock/gmock.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
| 13 | 15 |
| 14 using storage::BlobItemBytesRequest; | 16 using storage::BlobItemBytesRequest; |
| 15 using storage::BlobItemBytesResponse; | 17 using storage::BlobItemBytesResponse; |
| 16 using storage::DataElement; | 18 using storage::DataElement; |
| 17 | 19 |
| 18 namespace content { | 20 namespace content { |
| 19 namespace { | 21 namespace { |
| 20 | 22 |
| 23 class MockIPCSender : public IPC::Sender { |
| 24 public: |
| 25 MockIPCSender() {} |
| 26 ~MockIPCSender() override {} |
| 27 |
| 28 MOCK_METHOD1(Send, bool(IPC::Message* msg)); |
| 29 }; |
| 30 |
| 21 BlobItemBytesResponse ResponseWithData(size_t request_number, | 31 BlobItemBytesResponse ResponseWithData(size_t request_number, |
| 22 const std::string& str) { | 32 const std::string& str) { |
| 23 BlobItemBytesResponse response(request_number); | 33 BlobItemBytesResponse response(request_number); |
| 24 response.inline_data.assign(str.begin(), str.end()); | 34 response.inline_data.assign(str.begin(), str.end()); |
| 25 return response; | 35 return response; |
| 26 } | 36 } |
| 27 | 37 |
| 28 static DataElement MakeBlobElement(const std::string& uuid, | 38 static DataElement MakeBlobElement(const std::string& uuid, |
| 29 uint64_t offset, | 39 uint64_t offset, |
| 30 uint64_t size) { | 40 uint64_t size) { |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 | 103 |
| 94 // The first two data elements should be combined. | 104 // The first two data elements should be combined. |
| 95 BlobConsolidation* consolidation = new BlobConsolidation(); | 105 BlobConsolidation* consolidation = new BlobConsolidation(); |
| 96 consolidation->AddBlobItem(KRefBlobUUID, 10, 10); | 106 consolidation->AddBlobItem(KRefBlobUUID, 10, 10); |
| 97 consolidation->AddDataItem(CreateData("Hello")); | 107 consolidation->AddDataItem(CreateData("Hello")); |
| 98 consolidation->AddDataItem(CreateData("Hello2")); | 108 consolidation->AddDataItem(CreateData("Hello2")); |
| 99 consolidation->AddBlobItem(KRefBlobUUID, 0, 10); | 109 consolidation->AddBlobItem(KRefBlobUUID, 0, 10); |
| 100 consolidation->AddDataItem(CreateData("Hello3")); | 110 consolidation->AddDataItem(CreateData("Hello3")); |
| 101 // See the above test for the expected descriptions layout. | 111 // See the above test for the expected descriptions layout. |
| 102 | 112 |
| 103 holder->blob_storage_.insert( | 113 holder->blob_storage_[kBlobUUID] = make_scoped_ptr(consolidation); |
| 104 std::make_pair(kBlobUUID, make_scoped_ptr(consolidation))); | |
| 105 | 114 |
| 106 std::vector<BlobItemBytesRequest> requests; | 115 std::vector<BlobItemBytesRequest> requests; |
| 107 std::vector<base::SharedMemoryHandle> memory_handles; | 116 std::vector<base::SharedMemoryHandle> memory_handles; |
| 108 std::vector<IPC::PlatformFileForTransit> file_handles; | 117 std::vector<IPC::PlatformFileForTransit> file_handles; |
| 109 std::vector<storage::BlobItemBytesResponse> output; | 118 std::vector<storage::BlobItemBytesResponse> output; |
| 110 | 119 |
| 111 // Request for all of first data | 120 // Request for all of first data |
| 112 requests.push_back(BlobItemBytesRequest::CreateIPCRequest(0, 1, 0, 11)); | 121 requests.push_back(BlobItemBytesRequest::CreateIPCRequest(0, 1, 0, 11)); |
| 113 EXPECT_EQ(ResponsesStatus::SUCCESS, | 122 EXPECT_EQ(ResponsesStatus::SUCCESS, |
| 114 holder->GetResponses(kBlobUUID, requests, &memory_handles, | 123 holder->GetResponses(kBlobUUID, requests, &memory_handles, |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 | 161 |
| 153 // The first two data elements should be combined. | 162 // The first two data elements should be combined. |
| 154 BlobConsolidation* consolidation = new BlobConsolidation(); | 163 BlobConsolidation* consolidation = new BlobConsolidation(); |
| 155 consolidation->AddBlobItem(KRefBlobUUID, 10, 10); | 164 consolidation->AddBlobItem(KRefBlobUUID, 10, 10); |
| 156 consolidation->AddDataItem(CreateData("Hello")); | 165 consolidation->AddDataItem(CreateData("Hello")); |
| 157 consolidation->AddDataItem(CreateData("Hello2")); | 166 consolidation->AddDataItem(CreateData("Hello2")); |
| 158 consolidation->AddBlobItem(KRefBlobUUID, 0, 10); | 167 consolidation->AddBlobItem(KRefBlobUUID, 0, 10); |
| 159 consolidation->AddDataItem(CreateData("Hello3")); | 168 consolidation->AddDataItem(CreateData("Hello3")); |
| 160 // See the above test for the expected descriptions layout. | 169 // See the above test for the expected descriptions layout. |
| 161 | 170 |
| 162 holder->blob_storage_.insert( | 171 holder->blob_storage_[kBlobUUID] = make_scoped_ptr(consolidation); |
| 163 std::make_pair(kBlobUUID, make_scoped_ptr(consolidation))); | |
| 164 | 172 |
| 165 std::vector<BlobItemBytesRequest> requests; | 173 std::vector<BlobItemBytesRequest> requests; |
| 166 std::vector<base::SharedMemoryHandle> memory_handles; | 174 std::vector<base::SharedMemoryHandle> memory_handles; |
| 167 std::vector<IPC::PlatformFileForTransit> file_handles; | 175 std::vector<IPC::PlatformFileForTransit> file_handles; |
| 168 std::vector<storage::BlobItemBytesResponse> output; | 176 std::vector<storage::BlobItemBytesResponse> output; |
| 169 | 177 |
| 170 // Request for all data in shared memory | 178 // Request for all data in shared memory |
| 171 requests.push_back( | 179 requests.push_back( |
| 172 BlobItemBytesRequest::CreateSharedMemoryRequest(0, 1, 0, 11, 0, 0)); | 180 BlobItemBytesRequest::CreateSharedMemoryRequest(0, 1, 0, 11, 0, 0)); |
| 173 requests.push_back( | 181 requests.push_back( |
| (...skipping 17 matching lines...) Expand all Loading... |
| 191 const char* mem_location = static_cast<const char*>(memory.memory()); | 199 const char* mem_location = static_cast<const char*>(memory.memory()); |
| 192 std::vector<char> value(mem_location, mem_location + memory.requested_size()); | 200 std::vector<char> value(mem_location, mem_location + memory.requested_size()); |
| 193 EXPECT_THAT(value, testing::ElementsAreArray(expected_memory.c_str(), | 201 EXPECT_THAT(value, testing::ElementsAreArray(expected_memory.c_str(), |
| 194 expected_memory.size())); | 202 expected_memory.size())); |
| 195 } | 203 } |
| 196 | 204 |
| 197 TEST_F(BlobTransportControllerTest, TestPublicMethods) { | 205 TEST_F(BlobTransportControllerTest, TestPublicMethods) { |
| 198 const std::string kBlobUUID = "uuid"; | 206 const std::string kBlobUUID = "uuid"; |
| 199 const std::string KRefBlobUUID = "refuuid"; | 207 const std::string KRefBlobUUID = "refuuid"; |
| 200 const std::string kBadBlobUUID = "uuuidBad"; | 208 const std::string kBadBlobUUID = "uuuidBad"; |
| 209 MockIPCSender mock_sender; |
| 210 |
| 201 BlobTransportController* holder = BlobTransportController::GetInstance(); | 211 BlobTransportController* holder = BlobTransportController::GetInstance(); |
| 202 | 212 |
| 203 BlobConsolidation* consolidation = new BlobConsolidation(); | 213 BlobConsolidation* consolidation = new BlobConsolidation(); |
| 204 consolidation->AddBlobItem(KRefBlobUUID, 10, 10); | 214 consolidation->AddBlobItem(KRefBlobUUID, 10, 10); |
| 215 IPC::Message* message = nullptr; |
| 216 EXPECT_CALL(mock_sender, Send(testing::_)) |
| 217 .WillOnce( |
| 218 testing::DoAll(testing::SaveArg<0>(&message), testing::Return(true))) |
| 219 .RetiresOnSaturation(); |
| 205 holder->InitiateBlobTransfer(kBlobUUID, "", make_scoped_ptr(consolidation), | 220 holder->InitiateBlobTransfer(kBlobUUID, "", make_scoped_ptr(consolidation), |
| 206 nullptr); | 221 &mock_sender); |
| 222 EXPECT_NE(nullptr, message); |
| 207 holder->OnCancel(kBlobUUID, | 223 holder->OnCancel(kBlobUUID, |
| 208 storage::IPCBlobCreationCancelCode::OUT_OF_MEMORY); | 224 storage::IPCBlobCreationCancelCode::OUT_OF_MEMORY); |
| 209 EXPECT_FALSE(holder->IsTransporting(kBlobUUID)); | 225 EXPECT_FALSE(holder->IsTransporting(kBlobUUID)); |
| 226 delete ((BlobStorageMsg_StartBuildingBlob*)message); |
| 227 message = nullptr; |
| 210 | 228 |
| 211 consolidation = new BlobConsolidation(); | 229 consolidation = new BlobConsolidation(); |
| 212 consolidation->AddBlobItem(KRefBlobUUID, 10, 10); | 230 consolidation->AddBlobItem(KRefBlobUUID, 10, 10); |
| 231 EXPECT_CALL(mock_sender, Send(testing::_)) |
| 232 .WillOnce( |
| 233 testing::DoAll(testing::SaveArg<0>(&message), testing::Return(true))) |
| 234 .RetiresOnSaturation(); |
| 213 holder->InitiateBlobTransfer(kBlobUUID, "", make_scoped_ptr(consolidation), | 235 holder->InitiateBlobTransfer(kBlobUUID, "", make_scoped_ptr(consolidation), |
| 214 nullptr); | 236 &mock_sender); |
| 237 EXPECT_NE(nullptr, message); |
| 215 holder->OnDone(kBlobUUID); | 238 holder->OnDone(kBlobUUID); |
| 216 EXPECT_FALSE(holder->IsTransporting(kBlobUUID)); | 239 EXPECT_FALSE(holder->IsTransporting(kBlobUUID)); |
| 240 delete ((BlobStorageMsg_StartBuildingBlob*)message); |
| 217 } | 241 } |
| 218 | 242 |
| 219 TEST_F(BlobTransportControllerTest, ResponsesErrors) { | 243 TEST_F(BlobTransportControllerTest, ResponsesErrors) { |
| 220 using ResponsesStatus = BlobTransportController::ResponsesStatus; | 244 using ResponsesStatus = BlobTransportController::ResponsesStatus; |
| 221 const std::string kBlobUUID = "uuid"; | 245 const std::string kBlobUUID = "uuid"; |
| 222 const std::string KRefBlobUUID = "refuuid"; | 246 const std::string KRefBlobUUID = "refuuid"; |
| 223 const std::string kBadBlobUUID = "uuuidBad"; | 247 const std::string kBadBlobUUID = "uuuidBad"; |
| 224 BlobTransportController* holder = BlobTransportController::GetInstance(); | 248 BlobTransportController* holder = BlobTransportController::GetInstance(); |
| 225 | 249 |
| 226 BlobConsolidation* consolidation = new BlobConsolidation(); | 250 BlobConsolidation* consolidation = new BlobConsolidation(); |
| 227 consolidation->AddBlobItem(KRefBlobUUID, 10, 10); | 251 consolidation->AddBlobItem(KRefBlobUUID, 10, 10); |
| 228 | 252 |
| 229 holder->blob_storage_.insert( | 253 holder->blob_storage_[kBlobUUID] = make_scoped_ptr(consolidation); |
| 230 std::make_pair(kBlobUUID, make_scoped_ptr(consolidation))); | |
| 231 | 254 |
| 232 std::vector<BlobItemBytesRequest> requests; | 255 std::vector<BlobItemBytesRequest> requests; |
| 233 std::vector<base::SharedMemoryHandle> memory_handles; | 256 std::vector<base::SharedMemoryHandle> memory_handles; |
| 234 std::vector<IPC::PlatformFileForTransit> file_handles; | 257 std::vector<IPC::PlatformFileForTransit> file_handles; |
| 235 std::vector<storage::BlobItemBytesResponse> output; | 258 std::vector<storage::BlobItemBytesResponse> output; |
| 236 | 259 |
| 237 // Error conditions | 260 // Error conditions |
| 238 EXPECT_EQ(ResponsesStatus::BLOB_NOT_FOUND, | 261 EXPECT_EQ(ResponsesStatus::BLOB_NOT_FOUND, |
| 239 holder->GetResponses(kBadBlobUUID, requests, &memory_handles, | 262 holder->GetResponses(kBadBlobUUID, requests, &memory_handles, |
| 240 file_handles, &output)); | 263 file_handles, &output)); |
| 241 EXPECT_EQ(0u, output.size()); | 264 EXPECT_EQ(0u, output.size()); |
| 242 } | 265 } |
| 243 | 266 |
| 244 } // namespace content | 267 } // namespace content |
| OLD | NEW |