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