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)