Index: chrome/browser/extensions/extension_apitest.cc |
diff --git a/chrome/browser/extensions/extension_apitest.cc b/chrome/browser/extensions/extension_apitest.cc |
index 3c455240f8e3ebfecee80a78f80c367bb99b876e..415d1c9e6b48d5b713f1385f3134f3612cdbe27d 100644 |
--- a/chrome/browser/extensions/extension_apitest.cc |
+++ b/chrome/browser/extensions/extension_apitest.cc |
@@ -14,34 +14,48 @@ static const int kTimeoutMs = 60 * 1000; // 1 minute |
// Load an extension and wait for it to notify of PASSED or FAILED. |
bool ExtensionApiTest::RunExtensionTest(const char* extension_name) { |
- bool result; |
- completed_ = false; |
{ |
NotificationRegistrar registrar; |
registrar.Add(this, NotificationType::EXTENSION_TEST_PASSED, |
NotificationService::AllSources()); |
registrar.Add(this, NotificationType::EXTENSION_TEST_FAILED, |
NotificationService::AllSources()); |
- result = LoadExtension(test_data_dir_.AppendASCII(extension_name)); |
- // If the test runs quickly, we may get the notification while waiting |
- // for the Load to finish. |
- if (completed_) { |
- result = passed_; |
- } else { |
- result = WaitForPassFail(); |
+ if (!LoadExtension(test_data_dir_.AppendASCII(extension_name))) { |
+ message_ = "Failed to load extension."; |
+ return false; |
} |
} |
- return result; |
+ |
+ // TODO(erikkay) perhaps we shouldn't do this implicitly. |
+ return WaitForPassFail(); |
} |
bool ExtensionApiTest::WaitForPassFail() { |
- completed_ = false; |
- passed_ = false; |
- MessageLoop::current()->PostDelayedTask( |
- FROM_HERE, new MessageLoop::QuitTask, kTimeoutMs); |
- ui_test_utils::RunMessageLoop(); |
- return passed_; |
+ NotificationRegistrar registrar; |
+ registrar.Add(this, NotificationType::EXTENSION_TEST_PASSED, |
+ NotificationService::AllSources()); |
+ registrar.Add(this, NotificationType::EXTENSION_TEST_FAILED, |
+ NotificationService::AllSources()); |
+ |
+ // Depending on the tests, multiple results can come in from a single call |
+ // to RunMessageLoop(), so we maintain a queue of results and just pull them |
+ // off as the test calls this, going to the run loop only when the queue is |
+ // empty. |
+ if (!results_.size()) { |
+ MessageLoop::current()->PostDelayedTask( |
+ FROM_HERE, new MessageLoop::QuitTask, kTimeoutMs); |
+ ui_test_utils::RunMessageLoop(); |
+ } |
+ if (results_.size()) { |
+ bool ret = results_.front(); |
+ results_.pop_front(); |
+ message_ = messages_.front(); |
+ messages_.pop_front(); |
+ return ret; |
+ } |
+ message_ = "No response from message loop."; |
+ return false; |
} |
void ExtensionApiTest::SetUpCommandLine(CommandLine* command_line) { |
@@ -55,16 +69,15 @@ void ExtensionApiTest::Observe(NotificationType type, |
switch (type.value) { |
case NotificationType::EXTENSION_TEST_PASSED: |
std::cout << "Got EXTENSION_TEST_PASSED notification.\n"; |
- completed_ = true; |
- passed_ = true; |
+ results_.push_back(true); |
+ messages_.push_back(""); |
MessageLoopForUI::current()->Quit(); |
break; |
case NotificationType::EXTENSION_TEST_FAILED: |
std::cout << "Got EXTENSION_TEST_FAILED notification.\n"; |
- completed_ = true; |
- passed_ = false; |
- message_ = *(Details<std::string>(details).ptr()); |
+ results_.push_back(false); |
+ messages_.push_back(*(Details<std::string>(details).ptr())); |
MessageLoopForUI::current()->Quit(); |
break; |