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