1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_apitest.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_util.h"
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/stringprintf.h"
921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/extensions/extension_service.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/extensions/extension_test_api.h"
1121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/ui_test_utils.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace {
17731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst char kTestServerPort[] = "testServer.port";
19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};  // namespace
21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenExtensionApiTest::ExtensionApiTest() {}
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenExtensionApiTest::~ExtensionApiTest() {}
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
263345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickExtensionApiTest::ResultCatcher::ResultCatcher()
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    : profile_restriction_(NULL),
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      waiting_(false) {
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.Add(this, NotificationType::EXTENSION_TEST_PASSED,
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 NotificationService::AllSources());
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.Add(this, NotificationType::EXTENSION_TEST_FAILED,
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 NotificationService::AllSources());
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
353345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickExtensionApiTest::ResultCatcher::~ResultCatcher() {
363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ExtensionApiTest::ResultCatcher::GetNextResult() {
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Depending on the tests, multiple results can come in from a single call
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to RunMessageLoop(), so we maintain a queue of results and just pull them
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // off as the test calls this, going to the run loop only when the queue is
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // empty.
433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (results_.empty()) {
443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    waiting_ = true;
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ui_test_utils::RunMessageLoop();
463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    waiting_ = false;
473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!results_.empty()) {
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool ret = results_.front();
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    results_.pop_front();
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    message_ = messages_.front();
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    messages_.pop_front();
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return ret;
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NOTREACHED();
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return false;
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExtensionApiTest::ResultCatcher::Observe(
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NotificationType type, const NotificationSource& source,
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const NotificationDetails& details) {
643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (profile_restriction_ &&
653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      Source<Profile>(source).ptr() != profile_restriction_) {
663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (type.value) {
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case NotificationType::EXTENSION_TEST_PASSED:
71513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      VLOG(1) << "Got EXTENSION_TEST_PASSED notification.";
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      results_.push_back(true);
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      messages_.push_back("");
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      if (waiting_)
753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        MessageLoopForUI::current()->Quit();
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case NotificationType::EXTENSION_TEST_FAILED:
79513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      VLOG(1) << "Got EXTENSION_TEST_FAILED notification.";
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      results_.push_back(false);
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      messages_.push_back(*(Details<std::string>(details).ptr()));
823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      if (waiting_)
833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        MessageLoopForUI::current()->Quit();
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTREACHED();
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid ExtensionApiTest::SetUpInProcessBrowserTestFixture() {
92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(!test_config_.get()) << "Previous test did not clear config state.";
93731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  test_config_.reset(new DictionaryValue());
94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ExtensionTestGetConfigFunction::set_test_config_state(test_config_.get());
95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
97731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid ExtensionApiTest::TearDownInProcessBrowserTestFixture() {
98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ExtensionTestGetConfigFunction::set_test_config_state(NULL);
99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  test_config_.reset(NULL);
100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ExtensionApiTest::RunExtensionTest(const char* extension_name) {
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return RunExtensionTestImpl(extension_name, "", false, true, false);
1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool ExtensionApiTest::RunExtensionTestIncognito(const char* extension_name) {
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return RunExtensionTestImpl(extension_name, "", true, true, false);
108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool ExtensionApiTest::RunComponentExtensionTest(const char* extension_name) {
111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return RunExtensionTestImpl(extension_name, "", false, true, true);
1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool ExtensionApiTest::RunExtensionTestNoFileAccess(
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const char* extension_name) {
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return RunExtensionTestImpl(extension_name, "", false, false, false);
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool ExtensionApiTest::RunExtensionTestIncognitoNoFileAccess(
120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const char* extension_name) {
121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return RunExtensionTestImpl(extension_name, "", true, false, false);
122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool ExtensionApiTest::RunExtensionSubtest(const char* extension_name,
1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           const std::string& page_url) {
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DCHECK(!page_url.empty()) << "Argument page_url is required.";
126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return RunExtensionTestImpl(extension_name, page_url, false, true, false);
1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool ExtensionApiTest::RunPageTest(const std::string& page_url) {
1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return RunExtensionSubtest("", page_url);
1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Load |extension_name| extension and/or |page_url| and wait for
1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// PASSED or FAILED notification.
1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool ExtensionApiTest::RunExtensionTestImpl(const char* extension_name,
1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                            const std::string& page_url,
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                            bool enable_incognito,
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                            bool enable_fileaccess,
139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                            bool load_as_component) {
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ResultCatcher catcher;
1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DCHECK(!std::string(extension_name).empty() || !page_url.empty()) <<
1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "extension_name and page_url cannot both be empty";
1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!std::string(extension_name).empty()) {
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    bool loaded = false;
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (load_as_component) {
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      loaded =
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          LoadExtensionAsComponent(test_data_dir_.AppendASCII(extension_name));
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else {
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (enable_incognito) {
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        loaded = enable_fileaccess ?
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          LoadExtensionIncognito(test_data_dir_.AppendASCII(extension_name)) :
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          LoadExtensionIncognitoNoFileAccess(
154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              test_data_dir_.AppendASCII(extension_name));
155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      } else {
156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        loaded = enable_fileaccess ?
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          LoadExtension(test_data_dir_.AppendASCII(extension_name)) :
158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          LoadExtensionNoFileAccess(test_data_dir_.AppendASCII(extension_name));
159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!loaded) {
1623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      message_ = "Failed to load extension.";
1633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return false;
1643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // If there is a page_url to load, navigate it.
1683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!page_url.empty()) {
1693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    GURL url = GURL(page_url);
1703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Note: We use is_valid() here in the expectation that the provided url
1723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // may lack a scheme & host and thus be a relative url within the loaded
1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // extension.
1743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!url.is_valid()) {
1753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      DCHECK(!std::string(extension_name).empty()) <<
1763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          "Relative page_url given with no extension_name";
1773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
17821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      ExtensionService* service = browser()->profile()->GetExtensionService();
179513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      const Extension* extension =
1803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          service->GetExtensionById(last_loaded_extension_id_, false);
1813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      if (!extension)
1823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        return false;
1833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      url = extension->GetResourceURL(page_url);
1853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
1863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ui_test_utils::NavigateToURL(browser(), url);
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!catcher.GetNextResult()) {
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    message_ = catcher.message();
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test that exactly one extension loaded.
199513209b27ff55e2841eac0e4120199c23acce758Ben Murdochconst Extension* ExtensionApiTest::GetSingleLoadedExtension() {
20021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ExtensionService* service = browser()->profile()->GetExtensionService();
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int found_extension_index = -1;
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t i = 0; i < service->extensions()->size(); ++i) {
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Ignore any component extensions. They are automatically loaded into all
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // profiles and aren't the extension we're looking for here.
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (service->extensions()->at(i)->location() == Extension::COMPONENT)
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      continue;
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (found_extension_index != -1) {
2103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      message_ = base::StringPrintf(
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          "Expected only one extension to be present.  Found %u.",
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          static_cast<unsigned>(service->extensions()->size()));
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return NULL;
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    found_extension_index = static_cast<int>(i);
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
219513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const Extension* extension = service->extensions()->at(found_extension_index);
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!extension) {
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    message_ = "extension pointer is NULL.";
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return NULL;
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return extension;
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
227731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool ExtensionApiTest::StartTestServer() {
228731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!test_server()->Start())
229731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return false;
230731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
231731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Build a dictionary of values that tests can use to build URLs that
232731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // access the test server.  Tests can see these values using the extension
233731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // API function chrome.test.getConfig().
234731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  test_config_->SetInteger(kTestServerPort,
235731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                           test_server()->host_port_pair().port());
236731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
237731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return true;
238731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
239731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExtensionApiTest::SetUpCommandLine(CommandLine* command_line) {
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionBrowserTest::SetUpCommandLine(command_line);
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  test_data_dir_ = test_data_dir_.AppendASCII("api_test");
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
244