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" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16; 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// From task_manager.cc: 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Activity Monitor shows %cpu with one decimal digit -- be 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// consistent with that. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kZeroCPUUsage = "0.0"; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kZeroCPUUsage = "0"; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class TestResource : public task_manager::Resource { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestResource() : refresh_called_(false) {} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual base::string16 GetTitle() const OVERRIDE { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ASCIIToUTF16("test title"); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual base::string16 GetProfileName() const OVERRIDE { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ASCIIToUTF16("test profile"); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gfx::ImageSkia GetIcon() const OVERRIDE { return gfx::ImageSkia(); } 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual base::ProcessHandle GetProcess() const OVERRIDE { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::GetCurrentProcessHandle(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetUniqueChildProcessId() const OVERRIDE { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In reality the unique child process ID is not the actual process ID, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // but for testing purposes it shouldn't make difference. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<int>(base::GetCurrentProcId()); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual Type GetType() const OVERRIDE { return RENDERER; } 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool SupportNetworkUsage() const OVERRIDE { return false; } 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetSupportNetworkUsage() OVERRIDE { NOTREACHED(); } 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Refresh() OVERRIDE { refresh_called_ = true; } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool refresh_called() const { return refresh_called_; } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_refresh_called(bool refresh_called) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) refresh_called_ = refresh_called; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool refresh_called_; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TaskManagerTest : public testing::Test { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TaskManagerTest, Basic) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TaskManager task_manager; 70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TaskManagerModel* model = task_manager.model_.get(); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, model->ResourceCount()); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TaskManagerTest, Resources) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TaskManager task_manager; 76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TaskManagerModel* model = task_manager.model_.get(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestResource resource1, resource2; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) task_manager.AddResource(&resource1); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, model->ResourceCount()); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(model->IsResourceFirstInGroup(0)); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("test title"), model->GetResourceTitle(0)); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("test profile"), model->GetResourceProfileName(0)); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT), 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model->GetResourceNetworkUsage(0)); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16(kZeroCPUUsage), model->GetResourceCPUUsage(0)); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) task_manager.AddResource(&resource2); // Will be in the same group. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, model->ResourceCount()); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(model->IsResourceFirstInGroup(0)); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(model->IsResourceFirstInGroup(1)); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("test title"), model->GetResourceTitle(1)); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("test profile"), model->GetResourceProfileName(1)); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT).c_str(), 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model->GetResourceNetworkUsage(1)); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16(kZeroCPUUsage), model->GetResourceCPUUsage(1)); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) task_manager.RemoveResource(&resource1); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now resource2 will be first in group. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, model->ResourceCount()); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(model->IsResourceFirstInGroup(0)); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("test title"), model->GetResourceTitle(0)); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("test profile"), model->GetResourceProfileName(0)); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT), 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model->GetResourceNetworkUsage(0)); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16(kZeroCPUUsage), model->GetResourceCPUUsage(0)); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) task_manager.RemoveResource(&resource2); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, model->ResourceCount()); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the model is calling Refresh() on its resources. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TaskManagerTest, RefreshCalled) { 11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop loop; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TaskManager task_manager; 117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TaskManagerModel* model = task_manager.model_.get(); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestResource resource; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) task_manager.AddResource(&resource); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(resource.refresh_called()); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model->update_state_ = TaskManagerModel::TASK_PENDING; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model->Refresh(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resource.refresh_called()); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) task_manager.RemoveResource(&resource); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 127