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/memory/scoped_ptr.h"
     14 
     15 namespace base {
     16 class DictionaryValue;
     17 }
     18 
     19 namespace net {
     20 namespace test_server {
     21 class BasicHttpResponse;
     22 struct HttpRequest;
     23 class HttpResponse;
     24 }
     25 }
     26 
     27 // This is a test helper that implements a fake GAIA service for use in browser
     28 // tests. It's mainly intended for use with EmbeddedTestServer, for which it can
     29 // be registered as an additional request handler.
     30 class FakeGaia {
     31  public:
     32   typedef std::set<std::string> ScopeSet;
     33 
     34   // Access token details used for token minting and the token info endpoint.
     35   struct AccessTokenInfo {
     36     AccessTokenInfo();
     37     ~AccessTokenInfo();
     38 
     39     std::string token;
     40     std::string issued_to;
     41     std::string audience;
     42     std::string user_id;
     43     ScopeSet scopes;
     44     int expires_in;
     45     std::string email;
     46   };
     47 
     48   FakeGaia();
     49   ~FakeGaia();
     50 
     51   // Handles a request and returns a response if the request was recognized as a
     52   // GAIA request. Note that this respects the switches::kGaiaUrl and friends so
     53   // that this can used with EmbeddedTestServer::RegisterRequestHandler().
     54   scoped_ptr<net::test_server::HttpResponse> HandleRequest(
     55       const net::test_server::HttpRequest& request);
     56 
     57   // Configures an OAuth2 token that'll be returned when a client requests an
     58   // access token for the given auth token, which can be a refresh token or an
     59   // login-scoped access token for the token minting endpoint. Note that the
     60   // scope and audience requested by the client need to match the token_info.
     61   void IssueOAuthToken(const std::string& auth_token,
     62                        const AccessTokenInfo& token_info);
     63 
     64  private:
     65   typedef std::multimap<std::string, AccessTokenInfo> AccessTokenInfoMap;
     66 
     67   // Formats a JSON response with the data in |response_dict|.
     68   void FormatJSONResponse(const base::DictionaryValue& response_dict,
     69                           net::test_server::BasicHttpResponse* http_response);
     70 
     71   // Returns the access token associated with |auth_token| that matches the
     72   // given |client_id| and |scope_string|. If |scope_string| is empty, the first
     73   // token satisfying the other criteria is returned. Returns NULL if no token
     74   // matches.
     75   const AccessTokenInfo* GetAccessTokenInfo(const std::string& auth_token,
     76                                             const std::string& client_id,
     77                                             const std::string& scope_string)
     78       const;
     79 
     80   // Extracts the parameter named |key| from |query| and places it in |value|.
     81   // Returns false if no parameter is found.
     82   static bool GetQueryParameter(const std::string& query,
     83                                 const std::string& key,
     84                                 std::string* value);
     85 
     86   AccessTokenInfoMap access_token_info_map_;
     87   std::string service_login_response_;
     88 
     89   DISALLOW_COPY_AND_ASSIGN(FakeGaia);
     90 };
     91 
     92 #endif  // GOOGLE_APIS_GAIA_FAKE_GAIA_H_
     93