15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/task_manager/task_manager.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/task_manager/resource_provider.h" 1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16; 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// From task_manager.cc: 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Activity Monitor shows %cpu with one decimal digit -- be 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// consistent with that. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kZeroCPUUsage = "0.0"; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kZeroCPUUsage = "0"; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class TestResource : public task_manager::Resource { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestResource() : refresh_called_(false) {} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual base::string16 GetTitle() const OVERRIDE { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ASCIIToUTF16("test title"); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual base::string16 GetProfileName() const OVERRIDE { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ASCIIToUTF16("test profile"); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gfx::ImageSkia GetIcon() const OVERRIDE { return gfx::ImageSkia(); } 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual base::ProcessHandle GetProcess() const OVERRIDE { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::GetCurrentProcessHandle(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetUniqueChildProcessId() const OVERRIDE { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In reality the unique child process ID is not the actual process ID, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // but for testing purposes it shouldn't make difference. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<int>(base::GetCurrentProcId()); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual Type GetType() const OVERRIDE { return RENDERER; } 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool SupportNetworkUsage() const OVERRIDE { return false; } 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetSupportNetworkUsage() OVERRIDE { NOTREACHED(); } 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Refresh() OVERRIDE { refresh_called_ = true; } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool refresh_called() const { return refresh_called_; } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_refresh_called(bool refresh_called) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) refresh_called_ = refresh_called; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool refresh_called_; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TaskManagerTest : public testing::Test { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TaskManagerTest, Basic) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TaskManager task_manager; 69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TaskManagerModel* model = task_manager.model_.get(); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, model->ResourceCount()); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TaskManagerTest, Resources) { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TaskManager task_manager; 75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TaskManagerModel* model = task_manager.model_.get(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestResource resource1, resource2; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) task_manager.AddResource(&resource1); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, model->ResourceCount()); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(model->IsResourceFirstInGroup(0)); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("test title"), model->GetResourceTitle(0)); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("test profile"), model->GetResourceProfileName(0)); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT), 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model->GetResourceNetworkUsage(0)); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16(kZeroCPUUsage), model->GetResourceCPUUsage(0)); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) task_manager.AddResource(&resource2); // Will be in the same group. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, model->ResourceCount()); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(model->IsResourceFirstInGroup(0)); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(model->IsResourceFirstInGroup(1)); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("test title"), model->GetResourceTitle(1)); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("test profile"), model->GetResourceProfileName(1)); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT).c_str(), 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model->GetResourceNetworkUsage(1)); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16(kZeroCPUUsage), model->GetResourceCPUUsage(1)); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) task_manager.RemoveResource(&resource1); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now resource2 will be first in group. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, model->ResourceCount()); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(model->IsResourceFirstInGroup(0)); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("test title"), model->GetResourceTitle(0)); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("test profile"), model->GetResourceProfileName(0)); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT), 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model->GetResourceNetworkUsage(0)); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16(kZeroCPUUsage), model->GetResourceCPUUsage(0)); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) task_manager.RemoveResource(&resource2); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, model->ResourceCount()); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the model is calling Refresh() on its resources. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TaskManagerTest, RefreshCalled) { 11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop loop; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TaskManager task_manager; 116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TaskManagerModel* model = task_manager.model_.get(); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestResource resource; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) task_manager.AddResource(&resource); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(resource.refresh_called()); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model->update_state_ = TaskManagerModel::TASK_PENDING; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model->Refresh(); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resource.refresh_called()); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) task_manager.RemoveResource(&resource); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 126