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