Chromium Code Reviews| 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.
|
| +} |