Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(588)

Unified Diff: chrome/browser/task_manager/task_manager_browsertest_util.cc

Issue 1922683003: Make old task manager tests work against new task manager. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Missing override Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/task_manager/task_manager_browsertest_util.cc
diff --git a/chrome/browser/task_manager/task_manager_browsertest_util.cc b/chrome/browser/task_manager/task_manager_browsertest_util.cc
index edeccd0f4a2dc840a22a4dd3433dfa79aa03c7b7..3f8a2030dc1dbf0eadc0208ff127476c06eb2faf 100644
--- a/chrome/browser/task_manager/task_manager_browsertest_util.cc
+++ b/chrome/browser/task_manager/task_manager_browsertest_util.cc
@@ -4,8 +4,10 @@
#include "chrome/browser/task_manager/task_manager_browsertest_util.h"
+#include "base/bind_helpers.h"
#include "base/command_line.h"
#include "base/location.h"
+#include "base/memory/ptr_util.h"
#include "base/run_loop.h"
#include "base/single_thread_task_runner.h"
#include "base/strings/pattern.h"
@@ -17,40 +19,221 @@
#include "base/timer/timer.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/sessions/session_tab_helper.h"
+#include "chrome/browser/task_management/task_manager_interface.h"
+#include "chrome/browser/task_management/task_manager_observer.h"
#include "chrome/browser/task_manager/resource_provider.h"
#include "chrome/browser/task_manager/task_manager.h"
+#include "chrome/browser/ui/task_manager/task_manager_table_model.h"
+#include "chrome/browser/ui/views/new_task_manager_view.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/grit/generated_resources.h"
#include "extensions/strings/grit/extensions_strings.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/l10n/l10n_util.h"
+// TODO(nick): Move everything here (except for LegacyTaskManagerTesterImpl)
+// into the task_management namespace.
+namespace task_management {
+
+class TaskManagerTesterImpl
+ : public task_manager::browsertest_util::TaskManagerTester,
+ public TaskManagerObserver {
+ public:
+ // TODO(nick): We have a couple ways we could implement this class:
+ // (1) Grab the view's model directly.
ncarter (slow) 2016/04/27 17:17:45 This is what the code does today. It gets the job
afakhry 2016/04/28 00:03:13 I think this is the best approach since we are act
+ // (2) Instantiate our own TaskManagerTableModel instance and ignore
ncarter (slow) 2016/04/27 17:17:45 I think this is probably the best approach for wha
afakhry 2016/04/28 00:03:13 Your interceptor approach is better.
+ // the "real" view. This would be pretty clean, but it makes the
+ // chrome::ShowTaskManager() steps of the tests kind of lame.
+ // (3) Some hybrid of the above (where we cross validate the contents)
+ // of the real table model
+ // (4) Make TaskManagerTableModel support multiple observers, and
ncarter (slow) 2016/04/27 17:17:45 This turns out to be pretty gross, since SetObserv
afakhry 2016/04/28 00:03:13 Yes, this doesn't sound like a clean solution.
+ // observe the real view's model.
+ explicit TaskManagerTesterImpl(const base::Closure& on_resource_change)
+ : TaskManagerObserver(NewTaskManagerView::GetInstanceForTests()
+ ->table_model_->desired_refresh_time(),
+ NewTaskManagerView::GetInstanceForTests()
+ ->table_model_->desired_resources_flags()),
+ on_resource_change_(on_resource_change),
+ model_(NewTaskManagerView::GetInstanceForTests()->table_model_.get()) {
+ model_->observed_task_manager()->AddObserver(this);
+ }
+
+ ~TaskManagerTesterImpl() override {
+ observed_task_manager()->RemoveObserver(this);
+ }
+
+ int GetRowCount() override { return model_->RowCount(); }
+
+ base::string16 GetRowTitle(int row) override {
+ return model_->GetText(row, IDS_TASK_MANAGER_TASK_COLUMN);
+ }
+
+ void ToggleColumnVisibility(
+ task_manager::browsertest_util::ColumnSpecifier column) override {
+ int column_id = 0;
+ switch (column) {
+ case task_manager::browsertest_util::COLUMN_NONE:
+ return;
+ case task_manager::browsertest_util::SQLITE_MEMORY_USED:
+ column_id = IDS_TASK_MANAGER_SQLITE_MEMORY_USED_COLUMN;
+ break;
+ case task_manager::browsertest_util::V8_MEMORY_USED:
+ case task_manager::browsertest_util::V8_MEMORY:
+ column_id = IDS_TASK_MANAGER_JAVASCRIPT_MEMORY_ALLOCATED_COLUMN;
+ break;
+ }
+ model_->ToggleColumnVisibility(column_id);
+ }
+
+ int64_t GetColumnValue(task_manager::browsertest_util::ColumnSpecifier column,
+ int row) override {
+ TaskId task_id = model_->tasks_[row];
+ int64_t value = 0;
+ int64_t ignored = 0;
+ bool success = false;
+
+ switch (column) {
+ case task_manager::browsertest_util::COLUMN_NONE:
+ break;
+ case task_manager::browsertest_util::V8_MEMORY:
+ success =
+ observed_task_manager()->GetV8Memory(task_id, &value, &ignored);
+ break;
+ case task_manager::browsertest_util::V8_MEMORY_USED:
+ success =
+ observed_task_manager()->GetV8Memory(task_id, &ignored, &value);
+ break;
+ case task_manager::browsertest_util::SQLITE_MEMORY_USED:
+ value = observed_task_manager()->GetSqliteMemoryUsed(task_id);
+ success = true;
+ break;
+ }
+ if (!success)
+ return 0;
+ return value;
+ }
+
+ int32_t GetTabId(int row) override {
+ TaskId task_id = model_->tasks_[row];
+ return observed_task_manager()->GetTabId(task_id);
+ }
+
+ void Kill(int row) override { model_->KillTask(row); }
+
+ // TaskManagerObserver
+ void OnTaskAdded(TaskId id) override { on_resource_change_.Run(); }
+
+ void OnTaskToBeRemoved(TaskId id) override { on_resource_change_.Run(); }
+
+ void OnTasksRefreshed(const TaskIdList& task_ids) override {
+ on_resource_change_.Run();
+ }
+
+ void OnTasksRefreshedWithBackgroundCalculations(
+ const TaskIdList& task_ids) override {
+ on_resource_change_.Run();
+ }
+
+ void OnTaskUnresponsive(TaskId id) override { on_resource_change_.Run(); }
+
+ private:
+ base::Closure on_resource_change_;
+ TaskManagerTableModel* model_;
+};
+
+} // namespace task_management
+
namespace task_manager {
namespace browsertest_util {
namespace {
-class ResourceChangeObserver : public TaskManagerModelObserver {
+class LegacyTaskManagerTesterImpl : public TaskManagerTester,
+ public TaskManagerModelObserver {
public:
- ResourceChangeObserver(const TaskManagerModel* model,
- int required_count,
- const base::string16& title_pattern,
- ColumnSpecifier column_specifier,
- size_t min_column_value)
- : model_(model),
- required_count_(required_count),
- title_pattern_(title_pattern),
- column_specifier_(column_specifier),
- min_column_value_(min_column_value) {}
+ explicit LegacyTaskManagerTesterImpl(const base::Closure& on_resource_change)
+ : on_resource_change_(on_resource_change),
+ model_(TaskManager::GetInstance()->model()) {
+ model_->AddObserver(this);
+ }
+ ~LegacyTaskManagerTesterImpl() override { model_->RemoveObserver(this); }
- void OnModelChanged() override { OnResourceChange(); }
+ // TaskManagerTester:
+ int GetRowCount() override { return model_->ResourceCount(); }
- void OnItemsChanged(int start, int length) override { OnResourceChange(); }
+ base::string16 GetRowTitle(int row) override {
+ return model_->GetResourceTitle(row);
+ }
- void OnItemsAdded(int start, int length) override { OnResourceChange(); }
+ int64_t GetColumnValue(ColumnSpecifier column, int row) override {
+ size_t value = 0;
+ bool success = false;
+ switch (column) {
+ case COLUMN_NONE:
+ break;
+ case V8_MEMORY:
+ success = model_->GetV8Memory(row, &value);
+ break;
+ case V8_MEMORY_USED:
+ success = model_->GetV8MemoryUsed(row, &value);
+ break;
+ case SQLITE_MEMORY_USED:
+ success = model_->GetSqliteMemoryUsedBytes(row, &value);
+ break;
+ }
+ if (!success)
+ return 0;
+ return static_cast<int64_t>(value);
+ }
+
+ void ToggleColumnVisibility(ColumnSpecifier column) override {
+ // Doing nothing is okay here; the legacy TaskManager always collects all
+ // stats.
+ }
+
+ int32_t GetTabId(int row) override {
+ if (model_->GetResourceWebContents(row)) {
+ return SessionTabHelper::IdForTab(model_->GetResourceWebContents(row));
+ }
+ return -1;
+ }
+ void Kill(int row) override { TaskManager::GetInstance()->KillProcess(row); }
+
+ // TaskManagerModelObserver:
+ void OnModelChanged() override { OnResourceChange(); }
+ void OnItemsChanged(int start, int length) override { OnResourceChange(); }
+ void OnItemsAdded(int start, int length) override { OnResourceChange(); }
void OnItemsRemoved(int start, int length) override { OnResourceChange(); }
+ private:
+ void OnResourceChange() { on_resource_change_.Run(); }
+ base::Closure on_resource_change_;
+ TaskManagerModel* model_;
+};
+
+class ResourceChangeObserver {
+ public:
+ ResourceChangeObserver(int required_count,
+ const base::string16& title_pattern,
+ ColumnSpecifier column_specifier,
+ size_t min_column_value)
+ : required_count_(required_count),
+ title_pattern_(title_pattern),
+ column_specifier_(column_specifier),
+ min_column_value_(min_column_value) {
+ base::Closure on_resource_change = base::Bind(
+ &ResourceChangeObserver::OnResourceChange, base::Unretained(this));
+
+ if (switches::NewTaskManagerEnabled()) {
+ model_.reset(
+ new task_management::TaskManagerTesterImpl(on_resource_change));
+ } else {
+ model_.reset(new LegacyTaskManagerTesterImpl(on_resource_change));
+ }
+ }
+
void RunUntilSatisfied() {
// See if the condition is satisfied without having to run the loop. This
// check has to be placed after the installation of the
@@ -91,8 +274,8 @@ class ResourceChangeObserver : public TaskManagerModelObserver {
int CountMatches() {
int match_count = 0;
- for (int i = 0; i < model_->ResourceCount(); i++) {
- if (!base::MatchPattern(model_->GetResourceTitle(i), title_pattern_))
+ for (int i = 0; i < model_->GetRowCount(); i++) {
+ if (!base::MatchPattern(model_->GetRowTitle(i), title_pattern_))
continue;
if (GetColumnValue(i) < min_column_value_)
@@ -103,25 +286,8 @@ class ResourceChangeObserver : public TaskManagerModelObserver {
return match_count;
}
- size_t GetColumnValue(int index) {
- size_t value = 0;
- bool success = false;
- switch (column_specifier_) {
- case COLUMN_NONE:
- break;
- case V8_MEMORY:
- success = model_->GetV8Memory(index, &value);
- break;
- case V8_MEMORY_USED:
- success = model_->GetV8MemoryUsed(index, &value);
- break;
- case SQLITE_MEMORY_USED:
- success = model_->GetSqliteMemoryUsedBytes(index, &value);
- break;
- }
- if (!success)
- return 0;
- return value;
+ int64_t GetColumnValue(int index) {
+ return model_->GetColumnValue(column_specifier_, index);
}
const char* GetColumnName() {
@@ -156,10 +322,9 @@ class ResourceChangeObserver : public TaskManagerModelObserver {
task_manager_state_dump << "\nCurrently there are " << CountMatches()
<< " matches.";
task_manager_state_dump << "\nCurrent Task Manager Model is:";
- for (int i = 0; i < model_->ResourceCount(); i++) {
- task_manager_state_dump
- << "\n > " << std::setw(40) << std::left
- << base::UTF16ToASCII(model_->GetResourceTitle(i));
+ for (int i = 0; i < model_->GetRowCount(); i++) {
+ task_manager_state_dump << "\n > " << std::setw(40) << std::left
+ << base::UTF16ToASCII(model_->GetRowTitle(i));
if (min_column_value_ > 0) {
task_manager_state_dump << " [" << GetColumnName()
<< " == " << GetColumnValue(i) << "]";
@@ -168,45 +333,42 @@ class ResourceChangeObserver : public TaskManagerModelObserver {
return task_manager_state_dump;
}
- const TaskManagerModel* model_;
+ std::unique_ptr<TaskManagerTester> model_;
const int required_count_;
const base::string16 title_pattern_;
const ColumnSpecifier column_specifier_;
- const size_t min_column_value_;
+ const int64_t min_column_value_;
base::RunLoop run_loop_;
base::OneShotTimer timer_;
};
} // namespace
-void EnableOldTaskManager() {
- base::CommandLine::ForCurrentProcess()->AppendSwitch(
- switches::kDisableNewTaskManager);
+std::unique_ptr<TaskManagerTester> GetTaskManagerTester() {
+ base::Closure do_nothing = base::Bind(&base::DoNothing);
+ if (switches::NewTaskManagerEnabled()) {
+ return base::WrapUnique(
+ new task_management::TaskManagerTesterImpl(do_nothing));
+ } else {
+ return base::WrapUnique(new LegacyTaskManagerTesterImpl(do_nothing));
+ }
}
void WaitForTaskManagerRows(int required_count,
const base::string16& title_pattern) {
- TaskManagerModel* model = TaskManager::GetInstance()->model();
-
const int column_value_dont_care = 0;
- ResourceChangeObserver observer(model, required_count, title_pattern,
- COLUMN_NONE, column_value_dont_care);
- model->AddObserver(&observer);
+ ResourceChangeObserver observer(required_count, title_pattern, COLUMN_NONE,
+ column_value_dont_care);
observer.RunUntilSatisfied();
- model->RemoveObserver(&observer);
}
void WaitForTaskManagerStatToExceed(const base::string16& title_pattern,
ColumnSpecifier column_getter,
size_t min_column_value) {
- TaskManagerModel* model = TaskManager::GetInstance()->model();
-
const int wait_for_one_match = 1;
- ResourceChangeObserver observer(model, wait_for_one_match, title_pattern,
+ ResourceChangeObserver observer(wait_for_one_match, title_pattern,
column_getter, min_column_value);
- model->AddObserver(&observer);
observer.RunUntilSatisfied();
- model->RemoveObserver(&observer);
}
base::string16 MatchTab(const char* title) {
« no previous file with comments | « chrome/browser/task_manager/task_manager_browsertest_util.h ('k') | chrome/browser/ui/task_manager/task_manager_table_model.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698