OLD | NEW |
| (Empty) |
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. | |
4 | |
5 #include <algorithm> | |
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" | |
9 | |
10 namespace { | |
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; | |
14 | |
15 } // namespace | |
16 | |
17 using android_webview::GlobalTileManager; | |
18 using android_webview::GlobalTileManagerClient; | |
19 using content::SynchronousCompositorMemoryPolicy; | |
20 using testing::Test; | |
21 | |
22 class MockGlobalTileManagerClient : public GlobalTileManagerClient { | |
23 public: | |
24 virtual SynchronousCompositorMemoryPolicy GetMemoryPolicy() const override { | |
25 return memory_policy_; | |
26 } | |
27 | |
28 virtual void SetMemoryPolicy(SynchronousCompositorMemoryPolicy new_policy, | |
29 bool effective_immediately) override { | |
30 memory_policy_ = new_policy; | |
31 } | |
32 | |
33 MockGlobalTileManagerClient() { | |
34 tile_request_.num_resources_limit = kDefaultNumTiles; | |
35 key_ = GlobalTileManager::GetInstance()->PushBack(this); | |
36 } | |
37 | |
38 virtual ~MockGlobalTileManagerClient() { | |
39 GlobalTileManager::GetInstance()->Remove(key_); | |
40 } | |
41 | |
42 SynchronousCompositorMemoryPolicy GetTileRequest() { return tile_request_; } | |
43 GlobalTileManager::Key GetKey() { return key_; } | |
44 | |
45 private: | |
46 SynchronousCompositorMemoryPolicy memory_policy_; | |
47 SynchronousCompositorMemoryPolicy tile_request_; | |
48 GlobalTileManager::Key key_; | |
49 }; | |
50 | |
51 class GlobalTileManagerTest : public Test { | |
52 public: | |
53 virtual void SetUp() {} | |
54 | |
55 GlobalTileManager* manager() { return GlobalTileManager::GetInstance(); } | |
56 }; | |
57 | |
58 TEST_F(GlobalTileManagerTest, RequestTilesUnderLimit) { | |
59 MockGlobalTileManagerClient clients[2]; | |
60 | |
61 for (size_t i = 0; i < 2; i++) { | |
62 manager()->RequestTiles(clients[i].GetTileRequest(), clients[i].GetKey()); | |
63 manager()->DidUse(clients[i].GetKey()); | |
64 | |
65 // Ensure clients get what they asked for when the manager is under tile | |
66 // limit. | |
67 EXPECT_EQ(clients[i].GetMemoryPolicy().num_resources_limit, | |
68 kDefaultNumTiles); | |
69 } | |
70 } | |
71 | |
72 TEST_F(GlobalTileManagerTest, EvictHappensWhenOverLimit) { | |
73 MockGlobalTileManagerClient clients[4]; | |
74 | |
75 for (size_t i = 0; i < 4; i++) { | |
76 manager()->RequestTiles(clients[i].GetTileRequest(), clients[i].GetKey()); | |
77 manager()->DidUse(clients[i].GetKey()); | |
78 } | |
79 | |
80 size_t total_tiles = 0; | |
81 for (size_t i = 0; i < 4; i++) { | |
82 total_tiles += clients[i].GetMemoryPolicy().num_resources_limit; | |
83 } | |
84 | |
85 // Ensure that eviction happened and kept the total number of tiles within | |
86 // kNumTilesLimit. | |
87 EXPECT_LE(total_tiles, kNumTilesLimit); | |
88 } | |
89 | |
90 TEST_F(GlobalTileManagerTest, RandomizedStressRequests) { | |
91 MockGlobalTileManagerClient clients[100]; | |
92 size_t index[100]; | |
93 for (size_t i = 0; i < 100; i++) { | |
94 index[i] = i; | |
95 } | |
96 | |
97 // Fix the seed so that tests are reproducible. | |
98 std::srand(1); | |
99 // Simulate a random request order of clients. | |
100 std::random_shuffle(&index[0], &index[99]); | |
101 | |
102 for (size_t i = 0; i < 100; i++) { | |
103 size_t j = index[i]; | |
104 manager()->RequestTiles(clients[j].GetTileRequest(), clients[j].GetKey()); | |
105 manager()->DidUse(clients[j].GetKey()); | |
106 } | |
107 | |
108 size_t total_tiles = 0; | |
109 for (size_t i = 0; i < 100; i++) { | |
110 total_tiles += clients[i].GetMemoryPolicy().num_resources_limit; | |
111 } | |
112 | |
113 // Ensure that eviction happened and kept the total number of tiles within | |
114 // kNumTilesLimit. | |
115 EXPECT_LE(total_tiles, kNumTilesLimit); | |
116 } | |
117 | |
118 TEST_F(GlobalTileManagerTest, FixedOrderedRequests) { | |
119 MockGlobalTileManagerClient clients[10]; | |
120 | |
121 // 10 clients requesting resources in a fixed order. Do that for 5 rounds. | |
122 for (int round = 0; round < 5; round++) { | |
123 for (size_t i = 0; i < 10; i++) { | |
124 manager()->RequestTiles(clients[i].GetTileRequest(), clients[i].GetKey()); | |
125 manager()->DidUse(clients[i].GetKey()); | |
126 } | |
127 } | |
128 | |
129 // Ensure that the total tiles are divided evenly among all clients. | |
130 for (size_t i = 0; i < 10; i++) { | |
131 EXPECT_EQ(clients[i].GetMemoryPolicy().num_resources_limit, | |
132 kNumTilesLimit / 10); | |
133 } | |
134 } | |
135 | |
136 TEST_F(GlobalTileManagerTest, FixedOrderedRequestsWithInactiveClients) { | |
137 MockGlobalTileManagerClient clients[20]; | |
138 | |
139 // 20 clients request resources. | |
140 for (size_t i = 0; i < 20; i++) { | |
141 manager()->RequestTiles(clients[i].GetTileRequest(), clients[i].GetKey()); | |
142 manager()->DidUse(clients[i].GetKey()); | |
143 } | |
144 | |
145 // Now the last 10 clients become inactive. Only the first 10 clients remain | |
146 // active resource requesters. | |
147 // 10 clients requesting resources in a fixed order. Do that for 5 rounds. | |
148 for (int round = 0; round < 5; round++) { | |
149 for (size_t i = 0; i < 10; i++) { | |
150 manager()->RequestTiles(clients[i].GetTileRequest(), clients[i].GetKey()); | |
151 manager()->DidUse(clients[i].GetKey()); | |
152 } | |
153 } | |
154 | |
155 // Ensure that the total tiles are divided evenly among all clients. | |
156 for (size_t i = 0; i < 10; i++) { | |
157 EXPECT_EQ(clients[i].GetMemoryPolicy().num_resources_limit, | |
158 kNumTilesLimit / 10); | |
159 } | |
160 | |
161 // Ensure that the inactive tiles are evicted. | |
162 for (size_t i = 11; i < 20; i++) { | |
163 EXPECT_EQ(clients[i].GetMemoryPolicy().num_resources_limit, 0u); | |
164 } | |
165 } | |
OLD | NEW |