1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/browser/loader/resource_buffer.h"
6#include "testing/gtest/include/gtest/gtest.h"
7
8namespace content {
9
10TEST(ResourceBufferTest, BasicAllocations) {
11  scoped_refptr<ResourceBuffer> buf = new ResourceBuffer();
12  EXPECT_TRUE(buf->Initialize(100, 5, 10));
13  EXPECT_TRUE(buf->CanAllocate());
14
15  // First allocation
16  {
17    int size;
18    char* ptr = buf->Allocate(&size);
19    EXPECT_TRUE(ptr);
20    EXPECT_EQ(10, size);
21    EXPECT_TRUE(buf->CanAllocate());
22
23    EXPECT_EQ(0, buf->GetLastAllocationOffset());
24
25    buf->ShrinkLastAllocation(2);  // Less than our min allocation size.
26    EXPECT_EQ(0, buf->GetLastAllocationOffset());
27    EXPECT_TRUE(buf->CanAllocate());
28  }
29
30  // Second allocation
31  {
32    int size;
33    char* ptr = buf->Allocate(&size);
34    EXPECT_TRUE(ptr);
35    EXPECT_EQ(10, size);
36    EXPECT_TRUE(buf->CanAllocate());
37
38    EXPECT_EQ(5, buf->GetLastAllocationOffset());
39
40    buf->ShrinkLastAllocation(4);
41    EXPECT_EQ(5, buf->GetLastAllocationOffset());
42
43    EXPECT_TRUE(buf->CanAllocate());
44  }
45}
46
47TEST(ResourceBufferTest, AllocateAndRecycle) {
48  scoped_refptr<ResourceBuffer> buf = new ResourceBuffer();
49  EXPECT_TRUE(buf->Initialize(100, 5, 10));
50
51  int size;
52
53  buf->Allocate(&size);
54  EXPECT_EQ(0, buf->GetLastAllocationOffset());
55
56  buf->RecycleLeastRecentlyAllocated();
57
58  // Offset should again be 0.
59  buf->Allocate(&size);
60  EXPECT_EQ(0, buf->GetLastAllocationOffset());
61}
62
63TEST(ResourceBufferTest, WrapAround) {
64  scoped_refptr<ResourceBuffer> buf = new ResourceBuffer();
65  EXPECT_TRUE(buf->Initialize(20, 10, 10));
66
67  int size;
68
69  buf->Allocate(&size);
70  EXPECT_EQ(10, size);
71
72  buf->Allocate(&size);
73  EXPECT_EQ(10, size);
74
75  // Create hole at the beginnning.  Next allocation should go there.
76  buf->RecycleLeastRecentlyAllocated();
77
78  buf->Allocate(&size);
79  EXPECT_EQ(10, size);
80
81  EXPECT_EQ(0, buf->GetLastAllocationOffset());
82}
83
84TEST(ResourceBufferTest, WrapAround2) {
85  scoped_refptr<ResourceBuffer> buf = new ResourceBuffer();
86  EXPECT_TRUE(buf->Initialize(30, 10, 10));
87
88  int size;
89
90  buf->Allocate(&size);
91  EXPECT_EQ(10, size);
92
93  buf->Allocate(&size);
94  EXPECT_EQ(10, size);
95
96  buf->Allocate(&size);
97  EXPECT_EQ(10, size);
98
99  EXPECT_FALSE(buf->CanAllocate());
100
101  // Create holes at first and second slots.
102  buf->RecycleLeastRecentlyAllocated();
103  buf->RecycleLeastRecentlyAllocated();
104
105  EXPECT_TRUE(buf->CanAllocate());
106
107  buf->Allocate(&size);
108  EXPECT_EQ(10, size);
109  EXPECT_EQ(0, buf->GetLastAllocationOffset());
110
111  buf->Allocate(&size);
112  EXPECT_EQ(10, size);
113  EXPECT_EQ(10, buf->GetLastAllocationOffset());
114
115  EXPECT_FALSE(buf->CanAllocate());
116}
117
118TEST(ResourceBufferTest, Full) {
119  scoped_refptr<ResourceBuffer> buf = new ResourceBuffer();
120  EXPECT_TRUE(buf->Initialize(20, 10, 10));
121
122  int size;
123  buf->Allocate(&size);
124  EXPECT_EQ(10, size);
125
126  buf->Allocate(&size);
127  EXPECT_EQ(10, size);
128
129  // Full.
130  EXPECT_FALSE(buf->CanAllocate());
131
132  // Still full, even if there is a small hole at the end.
133  buf->ShrinkLastAllocation(5);
134  EXPECT_FALSE(buf->CanAllocate());
135}
136
137}  // namespace content
138