172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file. 4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/task_manager/task_manager.h" 6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include <string> 8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/message_loop.h" 10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/process_util.h" 11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/utf_string_conversions.h" 12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/chromium_strings.h" 13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/generated_resources.h" 14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "testing/gtest/include/gtest/gtest.h" 15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "third_party/skia/include/core/SkBitmap.h" 1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h" 17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace { 19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_MACOSX) 21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// From task_manager.cc: 22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Activity Monitor shows %cpu with one decimal digit -- be 23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// consistent with that. 24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst char* kZeroCPUUsage = "0.0"; 25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#else 26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst char* kZeroCPUUsage = "0"; 27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif 28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass TestResource : public TaskManager::Resource { 30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public: 31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TestResource() : refresh_called_(false) {} 32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual string16 GetTitle() const OVERRIDE { 3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return ASCIIToUTF16("test title"); 3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen virtual SkBitmap GetIcon() const { return SkBitmap(); } 37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen virtual base::ProcessHandle GetProcess() const { 38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return base::GetCurrentProcessHandle(); 39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual Type GetType() const { return RENDERER; } 41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen virtual bool SupportNetworkUsage() const { return false; } 42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen virtual void SetSupportNetworkUsage() { NOTREACHED(); } 43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen virtual void Refresh() { refresh_called_ = true; } 44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bool refresh_called() const { return refresh_called_; } 45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void set_refresh_called(bool refresh_called) { 46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen refresh_called_ = refresh_called; 47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private: 50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bool refresh_called_; 51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} // namespace 54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass TaskManagerTest : public testing::Test { 56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(TaskManagerTest, Basic) { 59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManager task_manager; 60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerModel* model = task_manager.model_; 61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(0, model->ResourceCount()); 62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(TaskManagerTest, Resources) { 65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManager task_manager; 66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerModel* model = task_manager.model_; 67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TestResource resource1, resource2; 69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager.AddResource(&resource1); 71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ASSERT_EQ(1, model->ResourceCount()); 72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(model->IsResourceFirstInGroup(0)); 73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(ASCIIToUTF16("test title"), model->GetResourceTitle(0)); 74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT), 75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen model->GetResourceNetworkUsage(0)); 76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(ASCIIToUTF16(kZeroCPUUsage), model->GetResourceCPUUsage(0)); 77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager.AddResource(&resource2); // Will be in the same group. 79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ASSERT_EQ(2, model->ResourceCount()); 80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(model->IsResourceFirstInGroup(0)); 81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_FALSE(model->IsResourceFirstInGroup(1)); 82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(ASCIIToUTF16("test title"), model->GetResourceTitle(1)); 83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT).c_str(), 84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen model->GetResourceNetworkUsage(1)); 85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(ASCIIToUTF16(kZeroCPUUsage), model->GetResourceCPUUsage(1)); 86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager.RemoveResource(&resource1); 88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Now resource2 will be first in group. 89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ASSERT_EQ(1, model->ResourceCount()); 90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(model->IsResourceFirstInGroup(0)); 91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(ASCIIToUTF16("test title"), model->GetResourceTitle(0)); 92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT), 93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen model->GetResourceNetworkUsage(0)); 94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(ASCIIToUTF16(kZeroCPUUsage), model->GetResourceCPUUsage(0)); 95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager.RemoveResource(&resource2); 97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(0, model->ResourceCount()); 98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Tests that the model is calling Refresh() on its resources. 101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(TaskManagerTest, RefreshCalled) { 102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen MessageLoop loop; 103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManager task_manager; 104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerModel* model = task_manager.model_; 105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TestResource resource; 106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager.AddResource(&resource); 108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ASSERT_FALSE(resource.refresh_called()); 109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen model->update_state_ = TaskManagerModel::TASK_PENDING; 110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen model->Refresh(); 111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ASSERT_TRUE(resource.refresh_called()); 112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager.RemoveResource(&resource); 113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 114