11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/test/result_catcher.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/notification_service.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/test/test_utils.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/notification_types.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace extensions {
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciResultCatcher::ResultCatcher()
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : browser_context_restriction_(NULL), waiting_(false) {
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  registrar_.Add(this,
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 extensions::NOTIFICATION_EXTENSION_TEST_PASSED,
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 content::NotificationService::AllSources());
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  registrar_.Add(this,
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 extensions::NOTIFICATION_EXTENSION_TEST_FAILED,
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 content::NotificationService::AllSources());
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciResultCatcher::~ResultCatcher() {
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool ResultCatcher::GetNextResult() {
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Depending on the tests, multiple results can come in from a single call
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // to RunMessageLoop(), so we maintain a queue of results and just pull them
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // off as the test calls this, going to the run loop only when the queue is
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // empty.
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (results_.empty()) {
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    waiting_ = true;
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    content::RunMessageLoop();
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    waiting_ = false;
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!results_.empty()) {
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool ret = results_.front();
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    results_.pop_front();
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    message_ = messages_.front();
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    messages_.pop_front();
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return ret;
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NOTREACHED();
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return false;
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ResultCatcher::Observe(int type,
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            const content::NotificationSource& source,
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            const content::NotificationDetails& details) {
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (browser_context_restriction_ &&
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::Source<content::BrowserContext>(source).ptr() !=
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          browser_context_restriction_) {
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (type) {
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case extensions::NOTIFICATION_EXTENSION_TEST_PASSED:
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      VLOG(1) << "Got EXTENSION_TEST_PASSED notification.";
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      results_.push_back(true);
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      messages_.push_back(std::string());
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (waiting_)
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::MessageLoopForUI::current()->Quit();
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case extensions::NOTIFICATION_EXTENSION_TEST_FAILED:
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      VLOG(1) << "Got EXTENSION_TEST_FAILED notification.";
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      results_.push_back(false);
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      messages_.push_back(*(content::Details<std::string>(details).ptr()));
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (waiting_)
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::MessageLoopForUI::current()->Quit();
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      NOTREACHED();
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace extensions
81