11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/server/http_connection.h" 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <string> 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/ref_counted.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/strings/string_piece.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gtest/include/gtest/gtest.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace net { 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace { 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistd::string GetTestString(int size) { 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string test_string; 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (int i = 0; i < size; ++i) { 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci test_string.push_back('A' + (i % 26)); 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return test_string; 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(HttpConnectionTest, ReadIOBuffer_SetCapacity) { 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<HttpConnection::ReadIOBuffer> buffer( 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new HttpConnection::ReadIOBuffer); 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize + 0, 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->GetCapacity()); 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize + 0, 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->RemainingCapacity()); 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, buffer->GetSize()); 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int kNewCapacity = HttpConnection::ReadIOBuffer::kInitialBufSize + 128; 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->SetCapacity(kNewCapacity); 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kNewCapacity, buffer->GetCapacity()); 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kNewCapacity, buffer->RemainingCapacity()); 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, buffer->GetSize()); 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(HttpConnectionTest, ReadIOBuffer_SetCapacity_WithData) { 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<HttpConnection::ReadIOBuffer> buffer( 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new HttpConnection::ReadIOBuffer); 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize + 0, 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->GetCapacity()); 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize + 0, 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->RemainingCapacity()); 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Write arbitrary data up to kInitialBufSize. 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string kReadData( 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetTestString(HttpConnection::ReadIOBuffer::kInitialBufSize)); 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memcpy(buffer->data(), kReadData.data(), kReadData.size()); 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->DidRead(kReadData.size()); 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize + 0, 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->GetCapacity()); 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize - 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static_cast<int>(kReadData.size()), 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->RemainingCapacity()); 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(static_cast<int>(kReadData.size()), buffer->GetSize()); 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kReadData, 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPiece(buffer->StartOfBuffer(), buffer->GetSize())); 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Check if read data in the buffer is same after SetCapacity(). 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int kNewCapacity = HttpConnection::ReadIOBuffer::kInitialBufSize + 128; 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->SetCapacity(kNewCapacity); 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kNewCapacity, buffer->GetCapacity()); 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kNewCapacity - static_cast<int>(kReadData.size()), 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->RemainingCapacity()); 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(static_cast<int>(kReadData.size()), buffer->GetSize()); 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kReadData, 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPiece(buffer->StartOfBuffer(), buffer->GetSize())); 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(HttpConnectionTest, ReadIOBuffer_IncreaseCapacity) { 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<HttpConnection::ReadIOBuffer> buffer( 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new HttpConnection::ReadIOBuffer); 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(buffer->IncreaseCapacity()); 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int kExpectedInitialBufSize = 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HttpConnection::ReadIOBuffer::kInitialBufSize * 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HttpConnection::ReadIOBuffer::kCapacityIncreaseFactor; 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kExpectedInitialBufSize, buffer->GetCapacity()); 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kExpectedInitialBufSize, buffer->RemainingCapacity()); 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, buffer->GetSize()); 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Increase capacity until it fails. 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (buffer->IncreaseCapacity()); 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(buffer->IncreaseCapacity()); 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(HttpConnection::ReadIOBuffer::kDefaultMaxBufferSize + 0, 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->max_buffer_size()); 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(HttpConnection::ReadIOBuffer::kDefaultMaxBufferSize + 0, 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->GetCapacity()); 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Enlarge capacity limit. 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->set_max_buffer_size(buffer->max_buffer_size() * 2); 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(buffer->IncreaseCapacity()); 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(HttpConnection::ReadIOBuffer::kDefaultMaxBufferSize * 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HttpConnection::ReadIOBuffer::kCapacityIncreaseFactor, 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->GetCapacity()); 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Shrink capacity limit. It doesn't change capacity itself. 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->set_max_buffer_size( 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HttpConnection::ReadIOBuffer::kDefaultMaxBufferSize / 2); 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(buffer->IncreaseCapacity()); 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(HttpConnection::ReadIOBuffer::kDefaultMaxBufferSize * 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HttpConnection::ReadIOBuffer::kCapacityIncreaseFactor, 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->GetCapacity()); 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(HttpConnectionTest, ReadIOBuffer_IncreaseCapacity_WithData) { 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<HttpConnection::ReadIOBuffer> buffer( 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new HttpConnection::ReadIOBuffer); 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(buffer->IncreaseCapacity()); 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int kExpectedInitialBufSize = 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HttpConnection::ReadIOBuffer::kInitialBufSize * 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HttpConnection::ReadIOBuffer::kCapacityIncreaseFactor; 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kExpectedInitialBufSize, buffer->GetCapacity()); 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kExpectedInitialBufSize, buffer->RemainingCapacity()); 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, buffer->GetSize()); 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Write arbitrary data up to kExpectedInitialBufSize. 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string kReadData(GetTestString(kExpectedInitialBufSize)); 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memcpy(buffer->data(), kReadData.data(), kReadData.size()); 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->DidRead(kReadData.size()); 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kExpectedInitialBufSize, buffer->GetCapacity()); 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kExpectedInitialBufSize - static_cast<int>(kReadData.size()), 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->RemainingCapacity()); 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(static_cast<int>(kReadData.size()), buffer->GetSize()); 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kReadData, 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPiece(buffer->StartOfBuffer(), buffer->GetSize())); 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Increase capacity until it fails and check if read data in the buffer is 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // same. 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (buffer->IncreaseCapacity()); 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(buffer->IncreaseCapacity()); 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(HttpConnection::ReadIOBuffer::kDefaultMaxBufferSize + 0, 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->max_buffer_size()); 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(HttpConnection::ReadIOBuffer::kDefaultMaxBufferSize + 0, 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->GetCapacity()); 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(HttpConnection::ReadIOBuffer::kDefaultMaxBufferSize - 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static_cast<int>(kReadData.size()), 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->RemainingCapacity()); 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(static_cast<int>(kReadData.size()), buffer->GetSize()); 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kReadData, 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPiece(buffer->StartOfBuffer(), buffer->GetSize())); 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(HttpConnectionTest, ReadIOBuffer_DidRead_DidConsume) { 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<HttpConnection::ReadIOBuffer> buffer( 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new HttpConnection::ReadIOBuffer); 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char* start_of_buffer = buffer->StartOfBuffer(); 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(start_of_buffer, buffer->data()); 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Read data. 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int kReadLength = 128; 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string kReadData(GetTestString(kReadLength)); 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memcpy(buffer->data(), kReadData.data(), kReadLength); 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->DidRead(kReadLength); 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // No change in total capacity. 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize + 0, 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->GetCapacity()); 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Change in unused capacity because of read data. 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize - kReadLength, 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->RemainingCapacity()); 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kReadLength, buffer->GetSize()); 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // No change in start pointers of read data. 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(start_of_buffer, buffer->StartOfBuffer()); 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Change in start pointer of unused buffer. 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(start_of_buffer + kReadLength, buffer->data()); 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Test read data. 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kReadData, std::string(buffer->StartOfBuffer(), buffer->GetSize())); 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Consume data partially. 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int kConsumedLength = 32; 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_LT(kConsumedLength, kReadLength); 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->DidConsume(kConsumedLength); 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Capacity reduced because read data was too small comparing to capacity. 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize / 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HttpConnection::ReadIOBuffer::kCapacityIncreaseFactor, 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->GetCapacity()); 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Change in unused capacity because of read data. 1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize / 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HttpConnection::ReadIOBuffer::kCapacityIncreaseFactor - 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kReadLength + kConsumedLength, 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->RemainingCapacity()); 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Change in read size. 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kReadLength - kConsumedLength, buffer->GetSize()); 1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Start data could be changed even when capacity is reduced. 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci start_of_buffer = buffer->StartOfBuffer(); 1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Change in start pointer of unused buffer. 1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(start_of_buffer + kReadLength - kConsumedLength, buffer->data()); 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Change in read data. 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kReadData.substr(kConsumedLength), 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string(buffer->StartOfBuffer(), buffer->GetSize())); 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Read more data. 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int kReadLength2 = 64; 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->DidRead(kReadLength2); 1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // No change in total capacity. 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize / 1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HttpConnection::ReadIOBuffer::kCapacityIncreaseFactor, 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->GetCapacity()); 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Change in unused capacity because of read data. 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize / 2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HttpConnection::ReadIOBuffer::kCapacityIncreaseFactor - 2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kReadLength + kConsumedLength - kReadLength2, 2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->RemainingCapacity()); 2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Change in read size 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kReadLength - kConsumedLength + kReadLength2, buffer->GetSize()); 2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // No change in start pointer of read part. 2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(start_of_buffer, buffer->StartOfBuffer()); 2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Change in start pointer of unused buffer. 2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(start_of_buffer + kReadLength - kConsumedLength + kReadLength2, 2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->data()); 2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Consume data fully. 2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->DidConsume(kReadLength - kConsumedLength + kReadLength2); 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Capacity reduced again because read data was too small. 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize / 2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HttpConnection::ReadIOBuffer::kCapacityIncreaseFactor / 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HttpConnection::ReadIOBuffer::kCapacityIncreaseFactor, 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->GetCapacity()); 2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize / 2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HttpConnection::ReadIOBuffer::kCapacityIncreaseFactor / 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HttpConnection::ReadIOBuffer::kCapacityIncreaseFactor, 2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->RemainingCapacity()); 2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // All reverts to initial because no data is left. 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, buffer->GetSize()); 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Start data could be changed even when capacity is reduced. 2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci start_of_buffer = buffer->StartOfBuffer(); 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(start_of_buffer, buffer->data()); 2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(HttpConnectionTest, QueuedWriteIOBuffer_Append_DidConsume) { 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<HttpConnection::QueuedWriteIOBuffer> buffer( 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new HttpConnection::QueuedWriteIOBuffer()); 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(buffer->IsEmpty()); 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, buffer->GetSizeToWrite()); 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, buffer->total_size()); 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string kData("data to write"); 2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(buffer->Append(kData)); 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(buffer->IsEmpty()); 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(static_cast<int>(kData.size()), buffer->GetSizeToWrite()); 2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(static_cast<int>(kData.size()), buffer->total_size()); 2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // First data to write is same to kData. 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kData, base::StringPiece(buffer->data(), buffer->GetSizeToWrite())); 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string kData2("more data to write"); 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(buffer->Append(kData2)); 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(buffer->IsEmpty()); 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // No change in size to write. 2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(static_cast<int>(kData.size()), buffer->GetSizeToWrite()); 2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Change in total size. 2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(static_cast<int>(kData.size() + kData2.size()), 2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->total_size()); 2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // First data to write has not been changed. Same to kData. 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kData, base::StringPiece(buffer->data(), buffer->GetSizeToWrite())); 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Consume data partially. 2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int kConsumedLength = kData.length() - 1; 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->DidConsume(kConsumedLength); 2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(buffer->IsEmpty()); 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Change in size to write. 2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(static_cast<int>(kData.size()) - kConsumedLength, 2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->GetSizeToWrite()); 2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Change in total size. 2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(static_cast<int>(kData.size() + kData2.size()) - kConsumedLength, 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->total_size()); 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // First data to write has shrinked. 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kData.substr(kConsumedLength), 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPiece(buffer->data(), buffer->GetSizeToWrite())); 2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Consume first data fully. 2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->DidConsume(kData.size() - kConsumedLength); 2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(buffer->IsEmpty()); 2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Now, size to write is size of data added second. 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(static_cast<int>(kData2.size()), buffer->GetSizeToWrite()); 2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Change in total size. 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(static_cast<int>(kData2.size()), buffer->total_size()); 2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // First data to write has changed to kData2. 2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kData2, 2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPiece(buffer->data(), buffer->GetSizeToWrite())); 2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Consume second data fully. 2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->DidConsume(kData2.size()); 2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(buffer->IsEmpty()); 2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, buffer->GetSizeToWrite()); 2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, buffer->total_size()); 2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(HttpConnectionTest, QueuedWriteIOBuffer_TotalSizeLimit) { 2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<HttpConnection::QueuedWriteIOBuffer> buffer( 2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new HttpConnection::QueuedWriteIOBuffer()); 2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(HttpConnection::QueuedWriteIOBuffer::kDefaultMaxBufferSize + 0, 2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->max_buffer_size()); 2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Set total size limit very small. 2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->set_max_buffer_size(10); 2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int kDataLength = 4; 3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string kData(kDataLength, 'd'); 3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(buffer->Append(kData)); 3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kDataLength, buffer->total_size()); 3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(buffer->Append(kData)); 3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kDataLength * 2, buffer->total_size()); 3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Cannot append more data because it exceeds the limit. 3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(buffer->Append(kData)); 3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kDataLength * 2, buffer->total_size()); 3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Consume data partially. 3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int kConsumedLength = 2; 3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->DidConsume(kConsumedLength); 3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kDataLength * 2 - kConsumedLength, buffer->total_size()); 3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Can add more data. 3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(buffer->Append(kData)); 3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kDataLength * 3 - kConsumedLength, buffer->total_size()); 3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Cannot append more data because it exceeds the limit. 3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(buffer->Append(kData)); 3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kDataLength * 3 - kConsumedLength, buffer->total_size()); 3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Enlarge limit. 3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->set_max_buffer_size(20); 3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Can add more data. 3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(buffer->Append(kData)); 3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kDataLength * 4 - kConsumedLength, buffer->total_size()); 3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace 3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace net 332