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

Unified Diff: chrome/browser/engagement/site_engagement_service_unittest.cc

Issue 1986033002: Implement an observer interface for the site engagement service. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@site-engagement-refactor
Patch Set: Squash race condition in unit test which leads to a leak Created 4 years, 7 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
Index: chrome/browser/engagement/site_engagement_service_unittest.cc
diff --git a/chrome/browser/engagement/site_engagement_service_unittest.cc b/chrome/browser/engagement/site_engagement_service_unittest.cc
index e43d6d63f38d409f1452d918097426f4ac572b93..77a2f4d91e58768f9cc3d4ae7162515c9730baa3 100644
--- a/chrome/browser/engagement/site_engagement_service_unittest.cc
+++ b/chrome/browser/engagement/site_engagement_service_unittest.cc
@@ -27,6 +27,7 @@
#include "components/history/core/browser/history_database_params.h"
#include "components/history/core/browser/history_service.h"
#include "components/history/core/test/test_history_database.h"
+#include "content/public/browser/browser_thread.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/page_navigator.h"
#include "content/public/browser/web_contents.h"
@@ -97,6 +98,35 @@ std::unique_ptr<KeyedService> BuildTestHistoryService(
} // namespace
+class CallbackTester {
+ public:
+ CallbackTester(const GURL& url, double score)
+ : url_(url), score_(score), callback_called_(false), run_loop_() {}
+
+ void EngagementCallback(const GURL& url, double score) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ EXPECT_EQ(url_, url);
+ EXPECT_EQ(score_, score);
+ set_callback_called(true);
+ run_loop_.Quit();
+ }
+
+ void Wait() { run_loop_.Run(); }
+
+ bool callback_called() { return callback_called_; }
+ void set_callback_called(bool callback_called) {
+ callback_called_ = callback_called;
+ }
+
+ private:
+ GURL url_;
+ double score_;
+ bool callback_called_;
+ base::RunLoop run_loop_;
+
+ DISALLOW_COPY_AND_ASSIGN(CallbackTester);
+};
+
class SiteEngagementServiceTest : public ChromeRenderViewHostTestHarness {
public:
void SetUp() override {
@@ -983,6 +1013,255 @@ TEST_F(SiteEngagementServiceTest, EngagementLevel) {
url2, SiteEngagementService::ENGAGEMENT_LEVEL_MAX));
}
+TEST_F(SiteEngagementServiceTest, RegisterCallbacks) {
+ base::SimpleTestClock* clock = new base::SimpleTestClock();
+ std::unique_ptr<SiteEngagementService> service(
+ new SiteEngagementService(profile(), base::WrapUnique(clock)));
+
+ base::Time current_day = GetReferenceTime();
+ clock->SetNow(current_day);
+ GURL url_score_1("http://www.google.com/maps");
+ GURL url_score_2("http://www.google.com/drive");
+ GURL url_score_3("http://www.google.com/");
+ GURL url_level_1("http://maps.google.com/");
+ GURL url_level_2("http://maps.google.com/path");
+ GURL url_level_3("http://maps.google.com/foo/bar");
+ GURL url_level_4("http://drive.google.com/");
+ GURL url_level_5("http://drive.google.com/path");
+ GURL url_level_6("http://drive.google.com/foo/bar");
+ GURL url_not_called_1("https://www.google.com/");
+ GURL url_not_called_2("http://foobar.com/foo/bar");
+ GURL url_not_called_3("http://maps.google.com.au");
+
+ // Register some callbacks that should never be called.
+ CallbackTester tester_not_called_1(url_not_called_1, 1);
+ CallbackTester tester_not_called_2(
+ url_not_called_2, SiteEngagementScore::GetMinimumEngagementIncrement());
+ CallbackTester tester_not_called_3(url_not_called_1, 5);
+
+ service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
+ base::Unretained(&tester_not_called_1)),
+ url_not_called_1, 1);
+ service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
+ base::Unretained(&tester_not_called_2)),
+ url_not_called_2,
+ SiteEngagementService::ENGAGEMENT_LEVEL_LOW);
+ service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
+ base::Unretained(&tester_not_called_3)),
+ url_not_called_3, 5);
+
+ // Register a callback for score 0. It should be called immediately with the
+ // origin as an argument.
+ {
+ CallbackTester tester(url_score_3, 0);
+ service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
+ base::Unretained(&tester)), url_score_1, 0);
+ tester.Wait();
+
+ EXPECT_TRUE(tester.callback_called());
+ EXPECT_FALSE(tester_not_called_1.callback_called());
+ EXPECT_FALSE(tester_not_called_2.callback_called());
+ EXPECT_FALSE(tester_not_called_3.callback_called());
+ EXPECT_EQ(3u, service->engagement_callbacks_.size());
+ }
+
+ // Register a callback for score 1.
+ {
+ CallbackTester tester(url_score_1, 1);
+ service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
+ base::Unretained(&tester)), url_score_1, 1);
+ service->AddPoints(url_score_1, 1);
+ tester.Wait();
+
+ EXPECT_TRUE(tester.callback_called());
+ EXPECT_FALSE(tester_not_called_1.callback_called());
+ EXPECT_FALSE(tester_not_called_2.callback_called());
+ EXPECT_FALSE(tester_not_called_3.callback_called());
+ EXPECT_EQ(3u, service->engagement_callbacks_.size());
+ }
+
+ // Register a callback for score 1.5 on a different URL, but same origin.
+ {
+ CallbackTester tester(url_score_1, 1.5);
+ service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
+ base::Unretained(&tester)), url_score_2, 1.5);
+ service->AddPoints(url_score_1, 0.25);
+ EXPECT_FALSE(tester.callback_called());
+ service->AddPoints(url_score_1, 0.25);
+ tester.Wait();
+
+ EXPECT_TRUE(tester.callback_called());
+ EXPECT_FALSE(tester_not_called_1.callback_called());
+ EXPECT_FALSE(tester_not_called_2.callback_called());
+ EXPECT_FALSE(tester_not_called_3.callback_called());
+ EXPECT_EQ(3u, service->engagement_callbacks_.size());
+ }
+
+ // Register a callback for score 2.5 on the origin.
+ {
+ CallbackTester tester(url_score_3, 2.5);
+ service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
+ base::Unretained(&tester)), url_score_1, 2.5);
+ service->AddPoints(url_score_3, 0.5);
+ EXPECT_FALSE(tester.callback_called());
+ service->AddPoints(url_score_3, 0.3);
+ EXPECT_FALSE(tester.callback_called());
+ service->AddPoints(url_score_3, 0.2);
+ tester.Wait();
+
+ EXPECT_TRUE(tester.callback_called());
+ EXPECT_FALSE(tester_not_called_1.callback_called());
+ EXPECT_FALSE(tester_not_called_2.callback_called());
+ EXPECT_FALSE(tester_not_called_3.callback_called());
+ EXPECT_EQ(3u, service->engagement_callbacks_.size());
+ }
+
+ // Register a callback for score 1 on the origin. It should be called
+ // immediately.
+ {
+ CallbackTester tester(url_score_3, 2.5);
+ service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
+ base::Unretained(&tester)), url_score_2, 1);
+ tester.Wait();
+
+ EXPECT_TRUE(tester.callback_called());
+ EXPECT_FALSE(tester_not_called_1.callback_called());
+ EXPECT_FALSE(tester_not_called_2.callback_called());
+ EXPECT_FALSE(tester_not_called_3.callback_called());
+ EXPECT_EQ(3u, service->engagement_callbacks_.size());
+ }
+
+ // Register a callback for score 100 on the origin.
+ {
+ CallbackTester tester(url_score_3, 100);
+ service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
+ base::Unretained(&tester)), url_score_2, 100);
+
+ service->AddPoints(url_score_2, 2.5);
+ for (int i = 0; i < 18; ++i) {
+ current_day += base::TimeDelta::FromDays(1);
+ clock->SetNow(current_day);
+ service->AddPoints(url_score_1, 5.0);
+ }
+
+ // Last one to tip over 100 engagement.
+ EXPECT_FALSE(tester.callback_called());
+ current_day += base::TimeDelta::FromDays(1);
+ clock->SetNow(current_day);
+ service->AddPoints(url_score_3, 5.0);
+ tester.Wait();
+
+ EXPECT_TRUE(tester.callback_called());
+ EXPECT_FALSE(tester_not_called_1.callback_called());
+ EXPECT_FALSE(tester_not_called_2.callback_called());
+ EXPECT_FALSE(tester_not_called_3.callback_called());
+ EXPECT_EQ(3u, service->engagement_callbacks_.size());
+ }
+
+ // Register a callback for level NONE. It should be called immediately.
+ {
+ CallbackTester tester(url_level_1, 0);
+ service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
+ base::Unretained(&tester)),
+ url_level_1,
+ SiteEngagementService::ENGAGEMENT_LEVEL_NONE);
+ tester.Wait();
+
+ EXPECT_TRUE(tester.callback_called());
+ EXPECT_FALSE(tester_not_called_1.callback_called());
+ EXPECT_FALSE(tester_not_called_2.callback_called());
+ EXPECT_FALSE(tester_not_called_3.callback_called());
+ EXPECT_EQ(3u, service->engagement_callbacks_.size());
+ }
+
+ // Register a callback for level LOW.
+ {
+ CallbackTester tester(url_level_2,
+ SiteEngagementScore::GetMinimumEngagementIncrement());
+ service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
+ base::Unretained(&tester)),
+ url_level_1,
+ SiteEngagementService::ENGAGEMENT_LEVEL_LOW);
+ service->AddPoints(url_level_2,
+ SiteEngagementScore::GetMinimumEngagementIncrement());
+ tester.Wait();
+
+ EXPECT_TRUE(tester.callback_called());
+ EXPECT_FALSE(tester_not_called_1.callback_called());
+ EXPECT_FALSE(tester_not_called_2.callback_called());
+ EXPECT_FALSE(tester_not_called_3.callback_called());
+ EXPECT_EQ(3u, service->engagement_callbacks_.size());
+ }
+
+ // Register a callback for level MEDIUM.
+ {
+ CallbackTester tester(url_level_2,
+ SiteEngagementScore::GetMediumEngagementBoundary());
+ service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
+ base::Unretained(&tester)),
+ url_level_3,
+ SiteEngagementService::ENGAGEMENT_LEVEL_MEDIUM);
+ service->AddPoints(url_level_2, 5.0);
+ tester.Wait();
+
+ EXPECT_TRUE(tester.callback_called());
+ EXPECT_FALSE(tester_not_called_1.callback_called());
+ EXPECT_FALSE(tester_not_called_2.callback_called());
+ EXPECT_FALSE(tester_not_called_3.callback_called());
+ EXPECT_EQ(3u, service->engagement_callbacks_.size());
+ }
+
+ // Register a callback for level HIGH.
+ {
+ CallbackTester tester(url_level_5,
+ SiteEngagementScore::GetHighEngagementBoundary());
+ service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
+ base::Unretained(&tester)),
+ url_level_4,
+ SiteEngagementService::ENGAGEMENT_LEVEL_HIGH);
+ for (int i = 0; i < 9; ++i) {
+ current_day += base::TimeDelta::FromDays(1);
+ clock->SetNow(current_day);
+ service->AddPoints(url_level_4, 5.0);
+ }
+ EXPECT_FALSE(tester.callback_called());
+ current_day += base::TimeDelta::FromDays(1);
+ clock->SetNow(current_day);
+ service->AddPoints(url_level_5, 5.0);
+ tester.Wait();
+
+ EXPECT_TRUE(tester.callback_called());
+ EXPECT_FALSE(tester_not_called_1.callback_called());
+ EXPECT_FALSE(tester_not_called_2.callback_called());
+ EXPECT_FALSE(tester_not_called_3.callback_called());
+ EXPECT_EQ(3u, service->engagement_callbacks_.size());
+ }
+
+ // Register a callback for level MAX.
+ {
+ CallbackTester tester(url_level_6, 100);
+ service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
+ base::Unretained(&tester)),
+ url_level_5,
+ SiteEngagementService::ENGAGEMENT_LEVEL_MAX);
+ for (int i = 0; i < 9; ++i) {
+ current_day += base::TimeDelta::FromDays(1);
+ clock->SetNow(current_day);
+ service->AddPoints(url_level_4, 5.0);
+ }
+ EXPECT_FALSE(tester.callback_called());
+ current_day += base::TimeDelta::FromDays(1);
+ clock->SetNow(current_day);
+ service->AddPoints(url_level_6, 5.0);
+ tester.Wait();
+
+ EXPECT_FALSE(tester_not_called_1.callback_called());
+ EXPECT_FALSE(tester_not_called_2.callback_called());
+ EXPECT_FALSE(tester_not_called_3.callback_called());
+ EXPECT_EQ(3u, service->engagement_callbacks_.size());
+ }
+}
+
TEST_F(SiteEngagementServiceTest, ScoreDecayHistograms) {
base::SimpleTestClock* clock = new base::SimpleTestClock();
std::unique_ptr<SiteEngagementService> service(

Powered by Google App Engine
This is Rietveld 408576698