task_manager_unittest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/task_manager/task_manager.h"
6
7#include <string>
8
9#include "base/message_loop.h"
10#include "base/process_util.h"
11#include "base/utf_string_conversions.h"
12#include "grit/chromium_strings.h"
13#include "grit/generated_resources.h"
14#include "testing/gtest/include/gtest/gtest.h"
15#include "ui/base/l10n/l10n_util.h"
16#include "ui/gfx/image/image_skia.h"
17
18namespace {
19
20#if defined(OS_MACOSX)
21// From task_manager.cc:
22// Activity Monitor shows %cpu with one decimal digit -- be
23// consistent with that.
24const char* kZeroCPUUsage = "0.0";
25#else
26const char* kZeroCPUUsage = "0";
27#endif
28
29class TestResource : public TaskManager::Resource {
30 public:
31  TestResource() : refresh_called_(false) {}
32
33  virtual string16 GetTitle() const OVERRIDE {
34    return ASCIIToUTF16("test title");
35  }
36  virtual string16 GetProfileName() const OVERRIDE {
37    return ASCIIToUTF16("test profile");
38  }
39  virtual gfx::ImageSkia GetIcon() const { return gfx::ImageSkia(); }
40  virtual base::ProcessHandle GetProcess() const {
41    return base::GetCurrentProcessHandle();
42  }
43  virtual int GetUniqueChildProcessId() const OVERRIDE {
44    // In reality the unique child process ID is not the actual process ID,
45    // but for testing purposes it shouldn't make difference.
46    return static_cast<int>(base::GetCurrentProcId());
47  }
48  virtual Type GetType() const { return RENDERER; }
49  virtual bool SupportNetworkUsage() const { return false; }
50  virtual void SetSupportNetworkUsage() { NOTREACHED(); }
51  virtual void Refresh() { refresh_called_ = true; }
52  bool refresh_called() const { return refresh_called_; }
53  void set_refresh_called(bool refresh_called) {
54    refresh_called_ = refresh_called;
55  }
56
57 private:
58  bool refresh_called_;
59};
60
61}  // namespace
62
63class TaskManagerTest : public testing::Test {
64};
65
66TEST_F(TaskManagerTest, Basic) {
67  TaskManager task_manager;
68  TaskManagerModel* model = task_manager.model_;
69  EXPECT_EQ(0, model->ResourceCount());
70}
71
72TEST_F(TaskManagerTest, Resources) {
73  TaskManager task_manager;
74  TaskManagerModel* model = task_manager.model_;
75
76  TestResource resource1, resource2;
77
78  task_manager.AddResource(&resource1);
79  ASSERT_EQ(1, model->ResourceCount());
80  EXPECT_TRUE(model->IsResourceFirstInGroup(0));
81  EXPECT_EQ(ASCIIToUTF16("test title"), model->GetResourceTitle(0));
82  EXPECT_EQ(ASCIIToUTF16("test profile"), model->GetResourceProfileName(0));
83  EXPECT_EQ(l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT),
84            model->GetResourceNetworkUsage(0));
85  EXPECT_EQ(ASCIIToUTF16(kZeroCPUUsage), model->GetResourceCPUUsage(0));
86
87  task_manager.AddResource(&resource2);  // Will be in the same group.
88  ASSERT_EQ(2, model->ResourceCount());
89  EXPECT_TRUE(model->IsResourceFirstInGroup(0));
90  EXPECT_FALSE(model->IsResourceFirstInGroup(1));
91  EXPECT_EQ(ASCIIToUTF16("test title"), model->GetResourceTitle(1));
92  EXPECT_EQ(ASCIIToUTF16("test profile"), model->GetResourceProfileName(1));
93  EXPECT_EQ(l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT).c_str(),
94            model->GetResourceNetworkUsage(1));
95  EXPECT_EQ(ASCIIToUTF16(kZeroCPUUsage), model->GetResourceCPUUsage(1));
96
97  task_manager.RemoveResource(&resource1);
98  // Now resource2 will be first in group.
99  ASSERT_EQ(1, model->ResourceCount());
100  EXPECT_TRUE(model->IsResourceFirstInGroup(0));
101  EXPECT_EQ(ASCIIToUTF16("test title"), model->GetResourceTitle(0));
102  EXPECT_EQ(ASCIIToUTF16("test profile"), model->GetResourceProfileName(0));
103  EXPECT_EQ(l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT),
104            model->GetResourceNetworkUsage(0));
105  EXPECT_EQ(ASCIIToUTF16(kZeroCPUUsage), model->GetResourceCPUUsage(0));
106
107  task_manager.RemoveResource(&resource2);
108  EXPECT_EQ(0, model->ResourceCount());
109}
110
111// Tests that the model is calling Refresh() on its resources.
112TEST_F(TaskManagerTest, RefreshCalled) {
113  MessageLoop loop;
114  TaskManager task_manager;
115  TaskManagerModel* model = task_manager.model_;
116  TestResource resource;
117
118  task_manager.AddResource(&resource);
119  ASSERT_FALSE(resource.refresh_called());
120  model->update_state_ = TaskManagerModel::TASK_PENDING;
121  model->Refresh();
122  ASSERT_TRUE(resource.refresh_called());
123  task_manager.RemoveResource(&resource);
124}
125