OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/browser/loader/upload_data_stream_builder.h" | 5 #include "content/browser/loader/upload_data_stream_builder.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
11 #include "base/files/file_util.h" | 11 #include "base/files/file_util.h" |
| 12 #include "base/message_loop/message_loop.h" |
| 13 #include "base/message_loop/message_loop_proxy.h" |
12 #include "base/run_loop.h" | 14 #include "base/run_loop.h" |
13 #include "base/thread_task_runner_handle.h" | |
14 #include "base/time/time.h" | 15 #include "base/time/time.h" |
15 #include "content/common/resource_request_body.h" | 16 #include "content/common/resource_request_body.h" |
16 #include "net/base/io_buffer.h" | 17 #include "net/base/io_buffer.h" |
17 #include "net/base/net_errors.h" | 18 #include "net/base/net_errors.h" |
18 #include "net/base/test_completion_callback.h" | 19 #include "net/base/test_completion_callback.h" |
19 #include "net/base/upload_bytes_element_reader.h" | 20 #include "net/base/upload_bytes_element_reader.h" |
20 #include "net/base/upload_data_stream.h" | 21 #include "net/base/upload_data_stream.h" |
21 #include "net/base/upload_file_element_reader.h" | 22 #include "net/base/upload_file_element_reader.h" |
22 #include "storage/browser/blob/blob_data_builder.h" | 23 #include "storage/browser/blob/blob_data_builder.h" |
23 #include "storage/browser/blob/blob_storage_context.h" | 24 #include "storage/browser/blob/blob_storage_context.h" |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 const uint64 kFileLength = 100U; | 71 const uint64 kFileLength = 100U; |
71 const base::Time kFileTime = base::Time::FromDoubleT(999); | 72 const base::Time kFileTime = base::Time::FromDoubleT(999); |
72 const int64 kIdentifier = 12345; | 73 const int64 kIdentifier = 12345; |
73 | 74 |
74 request_body->AppendBytes(kData, arraysize(kData) - 1); | 75 request_body->AppendBytes(kData, arraysize(kData) - 1); |
75 request_body->AppendFileRange(base::FilePath(kFilePath), | 76 request_body->AppendFileRange(base::FilePath(kFilePath), |
76 kFileOffset, kFileLength, kFileTime); | 77 kFileOffset, kFileLength, kFileTime); |
77 request_body->set_identifier(kIdentifier); | 78 request_body->set_identifier(kIdentifier); |
78 | 79 |
79 scoped_ptr<net::UploadDataStream> upload(UploadDataStreamBuilder::Build( | 80 scoped_ptr<net::UploadDataStream> upload(UploadDataStreamBuilder::Build( |
80 request_body.get(), NULL, NULL, | 81 request_body.get(), NULL, NULL, base::MessageLoopProxy::current().get())); |
81 base::ThreadTaskRunnerHandle::Get().get())); | |
82 | 82 |
83 EXPECT_EQ(kIdentifier, upload->identifier()); | 83 EXPECT_EQ(kIdentifier, upload->identifier()); |
84 ASSERT_TRUE(upload->GetElementReaders()); | 84 ASSERT_TRUE(upload->GetElementReaders()); |
85 ASSERT_EQ(request_body->elements()->size(), | 85 ASSERT_EQ(request_body->elements()->size(), |
86 upload->GetElementReaders()->size()); | 86 upload->GetElementReaders()->size()); |
87 | 87 |
88 const net::UploadBytesElementReader* r1 = | 88 const net::UploadBytesElementReader* r1 = |
89 (*upload->GetElementReaders())[0]->AsBytesReader(); | 89 (*upload->GetElementReaders())[0]->AsBytesReader(); |
90 ASSERT_TRUE(r1); | 90 ASSERT_TRUE(r1); |
91 EXPECT_EQ(kData, std::string(r1->bytes(), r1->length())); | 91 EXPECT_EQ(kData, std::string(r1->bytes(), r1->length())); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 scoped_refptr<ResourceRequestBody> request_body(new ResourceRequestBody()); | 139 scoped_refptr<ResourceRequestBody> request_body(new ResourceRequestBody()); |
140 request_body->AppendBytes( | 140 request_body->AppendBytes( |
141 upload_element1.bytes(), | 141 upload_element1.bytes(), |
142 upload_element1.length()); | 142 upload_element1.length()); |
143 request_body->AppendFileRange( | 143 request_body->AppendFileRange( |
144 upload_element2.path(), | 144 upload_element2.path(), |
145 upload_element2.offset(), | 145 upload_element2.offset(), |
146 upload_element2.length(), | 146 upload_element2.length(), |
147 upload_element2.expected_modification_time()); | 147 upload_element2.expected_modification_time()); |
148 | 148 |
149 scoped_ptr<net::UploadDataStream> upload(UploadDataStreamBuilder::Build( | 149 scoped_ptr<net::UploadDataStream> upload( |
150 request_body.get(), &blob_storage_context, NULL, | 150 UploadDataStreamBuilder::Build( |
151 base::ThreadTaskRunnerHandle::Get().get())); | 151 request_body.get(), |
| 152 &blob_storage_context, |
| 153 NULL, |
| 154 base::MessageLoopProxy::current().get())); |
152 | 155 |
153 ASSERT_TRUE(upload->GetElementReaders()); | 156 ASSERT_TRUE(upload->GetElementReaders()); |
154 ASSERT_EQ(2U, upload->GetElementReaders()->size()); | 157 ASSERT_EQ(2U, upload->GetElementReaders()->size()); |
155 EXPECT_TRUE(AreElementsEqual( | 158 EXPECT_TRUE(AreElementsEqual( |
156 *(*upload->GetElementReaders())[0], upload_element1)); | 159 *(*upload->GetElementReaders())[0], upload_element1)); |
157 EXPECT_TRUE(AreElementsEqual( | 160 EXPECT_TRUE(AreElementsEqual( |
158 *(*upload->GetElementReaders())[1], upload_element2)); | 161 *(*upload->GetElementReaders())[1], upload_element2)); |
159 | 162 |
160 // Test having only one blob reference that refers to empty blob data. | 163 // Test having only one blob reference that refers to empty blob data. |
161 request_body = new ResourceRequestBody(); | 164 request_body = new ResourceRequestBody(); |
162 request_body->AppendBlob(blob_id0); | 165 request_body->AppendBlob(blob_id0); |
163 | 166 |
164 upload = UploadDataStreamBuilder::Build( | 167 upload = UploadDataStreamBuilder::Build( |
165 request_body.get(), &blob_storage_context, NULL, | 168 request_body.get(), |
166 base::ThreadTaskRunnerHandle::Get().get()); | 169 &blob_storage_context, |
| 170 NULL, |
| 171 base::MessageLoopProxy::current().get()); |
167 ASSERT_TRUE(upload->GetElementReaders()); | 172 ASSERT_TRUE(upload->GetElementReaders()); |
168 ASSERT_EQ(0U, upload->GetElementReaders()->size()); | 173 ASSERT_EQ(0U, upload->GetElementReaders()->size()); |
169 | 174 |
170 // Test having only one blob reference. | 175 // Test having only one blob reference. |
171 request_body = new ResourceRequestBody(); | 176 request_body = new ResourceRequestBody(); |
172 request_body->AppendBlob(blob_id1); | 177 request_body->AppendBlob(blob_id1); |
173 | 178 |
174 upload = UploadDataStreamBuilder::Build( | 179 upload = UploadDataStreamBuilder::Build( |
175 request_body.get(), &blob_storage_context, NULL, | 180 request_body.get(), |
176 base::ThreadTaskRunnerHandle::Get().get()); | 181 &blob_storage_context, |
| 182 NULL, |
| 183 base::MessageLoopProxy::current().get()); |
177 ASSERT_TRUE(upload->GetElementReaders()); | 184 ASSERT_TRUE(upload->GetElementReaders()); |
178 ASSERT_EQ(2U, upload->GetElementReaders()->size()); | 185 ASSERT_EQ(2U, upload->GetElementReaders()->size()); |
179 EXPECT_TRUE(AreElementsEqual( | 186 EXPECT_TRUE(AreElementsEqual( |
180 *(*upload->GetElementReaders())[0], blob_element1)); | 187 *(*upload->GetElementReaders())[0], blob_element1)); |
181 EXPECT_TRUE(AreElementsEqual( | 188 EXPECT_TRUE(AreElementsEqual( |
182 *(*upload->GetElementReaders())[1], blob_element2)); | 189 *(*upload->GetElementReaders())[1], blob_element2)); |
183 | 190 |
184 // Test having one blob reference at the beginning. | 191 // Test having one blob reference at the beginning. |
185 request_body = new ResourceRequestBody(); | 192 request_body = new ResourceRequestBody(); |
186 request_body->AppendBlob(blob_id1); | 193 request_body->AppendBlob(blob_id1); |
187 request_body->AppendBytes( | 194 request_body->AppendBytes( |
188 upload_element1.bytes(), | 195 upload_element1.bytes(), |
189 upload_element1.length()); | 196 upload_element1.length()); |
190 request_body->AppendFileRange( | 197 request_body->AppendFileRange( |
191 upload_element2.path(), | 198 upload_element2.path(), |
192 upload_element2.offset(), | 199 upload_element2.offset(), |
193 upload_element2.length(), | 200 upload_element2.length(), |
194 upload_element2.expected_modification_time()); | 201 upload_element2.expected_modification_time()); |
195 | 202 |
196 upload = UploadDataStreamBuilder::Build( | 203 upload = UploadDataStreamBuilder::Build( |
197 request_body.get(), &blob_storage_context, NULL, | 204 request_body.get(), |
198 base::ThreadTaskRunnerHandle::Get().get()); | 205 &blob_storage_context, |
| 206 NULL, |
| 207 base::MessageLoopProxy::current().get()); |
199 ASSERT_TRUE(upload->GetElementReaders()); | 208 ASSERT_TRUE(upload->GetElementReaders()); |
200 ASSERT_EQ(4U, upload->GetElementReaders()->size()); | 209 ASSERT_EQ(4U, upload->GetElementReaders()->size()); |
201 EXPECT_TRUE(AreElementsEqual( | 210 EXPECT_TRUE(AreElementsEqual( |
202 *(*upload->GetElementReaders())[0], blob_element1)); | 211 *(*upload->GetElementReaders())[0], blob_element1)); |
203 EXPECT_TRUE(AreElementsEqual( | 212 EXPECT_TRUE(AreElementsEqual( |
204 *(*upload->GetElementReaders())[1], blob_element2)); | 213 *(*upload->GetElementReaders())[1], blob_element2)); |
205 EXPECT_TRUE(AreElementsEqual( | 214 EXPECT_TRUE(AreElementsEqual( |
206 *(*upload->GetElementReaders())[2], upload_element1)); | 215 *(*upload->GetElementReaders())[2], upload_element1)); |
207 EXPECT_TRUE(AreElementsEqual( | 216 EXPECT_TRUE(AreElementsEqual( |
208 *(*upload->GetElementReaders())[3], upload_element2)); | 217 *(*upload->GetElementReaders())[3], upload_element2)); |
209 | 218 |
210 // Test having one blob reference at the end. | 219 // Test having one blob reference at the end. |
211 request_body = new ResourceRequestBody(); | 220 request_body = new ResourceRequestBody(); |
212 request_body->AppendBytes( | 221 request_body->AppendBytes( |
213 upload_element1.bytes(), | 222 upload_element1.bytes(), |
214 upload_element1.length()); | 223 upload_element1.length()); |
215 request_body->AppendFileRange( | 224 request_body->AppendFileRange( |
216 upload_element2.path(), | 225 upload_element2.path(), |
217 upload_element2.offset(), | 226 upload_element2.offset(), |
218 upload_element2.length(), | 227 upload_element2.length(), |
219 upload_element2.expected_modification_time()); | 228 upload_element2.expected_modification_time()); |
220 request_body->AppendBlob(blob_id1); | 229 request_body->AppendBlob(blob_id1); |
221 | 230 |
222 upload = UploadDataStreamBuilder::Build( | 231 upload = |
223 request_body.get(), &blob_storage_context, NULL, | 232 UploadDataStreamBuilder::Build(request_body.get(), |
224 base::ThreadTaskRunnerHandle::Get().get()); | 233 &blob_storage_context, |
| 234 NULL, |
| 235 base::MessageLoopProxy::current().get()); |
225 ASSERT_TRUE(upload->GetElementReaders()); | 236 ASSERT_TRUE(upload->GetElementReaders()); |
226 ASSERT_EQ(4U, upload->GetElementReaders()->size()); | 237 ASSERT_EQ(4U, upload->GetElementReaders()->size()); |
227 EXPECT_TRUE(AreElementsEqual( | 238 EXPECT_TRUE(AreElementsEqual( |
228 *(*upload->GetElementReaders())[0], upload_element1)); | 239 *(*upload->GetElementReaders())[0], upload_element1)); |
229 EXPECT_TRUE(AreElementsEqual( | 240 EXPECT_TRUE(AreElementsEqual( |
230 *(*upload->GetElementReaders())[1], upload_element2)); | 241 *(*upload->GetElementReaders())[1], upload_element2)); |
231 EXPECT_TRUE(AreElementsEqual( | 242 EXPECT_TRUE(AreElementsEqual( |
232 *(*upload->GetElementReaders())[2], blob_element1)); | 243 *(*upload->GetElementReaders())[2], blob_element1)); |
233 EXPECT_TRUE(AreElementsEqual( | 244 EXPECT_TRUE(AreElementsEqual( |
234 *(*upload->GetElementReaders())[3], blob_element2)); | 245 *(*upload->GetElementReaders())[3], blob_element2)); |
235 | 246 |
236 // Test having one blob reference in the middle. | 247 // Test having one blob reference in the middle. |
237 request_body = new ResourceRequestBody(); | 248 request_body = new ResourceRequestBody(); |
238 request_body->AppendBytes( | 249 request_body->AppendBytes( |
239 upload_element1.bytes(), | 250 upload_element1.bytes(), |
240 upload_element1.length()); | 251 upload_element1.length()); |
241 request_body->AppendBlob(blob_id1); | 252 request_body->AppendBlob(blob_id1); |
242 request_body->AppendFileRange( | 253 request_body->AppendFileRange( |
243 upload_element2.path(), | 254 upload_element2.path(), |
244 upload_element2.offset(), | 255 upload_element2.offset(), |
245 upload_element2.length(), | 256 upload_element2.length(), |
246 upload_element2.expected_modification_time()); | 257 upload_element2.expected_modification_time()); |
247 | 258 |
248 upload = UploadDataStreamBuilder::Build( | 259 upload = UploadDataStreamBuilder::Build( |
249 request_body.get(), &blob_storage_context, NULL, | 260 request_body.get(), |
250 base::ThreadTaskRunnerHandle::Get().get()); | 261 &blob_storage_context, |
| 262 NULL, |
| 263 base::MessageLoopProxy::current().get()); |
251 ASSERT_TRUE(upload->GetElementReaders()); | 264 ASSERT_TRUE(upload->GetElementReaders()); |
252 ASSERT_EQ(4U, upload->GetElementReaders()->size()); | 265 ASSERT_EQ(4U, upload->GetElementReaders()->size()); |
253 EXPECT_TRUE(AreElementsEqual( | 266 EXPECT_TRUE(AreElementsEqual( |
254 *(*upload->GetElementReaders())[0], upload_element1)); | 267 *(*upload->GetElementReaders())[0], upload_element1)); |
255 EXPECT_TRUE(AreElementsEqual( | 268 EXPECT_TRUE(AreElementsEqual( |
256 *(*upload->GetElementReaders())[1], blob_element1)); | 269 *(*upload->GetElementReaders())[1], blob_element1)); |
257 EXPECT_TRUE(AreElementsEqual( | 270 EXPECT_TRUE(AreElementsEqual( |
258 *(*upload->GetElementReaders())[2], blob_element2)); | 271 *(*upload->GetElementReaders())[2], blob_element2)); |
259 EXPECT_TRUE(AreElementsEqual( | 272 EXPECT_TRUE(AreElementsEqual( |
260 *(*upload->GetElementReaders())[3], upload_element2)); | 273 *(*upload->GetElementReaders())[3], upload_element2)); |
261 | 274 |
262 // Test having multiple blob references. | 275 // Test having multiple blob references. |
263 request_body = new ResourceRequestBody(); | 276 request_body = new ResourceRequestBody(); |
264 request_body->AppendBlob(blob_id1); | 277 request_body->AppendBlob(blob_id1); |
265 request_body->AppendBytes( | 278 request_body->AppendBytes( |
266 upload_element1.bytes(), | 279 upload_element1.bytes(), |
267 upload_element1.length()); | 280 upload_element1.length()); |
268 request_body->AppendBlob(blob_id1); | 281 request_body->AppendBlob(blob_id1); |
269 request_body->AppendBlob(blob_id1); | 282 request_body->AppendBlob(blob_id1); |
270 request_body->AppendFileRange( | 283 request_body->AppendFileRange( |
271 upload_element2.path(), | 284 upload_element2.path(), |
272 upload_element2.offset(), | 285 upload_element2.offset(), |
273 upload_element2.length(), | 286 upload_element2.length(), |
274 upload_element2.expected_modification_time()); | 287 upload_element2.expected_modification_time()); |
275 | 288 |
276 upload = UploadDataStreamBuilder::Build( | 289 upload = UploadDataStreamBuilder::Build( |
277 request_body.get(), &blob_storage_context, NULL, | 290 request_body.get(), |
278 base::ThreadTaskRunnerHandle::Get().get()); | 291 &blob_storage_context, |
| 292 NULL, |
| 293 base::MessageLoopProxy::current().get()); |
279 ASSERT_TRUE(upload->GetElementReaders()); | 294 ASSERT_TRUE(upload->GetElementReaders()); |
280 ASSERT_EQ(8U, upload->GetElementReaders()->size()); | 295 ASSERT_EQ(8U, upload->GetElementReaders()->size()); |
281 EXPECT_TRUE(AreElementsEqual( | 296 EXPECT_TRUE(AreElementsEqual( |
282 *(*upload->GetElementReaders())[0], blob_element1)); | 297 *(*upload->GetElementReaders())[0], blob_element1)); |
283 EXPECT_TRUE(AreElementsEqual( | 298 EXPECT_TRUE(AreElementsEqual( |
284 *(*upload->GetElementReaders())[1], blob_element2)); | 299 *(*upload->GetElementReaders())[1], blob_element2)); |
285 EXPECT_TRUE(AreElementsEqual( | 300 EXPECT_TRUE(AreElementsEqual( |
286 *(*upload->GetElementReaders())[2], upload_element1)); | 301 *(*upload->GetElementReaders())[2], upload_element1)); |
287 EXPECT_TRUE(AreElementsEqual( | 302 EXPECT_TRUE(AreElementsEqual( |
288 *(*upload->GetElementReaders())[3], blob_element1)); | 303 *(*upload->GetElementReaders())[3], blob_element1)); |
(...skipping 30 matching lines...) Expand all Loading... |
319 blob_data_builder->AppendFile(test_blob_path, 0, kZeroLength, blob_time); | 334 blob_data_builder->AppendFile(test_blob_path, 0, kZeroLength, blob_time); |
320 scoped_ptr<BlobDataHandle> handle = | 335 scoped_ptr<BlobDataHandle> handle = |
321 blob_storage_context.AddFinishedBlob(blob_data_builder.get()); | 336 blob_storage_context.AddFinishedBlob(blob_data_builder.get()); |
322 | 337 |
323 ResourceRequestBody::Element blob_element; | 338 ResourceRequestBody::Element blob_element; |
324 blob_element.SetToFilePathRange(test_blob_path, 0, kZeroLength, blob_time); | 339 blob_element.SetToFilePathRange(test_blob_path, 0, kZeroLength, blob_time); |
325 | 340 |
326 scoped_refptr<ResourceRequestBody> request_body(new ResourceRequestBody()); | 341 scoped_refptr<ResourceRequestBody> request_body(new ResourceRequestBody()); |
327 scoped_ptr<net::UploadDataStream> upload(UploadDataStreamBuilder::Build( | 342 scoped_ptr<net::UploadDataStream> upload(UploadDataStreamBuilder::Build( |
328 request_body.get(), &blob_storage_context, NULL, | 343 request_body.get(), &blob_storage_context, NULL, |
329 base::ThreadTaskRunnerHandle::Get().get())); | 344 base::MessageLoopProxy::current().get())); |
330 | 345 |
331 request_body = new ResourceRequestBody(); | 346 request_body = new ResourceRequestBody(); |
332 request_body->AppendBlob(blob_id); | 347 request_body->AppendBlob(blob_id); |
333 request_body->AppendBlob(blob_id); | 348 request_body->AppendBlob(blob_id); |
334 request_body->AppendBlob(blob_id); | 349 request_body->AppendBlob(blob_id); |
335 | 350 |
336 upload = UploadDataStreamBuilder::Build( | 351 upload = UploadDataStreamBuilder::Build( |
337 request_body.get(), &blob_storage_context, NULL, | 352 request_body.get(), &blob_storage_context, NULL, |
338 base::ThreadTaskRunnerHandle::Get().get()); | 353 base::MessageLoopProxy::current().get()); |
339 ASSERT_TRUE(upload->GetElementReaders()); | 354 ASSERT_TRUE(upload->GetElementReaders()); |
340 const auto& readers = *upload->GetElementReaders(); | 355 const auto& readers = *upload->GetElementReaders(); |
341 ASSERT_EQ(3U, readers.size()); | 356 ASSERT_EQ(3U, readers.size()); |
342 EXPECT_TRUE(AreElementsEqual(*readers[0], blob_element)); | 357 EXPECT_TRUE(AreElementsEqual(*readers[0], blob_element)); |
343 EXPECT_TRUE(AreElementsEqual(*readers[1], blob_element)); | 358 EXPECT_TRUE(AreElementsEqual(*readers[1], blob_element)); |
344 EXPECT_TRUE(AreElementsEqual(*readers[2], blob_element)); | 359 EXPECT_TRUE(AreElementsEqual(*readers[2], blob_element)); |
345 | 360 |
346 net::TestCompletionCallback init_callback; | 361 net::TestCompletionCallback init_callback; |
347 ASSERT_EQ(net::ERR_IO_PENDING, upload->Init(init_callback.callback())); | 362 ASSERT_EQ(net::ERR_IO_PENDING, upload->Init(init_callback.callback())); |
348 EXPECT_EQ(net::OK, init_callback.WaitForResult()); | 363 EXPECT_EQ(net::OK, init_callback.WaitForResult()); |
(...skipping 10 matching lines...) Expand all Loading... |
359 int result = | 374 int result = |
360 upload->Read(io_buffer.get(), kBufferLength, read_callback.callback()); | 375 upload->Read(io_buffer.get(), kBufferLength, read_callback.callback()); |
361 EXPECT_EQ(static_cast<int>(kZeroLength), read_callback.GetResult(result)); | 376 EXPECT_EQ(static_cast<int>(kZeroLength), read_callback.GetResult(result)); |
362 | 377 |
363 base::DeleteFile(test_blob_path, false); | 378 base::DeleteFile(test_blob_path, false); |
364 } | 379 } |
365 // Clean up for ASAN. | 380 // Clean up for ASAN. |
366 base::RunLoop().RunUntilIdle(); | 381 base::RunLoop().RunUntilIdle(); |
367 } | 382 } |
368 } // namespace content | 383 } // namespace content |
OLD | NEW |