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

Side by Side Diff: google_apis/gaia/gaia_oauth_client_unittest.cc

Issue 17109006: Device robot refresh token integrity validation. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Extend device_oauth2_token_service_unittest.cc to cover refresh token validation cases. Created 7 years, 6 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 // 4 //
5 // A complete set of unit tests for GaiaOAuthClient. 5 // A complete set of unit tests for GaiaOAuthClient.
6 6
7 #include <string> 7 #include <string>
8 #include <vector>
8 9
9 #include "base/message_loop.h" 10 #include "base/message_loop.h"
10 #include "base/string_number_conversions.h" 11 #include "base/string_number_conversions.h"
11 #include "base/string_util.h" 12 #include "base/values.h"
12 #include "chrome/test/base/testing_profile.h" 13 #include "chrome/test/base/testing_profile.h"
13 #include "google_apis/gaia/gaia_oauth_client.h" 14 #include "google_apis/gaia/gaia_oauth_client.h"
14 #include "googleurl/src/gurl.h" 15 #include "googleurl/src/gurl.h"
15 #include "net/base/net_errors.h" 16 #include "net/base/net_errors.h"
16 #include "net/http/http_status_code.h" 17 #include "net/http/http_status_code.h"
17 #include "net/url_request/test_url_fetcher_factory.h" 18 #include "net/url_request/test_url_fetcher_factory.h"
18 #include "net/url_request/url_fetcher_delegate.h" 19 #include "net/url_request/url_fetcher_delegate.h"
19 #include "net/url_request/url_request_status.h" 20 #include "net/url_request/url_request_status.h"
20 #include "testing/gmock/include/gmock/gmock.h" 21 #include "testing/gmock/include/gmock/gmock.h"
21 #include "testing/gtest/include/gtest/gtest.h" 22 #include "testing/gtest/include/gtest/gtest.h"
22 23
23 using ::testing::_; 24 using ::testing::_;
25 using ::testing::Eq;
26 using ::testing::HasSubstr;
27 using ::testing::Pointee;
28 using ::testing::SaveArg;
24 29
25 namespace { 30 namespace {
26 31
27 const char kGaiaOAuth2Url[] = "https://accounts.google.com/o/oauth2/token";
28
29 // Responds as though OAuth returned from the server. 32 // Responds as though OAuth returned from the server.
30 class MockOAuthFetcher : public net::TestURLFetcher { 33 class MockOAuthFetcher : public net::TestURLFetcher {
31 public: 34 public:
32 MockOAuthFetcher(int response_code, 35 MockOAuthFetcher(int response_code,
33 int max_failure_count, 36 int max_failure_count,
37 bool complete_immediately,
34 const GURL& url, 38 const GURL& url,
35 const std::string& results, 39 const std::string& results,
36 net::URLFetcher::RequestType request_type, 40 net::URLFetcher::RequestType request_type,
37 net::URLFetcherDelegate* d) 41 net::URLFetcherDelegate* d)
38 : net::TestURLFetcher(0, url, d), 42 : net::TestURLFetcher(0, url, d),
39 max_failure_count_(max_failure_count), 43 max_failure_count_(max_failure_count),
40 current_failure_count_(0) { 44 current_failure_count_(0),
45 complete_immediately_(complete_immediately) {
41 set_url(url); 46 set_url(url);
42 set_response_code(response_code); 47 set_response_code(response_code);
43 SetResponseString(results); 48 SetResponseString(results);
44 } 49 }
45 50
46 virtual ~MockOAuthFetcher() { } 51 virtual ~MockOAuthFetcher() { }
47 52
48 virtual void Start() OVERRIDE { 53 virtual void Start() OVERRIDE {
49 if ((GetResponseCode() != net::HTTP_OK) && (max_failure_count_ != -1) && 54 if ((GetResponseCode() != net::HTTP_OK) && (max_failure_count_ != -1) &&
50 (current_failure_count_ == max_failure_count_)) { 55 (current_failure_count_ == max_failure_count_)) {
51 set_response_code(net::HTTP_OK); 56 set_response_code(net::HTTP_OK);
52 } 57 }
53 58
54 net::URLRequestStatus::Status code = net::URLRequestStatus::SUCCESS; 59 net::URLRequestStatus::Status code = net::URLRequestStatus::SUCCESS;
55 if (GetResponseCode() != net::HTTP_OK) { 60 if (GetResponseCode() != net::HTTP_OK) {
56 code = net::URLRequestStatus::FAILED; 61 code = net::URLRequestStatus::FAILED;
57 current_failure_count_++; 62 current_failure_count_++;
58 } 63 }
59 set_status(net::URLRequestStatus(code, 0)); 64 set_status(net::URLRequestStatus(code, 0));
60 65
66 if (complete_immediately_) {
Mattias Nissler (ping if slow) 2013/06/19 17:53:17 nit: no curlies needed
David Roche 2013/06/20 17:49:29 Done.
67 delegate()->OnURLFetchComplete(this);
68 }
69 }
70
71 void Finish() {
72 ASSERT_FALSE(complete_immediately_);
61 delegate()->OnURLFetchComplete(this); 73 delegate()->OnURLFetchComplete(this);
62 } 74 }
63 75
64 private: 76 private:
65 int max_failure_count_; 77 int max_failure_count_;
66 int current_failure_count_; 78 int current_failure_count_;
79 bool complete_immediately_;
67 DISALLOW_COPY_AND_ASSIGN(MockOAuthFetcher); 80 DISALLOW_COPY_AND_ASSIGN(MockOAuthFetcher);
68 }; 81 };
69 82
70 class MockOAuthFetcherFactory : public net::URLFetcherFactory, 83 class MockOAuthFetcherFactory : public net::URLFetcherFactory,
71 public net::ScopedURLFetcherFactory { 84 public net::ScopedURLFetcherFactory {
72 public: 85 public:
73 MockOAuthFetcherFactory() 86 MockOAuthFetcherFactory()
74 : net::ScopedURLFetcherFactory(this), 87 : net::ScopedURLFetcherFactory(this),
75 response_code_(net::HTTP_OK) { 88 response_code_(net::HTTP_OK),
89 complete_immediately_(true) {
76 } 90 }
77 virtual ~MockOAuthFetcherFactory() {} 91 virtual ~MockOAuthFetcherFactory() {}
78 virtual net::URLFetcher* CreateURLFetcher( 92 virtual net::URLFetcher* CreateURLFetcher(
79 int id, 93 int id,
80 const GURL& url, 94 const GURL& url,
81 net::URLFetcher::RequestType request_type, 95 net::URLFetcher::RequestType request_type,
82 net::URLFetcherDelegate* d) OVERRIDE { 96 net::URLFetcherDelegate* d) OVERRIDE {
83 return new MockOAuthFetcher( 97 url_fetcher_ = new MockOAuthFetcher(
84 response_code_, 98 response_code_,
85 max_failure_count_, 99 max_failure_count_,
100 complete_immediately_,
86 url, 101 url,
87 results_, 102 results_,
88 request_type, 103 request_type,
89 d); 104 d);
105 return url_fetcher_;
90 } 106 }
91 void set_response_code(int response_code) { 107 void set_response_code(int response_code) {
92 response_code_ = response_code; 108 response_code_ = response_code;
93 } 109 }
94 void set_max_failure_count(int count) { 110 void set_max_failure_count(int count) {
95 max_failure_count_ = count; 111 max_failure_count_ = count;
96 } 112 }
97 void set_results(const std::string& results) { 113 void set_results(const std::string& results) {
98 results_ = results; 114 results_ = results;
99 } 115 }
116 MockOAuthFetcher* get_url_fetcher() {
117 return url_fetcher_;
118 }
119 void set_complete_immediately(bool complete_immediately) {
120 complete_immediately_ = complete_immediately;
121 }
100 private: 122 private:
123 MockOAuthFetcher* url_fetcher_;
101 int response_code_; 124 int response_code_;
125 bool complete_immediately_;
102 int max_failure_count_; 126 int max_failure_count_;
103 std::string results_; 127 std::string results_;
104 DISALLOW_COPY_AND_ASSIGN(MockOAuthFetcherFactory); 128 DISALLOW_COPY_AND_ASSIGN(MockOAuthFetcherFactory);
105 }; 129 };
106 130
107 const std::string kTestAccessToken = "1/fFAGRNJru1FTz70BzhT3Zg"; 131 const std::string kTestAccessToken = "1/fFAGRNJru1FTz70BzhT3Zg";
108 const std::string kTestRefreshToken = 132 const std::string kTestRefreshToken =
109 "1/6BMfW9j53gdGImsixUH6kU5RsR4zwI9lUVX-tqf8JXQ"; 133 "1/6BMfW9j53gdGImsixUH6kU5RsR4zwI9lUVX-tqf8JXQ";
110 const std::string kTestUserEmail = "a_user@gmail.com"; 134 const std::string kTestUserEmail = "a_user@gmail.com";
111 const int kTestExpiresIn = 3920; 135 const int kTestExpiresIn = 3920;
112 136
113 const std::string kDummyGetTokensResult = 137 const std::string kDummyGetTokensResult =
114 "{\"access_token\":\"" + kTestAccessToken + "\"," 138 "{\"access_token\":\"" + kTestAccessToken + "\","
115 "\"expires_in\":" + base::IntToString(kTestExpiresIn) + "," 139 "\"expires_in\":" + base::IntToString(kTestExpiresIn) + ","
116 "\"refresh_token\":\"" + kTestRefreshToken + "\"}"; 140 "\"refresh_token\":\"" + kTestRefreshToken + "\"}";
117 141
118 const std::string kDummyRefreshTokenResult = 142 const std::string kDummyRefreshTokenResult =
119 "{\"access_token\":\"" + kTestAccessToken + "\"," 143 "{\"access_token\":\"" + kTestAccessToken + "\","
120 "\"expires_in\":" + base::IntToString(kTestExpiresIn) + "}"; 144 "\"expires_in\":" + base::IntToString(kTestExpiresIn) + "}";
121 145
122 const std::string kDummyUserInfoResult = 146 const std::string kDummyUserInfoResult =
123 "{\"email\":\"" + kTestUserEmail + "\"}"; 147 "{\"email\":\"" + kTestUserEmail + "\"}";
148
149 const std::string kDummyTokenInfoResult =
150 "{\"issued_to\": \"1234567890.apps.googleusercontent.com\","
151 "\"audience\": \"1234567890.apps.googleusercontent.com\","
152 "\"scope\": \"https://googleapis.com/oauth2/v2/tokeninfo\","
153 "\"expires_in\":" + base::IntToString(kTestExpiresIn) + "}";
124 } 154 }
125 155
126 namespace gaia { 156 namespace gaia {
127 157
128 class GaiaOAuthClientTest : public testing::Test { 158 class GaiaOAuthClientTest : public testing::Test {
129 public: 159 public:
130 GaiaOAuthClientTest() {} 160 GaiaOAuthClientTest() {}
161 void SetUp() {
162 client_info_.client_id = "test_client_id";
163 client_info_.client_secret = "test_client_secret";
164 client_info_.redirect_uri = "test_redirect_uri";
165 } OVERRIDE;
131 166
132 TestingProfile profile_; 167 TestingProfile profile_;
133 protected: 168 protected:
134 base::MessageLoop message_loop_; 169 base::MessageLoop message_loop_;
170 OAuthClientInfo client_info_;
135 }; 171 };
136 172
137 class MockGaiaOAuthClientDelegate : public gaia::GaiaOAuthClient::Delegate { 173 class MockGaiaOAuthClientDelegate : public gaia::GaiaOAuthClient::Delegate {
138 public: 174 public:
139 MockGaiaOAuthClientDelegate() {} 175 MockGaiaOAuthClientDelegate() {}
140 ~MockGaiaOAuthClientDelegate() {} 176 ~MockGaiaOAuthClientDelegate() {}
141 177
142 MOCK_METHOD3(OnGetTokensResponse, void(const std::string& refresh_token, 178 MOCK_METHOD3(OnGetTokensResponse, void(const std::string& refresh_token,
143 const std::string& access_token, 179 const std::string& access_token,
144 int expires_in_seconds)); 180 int expires_in_seconds));
145 MOCK_METHOD2(OnRefreshTokenResponse, void(const std::string& access_token, 181 MOCK_METHOD2(OnRefreshTokenResponse, void(const std::string& access_token,
146 int expires_in_seconds)); 182 int expires_in_seconds));
147 MOCK_METHOD1(OnGetUserInfoResponse, void(const std::string& user_email)); 183 MOCK_METHOD1(OnGetUserInfoResponse, void(const std::string& user_email));
148 MOCK_METHOD0(OnOAuthError, void()); 184 MOCK_METHOD0(OnOAuthError, void());
149 MOCK_METHOD1(OnNetworkError, void(int response_code)); 185 MOCK_METHOD1(OnNetworkError, void(int response_code));
186
187 // gMock doesn't like methods that take or return scoped_ptr. A
188 // work-around is to create a mock method that takes a raw ptr, and
189 // override the problematic method to call through to it.
190 // https://groups.google.com/a/chromium.org/d/msg/chromium-dev/01sDxsJ1OYw/I_S 0xCBRF2oJ
191 MOCK_METHOD1(OnGetTokenInfoResponsePtr,
192 void(const DictionaryValue* token_info));
193 virtual void OnGetTokenInfoResponse(scoped_ptr<DictionaryValue> token_info) {
194 token_info_.reset(token_info.release());
195 OnGetTokenInfoResponsePtr(token_info_.get());
196 }
197
198 private:
199 scoped_ptr<DictionaryValue> token_info_;
200 DISALLOW_COPY_AND_ASSIGN(MockGaiaOAuthClientDelegate);
150 }; 201 };
151 202
152 TEST_F(GaiaOAuthClientTest, NetworkFailure) { 203 TEST_F(GaiaOAuthClientTest, NetworkFailure) {
153 int response_code = net::HTTP_INTERNAL_SERVER_ERROR; 204 int response_code = net::HTTP_INTERNAL_SERVER_ERROR;
154 205
155 MockGaiaOAuthClientDelegate delegate; 206 MockGaiaOAuthClientDelegate delegate;
156 EXPECT_CALL(delegate, OnNetworkError(response_code)) 207 EXPECT_CALL(delegate, OnNetworkError(response_code))
157 .Times(1); 208 .Times(1);
158 209
159 TestingProfile profile;
160
161 MockOAuthFetcherFactory factory; 210 MockOAuthFetcherFactory factory;
162 factory.set_response_code(response_code); 211 factory.set_response_code(response_code);
163 factory.set_max_failure_count(4); 212 factory.set_max_failure_count(4);
164 213
165 OAuthClientInfo client_info; 214 GaiaOAuthClient auth(profile_.GetRequestContext());
166 client_info.client_id = "test_client_id"; 215 auth.GetTokensFromAuthCode(client_info_, "auth_code", 2, &delegate);
167 client_info.client_secret = "test_client_secret";
168 client_info.redirect_uri = "test_redirect_uri";
169 GaiaOAuthClient auth(kGaiaOAuth2Url,
170 profile_.GetRequestContext());
171 auth.GetTokensFromAuthCode(client_info, "auth_code", 2, &delegate);
172 } 216 }
173 217
174 TEST_F(GaiaOAuthClientTest, NetworkFailureRecover) { 218 TEST_F(GaiaOAuthClientTest, NetworkFailureRecover) {
175 int response_code = net::HTTP_INTERNAL_SERVER_ERROR; 219 int response_code = net::HTTP_INTERNAL_SERVER_ERROR;
176 220
177 MockGaiaOAuthClientDelegate delegate; 221 MockGaiaOAuthClientDelegate delegate;
178 EXPECT_CALL(delegate, OnGetTokensResponse(kTestRefreshToken, kTestAccessToken, 222 EXPECT_CALL(delegate, OnGetTokensResponse(kTestRefreshToken, kTestAccessToken,
179 kTestExpiresIn)).Times(1); 223 kTestExpiresIn)).Times(1);
180 224
181 TestingProfile profile;
182
183 MockOAuthFetcherFactory factory; 225 MockOAuthFetcherFactory factory;
184 factory.set_response_code(response_code); 226 factory.set_response_code(response_code);
185 factory.set_max_failure_count(4); 227 factory.set_max_failure_count(4);
186 factory.set_results(kDummyGetTokensResult); 228 factory.set_results(kDummyGetTokensResult);
187 229
188 OAuthClientInfo client_info; 230 GaiaOAuthClient auth(profile_.GetRequestContext());
189 client_info.client_id = "test_client_id"; 231 auth.GetTokensFromAuthCode(client_info_, "auth_code", -1, &delegate);
190 client_info.client_secret = "test_client_secret";
191 client_info.redirect_uri = "test_redirect_uri";
192 GaiaOAuthClient auth(kGaiaOAuth2Url,
193 profile_.GetRequestContext());
194 auth.GetTokensFromAuthCode(client_info, "auth_code", -1, &delegate);
195 } 232 }
196 233
197 TEST_F(GaiaOAuthClientTest, OAuthFailure) { 234 TEST_F(GaiaOAuthClientTest, OAuthFailure) {
198 int response_code = net::HTTP_BAD_REQUEST; 235 int response_code = net::HTTP_BAD_REQUEST;
199 236
200 MockGaiaOAuthClientDelegate delegate; 237 MockGaiaOAuthClientDelegate delegate;
201 EXPECT_CALL(delegate, OnOAuthError()).Times(1); 238 EXPECT_CALL(delegate, OnOAuthError()).Times(1);
202 239
203 TestingProfile profile;
204
205 MockOAuthFetcherFactory factory; 240 MockOAuthFetcherFactory factory;
206 factory.set_response_code(response_code); 241 factory.set_response_code(response_code);
207 factory.set_max_failure_count(-1); 242 factory.set_max_failure_count(-1);
208 factory.set_results(kDummyGetTokensResult); 243 factory.set_results(kDummyGetTokensResult);
209 244
210 OAuthClientInfo client_info; 245 GaiaOAuthClient auth(profile_.GetRequestContext());
211 client_info.client_id = "test_client_id"; 246 auth.GetTokensFromAuthCode(client_info_, "auth_code", -1, &delegate);
212 client_info.client_secret = "test_client_secret";
213 client_info.redirect_uri = "test_redirect_uri";
214 GaiaOAuthClient auth(kGaiaOAuth2Url,
215 profile_.GetRequestContext());
216 auth.GetTokensFromAuthCode(client_info, "auth_code", -1, &delegate);
217 } 247 }
218 248
219 249
220 TEST_F(GaiaOAuthClientTest, GetTokensSuccess) { 250 TEST_F(GaiaOAuthClientTest, GetTokensSuccess) {
221 MockGaiaOAuthClientDelegate delegate; 251 MockGaiaOAuthClientDelegate delegate;
222 EXPECT_CALL(delegate, OnGetTokensResponse(kTestRefreshToken, kTestAccessToken, 252 EXPECT_CALL(delegate, OnGetTokensResponse(kTestRefreshToken, kTestAccessToken,
223 kTestExpiresIn)).Times(1); 253 kTestExpiresIn)).Times(1);
224 254
225 TestingProfile profile;
226
227 MockOAuthFetcherFactory factory; 255 MockOAuthFetcherFactory factory;
228 factory.set_results(kDummyGetTokensResult); 256 factory.set_results(kDummyGetTokensResult);
229 257
230 OAuthClientInfo client_info; 258 GaiaOAuthClient auth(profile_.GetRequestContext());
231 client_info.client_id = "test_client_id"; 259 auth.GetTokensFromAuthCode(client_info_, "auth_code", -1, &delegate);
232 client_info.client_secret = "test_client_secret";
233 client_info.redirect_uri = "test_redirect_uri";
234 GaiaOAuthClient auth(kGaiaOAuth2Url,
235 profile_.GetRequestContext());
236 auth.GetTokensFromAuthCode(client_info, "auth_code", -1, &delegate);
237 } 260 }
238 261
239 TEST_F(GaiaOAuthClientTest, RefreshTokenSuccess) { 262 TEST_F(GaiaOAuthClientTest, RefreshTokenSuccess) {
240 MockGaiaOAuthClientDelegate delegate; 263 MockGaiaOAuthClientDelegate delegate;
241 EXPECT_CALL(delegate, OnRefreshTokenResponse(kTestAccessToken, 264 EXPECT_CALL(delegate, OnRefreshTokenResponse(kTestAccessToken,
242 kTestExpiresIn)).Times(1); 265 kTestExpiresIn)).Times(1);
243 266
244 TestingProfile profile; 267 MockOAuthFetcherFactory factory;
268 factory.set_results(kDummyRefreshTokenResult);
269 factory.set_complete_immediately(false);
270
271 GaiaOAuthClient auth(profile_.GetRequestContext());
272 auth.RefreshToken(client_info_, "refresh_token", std::vector<std::string>(),
273 -1, &delegate);
274 EXPECT_THAT(factory.get_url_fetcher()->upload_data(),
275 Not(HasSubstr("scope")));
276 factory.get_url_fetcher()->Finish();
277 }
278
279 TEST_F(GaiaOAuthClientTest, RefreshTokenDownscopingSuccess) {
280 MockGaiaOAuthClientDelegate delegate;
281 EXPECT_CALL(delegate, OnRefreshTokenResponse(kTestAccessToken,
282 kTestExpiresIn)).Times(1);
245 283
246 MockOAuthFetcherFactory factory; 284 MockOAuthFetcherFactory factory;
247 factory.set_results(kDummyRefreshTokenResult); 285 factory.set_results(kDummyRefreshTokenResult);
286 factory.set_complete_immediately(false);
248 287
249 OAuthClientInfo client_info; 288 GaiaOAuthClient auth(profile_.GetRequestContext());
250 client_info.client_id = "test_client_id"; 289 auth.RefreshToken(client_info_, "refresh_token",
251 client_info.client_secret = "test_client_secret"; 290 std::vector<std::string>(1, "scope4test"), -1, &delegate);
252 client_info.redirect_uri = "test_redirect_uri"; 291 EXPECT_THAT(factory.get_url_fetcher()->upload_data(),
253 GaiaOAuthClient auth(kGaiaOAuth2Url, 292 HasSubstr("&scope=scope4test"));
254 profile_.GetRequestContext()); 293 factory.get_url_fetcher()->Finish();
255 auth.RefreshToken(client_info, "refresh_token", -1, &delegate);
256 } 294 }
257 295
296
258 TEST_F(GaiaOAuthClientTest, GetUserInfo) { 297 TEST_F(GaiaOAuthClientTest, GetUserInfo) {
259 MockGaiaOAuthClientDelegate delegate; 298 MockGaiaOAuthClientDelegate delegate;
260 EXPECT_CALL(delegate, OnGetUserInfoResponse(kTestUserEmail)).Times(1); 299 EXPECT_CALL(delegate, OnGetUserInfoResponse(kTestUserEmail)).Times(1);
261 300
262 TestingProfile profile;
263
264 MockOAuthFetcherFactory factory; 301 MockOAuthFetcherFactory factory;
265 factory.set_results(kDummyUserInfoResult); 302 factory.set_results(kDummyUserInfoResult);
266 303
267 OAuthClientInfo client_info; 304 GaiaOAuthClient auth(profile_.GetRequestContext());
268 client_info.client_id = "test_client_id";
269 client_info.client_secret = "test_client_secret";
270 client_info.redirect_uri = "test_redirect_uri";
271 GaiaOAuthClient auth(kGaiaOAuth2Url,
272 profile_.GetRequestContext());
273 auth.GetUserInfo("access_token", 1, &delegate); 305 auth.GetUserInfo("access_token", 1, &delegate);
274 } 306 }
275 307
308 TEST_F(GaiaOAuthClientTest, GetTokenInfo) {
309 const DictionaryValue* captured_result;
310
311 MockGaiaOAuthClientDelegate delegate;
312 EXPECT_CALL(delegate, OnGetTokenInfoResponsePtr(_))
313 .WillOnce(SaveArg<0>(&captured_result));
314
315 MockOAuthFetcherFactory factory;
316 factory.set_results(kDummyTokenInfoResult);
317
318 GaiaOAuthClient auth(profile_.GetRequestContext());
319 auth.GetTokenInfo("access_token", 1, &delegate);
320
321 std::string issued_to;
322 ASSERT_TRUE(captured_result->GetString("issued_to", &issued_to));
323 ASSERT_EQ("1234567890.apps.googleusercontent.com", issued_to);
324 }
325
276 } // namespace gaia 326 } // namespace gaia
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698