|  | // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "content/browser/loader/resource_buffer.h" | 
|  | #include "testing/gtest/include/gtest/gtest.h" | 
|  |  | 
|  | namespace content { | 
|  |  | 
|  | TEST(ResourceBufferTest, BasicAllocations) { | 
|  | scoped_refptr<ResourceBuffer> buf = new ResourceBuffer(); | 
|  | EXPECT_TRUE(buf->Initialize(100, 5, 10)); | 
|  | EXPECT_TRUE(buf->CanAllocate()); | 
|  |  | 
|  | // First allocation | 
|  | { | 
|  | int size; | 
|  | char* ptr = buf->Allocate(&size); | 
|  | EXPECT_TRUE(ptr); | 
|  | EXPECT_EQ(10, size); | 
|  | EXPECT_TRUE(buf->CanAllocate()); | 
|  |  | 
|  | EXPECT_EQ(0, buf->GetLastAllocationOffset()); | 
|  |  | 
|  | buf->ShrinkLastAllocation(2);  // Less than our min allocation size. | 
|  | EXPECT_EQ(0, buf->GetLastAllocationOffset()); | 
|  | EXPECT_TRUE(buf->CanAllocate()); | 
|  | } | 
|  |  | 
|  | // Second allocation | 
|  | { | 
|  | int size; | 
|  | char* ptr = buf->Allocate(&size); | 
|  | EXPECT_TRUE(ptr); | 
|  | EXPECT_EQ(10, size); | 
|  | EXPECT_TRUE(buf->CanAllocate()); | 
|  |  | 
|  | EXPECT_EQ(5, buf->GetLastAllocationOffset()); | 
|  |  | 
|  | buf->ShrinkLastAllocation(4); | 
|  | EXPECT_EQ(5, buf->GetLastAllocationOffset()); | 
|  |  | 
|  | EXPECT_TRUE(buf->CanAllocate()); | 
|  | } | 
|  | } | 
|  |  | 
|  | TEST(ResourceBufferTest, AllocateAndRecycle) { | 
|  | scoped_refptr<ResourceBuffer> buf = new ResourceBuffer(); | 
|  | EXPECT_TRUE(buf->Initialize(100, 5, 10)); | 
|  |  | 
|  | int size; | 
|  |  | 
|  | buf->Allocate(&size); | 
|  | EXPECT_EQ(0, buf->GetLastAllocationOffset()); | 
|  |  | 
|  | buf->RecycleLeastRecentlyAllocated(); | 
|  |  | 
|  | // Offset should again be 0. | 
|  | buf->Allocate(&size); | 
|  | EXPECT_EQ(0, buf->GetLastAllocationOffset()); | 
|  | } | 
|  |  | 
|  | TEST(ResourceBufferTest, WrapAround) { | 
|  | scoped_refptr<ResourceBuffer> buf = new ResourceBuffer(); | 
|  | EXPECT_TRUE(buf->Initialize(20, 10, 10)); | 
|  |  | 
|  | int size; | 
|  |  | 
|  | buf->Allocate(&size); | 
|  | EXPECT_EQ(10, size); | 
|  |  | 
|  | buf->Allocate(&size); | 
|  | EXPECT_EQ(10, size); | 
|  |  | 
|  | // Create hole at the beginnning.  Next allocation should go there. | 
|  | buf->RecycleLeastRecentlyAllocated(); | 
|  |  | 
|  | buf->Allocate(&size); | 
|  | EXPECT_EQ(10, size); | 
|  |  | 
|  | EXPECT_EQ(0, buf->GetLastAllocationOffset()); | 
|  | } | 
|  |  | 
|  | TEST(ResourceBufferTest, WrapAround2) { | 
|  | scoped_refptr<ResourceBuffer> buf = new ResourceBuffer(); | 
|  | EXPECT_TRUE(buf->Initialize(30, 10, 10)); | 
|  |  | 
|  | int size; | 
|  |  | 
|  | buf->Allocate(&size); | 
|  | EXPECT_EQ(10, size); | 
|  |  | 
|  | buf->Allocate(&size); | 
|  | EXPECT_EQ(10, size); | 
|  |  | 
|  | buf->Allocate(&size); | 
|  | EXPECT_EQ(10, size); | 
|  |  | 
|  | EXPECT_FALSE(buf->CanAllocate()); | 
|  |  | 
|  | // Create holes at first and second slots. | 
|  | buf->RecycleLeastRecentlyAllocated(); | 
|  | buf->RecycleLeastRecentlyAllocated(); | 
|  |  | 
|  | EXPECT_TRUE(buf->CanAllocate()); | 
|  |  | 
|  | buf->Allocate(&size); | 
|  | EXPECT_EQ(10, size); | 
|  | EXPECT_EQ(0, buf->GetLastAllocationOffset()); | 
|  |  | 
|  | buf->Allocate(&size); | 
|  | EXPECT_EQ(10, size); | 
|  | EXPECT_EQ(10, buf->GetLastAllocationOffset()); | 
|  |  | 
|  | EXPECT_FALSE(buf->CanAllocate()); | 
|  | } | 
|  |  | 
|  | TEST(ResourceBufferTest, Full) { | 
|  | scoped_refptr<ResourceBuffer> buf = new ResourceBuffer(); | 
|  | EXPECT_TRUE(buf->Initialize(20, 10, 10)); | 
|  |  | 
|  | int size; | 
|  | buf->Allocate(&size); | 
|  | EXPECT_EQ(10, size); | 
|  |  | 
|  | buf->Allocate(&size); | 
|  | EXPECT_EQ(10, size); | 
|  |  | 
|  | // Full. | 
|  | EXPECT_FALSE(buf->CanAllocate()); | 
|  |  | 
|  | // Still full, even if there is a small hole at the end. | 
|  | buf->ShrinkLastAllocation(5); | 
|  | EXPECT_FALSE(buf->CanAllocate()); | 
|  | } | 
|  |  | 
|  | }  // namespace content |