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

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

Issue 185873003: Task Manager: overhaul & re-enable task manager browser tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Retry upload Created 6 years, 10 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 1895ff0865a1c4d7dea0d1c40c03481036935ab6..d7e8011d218af14920a3aac008c97f021664eb66 100644
--- a/chrome/browser/task_manager/task_manager_browsertest_util.cc
+++ b/chrome/browser/task_manager/task_manager_browsertest_util.cc
@@ -2,50 +2,33 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "chrome/browser/task_manager/task_manager_browsertest_util.h"
+
#include "base/message_loop/message_loop.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversions.h"
+#include "base/run_loop.h"
+#include "base/strings/string16.h"
+#include "base/strings/string_util.h"
+#include "base/test/test_timeouts.h"
+#include "base/timer/timer.h"
#include "chrome/browser/browser_process.h"
-#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/task_manager/resource_provider.h"
#include "chrome/browser/task_manager/task_manager.h"
-#include "chrome/browser/task_manager/task_manager_browsertest_util.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_dialogs.h"
-#include "chrome/browser/ui/browser_window.h"
-#include "chrome/test/base/ui_test_utils.h"
-#include "content/public/browser/notification_source.h"
-#include "content/public/browser/web_contents.h"
+#include "testing/gtest/include/gtest/gtest.h"
-namespace {
+namespace task_manager {
+namespace browsertest_util {
-int GetWebResourceCount(const TaskManagerModel* model) {
- int count = 0;
- for (int i = 0; i < model->ResourceCount(); i++) {
- task_manager::Resource::Type type = model->GetResourceType(i);
- // Skip system infrastructure resources.
- if (type == task_manager::Resource::BROWSER ||
- type == task_manager::Resource::NACL ||
- type == task_manager::Resource::GPU ||
- type == task_manager::Resource::UTILITY ||
- type == task_manager::Resource::ZYGOTE ||
- type == task_manager::Resource::SANDBOX_HELPER) {
- continue;
- }
-
- count++;
- }
- return count;
-}
+namespace {
class ResourceChangeObserver : public TaskManagerModelObserver {
public:
ResourceChangeObserver(const TaskManagerModel* model,
- int target_resource_count)
+ int required_count,
+ const base::string16& title_pattern)
: model_(model),
- target_resource_count_(target_resource_count) {
- }
+ required_count_(required_count),
+ title_pattern_(title_pattern) {}
virtual void OnModelChanged() OVERRIDE {
OnResourceChange();
@@ -63,33 +46,102 @@ class ResourceChangeObserver : public TaskManagerModelObserver {
OnResourceChange();
}
+ 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
+ // TaskManagerModelObserver, because resources may change before that.
+ if (IsSatisfied())
+ return;
+
+ timer_.Start(FROM_HERE,
+ TestTimeouts::action_timeout(),
+ this,
+ &ResourceChangeObserver::OnTimeout);
+
+ run_loop_.Run();
+
+ // If we succeeded normally (no timeout), check our post condition again
+ // before returning control to the test. If it is no longer satisfied, the
+ // test is likely flaky: we were waiting for a state that was only achieved
+ // emphemerally), so treat this as a failure.
+ if (!IsSatisfied() && timer_.IsRunning()) {
+ FAIL() << "Wait condition satisfied only emphemerally. Likely test "
+ << "problem. Maybe wait instead for the state below?\n"
+ << DumpTaskManagerModel();
+ }
+
+ timer_.Stop();
+ }
+
private:
void OnResourceChange() {
- if (GetWebResourceCount(model_) == target_resource_count_)
- base::MessageLoopForUI::current()->Quit();
+ if (!IsSatisfied())
+ return;
+
+ base::MessageLoop::current()->PostTask(FROM_HERE, run_loop_.QuitClosure());
+ }
+
+ bool IsSatisfied() { return CountMatches() == required_count_; }
+
+ int CountMatches() {
+ int match_count = 0;
+ for (int i = 0; i < model_->ResourceCount(); i++) {
+ task_manager::Resource::Type type = model_->GetResourceType(i);
+ // Skip system infrastructure resources.
+ if (type == task_manager::Resource::BROWSER ||
+ type == task_manager::Resource::NACL ||
+ type == task_manager::Resource::GPU ||
+ type == task_manager::Resource::UTILITY ||
+ type == task_manager::Resource::ZYGOTE ||
+ type == task_manager::Resource::SANDBOX_HELPER) {
+ continue;
+ }
+
+ if (MatchPattern(model_->GetResourceTitle(i), title_pattern_)) {
+ match_count++;
+ }
+ }
+ return match_count;
+ }
+
+ void OnTimeout() {
+ base::MessageLoop::current()->PostTask(FROM_HERE, run_loop_.QuitClosure());
+ FAIL() << "Timed out.\n" << DumpTaskManagerModel();
+ }
+
+ testing::Message DumpTaskManagerModel() {
+ testing::Message task_manager_state_dump;
+ task_manager_state_dump << "Waiting for exactly " << required_count_
+ << " matches of wildcard pattern \""
+ << UTF16ToASCII(title_pattern_) << "\"\n";
+ task_manager_state_dump << "Currently there are " << CountMatches()
+ << " matches.\n";
+ task_manager_state_dump << "Current Task Manager Model is:\n";
+ for (int i = 0; i < model_->ResourceCount(); i++) {
+ task_manager_state_dump
+ << " > " << UTF16ToASCII(model_->GetResourceTitle(i)) << "\n";
+ }
+ return task_manager_state_dump;
}
const TaskManagerModel* model_;
- const int target_resource_count_;
+ const int required_count_;
+ const base::string16 title_pattern_;
+ base::RunLoop run_loop_;
+ base::OneShotTimer<ResourceChangeObserver> timer_;
};
} // namespace
-// static
-void TaskManagerBrowserTestUtil::WaitForWebResourceChange(int target_count) {
+void WaitForTaskManagerRows(int required_count,
+ const base::string16& title_pattern) {
TaskManagerModel* model = TaskManager::GetInstance()->model();
- ResourceChangeObserver observer(model, target_count);
+ ResourceChangeObserver observer(model, required_count, title_pattern);
model->AddObserver(&observer);
-
- // Checks that the condition has not been satisfied yet.
- // This check has to be placed after the installation of the observer,
- // because resources may change before that.
- if (GetWebResourceCount(model) == target_count) {
- model->RemoveObserver(&observer);
- return;
- }
-
- content::RunMessageLoop();
+ observer.RunUntilSatisfied();
model->RemoveObserver(&observer);
}
+
+} // namespace browsertest_util
+} // namespace task_manager

Powered by Google App Engine
This is Rietveld 408576698