Chromium Code Reviews| Index: google_apis/gaia/gaia_oauth_client_unittest.cc |
| diff --git a/google_apis/gaia/gaia_oauth_client_unittest.cc b/google_apis/gaia/gaia_oauth_client_unittest.cc |
| index ba0c4103754c64cac546cf632fb78bb517d458fb..602f9d7a621c45a208058d7fce650fcfd29913e4 100644 |
| --- a/google_apis/gaia/gaia_oauth_client_unittest.cc |
| +++ b/google_apis/gaia/gaia_oauth_client_unittest.cc |
| @@ -5,10 +5,11 @@ |
| // A complete set of unit tests for GaiaOAuthClient. |
| #include <string> |
| +#include <vector> |
| #include "base/message_loop.h" |
| #include "base/strings/string_number_conversions.h" |
| -#include "base/strings/string_util.h" |
| +#include "base/values.h" |
| #include "chrome/test/base/testing_profile.h" |
| #include "google_apis/gaia/gaia_oauth_client.h" |
| #include "googleurl/src/gurl.h" |
| @@ -21,23 +22,27 @@ |
| #include "testing/gtest/include/gtest/gtest.h" |
| using ::testing::_; |
| +using ::testing::Eq; |
| +using ::testing::HasSubstr; |
| +using ::testing::Pointee; |
| +using ::testing::SaveArg; |
| namespace { |
| -const char kGaiaOAuth2Url[] = "https://accounts.google.com/o/oauth2/token"; |
| - |
| // Responds as though OAuth returned from the server. |
| class MockOAuthFetcher : public net::TestURLFetcher { |
| public: |
| MockOAuthFetcher(int response_code, |
| int max_failure_count, |
| + bool complete_immediately, |
| const GURL& url, |
| const std::string& results, |
| net::URLFetcher::RequestType request_type, |
| net::URLFetcherDelegate* d) |
| : net::TestURLFetcher(0, url, d), |
| max_failure_count_(max_failure_count), |
| - current_failure_count_(0) { |
| + current_failure_count_(0), |
| + complete_immediately_(complete_immediately) { |
| set_url(url); |
| set_response_code(response_code); |
| SetResponseString(results); |
| @@ -58,12 +63,19 @@ class MockOAuthFetcher : public net::TestURLFetcher { |
| } |
| set_status(net::URLRequestStatus(code, 0)); |
| + if (complete_immediately_) |
| + delegate()->OnURLFetchComplete(this); |
| + } |
| + |
| + void Finish() { |
| + ASSERT_FALSE(complete_immediately_); |
| delegate()->OnURLFetchComplete(this); |
| } |
| private: |
| int max_failure_count_; |
| int current_failure_count_; |
| + bool complete_immediately_; |
| DISALLOW_COPY_AND_ASSIGN(MockOAuthFetcher); |
| }; |
| @@ -72,7 +84,8 @@ class MockOAuthFetcherFactory : public net::URLFetcherFactory, |
| public: |
| MockOAuthFetcherFactory() |
| : net::ScopedURLFetcherFactory(this), |
| - response_code_(net::HTTP_OK) { |
| + response_code_(net::HTTP_OK), |
| + complete_immediately_(true) { |
| } |
| virtual ~MockOAuthFetcherFactory() {} |
| virtual net::URLFetcher* CreateURLFetcher( |
| @@ -80,13 +93,15 @@ class MockOAuthFetcherFactory : public net::URLFetcherFactory, |
| const GURL& url, |
| net::URLFetcher::RequestType request_type, |
| net::URLFetcherDelegate* d) OVERRIDE { |
| - return new MockOAuthFetcher( |
| + url_fetcher_ = new MockOAuthFetcher( |
| response_code_, |
| max_failure_count_, |
| + complete_immediately_, |
| url, |
| results_, |
| request_type, |
| d); |
| + return url_fetcher_; |
| } |
| void set_response_code(int response_code) { |
| response_code_ = response_code; |
| @@ -97,8 +112,16 @@ class MockOAuthFetcherFactory : public net::URLFetcherFactory, |
| void set_results(const std::string& results) { |
| results_ = results; |
| } |
| + MockOAuthFetcher* get_url_fetcher() { |
| + return url_fetcher_; |
| + } |
| + void set_complete_immediately(bool complete_immediately) { |
| + complete_immediately_ = complete_immediately; |
| + } |
| private: |
| + MockOAuthFetcher* url_fetcher_; |
| int response_code_; |
| + bool complete_immediately_; |
| int max_failure_count_; |
| std::string results_; |
| DISALLOW_COPY_AND_ASSIGN(MockOAuthFetcherFactory); |
| @@ -121,6 +144,12 @@ const std::string kDummyRefreshTokenResult = |
| const std::string kDummyUserInfoResult = |
| "{\"email\":\"" + kTestUserEmail + "\"}"; |
| + |
| +const std::string kDummyTokenInfoResult = |
| + "{\"issued_to\": \"1234567890.apps.googleusercontent.com\"," |
| + "\"audience\": \"1234567890.apps.googleusercontent.com\"," |
| + "\"scope\": \"https://googleapis.com/oauth2/v2/tokeninfo\"," |
| + "\"expires_in\":" + base::IntToString(kTestExpiresIn) + "}"; |
| } |
| namespace gaia { |
| @@ -128,10 +157,16 @@ namespace gaia { |
| class GaiaOAuthClientTest : public testing::Test { |
| public: |
| GaiaOAuthClientTest() {} |
| + void SetUp() { |
| + client_info_.client_id = "test_client_id"; |
| + client_info_.client_secret = "test_client_secret"; |
| + client_info_.redirect_uri = "test_redirect_uri"; |
| + } OVERRIDE; |
|
Roger Tawa OOO till Jul 10th
2013/06/21 18:22:41
The OVERRIDE macro should go at line 160 above.
David Roche
2013/06/21 18:40:45
Done.
|
| TestingProfile profile_; |
| protected: |
| base::MessageLoop message_loop_; |
| + OAuthClientInfo client_info_; |
| }; |
| class MockGaiaOAuthClientDelegate : public gaia::GaiaOAuthClient::Delegate { |
| @@ -147,6 +182,21 @@ class MockGaiaOAuthClientDelegate : public gaia::GaiaOAuthClient::Delegate { |
| MOCK_METHOD1(OnGetUserInfoResponse, void(const std::string& user_email)); |
| MOCK_METHOD0(OnOAuthError, void()); |
| MOCK_METHOD1(OnNetworkError, void(int response_code)); |
| + |
| + // gMock doesn't like methods that take or return scoped_ptr. A |
| + // work-around is to create a mock method that takes a raw ptr, and |
| + // override the problematic method to call through to it. |
| + // https://groups.google.com/a/chromium.org/d/msg/chromium-dev/01sDxsJ1OYw/I_S0xCBRF2oJ |
| + MOCK_METHOD1(OnGetTokenInfoResponsePtr, |
| + void(const DictionaryValue* token_info)); |
| + virtual void OnGetTokenInfoResponse(scoped_ptr<DictionaryValue> token_info) { |
|
Roger Tawa OOO till Jul 10th
2013/06/21 18:22:41
Need OVERRIDE macro.
David Roche
2013/06/21 18:40:45
Done.
|
| + token_info_.reset(token_info.release()); |
| + OnGetTokenInfoResponsePtr(token_info_.get()); |
| + } |
| + |
| + private: |
| + scoped_ptr<DictionaryValue> token_info_; |
| + DISALLOW_COPY_AND_ASSIGN(MockGaiaOAuthClientDelegate); |
| }; |
| TEST_F(GaiaOAuthClientTest, NetworkFailure) { |
| @@ -156,19 +206,12 @@ TEST_F(GaiaOAuthClientTest, NetworkFailure) { |
| EXPECT_CALL(delegate, OnNetworkError(response_code)) |
| .Times(1); |
| - TestingProfile profile; |
| - |
| MockOAuthFetcherFactory factory; |
| factory.set_response_code(response_code); |
| factory.set_max_failure_count(4); |
| - OAuthClientInfo client_info; |
| - client_info.client_id = "test_client_id"; |
| - client_info.client_secret = "test_client_secret"; |
| - client_info.redirect_uri = "test_redirect_uri"; |
| - GaiaOAuthClient auth(kGaiaOAuth2Url, |
| - profile_.GetRequestContext()); |
| - auth.GetTokensFromAuthCode(client_info, "auth_code", 2, &delegate); |
| + GaiaOAuthClient auth(profile_.GetRequestContext()); |
| + auth.GetTokensFromAuthCode(client_info_, "auth_code", 2, &delegate); |
| } |
| TEST_F(GaiaOAuthClientTest, NetworkFailureRecover) { |
| @@ -178,20 +221,13 @@ TEST_F(GaiaOAuthClientTest, NetworkFailureRecover) { |
| EXPECT_CALL(delegate, OnGetTokensResponse(kTestRefreshToken, kTestAccessToken, |
| kTestExpiresIn)).Times(1); |
| - TestingProfile profile; |
| - |
| MockOAuthFetcherFactory factory; |
| factory.set_response_code(response_code); |
| factory.set_max_failure_count(4); |
| factory.set_results(kDummyGetTokensResult); |
| - OAuthClientInfo client_info; |
| - client_info.client_id = "test_client_id"; |
| - client_info.client_secret = "test_client_secret"; |
| - client_info.redirect_uri = "test_redirect_uri"; |
| - GaiaOAuthClient auth(kGaiaOAuth2Url, |
| - profile_.GetRequestContext()); |
| - auth.GetTokensFromAuthCode(client_info, "auth_code", -1, &delegate); |
| + GaiaOAuthClient auth(profile_.GetRequestContext()); |
| + auth.GetTokensFromAuthCode(client_info_, "auth_code", -1, &delegate); |
| } |
| TEST_F(GaiaOAuthClientTest, OAuthFailure) { |
| @@ -200,20 +236,13 @@ TEST_F(GaiaOAuthClientTest, OAuthFailure) { |
| MockGaiaOAuthClientDelegate delegate; |
| EXPECT_CALL(delegate, OnOAuthError()).Times(1); |
| - TestingProfile profile; |
| - |
| MockOAuthFetcherFactory factory; |
| factory.set_response_code(response_code); |
| factory.set_max_failure_count(-1); |
| factory.set_results(kDummyGetTokensResult); |
| - OAuthClientInfo client_info; |
| - client_info.client_id = "test_client_id"; |
| - client_info.client_secret = "test_client_secret"; |
| - client_info.redirect_uri = "test_redirect_uri"; |
| - GaiaOAuthClient auth(kGaiaOAuth2Url, |
| - profile_.GetRequestContext()); |
| - auth.GetTokensFromAuthCode(client_info, "auth_code", -1, &delegate); |
| + GaiaOAuthClient auth(profile_.GetRequestContext()); |
| + auth.GetTokensFromAuthCode(client_info_, "auth_code", -1, &delegate); |
| } |
| @@ -222,18 +251,11 @@ TEST_F(GaiaOAuthClientTest, GetTokensSuccess) { |
| EXPECT_CALL(delegate, OnGetTokensResponse(kTestRefreshToken, kTestAccessToken, |
| kTestExpiresIn)).Times(1); |
| - TestingProfile profile; |
| - |
| MockOAuthFetcherFactory factory; |
| factory.set_results(kDummyGetTokensResult); |
| - OAuthClientInfo client_info; |
| - client_info.client_id = "test_client_id"; |
| - client_info.client_secret = "test_client_secret"; |
| - client_info.redirect_uri = "test_redirect_uri"; |
| - GaiaOAuthClient auth(kGaiaOAuth2Url, |
| - profile_.GetRequestContext()); |
| - auth.GetTokensFromAuthCode(client_info, "auth_code", -1, &delegate); |
| + GaiaOAuthClient auth(profile_.GetRequestContext()); |
| + auth.GetTokensFromAuthCode(client_info_, "auth_code", -1, &delegate); |
| } |
| TEST_F(GaiaOAuthClientTest, RefreshTokenSuccess) { |
| @@ -241,36 +263,63 @@ TEST_F(GaiaOAuthClientTest, RefreshTokenSuccess) { |
| EXPECT_CALL(delegate, OnRefreshTokenResponse(kTestAccessToken, |
| kTestExpiresIn)).Times(1); |
| - TestingProfile profile; |
| - |
| MockOAuthFetcherFactory factory; |
| factory.set_results(kDummyRefreshTokenResult); |
| + factory.set_complete_immediately(false); |
| + |
| + GaiaOAuthClient auth(profile_.GetRequestContext()); |
| + auth.RefreshToken(client_info_, "refresh_token", std::vector<std::string>(), |
| + -1, &delegate); |
| + EXPECT_THAT(factory.get_url_fetcher()->upload_data(), |
| + Not(HasSubstr("scope"))); |
| + factory.get_url_fetcher()->Finish(); |
| +} |
| - OAuthClientInfo client_info; |
| - client_info.client_id = "test_client_id"; |
| - client_info.client_secret = "test_client_secret"; |
| - client_info.redirect_uri = "test_redirect_uri"; |
| - GaiaOAuthClient auth(kGaiaOAuth2Url, |
| - profile_.GetRequestContext()); |
| - auth.RefreshToken(client_info, "refresh_token", -1, &delegate); |
| +TEST_F(GaiaOAuthClientTest, RefreshTokenDownscopingSuccess) { |
| + MockGaiaOAuthClientDelegate delegate; |
| + EXPECT_CALL(delegate, OnRefreshTokenResponse(kTestAccessToken, |
| + kTestExpiresIn)).Times(1); |
| + |
| + MockOAuthFetcherFactory factory; |
| + factory.set_results(kDummyRefreshTokenResult); |
| + factory.set_complete_immediately(false); |
| + |
| + GaiaOAuthClient auth(profile_.GetRequestContext()); |
| + auth.RefreshToken(client_info_, "refresh_token", |
| + std::vector<std::string>(1, "scope4test"), -1, &delegate); |
| + EXPECT_THAT(factory.get_url_fetcher()->upload_data(), |
| + HasSubstr("&scope=scope4test")); |
| + factory.get_url_fetcher()->Finish(); |
| } |
| + |
| TEST_F(GaiaOAuthClientTest, GetUserInfo) { |
| MockGaiaOAuthClientDelegate delegate; |
| EXPECT_CALL(delegate, OnGetUserInfoResponse(kTestUserEmail)).Times(1); |
| - TestingProfile profile; |
| - |
| MockOAuthFetcherFactory factory; |
| factory.set_results(kDummyUserInfoResult); |
| - OAuthClientInfo client_info; |
| - client_info.client_id = "test_client_id"; |
| - client_info.client_secret = "test_client_secret"; |
| - client_info.redirect_uri = "test_redirect_uri"; |
| - GaiaOAuthClient auth(kGaiaOAuth2Url, |
| - profile_.GetRequestContext()); |
| + GaiaOAuthClient auth(profile_.GetRequestContext()); |
| auth.GetUserInfo("access_token", 1, &delegate); |
| } |
| +TEST_F(GaiaOAuthClientTest, GetTokenInfo) { |
| + const DictionaryValue* captured_result; |
| + |
| + MockGaiaOAuthClientDelegate delegate; |
| + EXPECT_CALL(delegate, OnGetTokenInfoResponsePtr(_)) |
| + .WillOnce(SaveArg<0>(&captured_result)); |
| + |
| + MockOAuthFetcherFactory factory; |
| + factory.set_results(kDummyTokenInfoResult); |
| + |
| + GaiaOAuthClient auth(profile_.GetRequestContext()); |
| + auth.GetTokenInfo("access_token", 1, &delegate); |
| + |
| + std::string issued_to; |
| + ASSERT_TRUE(captured_result->GetString("issued_to", &issued_to)); |
| + ASSERT_EQ("1234567890.apps.googleusercontent.com", issued_to); |
| +} |
| + |
| } // namespace gaia |