fake_profile_oauth2_token_service.h revision 8bcbed890bc3ce4d7a057a8f32cab53fa534672e
13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file.
43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#ifndef CHROME_BROWSER_SIGNIN_FAKE_PROFILE_OAUTH2_TOKEN_SERVICE_H_
63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define CHROME_BROWSER_SIGNIN_FAKE_PROFILE_OAUTH2_TOKEN_SERVICE_H_
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <string>
93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <vector>
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/compiler_specific.h"
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/memory/weak_ptr.h"
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_ANDROID)
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/signin/android_profile_oauth2_token_service.h"
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#else
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service.h"
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace content {
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class BrowserContext;
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Helper class to simplify writing unittests that depend on an instance of
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// ProfileOAuth2TokenService.
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Tests would typically do something like the following:
283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// FakeProfileOAuth2TokenService service;
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// ...
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// service.IssueRefreshToken("token");  // Issue refresh token/notify observers
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// ...
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// // Confirm that there is at least one active request.
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// EXPECT_GT(0U, service.GetPendingRequests().size());
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// ...
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// // Make any pending token fetches for a given scope succeed.
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// ScopeSet scopes;
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// scopes.insert(GaiaConstants::kYourServiceScope);
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// IssueTokenForScope(scopes, "access_token", base::Time()::Max());
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// ...
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// // ...or make them fail...
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// IssueErrorForScope(scopes, GoogleServiceAuthError(INVALID_GAIA_CREDENTIALS));
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class FakeProfileOAuth2TokenService
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_ANDROID)
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  : public AndroidProfileOAuth2TokenService {
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#else
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  : public ProfileOAuth2TokenService {
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  struct PendingRequest {
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    PendingRequest();
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ~PendingRequest();
543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    std::string account_id;
563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::string client_id;
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::string client_secret;
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ScopeSet scopes;
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    base::WeakPtr<RequestImpl> request;
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  };
613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeProfileOAuth2TokenService();
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual ~FakeProfileOAuth2TokenService();
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Overriden to make sure it works on Android.
6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual bool RefreshTokenIsAvailable(
6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      const std::string& account_id) OVERRIDE;
6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Sets the current refresh token. If |token| is non-empty, this will invoke
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // OnRefreshTokenAvailable() on all Observers, otherwise this will invoke
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // OnRefreshTokenRevoked().
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void IssueRefreshToken(const std::string& token);
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // TODO(fgorski,rogerta): Merge with UpdateCredentials when this class fully
758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // supports multiple accounts.
768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  void IssueRefreshTokenForUser(const std::string& account_id,
778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                const std::string& token);
788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Gets a list of active requests (can be used by tests to validate that the
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // correct request has been issued).
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::vector<PendingRequest> GetPendingRequests();
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Helper routines to issue tokens for pending requests.
8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // TODO(fgorski): Add account IDs as parameters.
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void IssueTokenForScope(const ScopeSet& scopes,
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                          const std::string& access_token,
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                          const base::Time& expiration);
883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void IssueErrorForScope(const ScopeSet& scopes,
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                          const GoogleServiceAuthError& error);
913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void IssueTokenForAllPendingRequests(const std::string& access_token,
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                       const base::Time& expiration);
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void IssueErrorForAllPendingRequests(const GoogleServiceAuthError& error);
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Helper function to be used with
983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // BrowserContextKeyedService::SetTestingFactory().
993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  static BrowserContextKeyedService* Build(content::BrowserContext* profile);
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) protected:
1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // OAuth2TokenService overrides.
1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void FetchOAuth2Token(RequestImpl* request,
10468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                const std::string& account_id,
1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                net::URLRequestContextGetter* getter,
1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                const std::string& client_id,
1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                const std::string& client_secret,
1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                const ScopeSet& scopes) OVERRIDE;
1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual std::string GetRefreshToken(const std::string& account_id) OVERRIDE;
1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual net::URLRequestContextGetter* GetRequestContext() OVERRIDE;
1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Helper function to complete pending requests - if |all_scopes| is true,
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // then all pending requests are completed, otherwise, only those requests
1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // matching |scopes| are completed.
1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void CompleteRequests(bool all_scopes,
1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                        const ScopeSet& scopes,
1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                        const GoogleServiceAuthError& error,
1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                        const std::string& access_token,
1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                        const base::Time& expiration);
1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::vector<PendingRequest> pending_requests_;
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::string refresh_token_;
1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FakeProfileOAuth2TokenService);
1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif  // CHROME_BROWSER_SIGNIN_FAKE_PROFILE_OAUTH2_TOKEN_SERVICE_H_
131