Index: android_webview/browser/global_tile_manager_unittest.cc |
diff --git a/android_webview/browser/global_tile_manager_unittest.cc b/android_webview/browser/global_tile_manager_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..08f8fadb63383fc39c285b8148870f4fe5ab6497 |
--- /dev/null |
+++ b/android_webview/browser/global_tile_manager_unittest.cc |
@@ -0,0 +1,130 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include <algorithm> |
+#include "android_webview/browser/global_tile_manager.h" |
+#include "android_webview/browser/global_tile_manager_client.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace { |
+// This should be the same as the one defined global_tile_manager.cc |
+const size_t kNumTilesLimit = 450; |
+const size_t kDefaultNumTiles = 150; |
+ |
+} // namespace |
+ |
+using android_webview::GlobalTileManager; |
+using android_webview::GlobalTileManagerClient; |
+using testing::Test; |
+ |
+class MockGlobalTileManagerClient : public GlobalTileManagerClient { |
+ public: |
+ virtual size_t GetNumTiles() const OVERRIDE { return num_tiles_; } |
+ virtual void SetNumTiles(size_t num_tiles, |
+ bool effective_immediately) OVERRIDE { |
+ num_tiles_ = num_tiles; |
+ } |
+ |
+ MockGlobalTileManagerClient() { |
+ num_tiles_ = 0; |
+ tile_request_ = kDefaultNumTiles; |
+ } |
+ |
+ virtual ~MockGlobalTileManagerClient() {} |
+ |
+ size_t num_tiles_; |
boliu
2014/05/02 20:28:34
No underscore if aren't actually private.
hush (inactive)
2014/05/02 22:07:40
Made these 2 private
|
+ size_t tile_request_; |
+}; |
+ |
+class GlobalTileManagerTest : public Test { |
+ public: |
+ virtual void SetUp() {} |
+ |
+ GlobalTileManager* manager() { return GlobalTileManager::GetInstance(); } |
+}; |
+ |
+TEST_F(GlobalTileManagerTest, RequestTilesUnderLimit) { |
+ MockGlobalTileManagerClient clients[2]; |
+ GlobalTileManager::Key key[2]; |
+ for (size_t i = 0; i < 2; i++) { |
+ key[i] = manager()->PushBack(&clients[i]); |
boliu
2014/05/02 20:28:34
PushBack and Remove should be handled by client co
hush (inactive)
2014/05/02 22:07:40
Done.
|
+ } |
+ |
+ for (size_t i = 0; i < 2; i++) { |
+ manager()->RequestTiles(clients[i].tile_request_, true, key[i]); |
+ |
+ manager()->DidUse(key[i]); |
+ |
+ // Ensure clients get what they asked for when the manager is under tile |
+ // limit. |
+ EXPECT_EQ(clients[i].GetNumTiles(), kDefaultNumTiles); |
+ } |
+ |
+ // Clean up. |
+ for (size_t i = 0; i < 2; i++) { |
+ manager()->Remove(key[i]); |
+ } |
+} |
+ |
+TEST_F(GlobalTileManagerTest, EvictHappensWhenOverLimit) { |
+ MockGlobalTileManagerClient clients[4]; |
+ GlobalTileManager::Key key[4]; |
+ for (size_t i = 0; i < 4; i++) { |
+ key[i] = manager()->PushBack(&clients[i]); |
+ } |
+ |
+ for (size_t i = 0; i < 4; i++) { |
+ manager()->RequestTiles(clients[i].tile_request_, true, key[i]); |
+ |
+ manager()->DidUse(key[i]); |
+ } |
+ |
+ size_t total_tiles = 0; |
+ for (size_t i = 0; i < 4; i++) { |
+ total_tiles += clients[i].GetNumTiles(); |
+ } |
+ |
+ // Ensure that eviction happened and kept the total number of tiles within |
+ // kNumTilesLimit. |
+ EXPECT_LE(total_tiles, kNumTilesLimit); |
+ |
+ // Clean up. |
+ for (size_t i = 0; i < 4; i++) { |
+ manager()->Remove(key[i]); |
+ } |
+} |
+ |
+TEST_F(GlobalTileManagerTest, RandomizedStressRequests) { |
+ MockGlobalTileManagerClient clients[100]; |
+ GlobalTileManager::Key key[100]; |
+ size_t index[100]; |
+ for (size_t i = 0; i < 100; i++) { |
+ key[i] = manager()->PushBack(&clients[i]); |
+ index[i] = i; |
+ } |
+ |
+ // Simulate a random request order of clients. |
+ std::random_shuffle(&index[0], &index[99]); |
+ |
+ for (size_t i = 0; i < 100; i++) { |
+ size_t j = index[i]; |
+ manager()->RequestTiles(clients[j].tile_request_, true, key[j]); |
+ |
+ manager()->DidUse(key[j]); |
+ } |
+ |
+ size_t total_tiles = 0; |
+ for (size_t i = 0; i < 100; i++) { |
+ total_tiles += clients[i].GetNumTiles(); |
+ } |
+ |
+ // Ensure that eviction happened and kept the total number of tiles within |
+ // kNumTilesLimit. |
+ EXPECT_LE(total_tiles, kNumTilesLimit); |
+ |
+ // Clean up. |
+ for (size_t i = 0; i < 100; i++) { |
+ manager()->Remove(key[i]); |
+ } |
boliu
2014/05/02 20:28:34
Requesting a few more tests.
N active clients dra
hush (inactive)
2014/05/02 22:12:25
Done.
|
+} |