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

Side by Side Diff: chrome/common/net/gaia/oauth2_api_call_flow_unittest.cc

Issue 9937004: Create an abstract flow class that abstracts the following logical steps of calling an OAuth2 enabl… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 8 months 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 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 // A complete set of unit tests for OAuth2MintTokenFlow.
6
7 #include <string>
8 #include <vector>
9
10 #include "base/memory/scoped_ptr.h"
11 #include "chrome/common/net/gaia/gaia_urls.h"
12 #include "chrome/common/net/gaia/google_service_auth_error.h"
13 #include "chrome/common/net/gaia/oauth2_access_token_consumer.h"
14 #include "chrome/common/net/gaia/oauth2_access_token_fetcher.h"
15 #include "chrome/common/net/gaia/oauth2_api_call_flow.h"
16 #include "chrome/test/base/testing_profile.h"
17 #include "content/public/common/url_fetcher.h"
18 #include "content/public/common/url_fetcher_delegate.h"
19 #include "content/public/common/url_fetcher_factory.h"
20 #include "content/test/test_url_fetcher_factory.h"
21 #include "net/http/http_status_code.h"
22 #include "net/url_request/url_request.h"
23 #include "net/url_request/url_request_status.h"
24 #include "testing/gmock/include/gmock/gmock.h"
25 #include "testing/gtest/include/gtest/gtest.h"
26
27 using content::URLFetcher;
msw 2012/03/30 23:56:32 nit: using (i think this is usually ok in test fil
Munjal (Google) 2012/04/04 19:24:38 Done.
28 using content::URLFetcherDelegate;
29 using content::URLFetcherFactory;
30 using net::URLRequestStatus;
31 using testing::_;
32 using testing::Return;
33
34 namespace {
35 static GURL CreateApiUrl() {
msw 2012/03/30 23:56:32 nit: add a blank line above.
Munjal (Google) 2012/04/04 19:24:38 Done.
36 return GURL("https://www.googleapis.com/someapi");
37 }
38
39 static std::vector<std::string> CreateTestScopes() {
40 std::vector<std::string> scopes;
41 scopes.push_back("scope1");
42 scopes.push_back("scope2");
43 return scopes;
44 }
45 }
msw 2012/03/30 23:56:32 nit: "} // namespace" and add a blank line above.
Munjal (Google) 2012/04/04 19:24:38 Done.
46
47 class MockUrlFetcherFactory : public ScopedURLFetcherFactory,
48 public URLFetcherFactory {
49 public:
50 MockUrlFetcherFactory()
51 : ScopedURLFetcherFactory(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
52 }
53 virtual ~MockUrlFetcherFactory() {}
54
55 MOCK_METHOD4(
56 CreateURLFetcher,
57 URLFetcher* (int id,
58 const GURL& url,
59 URLFetcher::RequestType request_type,
60 URLFetcherDelegate* d));
61 };
62
63 class MockAccessTokenFetcher : public OAuth2AccessTokenFetcher {
64 public:
65 MockAccessTokenFetcher(OAuth2AccessTokenConsumer* consumer,
66 net::URLRequestContextGetter* getter)
67 : OAuth2AccessTokenFetcher(consumer, getter) {}
68 ~MockAccessTokenFetcher() {}
69
70 MOCK_METHOD4(Start,
71 void (const std::string& client_id,
72 const std::string& client_secret,
73 const std::string& refresh_token,
74 const std::vector<std::string>& scopes));
75 };
76
77 class MockApiCallFlow : public OAuth2ApiCallFlow {
78 public:
79 MockApiCallFlow(net::URLRequestContextGetter* context,
80 const std::string& refresh_token,
81 const std::string& access_token,
82 const std::vector<std::string>& scopes)
83 : OAuth2ApiCallFlow(context, refresh_token, access_token, scopes) {}
84 ~MockApiCallFlow() {}
85
86 MOCK_METHOD0(CreateApiCallUrl, GURL ());
87 MOCK_METHOD0(CreateApiCallBody, std::string ());
88 MOCK_METHOD1(ProcessApiCallSuccess,
89 void (const content::URLFetcher* source));
90 MOCK_METHOD1(ProcessApiCallFailure,
91 void (const content::URLFetcher* source));
92 MOCK_METHOD1(ProcessNewAccessToken,
93 void (const std::string& access_token));
94 MOCK_METHOD1(ProcessMintAccessTokenFailure,
95 void (const GoogleServiceAuthError& error));
96 MOCK_METHOD0(CreateAccessTokenFetcher, OAuth2AccessTokenFetcher* ());
97 // MOCK_METHOD0(CreateURLFetcher, URLFetcher* ());
msw 2012/03/30 23:56:32 Did you intend to remove this?
Munjal (Google) 2012/04/04 19:24:38 Done.
98 };
99
100 class OAuth2ApiCallFlowTest : public testing::Test {
101 public:
102 OAuth2ApiCallFlowTest() {}
103 virtual ~OAuth2ApiCallFlowTest() {}
104
105 protected:
106 void SetupAccessTokenFetcher(
107 const std::string& rt, const std::vector<std::string>& scopes) {
108 EXPECT_CALL(*access_token_fetcher_,
109 Start(GaiaUrls::GetInstance()->oauth2_chrome_client_id(),
110 GaiaUrls::GetInstance()->oauth2_chrome_client_secret(),
111 rt, scopes))
112 .Times(1);
113 EXPECT_CALL(*flow_, CreateAccessTokenFetcher())
114 .WillOnce(Return(access_token_fetcher_.release()));
115 }
116
117 TestURLFetcher* CreateURLFetcher(
118 const GURL& url, bool fetch_succeeds,
119 int response_code, const std::string& body) {
120 TestURLFetcher* url_fetcher = new TestURLFetcher(0, url, flow_.get());
121 URLRequestStatus::Status status =
122 fetch_succeeds ? URLRequestStatus::SUCCESS : URLRequestStatus::FAILED;
123 url_fetcher->set_status(URLRequestStatus(status, 0));
124
125 if (response_code != 0)
126 url_fetcher->set_response_code(response_code);
127
128 if (!body.empty())
129 url_fetcher->SetResponseString(body);
130
131 return url_fetcher;
132 }
133
134 void CreateFlow(const std::string& refresh_token,
135 const std::string& access_token,
136 const std::vector<std::string>& scopes) {
137 flow_.reset(new MockApiCallFlow(
138 profile_.GetRequestContext(),
139 refresh_token,
140 access_token,
141 scopes));
142 access_token_fetcher_.reset(new MockAccessTokenFetcher(
143 flow_.get(), profile_.GetRequestContext()));
144 }
145
146 TestURLFetcher* SetupApiCall(bool succeeds, net::HttpStatusCode status) {
147 GURL url(CreateApiUrl());
148 EXPECT_CALL(*flow_, CreateApiCallBody()).WillOnce(Return(""));
149 EXPECT_CALL(*flow_, CreateApiCallUrl()).WillOnce(Return(url));
150 TestURLFetcher* url_fetcher = CreateURLFetcher(
151 url, succeeds, status, "");
152 EXPECT_CALL(factory_, CreateURLFetcher(_, url, _, _))
153 .WillOnce(Return(url_fetcher));
154 return url_fetcher;
155 }
156
157 MockUrlFetcherFactory factory_;
158 scoped_ptr<MockApiCallFlow> flow_;
159 scoped_ptr<MockAccessTokenFetcher> access_token_fetcher_;
160 TestingProfile profile_;
161 };
162
163 TEST_F(OAuth2ApiCallFlowTest, FirstApiCallSucceeds) {
164 std::string rt = "refresh_token";
165 std::string at = "access_token";
166 std::vector<std::string> scopes(CreateTestScopes());
167
168 CreateFlow(rt, at, scopes);
169 TestURLFetcher* url_fetcher = SetupApiCall(true, net::HTTP_OK);
170 EXPECT_CALL(*flow_, ProcessApiCallSuccess(url_fetcher));
171 flow_->Start();
172 flow_->OnURLFetchComplete(url_fetcher);
173 }
174
175 TEST_F(OAuth2ApiCallFlowTest, SecondApiCallSucceeds) {
176 std::string rt = "refresh_token";
177 std::string at = "access_token";
178 std::vector<std::string> scopes(CreateTestScopes());
179
180 CreateFlow(rt, at, scopes);
181 TestURLFetcher* url_fetcher1 = SetupApiCall(true, net::HTTP_UNAUTHORIZED);
182 flow_->Start();
183 SetupAccessTokenFetcher(rt, scopes);
184 flow_->OnURLFetchComplete(url_fetcher1);
185 TestURLFetcher* url_fetcher2 = SetupApiCall(true, net::HTTP_OK);
186 EXPECT_CALL(*flow_, ProcessApiCallSuccess(url_fetcher2));
187 flow_->OnGetTokenSuccess(at);
188 flow_->OnURLFetchComplete(url_fetcher2);
189 }
190
191 TEST_F(OAuth2ApiCallFlowTest, SecondApiCallFails) {
192 std::string rt = "refresh_token";
193 std::string at = "access_token";
194 std::vector<std::string> scopes(CreateTestScopes());
195
196 CreateFlow(rt, at, scopes);
197 TestURLFetcher* url_fetcher1 = SetupApiCall(true, net::HTTP_UNAUTHORIZED);
198 flow_->Start();
199 SetupAccessTokenFetcher(rt, scopes);
200 flow_->OnURLFetchComplete(url_fetcher1);
201 TestURLFetcher* url_fetcher2 = SetupApiCall(false, net::HTTP_UNAUTHORIZED);
202 EXPECT_CALL(*flow_, ProcessApiCallFailure(url_fetcher2));
203 flow_->OnGetTokenSuccess(at);
204 flow_->OnURLFetchComplete(url_fetcher2);
205 }
206
207 TEST_F(OAuth2ApiCallFlowTest, NewTokenGenerationFails) {
208 std::string rt = "refresh_token";
209 std::string at = "access_token";
210 std::vector<std::string> scopes(CreateTestScopes());
211
212 CreateFlow(rt, at, scopes);
213 TestURLFetcher* url_fetcher = SetupApiCall(true, net::HTTP_UNAUTHORIZED);
214 flow_->Start();
215 SetupAccessTokenFetcher(rt, scopes);
216 flow_->OnURLFetchComplete(url_fetcher);
217 GoogleServiceAuthError error(
218 GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
219 EXPECT_CALL(*flow_, ProcessMintAccessTokenFailure(error));
220 flow_->OnGetTokenFailure(error);
221 }
222
223 TEST_F(OAuth2ApiCallFlowTest, EmptyAccessTokenFirstApiCallSucceeds) {
224 std::string rt = "refresh_token";
225 std::string at = "access_token";
226 std::vector<std::string> scopes(CreateTestScopes());
227
228 CreateFlow(rt, "", scopes);
229 SetupAccessTokenFetcher(rt, scopes);
230 TestURLFetcher* url_fetcher = SetupApiCall(true, net::HTTP_OK);
231 EXPECT_CALL(*flow_, ProcessApiCallSuccess(url_fetcher));
232 flow_->Start();
233 flow_->OnGetTokenSuccess(at);
234 flow_->OnURLFetchComplete(url_fetcher);
235 }
236
237 TEST_F(OAuth2ApiCallFlowTest, EmptyAccessTokenApiCallFails) {
238 std::string rt = "refresh_token";
239 std::string at = "access_token";
240 std::vector<std::string> scopes(CreateTestScopes());
241
242 CreateFlow(rt, "", scopes);
243 SetupAccessTokenFetcher(rt, scopes);
244 TestURLFetcher* url_fetcher = SetupApiCall(false, net::HTTP_BAD_GATEWAY);
245 EXPECT_CALL(*flow_, ProcessApiCallFailure(url_fetcher));
246 flow_->Start();
247 flow_->OnGetTokenSuccess(at);
248 flow_->OnURLFetchComplete(url_fetcher);
249 }
250
251 TEST_F(OAuth2ApiCallFlowTest, EmptyAccessTokenNewTokenGenerationFails) {
252 std::string rt = "refresh_token";
253 std::string at = "access_token";
254 std::vector<std::string> scopes(CreateTestScopes());
255
256 CreateFlow(rt, "", scopes);
257 SetupAccessTokenFetcher(rt, scopes);
258 GoogleServiceAuthError error(
259 GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
260 EXPECT_CALL(*flow_, ProcessMintAccessTokenFailure(error));
261 flow_->Start();
262 flow_->OnGetTokenFailure(error);
263 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698