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