multipart_response_delegate_unittest.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "testing/gtest/include/gtest/gtest.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURL.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLLoaderClient.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLResponse.h" 13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "webkit/child/multipart_response_delegate.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::string; 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString; 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURL; 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLError; 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLLoader; 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLLoaderClient; 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLRequest; 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLResponse; 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using content::MultipartResponseDelegateTester; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using webkit_glue::MultipartResponseDelegate; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace content { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MultipartResponseDelegateTester { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MultipartResponseDelegateTester(MultipartResponseDelegate* delegate) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : delegate_(delegate) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int PushOverLine(const std::string& data, size_t pos) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_->PushOverLine(data, pos); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ParseHeaders() { return delegate_->ParseHeaders(); } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t FindBoundary() { return delegate_->FindBoundary(); } 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string& boundary() { return delegate_->boundary_; } 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string& data() { return delegate_->data_; } 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MultipartResponseDelegate* delegate_; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MultipartResponseTest : public testing::Test { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockWebURLLoaderClient : public WebURLLoaderClient { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockWebURLLoaderClient() { Reset(); } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void willSendRequest( 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLLoader*, WebURLRequest&, const WebURLResponse&) {} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void didSendData( 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLLoader*, unsigned long long, unsigned long long) {} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void didReceiveResponse(WebURLLoader* loader, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLResponse& response) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++received_response_; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_ = response; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_.clear(); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void didReceiveData( 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebURLLoader* loader, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* data, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int data_length, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int encoded_data_length) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++received_data_; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_.append(data, data_length); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) total_encoded_data_length_ += encoded_data_length; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void didFinishLoading( 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebURLLoader*, double finishTime, int64_t total_encoded_data_length) {} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void didFail(WebURLLoader*, const WebURLError&) {} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reset() { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) received_response_ = received_data_ = total_encoded_data_length_ = 0; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_.clear(); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_.reset(); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string GetResponseHeader(const char* name) const { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return string(response_.httpHeaderField(WebString::fromUTF8(name)).utf8()); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int received_response_, received_data_, total_encoded_data_length_; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string data_; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLResponse response_; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We can't put this in an anonymous function because it's a friend class for 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// access to private members. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(MultipartResponseTest, Functions) { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PushOverLine tests 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLResponse response; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.initialize(); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.setMIMEType("multipart/x-mixed-replace"); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.setHTTPHeaderField("Foo", "Bar"); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.setHTTPHeaderField("Content-type", "text/plain"); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockWebURLLoaderClient client; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MultipartResponseDelegate delegate(&client, NULL, response, "bound"); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MultipartResponseDelegateTester delegate_tester(&delegate); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* input; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int position; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int expected; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } line_tests[] = { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Line", 0, 0 }, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Line", 2, 0 }, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Line", 10, 0 }, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "\r\nLine", 0, 2 }, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "\nLine", 0, 1 }, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "\n\nLine", 0, 2 }, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "\rLine", 0, 1 }, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Line\r\nLine", 4, 2 }, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Line\nLine", 4, 1 }, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Line\n\nLine", 4, 2 }, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Line\rLine", 4, 1 }, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Line\r\rLine", 4, 1 }, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(line_tests); ++i) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(line_tests[i].expected, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_tester.PushOverLine(line_tests[i].input, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) line_tests[i].position)); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ParseHeaders tests 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* data; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool rv; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int received_response_calls; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* newdata; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } header_tests[] = { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "This is junk", false, 0, "This is junk" }, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Foo: bar\nBaz:\n\nAfter:\n", true, 1, "After:\n" }, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Foo: bar\nBaz:\n", false, 0, "Foo: bar\nBaz:\n" }, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Foo: bar\r\nBaz:\r\n\r\nAfter:\r\n", true, 1, "After:\r\n" }, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Foo: bar\r\nBaz:\r\n", false, 0, "Foo: bar\r\nBaz:\r\n" }, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Foo: bar\nBaz:\r\n\r\nAfter:\n\n", true, 1, "After:\n\n" }, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Foo: bar\r\nBaz:\n", false, 0, "Foo: bar\r\nBaz:\n" }, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "\r\n", true, 1, "" }, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(header_tests); ++i) { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client.Reset(); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_tester.data().assign(header_tests[i].data); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(header_tests[i].rv, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_tester.ParseHeaders()); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(header_tests[i].received_response_calls, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client.received_response_); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(string(header_tests[i].newdata), 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_tester.data()); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that the resource response is filled in correctly when parsing 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // headers. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client.Reset(); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string test_header("content-type: image/png\ncontent-length: 10\n\n"); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_tester.data().assign(test_header); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(delegate_tester.ParseHeaders()); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(delegate_tester.data().length() == 0); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(string("image/png"), client.GetResponseHeader("Content-Type")); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(string("10"), client.GetResponseHeader("content-length")); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This header is passed from the original request. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(string("Bar"), client.GetResponseHeader("foo")); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we parse the right mime-type if a charset is provided. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client.Reset(); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string test_header2("content-type: text/html; charset=utf-8\n\n"); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_tester.data().assign(test_header2); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(delegate_tester.ParseHeaders()); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(delegate_tester.data().length() == 0); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(string("text/html; charset=utf-8"), 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client.GetResponseHeader("Content-Type")); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(string("utf-8"), 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string(client.response_.textEncodingName().utf8())); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FindBoundary tests 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* boundary; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* data; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t position; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } boundary_tests[] = { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "bound", "bound", 0 }, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "bound", "--bound", 0 }, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "bound", "junkbound", 4 }, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "bound", "junk--bound", 4 }, 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "foo", "bound", string::npos }, 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "bound", "--boundbound", 0 }, 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(boundary_tests); ++i) { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_tester.boundary().assign(boundary_tests[i].boundary); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_tester.data().assign(boundary_tests[i].data); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(boundary_tests[i].position, 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_tester.FindBoundary()); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(MultipartResponseTest, MissingBoundaries) { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLResponse response; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.initialize(); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.setMIMEType("multipart/x-mixed-replace"); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.setHTTPHeaderField("Foo", "Bar"); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.setHTTPHeaderField("Content-type", "text/plain"); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockWebURLLoaderClient client; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MultipartResponseDelegate delegate(&client, NULL, response, "bound"); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No start boundary 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string no_start_boundary( 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Content-type: text/plain\n\n" 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "This is a sample response\n" 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "--bound--" 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ignore junk after end token --bound\n\nTest2\n"); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate.OnReceivedData(no_start_boundary.c_str(), 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(no_start_boundary.length()), 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(no_start_boundary.length())); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, client.received_response_); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, client.received_data_); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(string("This is a sample response"), client.data_); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<int>(no_start_boundary.length()), 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client.total_encoded_data_length_); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate.OnCompletedRequest(); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, client.received_response_); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, client.received_data_); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No end boundary 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client.Reset(); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MultipartResponseDelegate delegate2(&client, NULL, response, "bound"); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string no_end_boundary( 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "bound\nContent-type: text/plain\n\n" 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "This is a sample response\n"); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate2.OnReceivedData(no_end_boundary.c_str(), 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(no_end_boundary.length()), 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(no_end_boundary.length())); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, client.received_response_); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, client.received_data_); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("This is a sample response\n", client.data_); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<int>(no_end_boundary.length()), 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client.total_encoded_data_length_); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate2.OnCompletedRequest(); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, client.received_response_); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, client.received_data_); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(string("This is a sample response\n"), client.data_); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<int>(no_end_boundary.length()), 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client.total_encoded_data_length_); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Neither boundary 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client.Reset(); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MultipartResponseDelegate delegate3(&client, NULL, response, "bound"); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string no_boundaries( 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Content-type: text/plain\n\n" 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "This is a sample response\n"); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate3.OnReceivedData(no_boundaries.c_str(), 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(no_boundaries.length()), 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(no_boundaries.length())); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, client.received_response_); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, client.received_data_); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("This is a sample response\n", client.data_); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<int>(no_boundaries.length()), 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client.total_encoded_data_length_); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate3.OnCompletedRequest(); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, client.received_response_); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, client.received_data_); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(string("This is a sample response\n"), client.data_); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<int>(no_boundaries.length()), 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client.total_encoded_data_length_); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(MultipartResponseTest, MalformedBoundary) { 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Some servers send a boundary that is prefixed by "--". See bug 5786. 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLResponse response; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.initialize(); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.setMIMEType("multipart/x-mixed-replace"); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.setHTTPHeaderField("Foo", "Bar"); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.setHTTPHeaderField("Content-type", "text/plain"); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockWebURLLoaderClient client; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MultipartResponseDelegate delegate(&client, NULL, response, "--bound"); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string data( 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "--bound\n" 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Content-type: text/plain\n\n" 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "This is a sample response\n" 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "--bound--" 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ignore junk after end token --bound\n\nTest2\n"); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate.OnReceivedData(data.c_str(), 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(data.length()), 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(data.length())); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, client.received_response_); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, client.received_data_); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(string("This is a sample response"), client.data_); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<int>(data.length()), client.total_encoded_data_length_); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate.OnCompletedRequest(); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, client.received_response_); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, client.received_data_); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used in for tests that break the data in various places. 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct TestChunk { 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int start_pos; // offset in data 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int end_pos; // end offset in data 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int expected_responses; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int expected_received_data; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* expected_data; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int expected_encoded_data_length; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VariousChunkSizesTest(const TestChunk chunks[], int chunks_size, 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int responses, int received_data, 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* completed_data, 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int completed_encoded_data_length) { 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string data( 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "--bound\n" // 0-7 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Content-type: image/png\n\n" // 8-32 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "datadatadatadatadata" // 33-52 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "--bound\n" // 53-60 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Content-type: image/jpg\n\n" // 61-85 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "foofoofoofoofoo" // 86-100 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "--bound--"); // 101-109 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLResponse response; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.initialize(); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.setMIMEType("multipart/x-mixed-replace"); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockWebURLLoaderClient client; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MultipartResponseDelegate delegate(&client, NULL, response, "bound"); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < chunks_size; ++i) { 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(chunks[i].start_pos < chunks[i].end_pos); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string chunk = data.substr(chunks[i].start_pos, 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks[i].end_pos - chunks[i].start_pos); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate.OnReceivedData( 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunk.c_str(), 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(chunk.length()), 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(chunk.length())); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chunks[i].expected_responses, client.received_response_); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chunks[i].expected_received_data, client.received_data_); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(string(chunks[i].expected_data), client.data_); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chunks[i].expected_encoded_data_length, 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client.total_encoded_data_length_); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check final state 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate.OnCompletedRequest(); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(responses, client.received_response_); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(received_data, client.received_data_); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string completed_data_string(completed_data); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(completed_data_string, client.data_); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(completed_encoded_data_length, client.total_encoded_data_length_); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(MultipartResponseTest, BreakInBoundary) { 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Break in the first boundary 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestChunk bound1[] = { 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 4, 0, 0, "", 0 }, 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4, 110, 2, 2, "foofoofoofoofoo", 110 }, 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariousChunkSizesTest(bound1, arraysize(bound1), 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 2, "foofoofoofoofoo", 110); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Break in first and second 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestChunk bound2[] = { 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 4, 0, 0, "", 0 }, 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4, 55, 1, 1, "datadatadatadat", 55 }, 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 55, 65, 1, 2, "datadatadatadatadata", 65 }, 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 65, 110, 2, 3, "foofoofoofoofoo", 110 }, 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariousChunkSizesTest(bound2, arraysize(bound2), 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 3, "foofoofoofoofoo", 110); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Break in second only 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestChunk bound3[] = { 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 55, 1, 1, "datadatadatadat", 55 }, 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 55, 110, 2, 3, "foofoofoofoofoo", 110 }, 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariousChunkSizesTest(bound3, arraysize(bound3), 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 3, "foofoofoofoofoo", 110); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(MultipartResponseTest, BreakInHeaders) { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Break in first header 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestChunk header1[] = { 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 10, 0, 0, "", 0 }, 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10, 35, 1, 0, "", 0 }, 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 35, 110, 2, 2, "foofoofoofoofoo", 110 }, 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariousChunkSizesTest(header1, arraysize(header1), 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 2, "foofoofoofoofoo", 110); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Break in both headers 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestChunk header2[] = { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 10, 0, 0, "", 0 }, 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10, 65, 1, 1, "datadatadatadatadata", 65 }, 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 65, 110, 2, 2, "foofoofoofoofoo", 110 }, 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariousChunkSizesTest(header2, arraysize(header2), 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 2, "foofoofoofoofoo", 110); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Break at end of a header 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestChunk header3[] = { 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 33, 1, 0, "", 0 }, 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 33, 65, 1, 1, "datadatadatadatadata", 65 }, 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 65, 110, 2, 2, "foofoofoofoofoo", 110 }, 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariousChunkSizesTest(header3, arraysize(header3), 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 2, "foofoofoofoofoo", 110); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(MultipartResponseTest, BreakInData) { 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All data as one chunk 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestChunk data1[] = { 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 110, 2, 2, "foofoofoofoofoo", 110 }, 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariousChunkSizesTest(data1, arraysize(data1), 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 2, "foofoofoofoofoo", 110); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // breaks in data segment 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestChunk data2[] = { 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 35, 1, 0, "", 0 }, 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 35, 65, 1, 1, "datadatadatadatadata", 65 }, 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 65, 90, 2, 1, "", 65 }, 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 90, 110, 2, 2, "foofoofoofoofoo", 110 }, 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariousChunkSizesTest(data2, arraysize(data2), 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 2, "foofoofoofoofoo", 110); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Incomplete send 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestChunk data3[] = { 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 35, 1, 0, "", 0 }, 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 35, 90, 2, 1, "", 90 }, 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariousChunkSizesTest(data3, arraysize(data3), 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 2, "foof", 90); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(MultipartResponseTest, SmallChunk) { 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLResponse response; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.initialize(); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.setMIMEType("multipart/x-mixed-replace"); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.setHTTPHeaderField("Content-type", "text/plain"); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockWebURLLoaderClient client; 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MultipartResponseDelegate delegate(&client, NULL, response, "bound"); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test chunks of size 1, 2, and 0. 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string data( 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "--boundContent-type: text/plain\n\n" 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\n--boundContent-type: text/plain\n\n" 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\n\n--boundContent-type: text/plain\n\n" 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "--boundContent-type: text/plain\n\n" 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "end--bound--"); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate.OnReceivedData(data.c_str(), 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(data.length()), 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(data.length())); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, client.received_response_); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, client.received_data_); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(string("end"), client.data_); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<int>(data.length()), client.total_encoded_data_length_); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate.OnCompletedRequest(); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, client.received_response_); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, client.received_data_); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(MultipartResponseTest, MultipleBoundaries) { 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test multiple boundaries back to back 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLResponse response; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.initialize(); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.setMIMEType("multipart/x-mixed-replace"); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockWebURLLoaderClient client; 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MultipartResponseDelegate delegate(&client, NULL, response, "bound"); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string data("--bound\r\n\r\n--bound\r\n\r\nfoofoo--bound--"); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate.OnReceivedData(data.c_str(), 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(data.length()), 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(data.length())); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, client.received_response_); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, client.received_data_); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(string("foofoo"), client.data_); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<int>(data.length()), client.total_encoded_data_length_); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(MultipartResponseTest, MultipartByteRangeParsingTest) { 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test multipart/byteranges based boundary parsing. 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLResponse response1; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response1.initialize(); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response1.setMIMEType("multipart/x-mixed-replace"); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response1.setHTTPHeaderField("Content-Length", "200"); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response1.setHTTPHeaderField("Content-type", 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "multipart/byteranges; boundary=--bound--"); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string multipart_boundary; 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = MultipartResponseDelegate::ReadMultipartBoundary( 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response1, &multipart_boundary); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(result, true); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(string("--bound--"), 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) multipart_boundary); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLResponse response2; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response2.initialize(); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response2.setMIMEType("image/png"); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response2.setHTTPHeaderField("Content-Length", "300"); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response2.setHTTPHeaderField("Last-Modified", 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Mon, 04 Apr 2005 20:36:01 GMT"); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response2.setHTTPHeaderField("Date", "Thu, 11 Sep 2008 18:21:42 GMT"); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) multipart_boundary.clear(); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = MultipartResponseDelegate::ReadMultipartBoundary( 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response2, &multipart_boundary); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(result, false); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLResponse response3; 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response3.initialize(); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response3.setMIMEType("multipart/byteranges"); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response3.setHTTPHeaderField("Content-Length", "300"); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response3.setHTTPHeaderField("Last-Modified", 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Mon, 04 Apr 2005 20:36:01 GMT"); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response3.setHTTPHeaderField("Date", "Thu, 11 Sep 2008 18:21:42 GMT"); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response3.setHTTPHeaderField("Content-type", "multipart/byteranges"); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) multipart_boundary.clear(); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = MultipartResponseDelegate::ReadMultipartBoundary( 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response3, &multipart_boundary); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(result, false); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(multipart_boundary.length(), 0U); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLResponse response4; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response4.initialize(); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response4.setMIMEType("multipart/byteranges"); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response4.setHTTPHeaderField("Content-Length", "200"); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response4.setHTTPHeaderField("Content-type", 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "multipart/byteranges; boundary=--bound--; charSet=utf8"); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) multipart_boundary.clear(); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = MultipartResponseDelegate::ReadMultipartBoundary( 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response4, &multipart_boundary); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(result, true); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(string("--bound--"), multipart_boundary); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLResponse response5; 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response5.initialize(); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response5.setMIMEType("multipart/byteranges"); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response5.setHTTPHeaderField("Content-Length", "200"); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response5.setHTTPHeaderField("Content-type", 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "multipart/byteranges; boundary=\"--bound--\"; charSet=utf8"); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) multipart_boundary.clear(); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = MultipartResponseDelegate::ReadMultipartBoundary( 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response5, &multipart_boundary); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(result, true); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(string("--bound--"), multipart_boundary); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(MultipartResponseTest, MultipartContentRangesTest) { 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLResponse response1; 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response1.initialize(); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response1.setMIMEType("application/pdf"); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response1.setHTTPHeaderField("Content-Length", "200"); // Ignored! 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use intentionally >32bit values to check they are handled correctly. 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response1.setHTTPHeaderField("Content-Range", 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "bytes 5000000000-5000000050/6000000000"); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 content_range_lower_bound = 0; 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 content_range_upper_bound = 0; 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 content_range_instance_size = 0; 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = MultipartResponseDelegate::ReadContentRanges( 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response1, &content_range_lower_bound, 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &content_range_upper_bound, 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &content_range_instance_size); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(result, true); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(content_range_lower_bound, 5e9); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(content_range_upper_bound, 5e9+50); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(content_range_instance_size, 6e9); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLResponse response2; 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response2.initialize(); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response2.setMIMEType("application/pdf"); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response2.setHTTPHeaderField("Content-Length", "200"); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response2.setHTTPHeaderField("Content-Range", "bytes 1000/1050"); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_range_lower_bound = 0; 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_range_upper_bound = 0; 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_range_instance_size = 0; 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = MultipartResponseDelegate::ReadContentRanges( 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response2, &content_range_lower_bound, 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &content_range_upper_bound, 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &content_range_instance_size); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(result, false); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLResponse response3; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response3.initialize(); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response3.setMIMEType("application/pdf"); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response3.setHTTPHeaderField("Content-Length", "200"); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response3.setHTTPHeaderField("Range", "bytes 1000-1050/5000"); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_range_lower_bound = 0; 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_range_upper_bound = 0; 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_range_instance_size = 0; 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = MultipartResponseDelegate::ReadContentRanges( 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response3, &content_range_lower_bound, 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &content_range_upper_bound, 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &content_range_instance_size); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(result, true); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(content_range_lower_bound, 1000); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(content_range_upper_bound, 1050); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLResponse response4; 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response4.initialize(); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response4.setMIMEType("application/pdf"); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response4.setHTTPHeaderField("Content-Length", "200"); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_range_lower_bound = 0; 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_range_upper_bound = 0; 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_range_instance_size = 0; 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = MultipartResponseDelegate::ReadContentRanges( 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response4, &content_range_lower_bound, 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &content_range_upper_bound, 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &content_range_instance_size); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(result, false); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(MultipartResponseTest, MultipartPayloadSet) { 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLResponse response; 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.initialize(); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.setMIMEType("multipart/x-mixed-replace"); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockWebURLLoaderClient client; 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MultipartResponseDelegate delegate(&client, NULL, response, "bound"); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string data( 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "--bound\n" 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Content-type: text/plain\n\n" 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "response data\n" 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "--bound\n"); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate.OnReceivedData(data.c_str(), 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(data.length()), 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(data.length())); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, client.received_response_); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(string("response data"), client.data_); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<int>(data.length()), client.total_encoded_data_length_); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(client.response_.isMultipartPayload()); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string data2( 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Content-type: text/plain\n\n" 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "response data2\n" 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "--bound\n"); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate.OnReceivedData(data2.c_str(), 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(data2.length()), 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(data2.length())); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, client.received_response_); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(string("response data2"), client.data_); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<int>(data.length()) + static_cast<int>(data2.length()), 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client.total_encoded_data_length_); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client.response_.isMultipartPayload()); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 675cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 676cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace content 677