Home | History | Annotate | Download | only in test
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/chromeos/login/test/oobe_base_test.h"
      6 
      7 #include "base/command_line.h"
      8 #include "base/message_loop/message_loop.h"
      9 #include "base/path_service.h"
     10 #include "chrome/browser/chrome_notification_types.h"
     11 #include "chrome/browser/chromeos/login/existing_user_controller.h"
     12 #include "chrome/browser/chromeos/login/users/fake_user_manager.h"
     13 #include "chrome/browser/chromeos/net/network_portal_detector_test_impl.h"
     14 #include "chrome/browser/lifetime/application_lifetime.h"
     15 #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
     16 #include "chrome/common/chrome_paths.h"
     17 #include "chrome/common/chrome_switches.h"
     18 #include "chromeos/chromeos_switches.h"
     19 #include "chromeos/dbus/fake_shill_manager_client.h"
     20 #include "content/public/browser/notification_observer.h"
     21 #include "content/public/browser/notification_registrar.h"
     22 #include "content/public/browser/notification_service.h"
     23 #include "content/public/test/browser_test_utils.h"
     24 #include "google_apis/gaia/gaia_switches.h"
     25 #include "net/dns/mock_host_resolver.h"
     26 #include "net/test/embedded_test_server/http_request.h"
     27 #include "net/test/embedded_test_server/http_response.h"
     28 
     29 namespace chromeos {
     30 
     31 OobeBaseTest::OobeBaseTest()
     32     : fake_gaia_(new FakeGaia()),
     33       network_portal_detector_(NULL),
     34       needs_background_networking_(false) {
     35   set_exit_when_last_browser_closes(false);
     36   set_chromeos_user_ = false;
     37 }
     38 
     39 OobeBaseTest::~OobeBaseTest() {
     40 }
     41 
     42 void OobeBaseTest::SetUp() {
     43   base::FilePath test_data_dir;
     44   PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir);
     45   embedded_test_server()->ServeFilesFromDirectory(test_data_dir);
     46   embedded_test_server()->RegisterRequestHandler(
     47       base::Bind(&FakeGaia::HandleRequest, base::Unretained(fake_gaia_.get())));
     48   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
     49   // Stop IO thread here because no threads are allowed while
     50   // spawning sandbox host process. See crbug.com/322732.
     51   embedded_test_server()->StopThread();
     52 
     53   ExtensionApiTest::SetUp();
     54 }
     55 
     56 void OobeBaseTest::SetUpInProcessBrowserTestFixture() {
     57   host_resolver()->AddRule("*", "127.0.0.1");
     58   network_portal_detector_ = new NetworkPortalDetectorTestImpl();
     59   NetworkPortalDetector::InitializeForTesting(network_portal_detector_);
     60   network_portal_detector_->SetDefaultNetworkForTesting(
     61       FakeShillManagerClient::kFakeEthernetNetworkGuid);
     62 
     63   ExtensionApiTest::SetUpInProcessBrowserTestFixture();
     64 }
     65 
     66 void OobeBaseTest::SetUpOnMainThread() {
     67   // Restart the thread as the sandbox host process has already been spawned.
     68   embedded_test_server()->RestartThreadAndListen();
     69 
     70   ExtensionApiTest::SetUpOnMainThread();
     71 }
     72 
     73 void OobeBaseTest::TearDownOnMainThread() {
     74   // If the login display is still showing, exit gracefully.
     75   if (LoginDisplayHostImpl::default_host()) {
     76     base::MessageLoop::current()->PostTask(FROM_HERE,
     77                                            base::Bind(&chrome::AttemptExit));
     78     content::RunMessageLoop();
     79   }
     80 
     81   ExtensionApiTest::TearDownOnMainThread();
     82 }
     83 
     84 void OobeBaseTest::SetUpCommandLine(CommandLine* command_line) {
     85   ExtensionApiTest::SetUpCommandLine(command_line);
     86   command_line->AppendSwitch(chromeos::switches::kLoginManager);
     87   command_line->AppendSwitch(chromeos::switches::kForceLoginManagerInTests);
     88   if (!needs_background_networking_)
     89     command_line->AppendSwitch(::switches::kDisableBackgroundNetworking);
     90   command_line->AppendSwitchASCII(chromeos::switches::kLoginProfile, "user");
     91 
     92   // Create gaia and webstore URL from test server url but using different
     93   // host names. This is to avoid gaia response being tagged as from
     94   // webstore in chrome_resource_dispatcher_host_delegate.cc.
     95   const GURL& server_url = embedded_test_server()->base_url();
     96 
     97   std::string gaia_host("gaia");
     98   GURL::Replacements replace_gaia_host;
     99   replace_gaia_host.SetHostStr(gaia_host);
    100   GURL gaia_url = server_url.ReplaceComponents(replace_gaia_host);
    101   command_line->AppendSwitchASCII(::switches::kGaiaUrl, gaia_url.spec());
    102   command_line->AppendSwitchASCII(::switches::kLsoUrl, gaia_url.spec());
    103   command_line->AppendSwitchASCII(::switches::kGoogleApisUrl,
    104                                   gaia_url.spec());
    105   fake_gaia_->Initialize();
    106 }
    107 
    108 void OobeBaseTest::SimulateNetworkOffline() {
    109   NetworkPortalDetector::CaptivePortalState offline_state;
    110   offline_state.status = NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE;
    111   network_portal_detector_->SetDetectionResultsForTesting(
    112       FakeShillManagerClient::kFakeEthernetNetworkGuid,
    113       offline_state);
    114   network_portal_detector_->NotifyObserversForTesting();
    115 }
    116 
    117 base::Closure OobeBaseTest::SimulateNetworkOfflineClosure() {
    118   return base::Bind(&OobeBaseTest::SimulateNetworkOffline,
    119                     base::Unretained(this));
    120 }
    121 
    122 void OobeBaseTest::SimulateNetworkOnline() {
    123   NetworkPortalDetector::CaptivePortalState online_state;
    124   online_state.status = NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE;
    125   online_state.response_code = 204;
    126   network_portal_detector_->SetDetectionResultsForTesting(
    127       FakeShillManagerClient::kFakeEthernetNetworkGuid,
    128       online_state);
    129   network_portal_detector_->NotifyObserversForTesting();
    130 }
    131 
    132 base::Closure OobeBaseTest::SimulateNetworkOnlineClosure() {
    133   return base::Bind(&OobeBaseTest::SimulateNetworkOnline,
    134                     base::Unretained(this));
    135 }
    136 
    137 void OobeBaseTest::SimulateNetworkPortal() {
    138   NetworkPortalDetector::CaptivePortalState portal_state;
    139   portal_state.status = NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL;
    140   network_portal_detector_->SetDetectionResultsForTesting(
    141       FakeShillManagerClient::kFakeEthernetNetworkGuid,
    142       portal_state);
    143   network_portal_detector_->NotifyObserversForTesting();
    144 }
    145 
    146 base::Closure OobeBaseTest::SimulateNetworkPortalClosure() {
    147   return base::Bind(&OobeBaseTest::SimulateNetworkPortal,
    148                     base::Unretained(this));
    149 }
    150 
    151 void OobeBaseTest::JsExpect(const std::string& expression) {
    152   bool result;
    153   ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
    154       GetLoginUI()->GetWebContents(),
    155       "window.domAutomationController.send(!!(" + expression + "));",
    156        &result));
    157   ASSERT_TRUE(result) << expression;
    158 }
    159 
    160 content::WebUI* OobeBaseTest::GetLoginUI() {
    161   return static_cast<chromeos::LoginDisplayHostImpl*>(
    162       chromeos::LoginDisplayHostImpl::default_host())->GetOobeUI()->web_ui();
    163 }
    164 
    165 SigninScreenHandler* OobeBaseTest::GetSigninScreenHandler() {
    166   return static_cast<chromeos::LoginDisplayHostImpl*>(
    167       chromeos::LoginDisplayHostImpl::default_host())
    168       ->GetOobeUI()
    169       ->signin_screen_handler_for_test();
    170 }
    171 
    172 WebUILoginDisplay* OobeBaseTest::GetLoginDisplay() {
    173   ExistingUserController* controller =
    174       ExistingUserController::current_controller();
    175   CHECK(controller);
    176   return static_cast<WebUILoginDisplay*>(
    177       controller->login_display());
    178 }
    179 
    180 }  // namespace chromeos
    181