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

Side by Side Diff: chrome/browser/search/one_google_bar/one_google_bar_fetcher_impl_unittest.cc

Issue 2814753002: Local NTP: Introduce OneGoogleBarFetcher (Closed)
Patch Set: review1 Created 3 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
OLDNEW
(Empty)
1 // Copyright 2017 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 #include "chrome/browser/search/one_google_bar/one_google_bar_fetcher_impl.h"
6
7 #include "base/macros.h"
8 #include "base/memory/ptr_util.h"
9 #include "base/memory/ref_counted.h"
10 #include "base/message_loop/message_loop.h"
11 #include "base/test/mock_callback.h"
12 #include "base/test/test_simple_task_runner.h"
13 #include "base/time/time.h"
14 #include "chrome/browser/search/one_google_bar/one_google_bar_data.h"
15 #include "components/google/core/browser/google_url_tracker.h"
16 #include "components/signin/core/browser/account_tracker_service.h"
17 #include "components/signin/core/browser/fake_profile_oauth2_token_service.h"
18 #include "components/signin/core/browser/fake_signin_manager.h"
19 #include "components/signin/core/browser/test_signin_client.h"
20 #include "components/sync_preferences/testing_pref_service_syncable.h"
21 #include "google_apis/gaia/fake_oauth2_token_service_delegate.h"
22 #include "net/http/http_request_headers.h"
23 #include "net/http/http_status_code.h"
24 #include "net/url_request/test_url_fetcher_factory.h"
25 #include "net/url_request/url_request_status.h"
26 #include "net/url_request/url_request_test_util.h"
27 #include "testing/gmock/include/gmock/gmock.h"
28 #include "testing/gtest/include/gtest/gtest.h"
29
30 using testing::_;
31 using testing::Eq;
32 using testing::IsEmpty;
33 using testing::SaveArg;
34 using testing::StartsWith;
35
36 namespace {
37
38 const char kMinimalValidResponse[] = R"json({"oneGoogleBar": {
39 "html": { "privateDoNotAccessOrElseSafeHtmlWrappedValue" : "" },
40 "pageHooks": {}
41 }})json";
42
43 // Required to instantiate a GoogleUrlTracker in UNIT_TEST_MODE.
44 class GoogleURLTrackerClientStub : public GoogleURLTrackerClient {
45 public:
46 GoogleURLTrackerClientStub() {}
47 ~GoogleURLTrackerClientStub() override {}
48
49 bool IsBackgroundNetworkingEnabled() override { return true; }
50 PrefService* GetPrefs() override { return nullptr; }
51 net::URLRequestContextGetter* GetRequestContext() override { return nullptr; }
52
53 private:
54 DISALLOW_COPY_AND_ASSIGN(GoogleURLTrackerClientStub);
55 };
56
57 } // namespace
58
59 class OneGoogleBarFetcherImplTest : public testing::Test {
60 public:
61 OneGoogleBarFetcherImplTest()
62 : signin_client_(&pref_service_),
63 signin_manager_(&signin_client_, &account_tracker_),
64 task_runner_(new base::TestSimpleTaskRunner()),
65 request_context_getter_(
66 new net::TestURLRequestContextGetter(task_runner_)),
67 token_service_(base::MakeUnique<FakeOAuth2TokenServiceDelegate>(
68 request_context_getter_.get())),
69 google_url_tracker_(base::MakeUnique<GoogleURLTrackerClientStub>(),
70 GoogleURLTracker::UNIT_TEST_MODE),
71 one_google_bar_fetcher_(&signin_manager_,
72 &token_service_,
73 request_context_getter_.get(),
74 &google_url_tracker_) {
75 SigninManagerBase::RegisterProfilePrefs(pref_service_.registry());
76 SigninManagerBase::RegisterPrefs(pref_service_.registry());
77 }
78
79 void SignIn() {
80 signin_manager_.SignIn("account");
81 token_service_.GetDelegate()->UpdateCredentials("account", "refresh_token");
82 }
83
84 void IssueAccessToken() {
85 token_service_.IssueAllTokensForAccount(
86 "account", "access_token",
87 base::Time::Now() + base::TimeDelta::FromHours(1));
88 }
89
90 void IssueAccessTokenError() {
91 token_service_.IssueErrorForAllPendingRequestsForAccount(
92 "account",
93 GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE));
94 }
95
96 net::TestURLFetcher* GetRunningURLFetcher() {
97 // All created URLFetchers have ID 0 by default.
98 net::TestURLFetcher* url_fetcher = url_fetcher_factory_.GetFetcherByID(0);
99 DCHECK(url_fetcher);
100 return url_fetcher;
101 }
102
103 void RespondWithData(const std::string& data) {
104 net::TestURLFetcher* url_fetcher = GetRunningURLFetcher();
105 url_fetcher->set_status(net::URLRequestStatus());
106 url_fetcher->set_response_code(net::HTTP_OK);
107 url_fetcher->SetResponseString(data);
108 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher);
109 }
110
111 OneGoogleBarFetcherImpl* one_google_bar_fetcher() {
112 return &one_google_bar_fetcher_;
113 }
114
115 private:
116 net::TestURLFetcherFactory url_fetcher_factory_;
117 sync_preferences::TestingPrefServiceSyncable pref_service_;
118
119 TestSigninClient signin_client_;
120 AccountTrackerService account_tracker_;
121 FakeSigninManagerBase signin_manager_;
122
123 scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
124 scoped_refptr<net::TestURLRequestContextGetter> request_context_getter_;
125 FakeProfileOAuth2TokenService token_service_;
126 GoogleURLTracker google_url_tracker_;
127
128 OneGoogleBarFetcherImpl one_google_bar_fetcher_;
129 };
130
131 TEST_F(OneGoogleBarFetcherImplTest, UnauthenticatedRequestReturns) {
132 base::MockCallback<OneGoogleBarFetcher::OneGoogleCallback> callback;
133 one_google_bar_fetcher()->Fetch(callback.Get());
134
135 base::Optional<OneGoogleBarData> data;
136 EXPECT_CALL(callback, Run(_)).WillOnce(SaveArg<0>(&data));
137 RespondWithData(kMinimalValidResponse);
138
139 EXPECT_TRUE(data.has_value());
140 }
141
142 TEST_F(OneGoogleBarFetcherImplTest, AuthenticatedRequestReturns) {
143 SignIn();
144
145 base::MockCallback<OneGoogleBarFetcher::OneGoogleCallback> callback;
146 one_google_bar_fetcher()->Fetch(callback.Get());
147
148 IssueAccessToken();
149
150 base::Optional<OneGoogleBarData> data;
151 EXPECT_CALL(callback, Run(_)).WillOnce(SaveArg<0>(&data));
152 RespondWithData(kMinimalValidResponse);
153
154 EXPECT_TRUE(data.has_value());
155 }
156
157 TEST_F(OneGoogleBarFetcherImplTest, UnauthenticatedRequestHasApiKey) {
158 base::MockCallback<OneGoogleBarFetcher::OneGoogleCallback> callback;
159 one_google_bar_fetcher()->Fetch(callback.Get());
160
161 // The request should have an API key (as a query param).
162 EXPECT_THAT(GetRunningURLFetcher()->GetOriginalURL().query(),
163 StartsWith("key="));
164
165 // But no "Authorization" header.
166 net::HttpRequestHeaders headers;
167 GetRunningURLFetcher()->GetExtraRequestHeaders(&headers);
168 EXPECT_FALSE(headers.HasHeader("Authorization"));
169 }
sfiera 2017/04/13 09:42:51 Looks like we're leaving a request hanging. Is tha
Marc Treib 2017/04/13 10:23:53 You mean, so that it won't mess up other tests? Ye
170
171 TEST_F(OneGoogleBarFetcherImplTest, AuthenticatedRequestHasAuthHeader) {
172 SignIn();
173
174 base::MockCallback<OneGoogleBarFetcher::OneGoogleCallback> callback;
175 one_google_bar_fetcher()->Fetch(callback.Get());
176
177 IssueAccessToken();
178
179 // The request should *not* have an API key (as a query param).
180 EXPECT_THAT(GetRunningURLFetcher()->GetOriginalURL().query(), IsEmpty());
181
182 // It should have an "Authorization" header.
183 net::HttpRequestHeaders headers;
184 GetRunningURLFetcher()->GetExtraRequestHeaders(&headers);
185 EXPECT_TRUE(headers.HasHeader("Authorization"));
186 }
187
188 TEST_F(OneGoogleBarFetcherImplTest,
189 AuthenticatedRequestFallsBackToUnauthenticated) {
190 SignIn();
191
192 base::MockCallback<OneGoogleBarFetcher::OneGoogleCallback> callback;
193 one_google_bar_fetcher()->Fetch(callback.Get());
194
195 IssueAccessTokenError();
196
197 // The request should have fallen back to unauthenticated mode with an API key
198 // (as a query param).
199 EXPECT_THAT(GetRunningURLFetcher()->GetOriginalURL().query(),
200 StartsWith("key="));
201
202 // But no "Authorization" header.
203 net::HttpRequestHeaders headers;
204 GetRunningURLFetcher()->GetExtraRequestHeaders(&headers);
205 EXPECT_FALSE(headers.HasHeader("Authorization"));
206 }
207
208 TEST_F(OneGoogleBarFetcherImplTest, CoalescesMultipleRequests) {
209 // Trigger two requests.
210 base::MockCallback<OneGoogleBarFetcher::OneGoogleCallback> first_callback;
211 one_google_bar_fetcher()->Fetch(first_callback.Get());
212 net::URLFetcher* first_fetcher = GetRunningURLFetcher();
213 base::MockCallback<OneGoogleBarFetcher::OneGoogleCallback> second_callback;
214 one_google_bar_fetcher()->Fetch(second_callback.Get());
215 net::URLFetcher* second_fetcher = GetRunningURLFetcher();
216
217 // Expect that only one fetcher handles both requests.
218 EXPECT_THAT(first_fetcher, Eq(second_fetcher));
219
220 // But both callbacks should get called.
221 base::Optional<OneGoogleBarData> first_data;
222 base::Optional<OneGoogleBarData> second_data;
223
224 EXPECT_CALL(first_callback, Run(_)).WillOnce(SaveArg<0>(&first_data));
225 EXPECT_CALL(second_callback, Run(_)).WillOnce(SaveArg<0>(&second_data));
226
227 RespondWithData(kMinimalValidResponse);
228
229 // Ensure that both requests received a response.
230 EXPECT_TRUE(first_data.has_value());
231 EXPECT_TRUE(second_data.has_value());
232 }
sfiera 2017/04/13 09:42:51 Test with )]}' ? Test that verifies JSON -> OneGo
Marc Treib 2017/04/13 10:23:53 Done.
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698