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

Unified Diff: ios/chrome/test/app/signin_test_util.mm

Issue 2580333003: Upstream Chrome on iOS source code [10/11]. (Closed)
Patch Set: Created 4 years 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
« no previous file with comments | « ios/chrome/test/app/signin_test_util.h ('k') | ios/chrome/test/app/stack_view_test_util.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ios/chrome/test/app/signin_test_util.mm
diff --git a/ios/chrome/test/app/signin_test_util.mm b/ios/chrome/test/app/signin_test_util.mm
new file mode 100644
index 0000000000000000000000000000000000000000..f7039e43520a8b50a93056732ddebf9fc5c3e7f6
--- /dev/null
+++ b/ios/chrome/test/app/signin_test_util.mm
@@ -0,0 +1,170 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ios/chrome/test/app/signin_test_util.h"
+
+#include "base/logging.h"
+#include "base/strings/stringprintf.h"
+#include "base/test/ios/wait_util.h"
+#include "components/prefs/pref_service.h"
+#include "components/signin/core/browser/account_tracker_service.h"
+#include "components/signin/core/common/signin_pref_names.h"
+#include "google_apis/gaia/gaia_constants.h"
+#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#include "ios/chrome/browser/signin/account_tracker_service_factory.h"
+#include "ios/chrome/browser/signin/authentication_service.h"
+#include "ios/chrome/browser/signin/authentication_service_factory.h"
+#include "ios/chrome/browser/signin/gaia_auth_fetcher_ios.h"
+#import "ios/chrome/test/app/chrome_test_util.h"
+#include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
+#import "ios/public/provider/chrome/browser/signin/fake_chrome_identity_service.h"
+#include "net/http/http_status_code.h"
+#include "net/url_request/test_url_fetcher_factory.h"
+#include "net/url_request/url_fetcher_delegate.h"
+#include "net/url_request/url_request_status.h"
+
+namespace {
+
+net::FakeURLFetcherFactory* gFakeURLFetcherFactory = nullptr;
+
+// Specialization of the FakeURLFetcherFactory that will recognize GET requests
+// for MergeSession and answer those requests correctly.
+class MergeSessionFakeURLFetcherFactory : public net::FakeURLFetcherFactory {
+ public:
+ explicit MergeSessionFakeURLFetcherFactory(URLFetcherFactory* default_factory)
+ : net::FakeURLFetcherFactory(default_factory) {}
+ std::unique_ptr<net::URLFetcher> CreateURLFetcher(
+ int id,
+ const GURL& url,
+ net::URLFetcher::RequestType request_type,
+ net::URLFetcherDelegate* d) override {
+ const GURL kMergeSessionURL =
+ GURL("https://accounts.google.com/MergeSession");
+ url::Replacements<char> replacements;
+ replacements.ClearRef();
+ replacements.ClearQuery();
+ if (url.ReplaceComponents(replacements) != kMergeSessionURL) {
+ // URL is not a MergeSession GET. Use the default method.
+ return net::FakeURLFetcherFactory::CreateURLFetcher(id, url, request_type,
+ d);
+ }
+ // Actual MergeSession request. Answer is ignored by the AccountReconcilor,
+ // so it can also be empty.
+ return std::unique_ptr<net::FakeURLFetcher>(new net::FakeURLFetcher(
+ url, d, "", net::HTTP_OK, net::URLRequestStatus::SUCCESS));
+ }
+};
+
+} // namespace
+
+namespace chrome_test_util {
+
+void SetUpMockAuthentication() {
+ ios::ChromeBrowserProvider* provider = ios::GetChromeBrowserProvider();
+ std::unique_ptr<ios::FakeChromeIdentityService> service(
+ new ios::FakeChromeIdentityService());
+ service->SetUpForIntegrationTests();
+ provider->SetChromeIdentityServiceForTesting(std::move(service));
+ AuthenticationServiceFactory::GetForBrowserState(GetOriginalBrowserState())
+ ->ResetChromeIdentityServiceObserverForTesting();
+}
+
+void TearDownMockAuthentication() {
+ ios::ChromeBrowserProvider* provider = ios::GetChromeBrowserProvider();
+ provider->SetChromeIdentityServiceForTesting(nullptr);
+ AuthenticationServiceFactory::GetForBrowserState(GetOriginalBrowserState())
+ ->ResetChromeIdentityServiceObserverForTesting();
+}
+
+void SetUpMockAccountReconcilor() {
+ gFakeURLFetcherFactory =
+ new MergeSessionFakeURLFetcherFactory(new net::URLFetcherImplFactory());
+ GaiaAuthFetcherIOS::SetShouldUseGaiaAuthFetcherIOSForTesting(false);
+
+ // Answer is URLs in JSON that will be fetched and used in MergeSession that
+ // we also intercept, so it can be empty.
+ const GURL kCheckConnectionInfoURL = GURL(base::StringPrintf(
+ "https://accounts.google.com/GetCheckConnectionInfo?source=%s",
+ GaiaConstants::kChromeSource));
+ gFakeURLFetcherFactory->SetFakeResponse(kCheckConnectionInfoURL, "[]",
+ net::HTTP_OK,
+ net::URLRequestStatus::SUCCESS);
+
+ // No accounts in the cookie jar, will trigger a MergeSession for all of
+ // them.
+ const GURL kListAccountsURL = GURL(base::StringPrintf(
+ "https://accounts.google.com/ListAccounts?source=%s&json=standard",
+ GaiaConstants::kChromeSource));
+ gFakeURLFetcherFactory->SetFakeResponse(kListAccountsURL, "[\"\",[]]",
+ net::HTTP_OK,
+ net::URLRequestStatus::SUCCESS);
+
+ // Ubertoken, which is sent for the MergeSession that we also intercept, so
+ // it can be any bogus token.
+ const GURL kUbertokenURL = GURL(base::StringPrintf(
+ "https://accounts.google.com/OAuthLogin?source=%s&issueuberauth=1",
+ GaiaConstants::kChromeSource));
+ gFakeURLFetcherFactory->SetFakeResponse(
+ kUbertokenURL, "1234-asdf-fake-ubertoken", net::HTTP_OK,
+ net::URLRequestStatus::SUCCESS);
+
+ // MergeSession request is handled by MergeSessionFakeURLFetcherFactory.
+
+ // If a profile was previously signed in without chrome identity, a logout
+ // action is done and will block all other requests until it has been dealt
+ // with.
+ const GURL kLogoutURL =
+ GURL(base::StringPrintf("https://accounts.google.com/Logout?source=%s",
+ GaiaConstants::kChromeSource));
+ gFakeURLFetcherFactory->SetFakeResponse(kLogoutURL, "", net::HTTP_OK,
+ net::URLRequestStatus::SUCCESS);
+}
+
+void TearDownMockAccountReconcilor() {
+ GaiaAuthFetcherIOS::SetShouldUseGaiaAuthFetcherIOSForTesting(true);
+ delete gFakeURLFetcherFactory;
+ gFakeURLFetcherFactory = nullptr;
+}
+
+bool SignOutAndClearAccounts() {
+ ios::ChromeBrowserState* browser_state = GetOriginalBrowserState();
+ DCHECK(browser_state);
+
+ // Sign out current user.
+ AuthenticationService* authentication_service =
+ AuthenticationServiceFactory::GetForBrowserState(browser_state);
+ if (authentication_service->IsAuthenticated()) {
+ authentication_service->SignOut(signin_metrics::SIGNOUT_TEST, nil);
+ }
+
+ // Clear the tracked accounts.
+ AccountTrackerService* account_tracker =
+ ios::AccountTrackerServiceFactory::GetForBrowserState(browser_state);
+ for (const AccountInfo& info : account_tracker->GetAccounts()) {
+ account_tracker->RemoveAccount(info.account_id);
+ }
+
+ // Clear last signed in user preference.
+ browser_state->GetPrefs()->ClearPref(prefs::kGoogleServicesLastAccountId);
+ browser_state->GetPrefs()->ClearPref(prefs::kGoogleServicesLastUsername);
+
+ // Clear known identities.
+ ios::ChromeIdentityService* identity_service =
+ ios::GetChromeBrowserProvider()->GetChromeIdentityService();
+ base::scoped_nsobject<NSArray> identities(
+ [identity_service->GetAllIdentities() copy]);
+ for (ChromeIdentity* identity in identities.get()) {
+ identity_service->ForgetIdentity(identity, nil);
+ }
+
+ NSDate* deadline = [NSDate dateWithTimeIntervalSinceNow:10.0];
+ while (identity_service->HasIdentities() &&
+ [[NSDate date] compare:deadline] != NSOrderedDescending) {
+ base::test::ios::SpinRunLoopWithMaxDelay(
+ base::TimeDelta::FromSecondsD(0.01));
+ }
+ return !identity_service->HasIdentities();
+}
+
+} // namespace chrome_test_util
« no previous file with comments | « ios/chrome/test/app/signin_test_util.h ('k') | ios/chrome/test/app/stack_view_test_util.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698