Home | History | Annotate | Download | only in gaia
      1 // Copyright (c) 2013 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 #ifndef GOOGLE_APIS_GAIA_FAKE_GAIA_H_
      6 #define GOOGLE_APIS_GAIA_FAKE_GAIA_H_
      7 
      8 #include <map>
      9 #include <set>
     10 #include <string>
     11 
     12 #include "base/basictypes.h"
     13 #include "base/callback.h"
     14 #include "base/memory/scoped_ptr.h"
     15 #include "url/gurl.h"
     16 
     17 namespace base {
     18 class DictionaryValue;
     19 }
     20 
     21 namespace net {
     22 namespace test_server {
     23 class BasicHttpResponse;
     24 struct HttpRequest;
     25 class HttpResponse;
     26 }
     27 }
     28 
     29 // This is a test helper that implements a fake GAIA service for use in browser
     30 // tests. It's mainly intended for use with EmbeddedTestServer, for which it can
     31 // be registered as an additional request handler.
     32 class FakeGaia {
     33  public:
     34   typedef std::set<std::string> ScopeSet;
     35 
     36   // Access token details used for token minting and the token info endpoint.
     37   struct AccessTokenInfo {
     38     AccessTokenInfo();
     39     ~AccessTokenInfo();
     40 
     41     std::string token;
     42     std::string issued_to;
     43     std::string audience;
     44     std::string user_id;
     45     ScopeSet scopes;
     46     int expires_in;
     47     std::string email;
     48   };
     49 
     50   // Cookies and tokens for /MergeSession call seqeunce.
     51   struct MergeSessionParams {
     52     MergeSessionParams();
     53     ~MergeSessionParams();
     54 
     55     // Values of SID and LSID cookie that are set by /ServiceLoginAuth or its
     56     // equivalent at the end of the SAML login flow.
     57     std::string auth_sid_cookie;
     58     std::string auth_lsid_cookie;
     59 
     60     // auth_code cookie value response for /o/oauth2/programmatic_auth call.
     61     std::string auth_code;
     62 
     63     // OAuth2 refresh and access token generated by /o/oauth2/token call
     64     // with "...&grant_type=authorization_code".
     65     std::string refresh_token;
     66     std::string access_token;
     67 
     68     // Uber token response from /OAuthLogin call.
     69     std::string gaia_uber_token;
     70 
     71     // Values of SID and LSID cookie generated from /MergeSession call.
     72     std::string session_sid_cookie;
     73     std::string session_lsid_cookie;
     74 
     75     // The e-mail address returned by /ListAccounts.
     76     std::string email;
     77   };
     78 
     79   FakeGaia();
     80   virtual ~FakeGaia();
     81 
     82   // Sets the initial value of tokens and cookies.
     83   void SetMergeSessionParams(const MergeSessionParams& params);
     84 
     85   // Initializes HTTP request handlers. Should be called after switches
     86   // for tweaking GaiaUrls are in place.
     87   void Initialize();
     88 
     89   // Handles a request and returns a response if the request was recognized as a
     90   // GAIA request. Note that this respects the switches::kGaiaUrl and friends so
     91   // that this can used with EmbeddedTestServer::RegisterRequestHandler().
     92   scoped_ptr<net::test_server::HttpResponse> HandleRequest(
     93       const net::test_server::HttpRequest& request);
     94 
     95   // Configures an OAuth2 token that'll be returned when a client requests an
     96   // access token for the given auth token, which can be a refresh token or an
     97   // login-scoped access token for the token minting endpoint. Note that the
     98   // scope and audience requested by the client need to match the token_info.
     99   void IssueOAuthToken(const std::string& auth_token,
    100                        const AccessTokenInfo& token_info);
    101 
    102   // Associates an account id with a SAML IdP redirect endpoint. When a
    103   // /ServiceLoginAuth request comes in for that user, it will be redirected
    104   // to the associated redirect endpoint.
    105   void RegisterSamlUser(const std::string& account_id, const GURL& saml_idp);
    106 
    107   // Extracts the parameter named |key| from |query| and places it in |value|.
    108   // Returns false if no parameter is found.
    109   static bool GetQueryParameter(const std::string& query,
    110                                 const std::string& key,
    111                                 std::string* value);
    112  protected:
    113   // HTTP handler for /MergeSession.
    114   virtual void HandleMergeSession(
    115       const net::test_server::HttpRequest& request,
    116       net::test_server::BasicHttpResponse* http_response);
    117 
    118  private:
    119   typedef std::multimap<std::string, AccessTokenInfo> AccessTokenInfoMap;
    120   typedef std::map<std::string, GURL> SamlAccountIdpMap;
    121 
    122   // Formats a JSON response with the data in |response_dict|.
    123   void FormatJSONResponse(const base::DictionaryValue& response_dict,
    124                           net::test_server::BasicHttpResponse* http_response);
    125 
    126   typedef base::Callback<void(
    127       const net::test_server::HttpRequest& request,
    128       net::test_server::BasicHttpResponse* http_response)>
    129           HttpRequestHandlerCallback;
    130   typedef std::map<std::string, HttpRequestHandlerCallback> RequestHandlerMap;
    131 
    132   // HTTP request handlers.
    133   void HandleProgramaticAuth(
    134       const net::test_server::HttpRequest& request,
    135       net::test_server::BasicHttpResponse* http_response);
    136   void HandleServiceLogin(const net::test_server::HttpRequest& request,
    137                           net::test_server::BasicHttpResponse* http_response);
    138   void HandleOAuthLogin(const net::test_server::HttpRequest& request,
    139                         net::test_server::BasicHttpResponse* http_response);
    140   void HandleServiceLoginAuth(
    141       const net::test_server::HttpRequest& request,
    142       net::test_server::BasicHttpResponse* http_response);
    143   void HandleSSO(const net::test_server::HttpRequest& request,
    144                  net::test_server::BasicHttpResponse* http_response);
    145   void HandleAuthToken(const net::test_server::HttpRequest& request,
    146                        net::test_server::BasicHttpResponse* http_response);
    147   void HandleTokenInfo(const net::test_server::HttpRequest& request,
    148                        net::test_server::BasicHttpResponse* http_response);
    149   void HandleIssueToken(const net::test_server::HttpRequest& request,
    150                         net::test_server::BasicHttpResponse* http_response);
    151   void HandleListAccounts(const net::test_server::HttpRequest& request,
    152                           net::test_server::BasicHttpResponse* http_response);
    153   void HandlePeopleGet(const net::test_server::HttpRequest& request,
    154                        net::test_server::BasicHttpResponse* http_response);
    155 
    156   // Returns the access token associated with |auth_token| that matches the
    157   // given |client_id| and |scope_string|. If |scope_string| is empty, the first
    158   // token satisfying the other criteria is returned. Returns NULL if no token
    159   // matches.
    160   const AccessTokenInfo* FindAccessTokenInfo(const std::string& auth_token,
    161                                              const std::string& client_id,
    162                                              const std::string& scope_string)
    163       const;
    164 
    165   MergeSessionParams merge_session_params_;
    166   AccessTokenInfoMap access_token_info_map_;
    167   RequestHandlerMap request_handlers_;
    168   std::string service_login_response_;
    169   SamlAccountIdpMap saml_account_idp_map_;
    170 
    171   DISALLOW_COPY_AND_ASSIGN(FakeGaia);
    172 };
    173 
    174 #endif  // GOOGLE_APIS_GAIA_FAKE_GAIA_H_
    175