1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/browser/loader/resource_buffer.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace content {
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(ResourceBufferTest, BasicAllocations) {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ResourceBuffer> buf = new ResourceBuffer();
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(buf->Initialize(100, 5, 10));
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(buf->CanAllocate());
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // First allocation
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int size;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char* ptr = buf->Allocate(&size);
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ptr);
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(10, size);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(buf->CanAllocate());
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(0, buf->GetLastAllocationOffset());
240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf->ShrinkLastAllocation(2);  // Less than our min allocation size.
260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(0, buf->GetLastAllocationOffset());
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_TRUE(buf->CanAllocate());
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Second allocation
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int size;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char* ptr = buf->Allocate(&size);
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_TRUE(ptr);
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(10, size);
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_TRUE(buf->CanAllocate());
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(5, buf->GetLastAllocationOffset());
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf->ShrinkLastAllocation(4);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(5, buf->GetLastAllocationOffset());
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(buf->CanAllocate());
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ResourceBufferTest, AllocateAndRecycle) {
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<ResourceBuffer> buf = new ResourceBuffer();
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(buf->Initialize(100, 5, 10));
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int size;
520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  buf->Allocate(&size);
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, buf->GetLastAllocationOffset());
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  buf->RecycleLeastRecentlyAllocated();
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Offset should again be 0.
590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  buf->Allocate(&size);
600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(0, buf->GetLastAllocationOffset());
610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
630529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST(ResourceBufferTest, WrapAround) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ResourceBuffer> buf = new ResourceBuffer();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(buf->Initialize(20, 10, 10));
660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int size;
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  buf->Allocate(&size);
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(10, size);
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  buf->Allocate(&size);
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(10, size);
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Create hole at the beginnning.  Next allocation should go there.
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  buf->RecycleLeastRecentlyAllocated();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  buf->Allocate(&size);
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(10, size);
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, buf->GetLastAllocationOffset());
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST(ResourceBufferTest, WrapAround2) {
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<ResourceBuffer> buf = new ResourceBuffer();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(buf->Initialize(30, 10, 10));
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int size;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  buf->Allocate(&size);
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(10, size);
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  buf->Allocate(&size);
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(10, size);
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buf->Allocate(&size);
970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(10, size);
980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(buf->CanAllocate());
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create holes at first and second slots.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buf->RecycleLeastRecentlyAllocated();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buf->RecycleLeastRecentlyAllocated();
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(buf->CanAllocate());
1060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  buf->Allocate(&size);
1080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(10, size);
1090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(0, buf->GetLastAllocationOffset());
1100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  buf->Allocate(&size);
1120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(10, size);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10, buf->GetLastAllocationOffset());
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(buf->CanAllocate());
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST(ResourceBufferTest, Full) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ResourceBuffer> buf = new ResourceBuffer();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(buf->Initialize(20, 10, 10));
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int size;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  buf->Allocate(&size);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(10, size);
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  buf->Allocate(&size);
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(10, size);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Full.
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(buf->CanAllocate());
1310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Still full, even if there is a small hole at the end.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buf->ShrinkLastAllocation(5);
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(buf->CanAllocate());
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)