1 // Copyright 2014 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.
6 #include "android_webview/browser/global_tile_manager.h"
7 #include "android_webview/browser/global_tile_manager_client.h"
8 #include "testing/gtest/include/gtest/gtest.h"
11 // This should be the same as the one defined global_tile_manager.cc
12 const size_t kNumTilesLimit = 450;
13 const size_t kDefaultNumTiles = 150;
17 using android_webview::GlobalTileManager;
18 using android_webview::GlobalTileManagerClient;
21 class MockGlobalTileManagerClient : public GlobalTileManagerClient {
23 virtual size_t GetNumTiles() const OVERRIDE { return num_tiles_; }
24 virtual void SetNumTiles(size_t num_tiles,
25 bool effective_immediately) OVERRIDE {
26 num_tiles_ = num_tiles;
29 MockGlobalTileManagerClient() {
31 tile_request_ = kDefaultNumTiles;
32 key_ = GlobalTileManager::GetInstance()->PushBack(this);
35 virtual ~MockGlobalTileManagerClient() {
36 GlobalTileManager::GetInstance()->Remove(key_);
39 size_t GetTileRequest() { return tile_request_; }
40 GlobalTileManager::Key GetKey() { return key_; }
45 GlobalTileManager::Key key_;
48 class GlobalTileManagerTest : public Test {
50 virtual void SetUp() {}
52 GlobalTileManager* manager() { return GlobalTileManager::GetInstance(); }
55 TEST_F(GlobalTileManagerTest, RequestTilesUnderLimit) {
56 MockGlobalTileManagerClient clients[2];
58 for (size_t i = 0; i < 2; i++) {
59 manager()->RequestTiles(clients[i].GetTileRequest(), clients[i].GetKey());
60 manager()->DidUse(clients[i].GetKey());
62 // Ensure clients get what they asked for when the manager is under tile
64 EXPECT_EQ(clients[i].GetNumTiles(), kDefaultNumTiles);
68 TEST_F(GlobalTileManagerTest, EvictHappensWhenOverLimit) {
69 MockGlobalTileManagerClient clients[4];
71 for (size_t i = 0; i < 4; i++) {
72 manager()->RequestTiles(clients[i].GetTileRequest(), clients[i].GetKey());
73 manager()->DidUse(clients[i].GetKey());
76 size_t total_tiles = 0;
77 for (size_t i = 0; i < 4; i++) {
78 total_tiles += clients[i].GetNumTiles();
81 // Ensure that eviction happened and kept the total number of tiles within
83 EXPECT_LE(total_tiles, kNumTilesLimit);
86 TEST_F(GlobalTileManagerTest, RandomizedStressRequests) {
87 MockGlobalTileManagerClient clients[100];
89 for (size_t i = 0; i < 100; i++) {
93 // Fix the seed so that tests are reproducible.
95 // Simulate a random request order of clients.
96 std::random_shuffle(&index[0], &index[99]);
98 for (size_t i = 0; i < 100; i++) {
100 manager()->RequestTiles(clients[j].GetTileRequest(), clients[j].GetKey());
101 manager()->DidUse(clients[j].GetKey());
104 size_t total_tiles = 0;
105 for (size_t i = 0; i < 100; i++) {
106 total_tiles += clients[i].GetNumTiles();
109 // Ensure that eviction happened and kept the total number of tiles within
111 EXPECT_LE(total_tiles, kNumTilesLimit);
114 TEST_F(GlobalTileManagerTest, FixedOrderedRequests) {
115 MockGlobalTileManagerClient clients[10];
117 // 10 clients requesting resources in a fixed order. Do that for 5 rounds.
118 for (int round = 0; round < 5; round++) {
119 for (size_t i = 0; i < 10; i++) {
120 manager()->RequestTiles(clients[i].GetTileRequest(), clients[i].GetKey());
121 manager()->DidUse(clients[i].GetKey());
125 // Ensure that the total tiles are divided evenly among all clients.
126 for (size_t i = 0; i < 10; i++) {
127 EXPECT_EQ(clients[i].GetNumTiles(), kNumTilesLimit / 10);
131 TEST_F(GlobalTileManagerTest, FixedOrderedRequestsWithInactiveClients) {
132 MockGlobalTileManagerClient clients[20];
134 // 20 clients request resources.
135 for (size_t i = 0; i < 20; i++) {
136 manager()->RequestTiles(clients[i].GetTileRequest(), clients[i].GetKey());
137 manager()->DidUse(clients[i].GetKey());
140 // Now the last 10 clients become inactive. Only the first 10 clients remain
141 // active resource requesters.
142 // 10 clients requesting resources in a fixed order. Do that for 5 rounds.
143 for (int round = 0; round < 5; round++) {
144 for (size_t i = 0; i < 10; i++) {
145 manager()->RequestTiles(clients[i].GetTileRequest(), clients[i].GetKey());
146 manager()->DidUse(clients[i].GetKey());
150 // Ensure that the total tiles are divided evenly among all clients.
151 for (size_t i = 0; i < 10; i++) {
152 EXPECT_EQ(clients[i].GetNumTiles(), kNumTilesLimit / 10);
155 // Ensure that the inactive tiles are evicted.
156 for (size_t i = 11; i < 20; i++) {
157 EXPECT_EQ(clients[i].GetNumTiles(), 0u);