OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 <vector> | 5 #include <vector> |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" | 8 #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" |
9 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURL.h" | 9 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURL.h" |
10 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLLoaderClient.h" | 10 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLLoaderClient.h" |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 data_.clear(); | 67 data_.clear(); |
68 } | 68 } |
69 // FIXME(vsevik): rename once renamed in webkit | 69 // FIXME(vsevik): rename once renamed in webkit |
70 virtual void didReceiveData2( | 70 virtual void didReceiveData2( |
71 WebKit::WebURLLoader* loader, | 71 WebKit::WebURLLoader* loader, |
72 const char* data, | 72 const char* data, |
73 int data_length, | 73 int data_length, |
74 int length_received) { | 74 int length_received) { |
75 ++received_data_; | 75 ++received_data_; |
76 data_.append(data, data_length); | 76 data_.append(data, data_length); |
| 77 length_received_ += length_received; |
77 } | 78 } |
78 | 79 |
79 // FIXME(vsevik): remove once removed in webkit | 80 // FIXME(vsevik): remove once removed in webkit |
80 virtual void didReceiveData( | 81 virtual void didReceiveData( |
81 WebKit::WebURLLoader* loader, | 82 WebKit::WebURLLoader* loader, |
82 const char* data, | 83 const char* data, |
83 int data_length) { | 84 int data_length) { |
84 didReceiveData2(loader, data, data_length, -1); | 85 didReceiveData2(loader, data, data_length, -1); |
85 } | 86 } |
86 virtual void didFinishLoading(WebURLLoader*, double finishTime) {} | 87 virtual void didFinishLoading(WebURLLoader*, double finishTime) {} |
87 virtual void didFail(WebURLLoader*, const WebURLError&) {} | 88 virtual void didFail(WebURLLoader*, const WebURLError&) {} |
88 | 89 |
89 void Reset() { | 90 void Reset() { |
90 received_response_ = received_data_ = 0; | 91 received_response_ = received_data_ = length_received_ = 0; |
91 data_.clear(); | 92 data_.clear(); |
92 response_.reset(); | 93 response_.reset(); |
93 } | 94 } |
94 | 95 |
95 string GetResponseHeader(const char* name) const { | 96 string GetResponseHeader(const char* name) const { |
96 return string(response_.httpHeaderField(WebString::fromUTF8(name)).utf8()); | 97 return string(response_.httpHeaderField(WebString::fromUTF8(name)).utf8()); |
97 } | 98 } |
98 | 99 |
99 int received_response_, received_data_; | 100 int received_response_, received_data_, length_received_; |
100 string data_; | 101 string data_; |
101 WebURLResponse response_; | 102 WebURLResponse response_; |
102 }; | 103 }; |
103 | 104 |
104 // We can't put this in an anonymous function because it's a friend class for | 105 // We can't put this in an anonymous function because it's a friend class for |
105 // access to private members. | 106 // access to private members. |
106 TEST(MultipartResponseTest, Functions) { | 107 TEST(MultipartResponseTest, Functions) { |
107 // PushOverLine tests | 108 // PushOverLine tests |
108 | 109 |
109 WebURLResponse response; | 110 WebURLResponse response; |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 MockWebURLLoaderClient client; | 219 MockWebURLLoaderClient client; |
219 MultipartResponseDelegate delegate(&client, NULL, response, "bound"); | 220 MultipartResponseDelegate delegate(&client, NULL, response, "bound"); |
220 | 221 |
221 // No start boundary | 222 // No start boundary |
222 string no_start_boundary( | 223 string no_start_boundary( |
223 "Content-type: text/plain\n\n" | 224 "Content-type: text/plain\n\n" |
224 "This is a sample response\n" | 225 "This is a sample response\n" |
225 "--bound--" | 226 "--bound--" |
226 "ignore junk after end token --bound\n\nTest2\n"); | 227 "ignore junk after end token --bound\n\nTest2\n"); |
227 delegate.OnReceivedData(no_start_boundary.c_str(), | 228 delegate.OnReceivedData(no_start_boundary.c_str(), |
| 229 static_cast<int>(no_start_boundary.length()), |
228 static_cast<int>(no_start_boundary.length())); | 230 static_cast<int>(no_start_boundary.length())); |
229 EXPECT_EQ(1, client.received_response_); | 231 EXPECT_EQ(1, client.received_response_); |
230 EXPECT_EQ(1, client.received_data_); | 232 EXPECT_EQ(1, client.received_data_); |
231 EXPECT_EQ(string("This is a sample response"), | 233 EXPECT_EQ(string("This is a sample response"), client.data_); |
232 client.data_); | 234 EXPECT_EQ(static_cast<int>(no_start_boundary.length()), |
| 235 client.length_received_); |
233 | 236 |
234 delegate.OnCompletedRequest(); | 237 delegate.OnCompletedRequest(); |
235 EXPECT_EQ(1, client.received_response_); | 238 EXPECT_EQ(1, client.received_response_); |
236 EXPECT_EQ(1, client.received_data_); | 239 EXPECT_EQ(1, client.received_data_); |
237 | 240 |
238 // No end boundary | 241 // No end boundary |
239 client.Reset(); | 242 client.Reset(); |
240 MultipartResponseDelegate delegate2(&client, NULL, response, "bound"); | 243 MultipartResponseDelegate delegate2(&client, NULL, response, "bound"); |
241 string no_end_boundary( | 244 string no_end_boundary( |
242 "bound\nContent-type: text/plain\n\n" | 245 "bound\nContent-type: text/plain\n\n" |
243 "This is a sample response\n"); | 246 "This is a sample response\n"); |
244 delegate2.OnReceivedData(no_end_boundary.c_str(), | 247 delegate2.OnReceivedData(no_end_boundary.c_str(), |
| 248 static_cast<int>(no_end_boundary.length()), |
245 static_cast<int>(no_end_boundary.length())); | 249 static_cast<int>(no_end_boundary.length())); |
246 EXPECT_EQ(1, client.received_response_); | 250 EXPECT_EQ(1, client.received_response_); |
247 EXPECT_EQ(1, client.received_data_); | 251 EXPECT_EQ(1, client.received_data_); |
248 EXPECT_EQ("This is a sample response\n", client.data_); | 252 EXPECT_EQ("This is a sample response\n", client.data_); |
| 253 EXPECT_EQ(static_cast<int>(no_end_boundary.length()), |
| 254 client.length_received_); |
249 | 255 |
250 delegate2.OnCompletedRequest(); | 256 delegate2.OnCompletedRequest(); |
251 EXPECT_EQ(1, client.received_response_); | 257 EXPECT_EQ(1, client.received_response_); |
252 EXPECT_EQ(1, client.received_data_); | 258 EXPECT_EQ(1, client.received_data_); |
253 EXPECT_EQ(string("This is a sample response\n"), | 259 EXPECT_EQ(string("This is a sample response\n"), client.data_); |
254 client.data_); | 260 EXPECT_EQ(static_cast<int>(no_end_boundary.length()), |
| 261 client.length_received_); |
255 | 262 |
256 // Neither boundary | 263 // Neither boundary |
257 client.Reset(); | 264 client.Reset(); |
258 MultipartResponseDelegate delegate3(&client, NULL, response, "bound"); | 265 MultipartResponseDelegate delegate3(&client, NULL, response, "bound"); |
259 string no_boundaries( | 266 string no_boundaries( |
260 "Content-type: text/plain\n\n" | 267 "Content-type: text/plain\n\n" |
261 "This is a sample response\n"); | 268 "This is a sample response\n"); |
262 delegate3.OnReceivedData(no_boundaries.c_str(), | 269 delegate3.OnReceivedData(no_boundaries.c_str(), |
| 270 static_cast<int>(no_boundaries.length()), |
263 static_cast<int>(no_boundaries.length())); | 271 static_cast<int>(no_boundaries.length())); |
264 EXPECT_EQ(1, client.received_response_); | 272 EXPECT_EQ(1, client.received_response_); |
265 EXPECT_EQ(1, client.received_data_); | 273 EXPECT_EQ(1, client.received_data_); |
266 EXPECT_EQ("This is a sample response\n", client.data_); | 274 EXPECT_EQ("This is a sample response\n", client.data_); |
| 275 EXPECT_EQ(static_cast<int>(no_boundaries.length()), client.length_received_); |
267 | 276 |
268 delegate3.OnCompletedRequest(); | 277 delegate3.OnCompletedRequest(); |
269 EXPECT_EQ(1, client.received_response_); | 278 EXPECT_EQ(1, client.received_response_); |
270 EXPECT_EQ(1, client.received_data_); | 279 EXPECT_EQ(1, client.received_data_); |
271 EXPECT_EQ(string("This is a sample response\n"), | 280 EXPECT_EQ(string("This is a sample response\n"), client.data_); |
272 client.data_); | 281 EXPECT_EQ(static_cast<int>(no_boundaries.length()), client.length_received_); |
273 } | 282 } |
274 | 283 |
275 TEST(MultipartResponseTest, MalformedBoundary) { | 284 TEST(MultipartResponseTest, MalformedBoundary) { |
276 // Some servers send a boundary that is prefixed by "--". See bug 5786. | 285 // Some servers send a boundary that is prefixed by "--". See bug 5786. |
277 | 286 |
278 WebURLResponse response; | 287 WebURLResponse response; |
279 response.initialize(); | 288 response.initialize(); |
280 response.setMIMEType("multipart/x-mixed-replace"); | 289 response.setMIMEType("multipart/x-mixed-replace"); |
281 response.setHTTPHeaderField("Foo", "Bar"); | 290 response.setHTTPHeaderField("Foo", "Bar"); |
282 response.setHTTPHeaderField("Content-type", "text/plain"); | 291 response.setHTTPHeaderField("Content-type", "text/plain"); |
283 MockWebURLLoaderClient client; | 292 MockWebURLLoaderClient client; |
284 MultipartResponseDelegate delegate(&client, NULL, response, "--bound"); | 293 MultipartResponseDelegate delegate(&client, NULL, response, "--bound"); |
285 | 294 |
286 string data( | 295 string data( |
287 "--bound\n" | 296 "--bound\n" |
288 "Content-type: text/plain\n\n" | 297 "Content-type: text/plain\n\n" |
289 "This is a sample response\n" | 298 "This is a sample response\n" |
290 "--bound--" | 299 "--bound--" |
291 "ignore junk after end token --bound\n\nTest2\n"); | 300 "ignore junk after end token --bound\n\nTest2\n"); |
292 delegate.OnReceivedData(data.c_str(), static_cast<int>(data.length())); | 301 delegate.OnReceivedData(data.c_str(), |
| 302 static_cast<int>(data.length()), |
| 303 static_cast<int>(data.length())); |
293 EXPECT_EQ(1, client.received_response_); | 304 EXPECT_EQ(1, client.received_response_); |
294 EXPECT_EQ(1, client.received_data_); | 305 EXPECT_EQ(1, client.received_data_); |
295 EXPECT_EQ(string("This is a sample response"), client.data_); | 306 EXPECT_EQ(string("This is a sample response"), client.data_); |
| 307 EXPECT_EQ(static_cast<int>(data.length()), client.length_received_); |
296 | 308 |
297 delegate.OnCompletedRequest(); | 309 delegate.OnCompletedRequest(); |
298 EXPECT_EQ(1, client.received_response_); | 310 EXPECT_EQ(1, client.received_response_); |
299 EXPECT_EQ(1, client.received_data_); | 311 EXPECT_EQ(1, client.received_data_); |
300 } | 312 } |
301 | 313 |
302 | 314 |
303 // Used in for tests that break the data in various places. | 315 // Used in for tests that break the data in various places. |
304 struct TestChunk { | 316 struct TestChunk { |
305 const int start_pos; // offset in data | 317 const int start_pos; // offset in data |
306 const int end_pos; // end offset in data | 318 const int end_pos; // end offset in data |
307 const int expected_responses; | 319 const int expected_responses; |
308 const int expected_received_data; | 320 const int expected_received_data; |
309 const char* expected_data; | 321 const char* expected_data; |
| 322 const int expected_length_received; |
310 }; | 323 }; |
311 | 324 |
312 void VariousChunkSizesTest(const TestChunk chunks[], int chunks_size, | 325 void VariousChunkSizesTest(const TestChunk chunks[], int chunks_size, |
313 int responses, int received_data, | 326 int responses, int received_data, |
314 const char* completed_data) { | 327 const char* completed_data, |
| 328 int completed_length_received) { |
315 const string data( | 329 const string data( |
316 "--bound\n" // 0-7 | 330 "--bound\n" // 0-7 |
317 "Content-type: image/png\n\n" // 8-32 | 331 "Content-type: image/png\n\n" // 8-32 |
318 "datadatadatadatadata" // 33-52 | 332 "datadatadatadatadata" // 33-52 |
319 "--bound\n" // 53-60 | 333 "--bound\n" // 53-60 |
320 "Content-type: image/jpg\n\n" // 61-85 | 334 "Content-type: image/jpg\n\n" // 61-85 |
321 "foofoofoofoofoo" // 86-100 | 335 "foofoofoofoofoo" // 86-100 |
322 "--bound--"); // 101-109 | 336 "--bound--"); // 101-109 |
323 | 337 |
324 WebURLResponse response; | 338 WebURLResponse response; |
325 response.initialize(); | 339 response.initialize(); |
326 response.setMIMEType("multipart/x-mixed-replace"); | 340 response.setMIMEType("multipart/x-mixed-replace"); |
327 MockWebURLLoaderClient client; | 341 MockWebURLLoaderClient client; |
328 MultipartResponseDelegate delegate(&client, NULL, response, "bound"); | 342 MultipartResponseDelegate delegate(&client, NULL, response, "bound"); |
329 | 343 |
330 for (int i = 0; i < chunks_size; ++i) { | 344 for (int i = 0; i < chunks_size; ++i) { |
331 ASSERT_TRUE(chunks[i].start_pos < chunks[i].end_pos); | 345 ASSERT_TRUE(chunks[i].start_pos < chunks[i].end_pos); |
332 string chunk = data.substr(chunks[i].start_pos, | 346 string chunk = data.substr(chunks[i].start_pos, |
333 chunks[i].end_pos - chunks[i].start_pos); | 347 chunks[i].end_pos - chunks[i].start_pos); |
334 delegate.OnReceivedData(chunk.c_str(), static_cast<int>(chunk.length())); | 348 delegate.OnReceivedData( |
335 EXPECT_EQ(chunks[i].expected_responses, | 349 chunk.c_str(), |
336 client.received_response_); | 350 static_cast<int>(chunk.length()), |
337 EXPECT_EQ(chunks[i].expected_received_data, | 351 static_cast<int>(chunk.length())); |
338 client.received_data_); | 352 EXPECT_EQ(chunks[i].expected_responses, client.received_response_); |
339 EXPECT_EQ(string(chunks[i].expected_data), | 353 EXPECT_EQ(chunks[i].expected_received_data, client.received_data_); |
340 client.data_); | 354 EXPECT_EQ(string(chunks[i].expected_data), client.data_); |
| 355 EXPECT_EQ(chunks[i].expected_length_received, client.length_received_); |
341 } | 356 } |
342 // Check final state | 357 // Check final state |
343 delegate.OnCompletedRequest(); | 358 delegate.OnCompletedRequest(); |
344 EXPECT_EQ(responses, | 359 EXPECT_EQ(responses, client.received_response_); |
345 client.received_response_); | 360 EXPECT_EQ(received_data, client.received_data_); |
346 EXPECT_EQ(received_data, | 361 string completed_data_string(completed_data); |
347 client.received_data_); | 362 EXPECT_EQ(completed_data_string, client.data_); |
348 EXPECT_EQ(string(completed_data), | 363 EXPECT_EQ(completed_length_received, client.length_received_); |
349 client.data_); | |
350 } | 364 } |
351 | 365 |
352 TEST(MultipartResponseTest, BreakInBoundary) { | 366 TEST(MultipartResponseTest, BreakInBoundary) { |
353 // Break in the first boundary | 367 // Break in the first boundary |
354 const TestChunk bound1[] = { | 368 const TestChunk bound1[] = { |
355 { 0, 4, 0, 0, ""}, | 369 { 0, 4, 0, 0, "", 0 }, |
356 { 4, 110, 2, 2, "foofoofoofoofoo" }, | 370 { 4, 110, 2, 2, "foofoofoofoofoo", 110 }, |
357 }; | 371 }; |
358 VariousChunkSizesTest(bound1, arraysize(bound1), | 372 VariousChunkSizesTest(bound1, arraysize(bound1), |
359 2, 2, "foofoofoofoofoo"); | 373 2, 2, "foofoofoofoofoo", 110); |
360 | 374 |
361 // Break in first and second | 375 // Break in first and second |
362 const TestChunk bound2[] = { | 376 const TestChunk bound2[] = { |
363 { 0, 4, 0, 0, ""}, | 377 { 0, 4, 0, 0, "", 0 }, |
364 { 4, 55, 1, 1, "datadatadatadat" }, | 378 { 4, 55, 1, 1, "datadatadatadat", 55 }, |
365 { 55, 65, 1, 2, "datadatadatadatadata" }, | 379 { 55, 65, 1, 2, "datadatadatadatadata", 65 }, |
366 { 65, 110, 2, 3, "foofoofoofoofoo" }, | 380 { 65, 110, 2, 3, "foofoofoofoofoo", 110 }, |
367 }; | 381 }; |
368 VariousChunkSizesTest(bound2, arraysize(bound2), | 382 VariousChunkSizesTest(bound2, arraysize(bound2), |
369 2, 3, "foofoofoofoofoo"); | 383 2, 3, "foofoofoofoofoo", 110); |
370 | 384 |
371 // Break in second only | 385 // Break in second only |
372 const TestChunk bound3[] = { | 386 const TestChunk bound3[] = { |
373 { 0, 55, 1, 1, "datadatadatadat" }, | 387 { 0, 55, 1, 1, "datadatadatadat", 55 }, |
374 { 55, 110, 2, 3, "foofoofoofoofoo" }, | 388 { 55, 110, 2, 3, "foofoofoofoofoo", 110 }, |
375 }; | 389 }; |
376 VariousChunkSizesTest(bound3, arraysize(bound3), | 390 VariousChunkSizesTest(bound3, arraysize(bound3), |
377 2, 3, "foofoofoofoofoo"); | 391 2, 3, "foofoofoofoofoo", 110); |
378 } | 392 } |
379 | 393 |
380 TEST(MultipartResponseTest, BreakInHeaders) { | 394 TEST(MultipartResponseTest, BreakInHeaders) { |
381 // Break in first header | 395 // Break in first header |
382 const TestChunk header1[] = { | 396 const TestChunk header1[] = { |
383 { 0, 10, 0, 0, "" }, | 397 { 0, 10, 0, 0, "", 0 }, |
384 { 10, 35, 1, 0, "" }, | 398 { 10, 35, 1, 0, "", 0 }, |
385 { 35, 110, 2, 2, "foofoofoofoofoo" }, | 399 { 35, 110, 2, 2, "foofoofoofoofoo", 110 }, |
386 }; | 400 }; |
387 VariousChunkSizesTest(header1, arraysize(header1), | 401 VariousChunkSizesTest(header1, arraysize(header1), |
388 2, 2, "foofoofoofoofoo"); | 402 2, 2, "foofoofoofoofoo", 110); |
389 | 403 |
390 // Break in both headers | 404 // Break in both headers |
391 const TestChunk header2[] = { | 405 const TestChunk header2[] = { |
392 { 0, 10, 0, 0, "" }, | 406 { 0, 10, 0, 0, "", 0 }, |
393 { 10, 65, 1, 1, "datadatadatadatadata" }, | 407 { 10, 65, 1, 1, "datadatadatadatadata", 65 }, |
394 { 65, 110, 2, 2, "foofoofoofoofoo" }, | 408 { 65, 110, 2, 2, "foofoofoofoofoo", 110 }, |
395 }; | 409 }; |
396 VariousChunkSizesTest(header2, arraysize(header2), | 410 VariousChunkSizesTest(header2, arraysize(header2), |
397 2, 2, "foofoofoofoofoo"); | 411 2, 2, "foofoofoofoofoo", 110); |
398 | 412 |
399 // Break at end of a header | 413 // Break at end of a header |
400 const TestChunk header3[] = { | 414 const TestChunk header3[] = { |
401 { 0, 33, 1, 0, "" }, | 415 { 0, 33, 1, 0, "", 0 }, |
402 { 33, 65, 1, 1, "datadatadatadatadata" }, | 416 { 33, 65, 1, 1, "datadatadatadatadata", 65 }, |
403 { 65, 110, 2, 2, "foofoofoofoofoo" }, | 417 { 65, 110, 2, 2, "foofoofoofoofoo", 110 }, |
404 }; | 418 }; |
405 VariousChunkSizesTest(header3, arraysize(header3), | 419 VariousChunkSizesTest(header3, arraysize(header3), |
406 2, 2, "foofoofoofoofoo"); | 420 2, 2, "foofoofoofoofoo", 110); |
407 } | 421 } |
408 | 422 |
409 TEST(MultipartResponseTest, BreakInData) { | 423 TEST(MultipartResponseTest, BreakInData) { |
410 // All data as one chunk | 424 // All data as one chunk |
411 const TestChunk data1[] = { | 425 const TestChunk data1[] = { |
412 { 0, 110, 2, 2, "foofoofoofoofoo" }, | 426 { 0, 110, 2, 2, "foofoofoofoofoo", 110 }, |
413 }; | 427 }; |
414 VariousChunkSizesTest(data1, arraysize(data1), | 428 VariousChunkSizesTest(data1, arraysize(data1), |
415 2, 2, "foofoofoofoofoo"); | 429 2, 2, "foofoofoofoofoo", 110); |
416 | 430 |
417 // breaks in data segment | 431 // breaks in data segment |
418 const TestChunk data2[] = { | 432 const TestChunk data2[] = { |
419 { 0, 35, 1, 0, "" }, | 433 { 0, 35, 1, 0, "", 0 }, |
420 { 35, 65, 1, 1, "datadatadatadatadata" }, | 434 { 35, 65, 1, 1, "datadatadatadatadata", 65 }, |
421 { 65, 90, 2, 1, "" }, | 435 { 65, 90, 2, 1, "", 65 }, |
422 { 90, 110, 2, 2, "foofoofoofoofoo" }, | 436 { 90, 110, 2, 2, "foofoofoofoofoo", 110 }, |
423 }; | 437 }; |
424 VariousChunkSizesTest(data2, arraysize(data2), | 438 VariousChunkSizesTest(data2, arraysize(data2), |
425 2, 2, "foofoofoofoofoo"); | 439 2, 2, "foofoofoofoofoo", 110); |
426 | 440 |
427 // Incomplete send | 441 // Incomplete send |
428 const TestChunk data3[] = { | 442 const TestChunk data3[] = { |
429 { 0, 35, 1, 0, "" }, | 443 { 0, 35, 1, 0, "", 0 }, |
430 { 35, 90, 2, 1, "" }, | 444 { 35, 90, 2, 1, "", 90 }, |
431 }; | 445 }; |
432 VariousChunkSizesTest(data3, arraysize(data3), | 446 VariousChunkSizesTest(data3, arraysize(data3), |
433 2, 2, "foof"); | 447 2, 2, "foof", 90); |
434 } | 448 } |
435 | 449 |
436 TEST(MultipartResponseTest, SmallChunk) { | 450 TEST(MultipartResponseTest, SmallChunk) { |
437 WebURLResponse response; | 451 WebURLResponse response; |
438 response.initialize(); | 452 response.initialize(); |
439 response.setMIMEType("multipart/x-mixed-replace"); | 453 response.setMIMEType("multipart/x-mixed-replace"); |
440 response.setHTTPHeaderField("Content-type", "text/plain"); | 454 response.setHTTPHeaderField("Content-type", "text/plain"); |
441 MockWebURLLoaderClient client; | 455 MockWebURLLoaderClient client; |
442 MultipartResponseDelegate delegate(&client, NULL, response, "bound"); | 456 MultipartResponseDelegate delegate(&client, NULL, response, "bound"); |
443 | 457 |
444 // Test chunks of size 1, 2, and 0. | 458 // Test chunks of size 1, 2, and 0. |
445 string data( | 459 string data( |
446 "--boundContent-type: text/plain\n\n" | 460 "--boundContent-type: text/plain\n\n" |
447 "\n--boundContent-type: text/plain\n\n" | 461 "\n--boundContent-type: text/plain\n\n" |
448 "\n\n--boundContent-type: text/plain\n\n" | 462 "\n\n--boundContent-type: text/plain\n\n" |
449 "--boundContent-type: text/plain\n\n" | 463 "--boundContent-type: text/plain\n\n" |
450 "end--bound--"); | 464 "end--bound--"); |
451 delegate.OnReceivedData(data.c_str(), | 465 delegate.OnReceivedData(data.c_str(), |
| 466 static_cast<int>(data.length()), |
452 static_cast<int>(data.length())); | 467 static_cast<int>(data.length())); |
453 EXPECT_EQ(4, client.received_response_); | 468 EXPECT_EQ(4, client.received_response_); |
454 EXPECT_EQ(2, client.received_data_); | 469 EXPECT_EQ(2, client.received_data_); |
455 EXPECT_EQ(string("end"), client.data_); | 470 EXPECT_EQ(string("end"), client.data_); |
| 471 EXPECT_EQ(static_cast<int>(data.length()), client.length_received_); |
456 | 472 |
457 delegate.OnCompletedRequest(); | 473 delegate.OnCompletedRequest(); |
458 EXPECT_EQ(4, client.received_response_); | 474 EXPECT_EQ(4, client.received_response_); |
459 EXPECT_EQ(2, client.received_data_); | 475 EXPECT_EQ(2, client.received_data_); |
460 } | 476 } |
461 | 477 |
462 TEST(MultipartResponseTest, MultipleBoundaries) { | 478 TEST(MultipartResponseTest, MultipleBoundaries) { |
463 // Test multiple boundaries back to back | 479 // Test multiple boundaries back to back |
464 WebURLResponse response; | 480 WebURLResponse response; |
465 response.initialize(); | 481 response.initialize(); |
466 response.setMIMEType("multipart/x-mixed-replace"); | 482 response.setMIMEType("multipart/x-mixed-replace"); |
467 MockWebURLLoaderClient client; | 483 MockWebURLLoaderClient client; |
468 MultipartResponseDelegate delegate(&client, NULL, response, "bound"); | 484 MultipartResponseDelegate delegate(&client, NULL, response, "bound"); |
469 | 485 |
470 string data("--bound\r\n\r\n--bound\r\n\r\nfoofoo--bound--"); | 486 string data("--bound\r\n\r\n--bound\r\n\r\nfoofoo--bound--"); |
471 delegate.OnReceivedData(data.c_str(), static_cast<int>(data.length())); | 487 delegate.OnReceivedData(data.c_str(), |
472 EXPECT_EQ(2, | 488 static_cast<int>(data.length()), |
473 client.received_response_); | 489 static_cast<int>(data.length())); |
474 EXPECT_EQ(1, | 490 EXPECT_EQ(2, client.received_response_); |
475 client.received_data_); | 491 EXPECT_EQ(1, client.received_data_); |
476 EXPECT_EQ(string("foofoo"), | 492 EXPECT_EQ(string("foofoo"), client.data_); |
477 client.data_); | 493 EXPECT_EQ(static_cast<int>(data.length()), client.length_received_); |
478 } | 494 } |
479 | 495 |
480 TEST(MultipartResponseTest, MultipartByteRangeParsingTest) { | 496 TEST(MultipartResponseTest, MultipartByteRangeParsingTest) { |
481 // Test multipart/byteranges based boundary parsing. | 497 // Test multipart/byteranges based boundary parsing. |
482 WebURLResponse response1; | 498 WebURLResponse response1; |
483 response1.initialize(); | 499 response1.initialize(); |
484 response1.setMIMEType("multipart/x-mixed-replace"); | 500 response1.setMIMEType("multipart/x-mixed-replace"); |
485 response1.setHTTPHeaderField("Content-Length", "200"); | 501 response1.setHTTPHeaderField("Content-Length", "200"); |
486 response1.setHTTPHeaderField("Content-type", | 502 response1.setHTTPHeaderField("Content-type", |
487 "multipart/byteranges; boundary=--bound--"); | 503 "multipart/byteranges; boundary=--bound--"); |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
630 response.initialize(); | 646 response.initialize(); |
631 response.setMIMEType("multipart/x-mixed-replace"); | 647 response.setMIMEType("multipart/x-mixed-replace"); |
632 MockWebURLLoaderClient client; | 648 MockWebURLLoaderClient client; |
633 MultipartResponseDelegate delegate(&client, NULL, response, "bound"); | 649 MultipartResponseDelegate delegate(&client, NULL, response, "bound"); |
634 | 650 |
635 string data( | 651 string data( |
636 "--bound\n" | 652 "--bound\n" |
637 "Content-type: text/plain\n\n" | 653 "Content-type: text/plain\n\n" |
638 "response data\n" | 654 "response data\n" |
639 "--bound\n"); | 655 "--bound\n"); |
640 delegate.OnReceivedData(data.c_str(), static_cast<int>(data.length())); | 656 delegate.OnReceivedData(data.c_str(), |
641 EXPECT_EQ(1, | 657 static_cast<int>(data.length()), |
642 client.received_response_); | 658 static_cast<int>(data.length())); |
643 EXPECT_EQ(string("response data"), | 659 EXPECT_EQ(1, client.received_response_); |
644 client.data_); | 660 EXPECT_EQ(string("response data"), client.data_); |
| 661 EXPECT_EQ(static_cast<int>(data.length()), client.length_received_); |
645 EXPECT_FALSE(client.response_.isMultipartPayload()); | 662 EXPECT_FALSE(client.response_.isMultipartPayload()); |
646 | 663 |
647 string data2( | 664 string data2( |
648 "Content-type: text/plain\n\n" | 665 "Content-type: text/plain\n\n" |
649 "response data2\n" | 666 "response data2\n" |
650 "--bound\n"); | 667 "--bound\n"); |
651 delegate.OnReceivedData(data2.c_str(), static_cast<int>(data2.length())); | 668 delegate.OnReceivedData(data2.c_str(), |
652 EXPECT_EQ(2, | 669 static_cast<int>(data2.length()), |
653 client.received_response_); | 670 static_cast<int>(data2.length())); |
654 EXPECT_EQ(string("response data2"), | 671 EXPECT_EQ(2, client.received_response_); |
655 client.data_); | 672 EXPECT_EQ(string("response data2"), client.data_); |
| 673 EXPECT_EQ(static_cast<int>(data.length()) + static_cast<int>(data2.length()), |
| 674 client.length_received_); |
656 EXPECT_TRUE(client.response_.isMultipartPayload()); | 675 EXPECT_TRUE(client.response_.isMultipartPayload()); |
657 } | 676 } |
658 | 677 |
659 } // namespace | 678 } // namespace |
OLD | NEW |