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

Unified Diff: chrome/browser/search/one_google_bar/one_google_bar_service_unittest.cc

Issue 2811353002: Local NTP: Introduce OneGoogleBarService (Closed)
Patch Set: fix memleak 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/search/one_google_bar/one_google_bar_service_observer.h ('k') | chrome/test/BUILD.gn » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/search/one_google_bar/one_google_bar_service_unittest.cc
diff --git a/chrome/browser/search/one_google_bar/one_google_bar_service_unittest.cc b/chrome/browser/search/one_google_bar/one_google_bar_service_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..a4cfe20003fdac2fca1e7ad180cabe818efc5fe2
--- /dev/null
+++ b/chrome/browser/search/one_google_bar/one_google_bar_service_unittest.cc
@@ -0,0 +1,219 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/search/one_google_bar/one_google_bar_service.h"
+
+#include <memory>
+#include <utility>
+#include <vector>
+
+#include "base/macros.h"
+#include "base/memory/ptr_util.h"
+#include "base/optional.h"
+#include "chrome/browser/search/one_google_bar/one_google_bar_data.h"
+#include "chrome/browser/search/one_google_bar/one_google_bar_fetcher.h"
+#include "components/signin/core/browser/account_tracker_service.h"
+#include "components/signin/core/browser/fake_profile_oauth2_token_service.h"
+#include "components/signin/core/browser/fake_signin_manager.h"
+#include "components/signin/core/browser/test_signin_client.h"
+#include "components/sync_preferences/testing_pref_service_syncable.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using testing::Eq;
+using testing::StrictMock;
+
+class FakeOneGoogleBarFetcher : public OneGoogleBarFetcher {
+ public:
+ void Fetch(OneGoogleCallback callback) override {
+ callbacks_.push_back(std::move(callback));
+ }
+
+ size_t GetCallbackCount() const { return callbacks_.size(); }
+
+ void RespondToAllCallbacks(const base::Optional<OneGoogleBarData>& data) {
+ for (OneGoogleCallback& callback : callbacks_) {
+ std::move(callback).Run(data);
+ }
+ callbacks_.clear();
+ }
+
+ private:
+ std::vector<OneGoogleCallback> callbacks_;
+};
+
+class MockOneGoogleBarServiceObserver : public OneGoogleBarServiceObserver {
+ public:
+ MOCK_METHOD0(OnOneGoogleBarDataChanged, void());
+};
+
+class OneGoogleBarServiceTest : public testing::Test {
+ public:
+ OneGoogleBarServiceTest()
+ : signin_client_(&pref_service_),
+ signin_manager_(&signin_client_, &account_tracker_) {
+ SigninManagerBase::RegisterProfilePrefs(pref_service_.registry());
+ SigninManagerBase::RegisterPrefs(pref_service_.registry());
+
+ auto fetcher = base::MakeUnique<FakeOneGoogleBarFetcher>();
+ fetcher_ = fetcher.get();
+ service_ = base::MakeUnique<OneGoogleBarService>(&signin_manager_,
+ std::move(fetcher));
+ }
+
+ FakeOneGoogleBarFetcher* fetcher() { return fetcher_; }
+ OneGoogleBarService* service() { return service_.get(); }
+
+ private:
+ sync_preferences::TestingPrefServiceSyncable pref_service_;
+ TestSigninClient signin_client_;
+ AccountTrackerService account_tracker_;
+ FakeSigninManagerBase signin_manager_;
+
+ // Owned by the service.
+ FakeOneGoogleBarFetcher* fetcher_;
+
+ std::unique_ptr<OneGoogleBarService> service_;
+};
+
+TEST_F(OneGoogleBarServiceTest, RefreshesOnRequest) {
+ ASSERT_THAT(service()->one_google_bar_data(), Eq(base::nullopt));
+
+ // Request a refresh. That should arrive at the fetcher.
+ service()->Refresh();
+ EXPECT_THAT(fetcher()->GetCallbackCount(), Eq(1u));
+
+ // Fulfill it.
+ OneGoogleBarData data;
+ data.bar_html = "<div></div>";
+ fetcher()->RespondToAllCallbacks(data);
+ EXPECT_THAT(service()->one_google_bar_data(), Eq(data));
+
+ // Request another refresh.
+ service()->Refresh();
+ EXPECT_THAT(fetcher()->GetCallbackCount(), Eq(1u));
+
+ // For now, the old data should still be there.
+ EXPECT_THAT(service()->one_google_bar_data(), Eq(data));
+
+ // Fulfill the second request.
+ OneGoogleBarData other_data;
+ other_data.bar_html = "<div>Different!</div>";
+ fetcher()->RespondToAllCallbacks(other_data);
+ EXPECT_THAT(service()->one_google_bar_data(), Eq(other_data));
+}
+
+TEST_F(OneGoogleBarServiceTest, NotifiesObserverOnChanges) {
+ ASSERT_THAT(service()->one_google_bar_data(), Eq(base::nullopt));
+
+ StrictMock<MockOneGoogleBarServiceObserver> observer;
+ service()->AddObserver(&observer);
+
+ // Empty result from a fetch doesn't change anything (it's already empty), so
+ // should not result in a notification.
+ service()->Refresh();
+ fetcher()->RespondToAllCallbacks(base::nullopt);
+
+ // Non-empty response should result in a notification.
+ service()->Refresh();
+ OneGoogleBarData data;
+ data.bar_html = "<div></div>";
+ EXPECT_CALL(observer, OnOneGoogleBarDataChanged());
+ fetcher()->RespondToAllCallbacks(data);
+ EXPECT_THAT(service()->one_google_bar_data(), Eq(data));
+
+ // Non-empty but identical response should not result in another notification.
+ service()->Refresh();
+ OneGoogleBarData identical_data = data;
+ fetcher()->RespondToAllCallbacks(identical_data);
+
+ // Different response should result in a notification.
+ service()->Refresh();
+ OneGoogleBarData other_data;
+ data.bar_html = "<div>Different</div>";
+ EXPECT_CALL(observer, OnOneGoogleBarDataChanged());
+ fetcher()->RespondToAllCallbacks(other_data);
+ EXPECT_THAT(service()->one_google_bar_data(), Eq(other_data));
+
+ // Finally, an empty response should result in a notification now.
+ service()->Refresh();
+ EXPECT_CALL(observer, OnOneGoogleBarDataChanged());
+ fetcher()->RespondToAllCallbacks(base::nullopt);
+ EXPECT_THAT(service()->one_google_bar_data(), Eq(base::nullopt));
+
+ service()->RemoveObserver(&observer);
+}
+
+#if !defined(OS_CHROMEOS)
+
+// Like OneGoogleBarServiceTest, but it has a FakeSigninManager (rather than
+// FakeSigninManagerBase), so it can simulate sign-in and sign-out.
+class OneGoogleBarServiceSignInTest : public testing::Test {
+ public:
+ OneGoogleBarServiceSignInTest()
+ : signin_client_(&pref_service_),
+ signin_manager_(&signin_client_,
+ &token_service_,
+ &account_tracker_,
+ nullptr) {
+ SigninManagerBase::RegisterProfilePrefs(pref_service_.registry());
+ SigninManagerBase::RegisterPrefs(pref_service_.registry());
+ AccountTrackerService::RegisterPrefs(pref_service_.registry());
+
+ account_tracker_.Initialize(&signin_client_);
+
+ auto fetcher = base::MakeUnique<FakeOneGoogleBarFetcher>();
+ fetcher_ = fetcher.get();
+ service_ = base::MakeUnique<OneGoogleBarService>(&signin_manager_,
+ std::move(fetcher));
+ }
+
+ void SignIn() { signin_manager_.SignIn("account", "username", "pass"); }
+ void SignOut() { signin_manager_.ForceSignOut(); }
+
+ FakeOneGoogleBarFetcher* fetcher() { return fetcher_; }
+ OneGoogleBarService* service() { return service_.get(); }
+
+ private:
+ sync_preferences::TestingPrefServiceSyncable pref_service_;
+ TestSigninClient signin_client_;
+ FakeProfileOAuth2TokenService token_service_;
+ AccountTrackerService account_tracker_;
+ FakeSigninManager signin_manager_;
+
+ // Owned by the service.
+ FakeOneGoogleBarFetcher* fetcher_;
+
+ std::unique_ptr<OneGoogleBarService> service_;
+};
+
+TEST_F(OneGoogleBarServiceSignInTest, ResetsOnSignIn) {
+ // Load some data.
+ service()->Refresh();
+ OneGoogleBarData data;
+ data.bar_html = "<div></div>";
+ fetcher()->RespondToAllCallbacks(data);
+ ASSERT_THAT(service()->one_google_bar_data(), Eq(data));
+
+ // Sign in. This should clear the cached data.
+ SignIn();
+ EXPECT_THAT(service()->one_google_bar_data(), Eq(base::nullopt));
+}
+
+TEST_F(OneGoogleBarServiceSignInTest, ResetsOnSignOut) {
+ SignIn();
+
+ // Load some data.
+ service()->Refresh();
+ OneGoogleBarData data;
+ data.bar_html = "<div></div>";
+ fetcher()->RespondToAllCallbacks(data);
+ ASSERT_THAT(service()->one_google_bar_data(), Eq(data));
+
+ // Sign out. This should clear the cached data.
+ SignOut();
+ EXPECT_THAT(service()->one_google_bar_data(), Eq(base::nullopt));
+}
+
+#endif // OS_CHROMEOS
« no previous file with comments | « chrome/browser/search/one_google_bar/one_google_bar_service_observer.h ('k') | chrome/test/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698