| Index: net/http/http_network_transaction_unittest.cc
|
| diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc
|
| index 14bda39448d3534d25d6c6b5e742fb08a47b8f07..25af22fabeebddd8ece2587a2d6518192ed6179f 100644
|
| --- a/net/http/http_network_transaction_unittest.cc
|
| +++ b/net/http/http_network_transaction_unittest.cc
|
| @@ -265,7 +265,8 @@ class HttpNetworkTransactionTest
|
| int rv;
|
| std::string status_line;
|
| std::string response_data;
|
| - int64 totalReceivedBytes;
|
| + int64_t total_received_bytes;
|
| + int64_t total_sent_bytes;
|
| LoadTimingInfo load_timing_info;
|
| ConnectionAttempts connection_attempts;
|
| };
|
| @@ -341,6 +342,8 @@ class HttpNetworkTransactionTest
|
| EXPECT_EQ(ERR_IO_PENDING, rv);
|
|
|
| out.rv = callback.WaitForResult();
|
| + out.total_received_bytes = trans->GetTotalReceivedBytes();
|
| + out.total_sent_bytes = trans->GetTotalSentBytes();
|
|
|
| // Even in the failure cases that use this function, connections are always
|
| // successfully established before the error.
|
| @@ -392,23 +395,30 @@ class HttpNetworkTransactionTest
|
| EXPECT_EQ("['Host: www.example.org','Connection: keep-alive']",
|
| response_headers);
|
|
|
| - out.totalReceivedBytes = trans->GetTotalReceivedBytes();
|
| + out.total_received_bytes = trans->GetTotalReceivedBytes();
|
| + // The total number of sent bytes should not have changed.
|
| + EXPECT_EQ(out.total_sent_bytes, trans->GetTotalSentBytes());
|
| +
|
| trans->GetConnectionAttempts(&out.connection_attempts);
|
| return out;
|
| }
|
|
|
| SimpleGetHelperResult SimpleGetHelper(MockRead data_reads[],
|
| size_t reads_count) {
|
| - StaticSocketDataProvider reads(data_reads, reads_count, NULL, 0);
|
| - StaticSocketDataProvider* data[] = { &reads };
|
| - return SimpleGetHelperForData(data, 1);
|
| - }
|
| + MockWrite data_writes[] = {
|
| + MockWrite("GET / HTTP/1.1\r\n"
|
| + "Host: www.example.org\r\n"
|
| + "Connection: keep-alive\r\n\r\n"),
|
| + };
|
| +
|
| + StaticSocketDataProvider reads(data_reads, reads_count, data_writes,
|
| + arraysize(data_writes));
|
| + StaticSocketDataProvider* data[] = {&reads};
|
| + SimpleGetHelperResult out = SimpleGetHelperForData(data, 1);
|
|
|
| - int64 ReadsSize(MockRead data_reads[], size_t reads_count) {
|
| - int64 size = 0;
|
| - for (size_t i = 0; i < reads_count; ++i)
|
| - size += data_reads[i].data_len;
|
| - return size;
|
| + EXPECT_EQ(CountWriteBytes(data_writes, arraysize(data_writes)),
|
| + out.total_sent_bytes);
|
| + return out;
|
| }
|
|
|
| void ConnectStatusHelperWithExpectedStatus(const MockRead& status,
|
| @@ -679,8 +689,8 @@ TEST_P(HttpNetworkTransactionTest, SimpleGET) {
|
| EXPECT_EQ(OK, out.rv);
|
| EXPECT_EQ("HTTP/1.0 200 OK", out.status_line);
|
| EXPECT_EQ("hello world", out.response_data);
|
| - int64 reads_size = ReadsSize(data_reads, arraysize(data_reads));
|
| - EXPECT_EQ(reads_size, out.totalReceivedBytes);
|
| + int64_t reads_size = CountReadBytes(data_reads, arraysize(data_reads));
|
| + EXPECT_EQ(reads_size, out.total_received_bytes);
|
| EXPECT_EQ(0u, out.connection_attempts.size());
|
| }
|
|
|
| @@ -695,8 +705,8 @@ TEST_P(HttpNetworkTransactionTest, SimpleGETNoHeaders) {
|
| EXPECT_EQ(OK, out.rv);
|
| EXPECT_EQ("HTTP/0.9 200 OK", out.status_line);
|
| EXPECT_EQ("hello world", out.response_data);
|
| - int64 reads_size = ReadsSize(data_reads, arraysize(data_reads));
|
| - EXPECT_EQ(reads_size, out.totalReceivedBytes);
|
| + int64_t reads_size = CountReadBytes(data_reads, arraysize(data_reads));
|
| + EXPECT_EQ(reads_size, out.total_received_bytes);
|
| }
|
|
|
| // Allow up to 4 bytes of junk to precede status line.
|
| @@ -710,8 +720,8 @@ TEST_P(HttpNetworkTransactionTest, StatusLineJunk3Bytes) {
|
| EXPECT_EQ(OK, out.rv);
|
| EXPECT_EQ("HTTP/1.0 404 Not Found", out.status_line);
|
| EXPECT_EQ("DATA", out.response_data);
|
| - int64 reads_size = ReadsSize(data_reads, arraysize(data_reads));
|
| - EXPECT_EQ(reads_size, out.totalReceivedBytes);
|
| + int64_t reads_size = CountReadBytes(data_reads, arraysize(data_reads));
|
| + EXPECT_EQ(reads_size, out.total_received_bytes);
|
| }
|
|
|
| // Allow up to 4 bytes of junk to precede status line.
|
| @@ -725,8 +735,8 @@ TEST_P(HttpNetworkTransactionTest, StatusLineJunk4Bytes) {
|
| EXPECT_EQ(OK, out.rv);
|
| EXPECT_EQ("HTTP/1.0 404 Not Found", out.status_line);
|
| EXPECT_EQ("DATA", out.response_data);
|
| - int64 reads_size = ReadsSize(data_reads, arraysize(data_reads));
|
| - EXPECT_EQ(reads_size, out.totalReceivedBytes);
|
| + int64_t reads_size = CountReadBytes(data_reads, arraysize(data_reads));
|
| + EXPECT_EQ(reads_size, out.total_received_bytes);
|
| }
|
|
|
| // Beyond 4 bytes of slop and it should fail to find a status line.
|
| @@ -740,8 +750,8 @@ TEST_P(HttpNetworkTransactionTest, StatusLineJunk5Bytes) {
|
| EXPECT_EQ(OK, out.rv);
|
| EXPECT_EQ("HTTP/0.9 200 OK", out.status_line);
|
| EXPECT_EQ("xxxxxHTTP/1.1 404 Not Found\nServer: blah", out.response_data);
|
| - int64 reads_size = ReadsSize(data_reads, arraysize(data_reads));
|
| - EXPECT_EQ(reads_size, out.totalReceivedBytes);
|
| + int64_t reads_size = CountReadBytes(data_reads, arraysize(data_reads));
|
| + EXPECT_EQ(reads_size, out.total_received_bytes);
|
| }
|
|
|
| // Same as StatusLineJunk4Bytes, except the read chunks are smaller.
|
| @@ -759,8 +769,8 @@ TEST_P(HttpNetworkTransactionTest, StatusLineJunk4Bytes_Slow) {
|
| EXPECT_EQ(OK, out.rv);
|
| EXPECT_EQ("HTTP/1.0 404 Not Found", out.status_line);
|
| EXPECT_EQ("DATA", out.response_data);
|
| - int64 reads_size = ReadsSize(data_reads, arraysize(data_reads));
|
| - EXPECT_EQ(reads_size, out.totalReceivedBytes);
|
| + int64_t reads_size = CountReadBytes(data_reads, arraysize(data_reads));
|
| + EXPECT_EQ(reads_size, out.total_received_bytes);
|
| }
|
|
|
| // Close the connection before enough bytes to have a status line.
|
| @@ -774,8 +784,8 @@ TEST_P(HttpNetworkTransactionTest, StatusLinePartial) {
|
| EXPECT_EQ(OK, out.rv);
|
| EXPECT_EQ("HTTP/0.9 200 OK", out.status_line);
|
| EXPECT_EQ("HTT", out.response_data);
|
| - int64 reads_size = ReadsSize(data_reads, arraysize(data_reads));
|
| - EXPECT_EQ(reads_size, out.totalReceivedBytes);
|
| + int64_t reads_size = CountReadBytes(data_reads, arraysize(data_reads));
|
| + EXPECT_EQ(reads_size, out.total_received_bytes);
|
| }
|
|
|
| // Simulate a 204 response, lacking a Content-Length header, sent over a
|
| @@ -793,9 +803,9 @@ TEST_P(HttpNetworkTransactionTest, StopsReading204) {
|
| EXPECT_EQ(OK, out.rv);
|
| EXPECT_EQ("HTTP/1.1 204 No Content", out.status_line);
|
| EXPECT_EQ("", out.response_data);
|
| - int64 reads_size = ReadsSize(data_reads, arraysize(data_reads));
|
| - int64 response_size = reads_size - strlen(junk);
|
| - EXPECT_EQ(response_size, out.totalReceivedBytes);
|
| + int64_t reads_size = CountReadBytes(data_reads, arraysize(data_reads));
|
| + int64_t response_size = reads_size - strlen(junk);
|
| + EXPECT_EQ(response_size, out.total_received_bytes);
|
| }
|
|
|
| // A simple request using chunked encoding with some extra data after.
|
| @@ -817,9 +827,9 @@ TEST_P(HttpNetworkTransactionTest, ChunkedEncoding) {
|
| EXPECT_EQ(OK, out.rv);
|
| EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
|
| EXPECT_EQ("Hello world", out.response_data);
|
| - int64 reads_size = ReadsSize(data_reads, arraysize(data_reads));
|
| - int64 response_size = reads_size - extra_data.size();
|
| - EXPECT_EQ(response_size, out.totalReceivedBytes);
|
| + int64_t reads_size = CountReadBytes(data_reads, arraysize(data_reads));
|
| + int64_t response_size = reads_size - extra_data.size();
|
| + EXPECT_EQ(response_size, out.total_received_bytes);
|
| }
|
|
|
| // Next tests deal with http://crbug.com/56344.
|
| @@ -1955,7 +1965,9 @@ TEST_P(HttpNetworkTransactionTest, BasicAuth) {
|
| EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info1));
|
| TestLoadTimingNotReused(load_timing_info1, CONNECT_TIMING_HAS_DNS_TIMES);
|
|
|
| - int64 reads_size1 = ReadsSize(data_reads1, arraysize(data_reads1));
|
| + int64_t writes_size1 = CountWriteBytes(data_writes1, arraysize(data_writes1));
|
| + EXPECT_EQ(writes_size1, trans->GetTotalSentBytes());
|
| + int64_t reads_size1 = CountReadBytes(data_reads1, arraysize(data_reads1));
|
| EXPECT_EQ(reads_size1, trans->GetTotalReceivedBytes());
|
|
|
| const HttpResponseInfo* response = trans->GetResponseInfo();
|
| @@ -1980,7 +1992,9 @@ TEST_P(HttpNetworkTransactionTest, BasicAuth) {
|
| load_timing_info2.connect_timing.connect_start);
|
| EXPECT_NE(load_timing_info1.socket_log_id, load_timing_info2.socket_log_id);
|
|
|
| - int64 reads_size2 = ReadsSize(data_reads2, arraysize(data_reads2));
|
| + int64_t writes_size2 = CountWriteBytes(data_writes2, arraysize(data_writes2));
|
| + EXPECT_EQ(writes_size1 + writes_size2, trans->GetTotalSentBytes());
|
| + int64_t reads_size2 = CountReadBytes(data_reads2, arraysize(data_reads2));
|
| EXPECT_EQ(reads_size1 + reads_size2, trans->GetTotalReceivedBytes());
|
|
|
| response = trans->GetResponseInfo();
|
| @@ -2026,7 +2040,9 @@ TEST_P(HttpNetworkTransactionTest, DoNotSendAuth) {
|
| rv = callback.WaitForResult();
|
| EXPECT_EQ(0, rv);
|
|
|
| - int64 reads_size = ReadsSize(data_reads, arraysize(data_reads));
|
| + int64_t writes_size = CountWriteBytes(data_writes, arraysize(data_writes));
|
| + EXPECT_EQ(writes_size, trans->GetTotalSentBytes());
|
| + int64_t reads_size = CountReadBytes(data_reads, arraysize(data_reads));
|
| EXPECT_EQ(reads_size, trans->GetTotalReceivedBytes());
|
|
|
| const HttpResponseInfo* response = trans->GetResponseInfo();
|
| @@ -2132,7 +2148,10 @@ TEST_P(HttpNetworkTransactionTest, BasicAuthKeepAlive) {
|
| std::string response_data;
|
| rv = ReadTransaction(trans.get(), &response_data);
|
| EXPECT_EQ(OK, rv);
|
| - int64 reads_size1 = ReadsSize(data_reads1, arraysize(data_reads1));
|
| +
|
| + int64_t writes_size1 = CountWriteBytes(data_writes1, arraysize(data_writes1));
|
| + EXPECT_EQ(writes_size1, trans->GetTotalSentBytes());
|
| + int64_t reads_size1 = CountReadBytes(data_reads1, arraysize(data_reads1));
|
| EXPECT_EQ(reads_size1, trans->GetTotalReceivedBytes());
|
| }
|
|
|
| @@ -14584,4 +14603,145 @@ TEST_P(HttpNetworkTransactionTest, ProxyHeadersNotSentOverWsTunnel) {
|
| session->CloseAllConnections();
|
| }
|
|
|
| +TEST_P(HttpNetworkTransactionTest, TotalNetworkBytesPost) {
|
| + ScopedVector<UploadElementReader> element_readers;
|
| + element_readers.push_back(new UploadBytesElementReader("foo", 3));
|
| + ElementsUploadDataStream upload_data_stream(element_readers.Pass(), 0);
|
| +
|
| + HttpRequestInfo request;
|
| + request.method = "POST";
|
| + request.url = GURL("http://www.foo.com/");
|
| + request.upload_data_stream = &upload_data_stream;
|
| +
|
| + scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_));
|
| + scoped_ptr<HttpTransaction> trans(
|
| + new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get()));
|
| + MockWrite data_writes[] = {
|
| + MockWrite("POST / HTTP/1.1\r\n"
|
| + "Host: www.foo.com\r\n"
|
| + "Connection: keep-alive\r\n"
|
| + "Content-Length: 3\r\n\r\n"),
|
| + MockWrite("foo"),
|
| + };
|
| +
|
| + MockRead data_reads[] = {
|
| + MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
|
| + MockRead(SYNCHRONOUS, OK),
|
| + };
|
| + StaticSocketDataProvider data(data_reads, arraysize(data_reads), data_writes,
|
| + arraysize(data_writes));
|
| + session_deps_.socket_factory->AddSocketDataProvider(&data);
|
| +
|
| + TestCompletionCallback callback;
|
| +
|
| + EXPECT_EQ(ERR_IO_PENDING,
|
| + trans->Start(&request, callback.callback(), BoundNetLog()));
|
| + EXPECT_EQ(OK, callback.WaitForResult());
|
| +
|
| + std::string response_data;
|
| + EXPECT_EQ(OK, ReadTransaction(trans.get(), &response_data));
|
| +
|
| + EXPECT_EQ(CountWriteBytes(data_writes, arraysize(data_writes)),
|
| + trans->GetTotalSentBytes());
|
| + EXPECT_EQ(CountReadBytes(data_reads, arraysize(data_reads)),
|
| + trans->GetTotalReceivedBytes());
|
| +}
|
| +
|
| +TEST_P(HttpNetworkTransactionTest, TotalNetworkBytesPost100Continue) {
|
| + ScopedVector<UploadElementReader> element_readers;
|
| + element_readers.push_back(new UploadBytesElementReader("foo", 3));
|
| + ElementsUploadDataStream upload_data_stream(element_readers.Pass(), 0);
|
| +
|
| + HttpRequestInfo request;
|
| + request.method = "POST";
|
| + request.url = GURL("http://www.foo.com/");
|
| + request.upload_data_stream = &upload_data_stream;
|
| +
|
| + scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_));
|
| + scoped_ptr<HttpTransaction> trans(
|
| + new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get()));
|
| + MockWrite data_writes[] = {
|
| + MockWrite("POST / HTTP/1.1\r\n"
|
| + "Host: www.foo.com\r\n"
|
| + "Connection: keep-alive\r\n"
|
| + "Content-Length: 3\r\n\r\n"),
|
| + MockWrite("foo"),
|
| + };
|
| +
|
| + MockRead data_reads[] = {
|
| + MockRead("HTTP/1.1 100 Continue\r\n\r\n"),
|
| + MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
|
| + MockRead(SYNCHRONOUS, OK),
|
| + };
|
| + StaticSocketDataProvider data(data_reads, arraysize(data_reads), data_writes,
|
| + arraysize(data_writes));
|
| + session_deps_.socket_factory->AddSocketDataProvider(&data);
|
| +
|
| + TestCompletionCallback callback;
|
| +
|
| + EXPECT_EQ(ERR_IO_PENDING,
|
| + trans->Start(&request, callback.callback(), BoundNetLog()));
|
| + EXPECT_EQ(OK, callback.WaitForResult());
|
| +
|
| + std::string response_data;
|
| + EXPECT_EQ(OK, ReadTransaction(trans.get(), &response_data));
|
| +
|
| + EXPECT_EQ(CountWriteBytes(data_writes, arraysize(data_writes)),
|
| + trans->GetTotalSentBytes());
|
| + EXPECT_EQ(CountReadBytes(data_reads, arraysize(data_reads)),
|
| + trans->GetTotalReceivedBytes());
|
| +}
|
| +
|
| +TEST_P(HttpNetworkTransactionTest, TotalNetworkBytesChunkedPost) {
|
| + ScopedVector<UploadElementReader> element_readers;
|
| + element_readers.push_back(new UploadBytesElementReader("foo", 3));
|
| + ChunkedUploadDataStream upload_data_stream(0);
|
| +
|
| + HttpRequestInfo request;
|
| + request.method = "POST";
|
| + request.url = GURL("http://www.foo.com/");
|
| + request.upload_data_stream = &upload_data_stream;
|
| +
|
| + scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_));
|
| + scoped_ptr<HttpTransaction> trans(
|
| + new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get()));
|
| + // Send headers successfully, but get an error while sending the body.
|
| + MockWrite data_writes[] = {
|
| + MockWrite("POST / HTTP/1.1\r\n"
|
| + "Host: www.foo.com\r\n"
|
| + "Connection: keep-alive\r\n"
|
| + "Transfer-Encoding: chunked\r\n\r\n"),
|
| + MockWrite("1\r\nf\r\n"), MockWrite("2\r\noo\r\n"), MockWrite("0\r\n\r\n"),
|
| + };
|
| +
|
| + MockRead data_reads[] = {
|
| + MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
|
| + MockRead(SYNCHRONOUS, OK),
|
| + };
|
| + StaticSocketDataProvider data(data_reads, arraysize(data_reads), data_writes,
|
| + arraysize(data_writes));
|
| + session_deps_.socket_factory->AddSocketDataProvider(&data);
|
| +
|
| + TestCompletionCallback callback;
|
| +
|
| + EXPECT_EQ(ERR_IO_PENDING,
|
| + trans->Start(&request, callback.callback(), BoundNetLog()));
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| + upload_data_stream.AppendData("f", 1, false);
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| + upload_data_stream.AppendData("oo", 2, true);
|
| +
|
| + EXPECT_EQ(OK, callback.WaitForResult());
|
| +
|
| + std::string response_data;
|
| + EXPECT_EQ(OK, ReadTransaction(trans.get(), &response_data));
|
| +
|
| + EXPECT_EQ(CountWriteBytes(data_writes, arraysize(data_writes)),
|
| + trans->GetTotalSentBytes());
|
| + EXPECT_EQ(CountReadBytes(data_reads, arraysize(data_reads)),
|
| + trans->GetTotalReceivedBytes());
|
| +}
|
| +
|
| } // namespace net
|
|
|