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

Unified Diff: chrome/browser/chromeos/login/wizard_controller_browsertest.cc

Issue 294903005: Add browser test for timezone resolve. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update after review. Created 6 years, 7 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/chromeos/login/wizard_controller_browsertest.cc
diff --git a/chrome/browser/chromeos/login/wizard_controller_browsertest.cc b/chrome/browser/chromeos/login/wizard_controller_browsertest.cc
index d22ffca3a530c6397815ec523331a7bbf59f2bca..af35194e4f6baf1203d7a0f0a4f23d1ba3aa557c 100644
--- a/chrome/browser/chromeos/login/wizard_controller_browsertest.cc
+++ b/chrome/browser/chromeos/login/wizard_controller_browsertest.cc
@@ -11,12 +11,14 @@
#include "base/prefs/pref_service_factory.h"
#include "base/prefs/testing_pref_store.h"
#include "base/run_loop.h"
+#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_shutdown.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
#include "chrome/browser/chromeos/base/locale_util.h"
+#include "chrome/browser/chromeos/geolocation/simple_geolocation_provider.h"
#include "chrome/browser/chromeos/login/auth/mock_authenticator.h"
#include "chrome/browser/chromeos/login/auth/mock_login_status_consumer.h"
#include "chrome/browser/chromeos/login/auth/user_context.h"
@@ -38,8 +40,10 @@
#include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
#include "chrome/browser/chromeos/login/ui/webui_login_view.h"
#include "chrome/browser/chromeos/login/wizard_controller.h"
+#include "chrome/browser/chromeos/net/network_portal_detector_test_impl.h"
#include "chrome/browser/chromeos/policy/server_backed_device_state.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/browser/chromeos/timezone/timezone_request.h"
#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
#include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
#include "chrome/common/chrome_paths.h"
@@ -52,11 +56,15 @@
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/fake_dbus_thread_manager.h"
#include "chromeos/dbus/fake_session_manager_client.h"
+#include "chromeos/network/network_state.h"
#include "chromeos/network/network_state_handler.h"
+#include "chromeos/settings/timezone_settings.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_utils.h"
#include "grit/generated_resources.h"
#include "net/test/spawned_test_server/spawned_test_server.h"
+#include "net/url_request/test_url_fetcher_factory.h"
+#include "net/url_request/url_fetcher_impl.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/icu/source/common/unicode/locid.h"
@@ -70,9 +78,30 @@ using ::testing::Return;
namespace chromeos {
namespace {
+
const char kUsername[] = "test_user@managedchrome.com";
const char kPassword[] = "test_password";
+const char kGeolocationResponseBody[] =
+ "{\n"
+ " \"location\": {\n"
+ " \"lat\": 51.0,\n"
+ " \"lng\": -0.1\n"
+ " },\n"
+ " \"accuracy\": 1200.4\n"
+ "}";
+
+// Timezone should not match kGeolocationResponseBody to check that exactly
+// this value will be used.
+const char kTimezoneResponseBody[] =
+ "{\n"
+ " \"dstOffset\" : 0.0,\n"
+ " \"rawOffset\" : -32400.0,\n"
+ " \"status\" : \"OK\",\n"
+ " \"timeZoneId\" : \"America/Anchorage\",\n"
+ " \"timeZoneName\" : \"Pacific Standard Time\"\n"
+ "}";
+
class PrefStoreStub : public TestingPrefStore {
public:
// TestingPrefStore overrides:
@@ -303,6 +332,47 @@ IN_PROC_BROWSER_TEST_F(WizardControllerTest, VolumeIsAdjustedForChromeVox) {
cras->GetOutputVolumePercent());
}
+class WizardControllerTestURLFetcherFactory
+ : public net::TestURLFetcherFactory {
+ public:
+ virtual net::URLFetcher* CreateURLFetcher(
+ int id,
+ const GURL& url,
+ net::URLFetcher::RequestType request_type,
+ net::URLFetcherDelegate* d) OVERRIDE {
+ if (StartsWithASCII(
+ url.spec(),
+ SimpleGeolocationProvider::DefaultGeolocationProviderURL().spec(),
+ true)) {
+ return new net::FakeURLFetcher(url,
+ d,
+ std::string(kGeolocationResponseBody),
+ net::HTTP_OK,
+ net::URLRequestStatus::SUCCESS);
+ }
+ if (StartsWithASCII(
+ url.spec(), chromeos::DefaultTimezoneProviderURL().spec(), true)) {
+ return new net::FakeURLFetcher(url,
+ d,
+ std::string(kTimezoneResponseBody),
+ net::HTTP_OK,
+ net::URLRequestStatus::SUCCESS);
+ }
+ return net::TestURLFetcherFactory::CreateURLFetcher(
+ id, url, request_type, d);
+ }
+ virtual ~WizardControllerTestURLFetcherFactory() {}
+};
+
+class TimeZoneTestRunner {
+ public:
+ void OnResolved() { loop_.Quit(); }
+ void Run() { loop_.Run(); }
+
+ private:
+ base::RunLoop loop_;
+};
+
class WizardControllerFlowTest : public WizardControllerTest {
protected:
WizardControllerFlowTest() {}
@@ -310,6 +380,12 @@ class WizardControllerFlowTest : public WizardControllerTest {
virtual void SetUpOnMainThread() OVERRIDE {
WizardControllerTest::SetUpOnMainThread();
+ fallback_fetcher_factory_.reset(new WizardControllerTestURLFetcherFactory);
+ net::URLFetcherImpl::set_factory(NULL);
+ fetcher_factory_.reset(new net::FakeURLFetcherFactory(
+ fallback_fetcher_factory_.get(),
+ net::FakeURLFetcherFactory::CreateDefaultFakeURLFetcherCreator()));
mmenke 2014/05/21 19:40:16 This is the same as FakeURLFetcherFactory(fallback
Alexander Alekseev 2014/05/21 20:26:04 This was the first thing I've tried, but it crashe
mmenke 2014/05/21 20:31:11 Not a problem.
+
// Make sure that OOBE is run as an "official" build.
WizardController::default_controller()->is_official_build_ = true;
@@ -332,10 +408,55 @@ class WizardControllerFlowTest : public WizardControllerTest {
WizardController::kNetworkScreenName);
}
+ virtual void TearDown() {
+ fetcher_factory_.reset();
+ net::URLFetcherImpl::set_factory(fallback_fetcher_factory_.get());
+ fallback_fetcher_factory_.reset();
+ }
+
+ virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
+ WizardControllerTest::SetUpInProcessBrowserTestFixture();
+
+ network_portal_detector_ = new NetworkPortalDetectorTestImpl();
+ NetworkPortalDetector::InitializeForTesting(network_portal_detector_);
+ }
+
+ void InitDefaultNetwork() {
+ NetworkPortalDetector::CaptivePortalState online_state;
+ online_state.status = NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE;
+ online_state.response_code = 204;
+ // Default detworks happens to be usually "eth1" in tests.
+ network_portal_detector_->SetDefaultNetworkPathForTesting(
+ NetworkHandler::Get()
+ ->network_state_handler()
+ ->DefaultNetwork()
+ ->path());
+ network_portal_detector_->SetDetectionResultsForTesting(
+ NetworkHandler::Get()
+ ->network_state_handler()
+ ->DefaultNetwork()
+ ->path(),
+ online_state);
+ }
+
void OnExit(ScreenObserver::ExitCodes exit_code) {
WizardController::default_controller()->OnExit(exit_code);
}
+ chromeos::SimpleGeolocationProvider* GetGeolocationProvider() {
+ return WizardController::default_controller()->geolocation_provider_.get();
+ }
+
+ void WaitUntilTimezoneResolved() {
+ scoped_ptr<TimeZoneTestRunner> runner(new TimeZoneTestRunner);
+ if (WizardController::default_controller()->SetOnTimeZoneResolvedForTesting(
+ base::Bind(&TimeZoneTestRunner::OnResolved,
+ base::Unretained(runner.get()))))
+ return;
+
+ runner->Run();
+ }
+
MockOutShowHide<MockNetworkScreen, MockNetworkScreenActor>*
mock_network_screen_;
MockOutShowHide<MockUpdateScreen, MockUpdateScreenActor>* mock_update_screen_;
@@ -344,6 +465,13 @@ class WizardControllerFlowTest : public WizardControllerTest {
MockEnrollmentScreenActor>* mock_enrollment_screen_;
private:
+ NetworkPortalDetectorTestImpl* network_portal_detector_;
+
+ // Use a test factory as a fallback so we don't have to deal with other
+ // requests.
+ scoped_ptr<WizardControllerTestURLFetcherFactory> fallback_fetcher_factory_;
+ scoped_ptr<net::FakeURLFetcherFactory> fetcher_factory_;
+
DISALLOW_COPY_AND_ASSIGN(WizardControllerFlowTest);
};
@@ -370,7 +498,10 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowMain) {
EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
+ // Enable TimeZone resolve
+ InitDefaultNetwork();
OnExit(ScreenObserver::EULA_ACCEPTED);
+ EXPECT_TRUE(GetGeolocationProvider());
// Let update screen smooth time process (time = 0ms).
content::RunAllPendingInMessageLoop();
@@ -384,6 +515,11 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowMain) {
EXPECT_EQ("ethernet,wifi,cellular",
NetworkHandler::Get()->network_state_handler()
->GetCheckPortalListForTest());
+
+ WaitUntilTimezoneResolved();
+ EXPECT_EQ("America/Anchorage",
+ base::UTF16ToUTF8(chromeos::system::TimezoneSettings::GetInstance()
+ ->GetCurrentTimezoneID()));
}
IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowErrorUpdate) {

Powered by Google App Engine
This is Rietveld 408576698