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

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

Issue 2811353002: Local NTP: Introduce OneGoogleBarService (Closed)
Patch Set: . 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_service.h"
6
7 #include <memory>
8 #include <utility>
9 #include <vector>
10
11 #include "base/macros.h"
12 #include "base/memory/ptr_util.h"
13 #include "base/optional.h"
14 #include "chrome/browser/search/one_google_bar/one_google_bar_data.h"
15 #include "chrome/browser/search/one_google_bar/one_google_bar_fetcher.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 "testing/gmock/include/gmock/gmock.h"
22 #include "testing/gtest/include/gtest/gtest.h"
23
24 using testing::Eq;
25 using testing::StrictMock;
26
27 class FakeOneGoogleBarFetcher : public OneGoogleBarFetcher {
28 public:
29 void Fetch(OneGoogleCallback callback) override {
30 callbacks_.push_back(std::move(callback));
31 }
32
33 size_t GetCallbackCount() const { return callbacks_.size(); }
34
35 void RespondToAllCallbacks(const base::Optional<OneGoogleBarData>& data) {
36 for (OneGoogleCallback& callback : callbacks_) {
37 std::move(callback).Run(data);
38 }
39 callbacks_.clear();
40 }
41
42 private:
43 std::vector<OneGoogleCallback> callbacks_;
44 };
45
46 class MockOneGoogleBarServiceObserver : public OneGoogleBarServiceObserver {
47 public:
48 MOCK_METHOD1(OnOneGoogleBarDataChanged,
49 void(const base::Optional<OneGoogleBarData>& data));
50 };
51
52 class OneGoogleBarServiceTest : public testing::Test {
53 public:
54 OneGoogleBarServiceTest()
55 : signin_client_(&pref_service_),
56 signin_manager_(&signin_client_, &account_tracker_) {
57 SigninManagerBase::RegisterProfilePrefs(pref_service_.registry());
58 SigninManagerBase::RegisterPrefs(pref_service_.registry());
59
60 auto fetcher = base::MakeUnique<FakeOneGoogleBarFetcher>();
61 fetcher_ = fetcher.get();
62 service_ = base::MakeUnique<OneGoogleBarService>(&signin_manager_,
63 std::move(fetcher));
64 }
65
66 FakeOneGoogleBarFetcher* fetcher() { return fetcher_; }
67 OneGoogleBarService* service() { return service_.get(); }
68
69 private:
70 sync_preferences::TestingPrefServiceSyncable pref_service_;
71 TestSigninClient signin_client_;
72 AccountTrackerService account_tracker_;
73 FakeSigninManagerBase signin_manager_;
74
75 // Owned by the service.
76 FakeOneGoogleBarFetcher* fetcher_;
77
78 std::unique_ptr<OneGoogleBarService> service_;
79 };
80
81 TEST_F(OneGoogleBarServiceTest, RefreshesOnRequest) {
82 ASSERT_THAT(service()->one_google_bar_data(), Eq(base::nullopt));
83
84 // Request a refresh. That should arrive at the fetcher.
85 service()->Refresh();
86 EXPECT_THAT(fetcher()->GetCallbackCount(), Eq(1u));
87
88 // Fulfill it.
89 OneGoogleBarData data;
90 data.bar_html = "<div></div>";
91 fetcher()->RespondToAllCallbacks(data);
92 EXPECT_THAT(service()->one_google_bar_data(), Eq(data));
93
94 // Request another refresh.
95 service()->Refresh();
96 EXPECT_THAT(fetcher()->GetCallbackCount(), Eq(1u));
97
98 // For now, the old data should still be there.
99 EXPECT_THAT(service()->one_google_bar_data(), Eq(data));
100
101 // Fulfill the second request.
102 OneGoogleBarData other_data;
103 other_data.bar_html = "<div>Different!</div>";
104 fetcher()->RespondToAllCallbacks(other_data);
105 EXPECT_THAT(service()->one_google_bar_data(), Eq(other_data));
106 }
107
108 TEST_F(OneGoogleBarServiceTest, NotifiesObserverOnChanges) {
109 ASSERT_THAT(service()->one_google_bar_data(), Eq(base::nullopt));
110
111 StrictMock<MockOneGoogleBarServiceObserver> observer;
112 service()->AddObserver(&observer);
113
114 // Empty result from a fetch doesn't change anything (it's already empty), so
115 // should not result in a notification.
116 service()->Refresh();
117 fetcher()->RespondToAllCallbacks(base::nullopt);
118
119 // Non-empty response should result in a notification.
120 service()->Refresh();
121 OneGoogleBarData data;
122 data.bar_html = "<div></div>";
123 EXPECT_CALL(observer, OnOneGoogleBarDataChanged(Eq(data)));
124 fetcher()->RespondToAllCallbacks(data);
125
126 // Non-empty but identical response should not result in another notification.
127 service()->Refresh();
128 OneGoogleBarData identical_data = data;
129 fetcher()->RespondToAllCallbacks(identical_data);
130
131 // Different response should result in a notification.
132 service()->Refresh();
133 OneGoogleBarData other_data;
134 data.bar_html = "<div>Different</div>";
135 EXPECT_CALL(observer, OnOneGoogleBarDataChanged(Eq(other_data)));
136 fetcher()->RespondToAllCallbacks(other_data);
137
138 // Finally, an empty response should result in a notification now.
139 service()->Refresh();
140 EXPECT_CALL(observer, OnOneGoogleBarDataChanged(Eq(base::nullopt)));
141 fetcher()->RespondToAllCallbacks(base::nullopt);
142
143 service()->RemoveObserver(&observer);
144 }
145
146 #if !defined(OS_CHROMEOS)
147
148 // Like OneGoogleBarServiceTest, but it has a FakeSigninManager (rather than
149 // FakeSigninManagerBase), so it can simulate sign-in and sign-out.
150 class OneGoogleBarServiceSignInTest : public testing::Test {
151 public:
152 OneGoogleBarServiceSignInTest()
153 : signin_client_(&pref_service_),
154 signin_manager_(&signin_client_,
155 &token_service_,
156 &account_tracker_,
157 nullptr) {
158 SigninManagerBase::RegisterProfilePrefs(pref_service_.registry());
159 SigninManagerBase::RegisterPrefs(pref_service_.registry());
160 AccountTrackerService::RegisterPrefs(pref_service_.registry());
161
162 account_tracker_.Initialize(&signin_client_);
163
164 auto fetcher = base::MakeUnique<FakeOneGoogleBarFetcher>();
165 fetcher_ = fetcher.get();
166 service_ = base::MakeUnique<OneGoogleBarService>(&signin_manager_,
167 std::move(fetcher));
168 }
169
170 void SignIn() { signin_manager_.SignIn("account", "username", "pass"); }
171 void SignOut() { signin_manager_.ForceSignOut(); }
172
173 FakeOneGoogleBarFetcher* fetcher() { return fetcher_; }
174 OneGoogleBarService* service() { return service_.get(); }
175
176 private:
177 sync_preferences::TestingPrefServiceSyncable pref_service_;
178 TestSigninClient signin_client_;
179 FakeProfileOAuth2TokenService token_service_;
180 AccountTrackerService account_tracker_;
181 FakeSigninManager signin_manager_;
182
183 // Owned by the service.
184 FakeOneGoogleBarFetcher* fetcher_;
185
186 std::unique_ptr<OneGoogleBarService> service_;
187 };
188
189 TEST_F(OneGoogleBarServiceSignInTest, ResetsOnSignIn) {
190 // Load some data.
191 service()->Refresh();
192 OneGoogleBarData data;
193 data.bar_html = "<div></div>";
194 fetcher()->RespondToAllCallbacks(data);
195 ASSERT_THAT(service()->one_google_bar_data(), Eq(data));
196
197 // Sign in. This should clear the cached data.
198 SignIn();
199 EXPECT_THAT(service()->one_google_bar_data(), Eq(base::nullopt));
200 }
201
202 TEST_F(OneGoogleBarServiceSignInTest, ResetsOnSignOut) {
203 SignIn();
204
205 // Load some data.
206 service()->Refresh();
207 OneGoogleBarData data;
208 data.bar_html = "<div></div>";
209 fetcher()->RespondToAllCallbacks(data);
210 ASSERT_THAT(service()->one_google_bar_data(), Eq(data));
211
212 // Sign out. This should clear the cached data.
213 SignOut();
214 EXPECT_THAT(service()->one_google_bar_data(), Eq(base::nullopt));
215 }
216
217 #endif // OS_CHROMEOS
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698