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