Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2349)

Unified Diff: android_webview/browser/global_tile_manager_unittest.cc

Issue 226363004: Global GPU memory manager for android webview (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Use command line switch and move that from HR to BVR. Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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.
+}

Powered by Google App Engine
This is Rietveld 408576698