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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 #include "chrome/browser/engagement/site_engagement_service.h" 5 #include "chrome/browser/engagement/site_engagement_service.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/files/scoped_temp_dir.h" 9 #include "base/files/scoped_temp_dir.h"
10 #include "base/macros.h" 10 #include "base/macros.h"
11 #include "base/memory/ptr_util.h" 11 #include "base/memory/ptr_util.h"
12 #include "base/run_loop.h" 12 #include "base/run_loop.h"
13 #include "base/test/histogram_tester.h" 13 #include "base/test/histogram_tester.h"
14 #include "base/test/simple_test_clock.h" 14 #include "base/test/simple_test_clock.h"
15 #include "base/values.h" 15 #include "base/values.h"
16 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" 16 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
17 #include "chrome/browser/engagement/site_engagement_helper.h" 17 #include "chrome/browser/engagement/site_engagement_helper.h"
18 #include "chrome/browser/engagement/site_engagement_metrics.h" 18 #include "chrome/browser/engagement/site_engagement_metrics.h"
19 #include "chrome/browser/engagement/site_engagement_score.h" 19 #include "chrome/browser/engagement/site_engagement_score.h"
20 #include "chrome/browser/history/history_service_factory.h" 20 #include "chrome/browser/history/history_service_factory.h"
21 #include "chrome/browser/ui/tabs/tab_strip_model.h" 21 #include "chrome/browser/ui/tabs/tab_strip_model.h"
22 #include "chrome/common/chrome_switches.h" 22 #include "chrome/common/chrome_switches.h"
23 #include "chrome/test/base/chrome_render_view_host_test_harness.h" 23 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
24 #include "chrome/test/base/testing_profile.h" 24 #include "chrome/test/base/testing_profile.h"
25 #include "components/content_settings/core/browser/content_settings_observer.h" 25 #include "components/content_settings/core/browser/content_settings_observer.h"
26 #include "components/content_settings/core/browser/host_content_settings_map.h" 26 #include "components/content_settings/core/browser/host_content_settings_map.h"
27 #include "components/history/core/browser/history_database_params.h" 27 #include "components/history/core/browser/history_database_params.h"
28 #include "components/history/core/browser/history_service.h" 28 #include "components/history/core/browser/history_service.h"
29 #include "components/history/core/test/test_history_database.h" 29 #include "components/history/core/test/test_history_database.h"
30 #include "content/public/browser/browser_thread.h"
30 #include "content/public/browser/navigation_entry.h" 31 #include "content/public/browser/navigation_entry.h"
31 #include "content/public/browser/page_navigator.h" 32 #include "content/public/browser/page_navigator.h"
32 #include "content/public/browser/web_contents.h" 33 #include "content/public/browser/web_contents.h"
33 #include "content/public/test/web_contents_tester.h" 34 #include "content/public/test/web_contents_tester.h"
34 #include "testing/gtest/include/gtest/gtest.h" 35 #include "testing/gtest/include/gtest/gtest.h"
35 36
36 namespace { 37 namespace {
37 38
38 base::FilePath g_temp_history_dir; 39 base::FilePath g_temp_history_dir;
39 40
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 std::unique_ptr<KeyedService> BuildTestHistoryService( 91 std::unique_ptr<KeyedService> BuildTestHistoryService(
91 content::BrowserContext* context) { 92 content::BrowserContext* context) {
92 std::unique_ptr<history::HistoryService> service( 93 std::unique_ptr<history::HistoryService> service(
93 new history::HistoryService()); 94 new history::HistoryService());
94 service->Init(history::TestHistoryDatabaseParamsForPath(g_temp_history_dir)); 95 service->Init(history::TestHistoryDatabaseParamsForPath(g_temp_history_dir));
95 return std::move(service); 96 return std::move(service);
96 } 97 }
97 98
98 } // namespace 99 } // namespace
99 100
101 class CallbackTester {
102 public:
103 CallbackTester(const GURL& url, double score)
104 : url_(url), score_(score), callback_called_(false), run_loop_() {}
105
106 void EngagementCallback(const GURL& url, double score) {
107 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
108 EXPECT_EQ(url_, url);
109 EXPECT_EQ(score_, score);
110 set_callback_called(true);
111 run_loop_.Quit();
112 }
113
114 void Wait() { run_loop_.Run(); }
115
116 bool callback_called() { return callback_called_; }
117 void set_callback_called(bool callback_called) {
118 callback_called_ = callback_called;
119 }
120
121 private:
122 GURL url_;
123 double score_;
124 bool callback_called_;
125 base::RunLoop run_loop_;
126
127 DISALLOW_COPY_AND_ASSIGN(CallbackTester);
128 };
129
100 class SiteEngagementServiceTest : public ChromeRenderViewHostTestHarness { 130 class SiteEngagementServiceTest : public ChromeRenderViewHostTestHarness {
101 public: 131 public:
102 void SetUp() override { 132 void SetUp() override {
103 ChromeRenderViewHostTestHarness::SetUp(); 133 ChromeRenderViewHostTestHarness::SetUp();
104 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 134 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
105 g_temp_history_dir = temp_dir_.path(); 135 g_temp_history_dir = temp_dir_.path();
106 HistoryServiceFactory::GetInstance()->SetTestingFactory( 136 HistoryServiceFactory::GetInstance()->SetTestingFactory(
107 profile(), &BuildTestHistoryService); 137 profile(), &BuildTestHistoryService);
108 SiteEngagementScore::SetParamValuesForTesting(); 138 SiteEngagementScore::SetParamValuesForTesting();
109 } 139 }
(...skipping 866 matching lines...) Expand 10 before | Expand all | Expand 10 after
976 EXPECT_TRUE(service->IsEngagementAtLeast( 1006 EXPECT_TRUE(service->IsEngagementAtLeast(
977 url2, SiteEngagementService::ENGAGEMENT_LEVEL_LOW)); 1007 url2, SiteEngagementService::ENGAGEMENT_LEVEL_LOW));
978 EXPECT_TRUE(service->IsEngagementAtLeast( 1008 EXPECT_TRUE(service->IsEngagementAtLeast(
979 url2, SiteEngagementService::ENGAGEMENT_LEVEL_MEDIUM)); 1009 url2, SiteEngagementService::ENGAGEMENT_LEVEL_MEDIUM));
980 EXPECT_TRUE(service->IsEngagementAtLeast( 1010 EXPECT_TRUE(service->IsEngagementAtLeast(
981 url2, SiteEngagementService::ENGAGEMENT_LEVEL_HIGH)); 1011 url2, SiteEngagementService::ENGAGEMENT_LEVEL_HIGH));
982 EXPECT_TRUE(service->IsEngagementAtLeast( 1012 EXPECT_TRUE(service->IsEngagementAtLeast(
983 url2, SiteEngagementService::ENGAGEMENT_LEVEL_MAX)); 1013 url2, SiteEngagementService::ENGAGEMENT_LEVEL_MAX));
984 } 1014 }
985 1015
1016 TEST_F(SiteEngagementServiceTest, RegisterCallbacks) {
1017 base::SimpleTestClock* clock = new base::SimpleTestClock();
1018 std::unique_ptr<SiteEngagementService> service(
1019 new SiteEngagementService(profile(), base::WrapUnique(clock)));
1020
1021 base::Time current_day = GetReferenceTime();
1022 clock->SetNow(current_day);
1023 GURL url_score_1("http://www.google.com/maps");
1024 GURL url_score_2("http://www.google.com/drive");
1025 GURL url_score_3("http://www.google.com/");
1026 GURL url_level_1("http://maps.google.com/");
1027 GURL url_level_2("http://maps.google.com/path");
1028 GURL url_level_3("http://maps.google.com/foo/bar");
1029 GURL url_level_4("http://drive.google.com/");
1030 GURL url_level_5("http://drive.google.com/path");
1031 GURL url_level_6("http://drive.google.com/foo/bar");
1032 GURL url_not_called_1("https://www.google.com/");
1033 GURL url_not_called_2("http://foobar.com/foo/bar");
1034 GURL url_not_called_3("http://maps.google.com.au");
1035
1036 // Register some callbacks that should never be called.
1037 CallbackTester tester_not_called_1(url_not_called_1, 1);
1038 CallbackTester tester_not_called_2(
1039 url_not_called_2, SiteEngagementScore::GetMinimumEngagementIncrement());
1040 CallbackTester tester_not_called_3(url_not_called_1, 5);
1041
1042 service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
1043 base::Unretained(&tester_not_called_1)),
1044 url_not_called_1, 1);
1045 service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
1046 base::Unretained(&tester_not_called_2)),
1047 url_not_called_2,
1048 SiteEngagementService::ENGAGEMENT_LEVEL_LOW);
1049 service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
1050 base::Unretained(&tester_not_called_3)),
1051 url_not_called_3, 5);
1052
1053 // Register a callback for score 0. It should be called immediately with the
1054 // origin as an argument.
1055 {
1056 CallbackTester tester(url_score_3, 0);
1057 service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
1058 base::Unretained(&tester)), url_score_1, 0);
1059 tester.Wait();
1060
1061 EXPECT_TRUE(tester.callback_called());
1062 EXPECT_FALSE(tester_not_called_1.callback_called());
1063 EXPECT_FALSE(tester_not_called_2.callback_called());
1064 EXPECT_FALSE(tester_not_called_3.callback_called());
1065 EXPECT_EQ(3u, service->engagement_callbacks_.size());
1066 }
1067
1068 // Register a callback for score 1.
1069 {
1070 CallbackTester tester(url_score_1, 1);
1071 service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
1072 base::Unretained(&tester)), url_score_1, 1);
1073 service->AddPoints(url_score_1, 1);
1074 tester.Wait();
1075
1076 EXPECT_TRUE(tester.callback_called());
1077 EXPECT_FALSE(tester_not_called_1.callback_called());
1078 EXPECT_FALSE(tester_not_called_2.callback_called());
1079 EXPECT_FALSE(tester_not_called_3.callback_called());
1080 EXPECT_EQ(3u, service->engagement_callbacks_.size());
1081 }
1082
1083 // Register a callback for score 1.5 on a different URL, but same origin.
1084 {
1085 CallbackTester tester(url_score_1, 1.5);
1086 service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
1087 base::Unretained(&tester)), url_score_2, 1.5);
1088 service->AddPoints(url_score_1, 0.25);
1089 EXPECT_FALSE(tester.callback_called());
1090 service->AddPoints(url_score_1, 0.25);
1091 tester.Wait();
1092
1093 EXPECT_TRUE(tester.callback_called());
1094 EXPECT_FALSE(tester_not_called_1.callback_called());
1095 EXPECT_FALSE(tester_not_called_2.callback_called());
1096 EXPECT_FALSE(tester_not_called_3.callback_called());
1097 EXPECT_EQ(3u, service->engagement_callbacks_.size());
1098 }
1099
1100 // Register a callback for score 2.5 on the origin.
1101 {
1102 CallbackTester tester(url_score_3, 2.5);
1103 service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
1104 base::Unretained(&tester)), url_score_1, 2.5);
1105 service->AddPoints(url_score_3, 0.5);
1106 EXPECT_FALSE(tester.callback_called());
1107 service->AddPoints(url_score_3, 0.3);
1108 EXPECT_FALSE(tester.callback_called());
1109 service->AddPoints(url_score_3, 0.2);
1110 tester.Wait();
1111
1112 EXPECT_TRUE(tester.callback_called());
1113 EXPECT_FALSE(tester_not_called_1.callback_called());
1114 EXPECT_FALSE(tester_not_called_2.callback_called());
1115 EXPECT_FALSE(tester_not_called_3.callback_called());
1116 EXPECT_EQ(3u, service->engagement_callbacks_.size());
1117 }
1118
1119 // Register a callback for score 1 on the origin. It should be called
1120 // immediately.
1121 {
1122 CallbackTester tester(url_score_3, 2.5);
1123 service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
1124 base::Unretained(&tester)), url_score_2, 1);
1125 tester.Wait();
1126
1127 EXPECT_TRUE(tester.callback_called());
1128 EXPECT_FALSE(tester_not_called_1.callback_called());
1129 EXPECT_FALSE(tester_not_called_2.callback_called());
1130 EXPECT_FALSE(tester_not_called_3.callback_called());
1131 EXPECT_EQ(3u, service->engagement_callbacks_.size());
1132 }
1133
1134 // Register a callback for score 100 on the origin.
1135 {
1136 CallbackTester tester(url_score_3, 100);
1137 service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
1138 base::Unretained(&tester)), url_score_2, 100);
1139
1140 service->AddPoints(url_score_2, 2.5);
1141 for (int i = 0; i < 18; ++i) {
1142 current_day += base::TimeDelta::FromDays(1);
1143 clock->SetNow(current_day);
1144 service->AddPoints(url_score_1, 5.0);
1145 }
1146
1147 // Last one to tip over 100 engagement.
1148 EXPECT_FALSE(tester.callback_called());
1149 current_day += base::TimeDelta::FromDays(1);
1150 clock->SetNow(current_day);
1151 service->AddPoints(url_score_3, 5.0);
1152 tester.Wait();
1153
1154 EXPECT_TRUE(tester.callback_called());
1155 EXPECT_FALSE(tester_not_called_1.callback_called());
1156 EXPECT_FALSE(tester_not_called_2.callback_called());
1157 EXPECT_FALSE(tester_not_called_3.callback_called());
1158 EXPECT_EQ(3u, service->engagement_callbacks_.size());
1159 }
1160
1161 // Register a callback for level NONE. It should be called immediately.
1162 {
1163 CallbackTester tester(url_level_1, 0);
1164 service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
1165 base::Unretained(&tester)),
1166 url_level_1,
1167 SiteEngagementService::ENGAGEMENT_LEVEL_NONE);
1168 tester.Wait();
1169
1170 EXPECT_TRUE(tester.callback_called());
1171 EXPECT_FALSE(tester_not_called_1.callback_called());
1172 EXPECT_FALSE(tester_not_called_2.callback_called());
1173 EXPECT_FALSE(tester_not_called_3.callback_called());
1174 EXPECT_EQ(3u, service->engagement_callbacks_.size());
1175 }
1176
1177 // Register a callback for level LOW.
1178 {
1179 CallbackTester tester(url_level_2,
1180 SiteEngagementScore::GetMinimumEngagementIncrement());
1181 service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
1182 base::Unretained(&tester)),
1183 url_level_1,
1184 SiteEngagementService::ENGAGEMENT_LEVEL_LOW);
1185 service->AddPoints(url_level_2,
1186 SiteEngagementScore::GetMinimumEngagementIncrement());
1187 tester.Wait();
1188
1189 EXPECT_TRUE(tester.callback_called());
1190 EXPECT_FALSE(tester_not_called_1.callback_called());
1191 EXPECT_FALSE(tester_not_called_2.callback_called());
1192 EXPECT_FALSE(tester_not_called_3.callback_called());
1193 EXPECT_EQ(3u, service->engagement_callbacks_.size());
1194 }
1195
1196 // Register a callback for level MEDIUM.
1197 {
1198 CallbackTester tester(url_level_2,
1199 SiteEngagementScore::GetMediumEngagementBoundary());
1200 service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
1201 base::Unretained(&tester)),
1202 url_level_3,
1203 SiteEngagementService::ENGAGEMENT_LEVEL_MEDIUM);
1204 service->AddPoints(url_level_2, 5.0);
1205 tester.Wait();
1206
1207 EXPECT_TRUE(tester.callback_called());
1208 EXPECT_FALSE(tester_not_called_1.callback_called());
1209 EXPECT_FALSE(tester_not_called_2.callback_called());
1210 EXPECT_FALSE(tester_not_called_3.callback_called());
1211 EXPECT_EQ(3u, service->engagement_callbacks_.size());
1212 }
1213
1214 // Register a callback for level HIGH.
1215 {
1216 CallbackTester tester(url_level_5,
1217 SiteEngagementScore::GetHighEngagementBoundary());
1218 service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
1219 base::Unretained(&tester)),
1220 url_level_4,
1221 SiteEngagementService::ENGAGEMENT_LEVEL_HIGH);
1222 for (int i = 0; i < 9; ++i) {
1223 current_day += base::TimeDelta::FromDays(1);
1224 clock->SetNow(current_day);
1225 service->AddPoints(url_level_4, 5.0);
1226 }
1227 EXPECT_FALSE(tester.callback_called());
1228 current_day += base::TimeDelta::FromDays(1);
1229 clock->SetNow(current_day);
1230 service->AddPoints(url_level_5, 5.0);
1231 tester.Wait();
1232
1233 EXPECT_TRUE(tester.callback_called());
1234 EXPECT_FALSE(tester_not_called_1.callback_called());
1235 EXPECT_FALSE(tester_not_called_2.callback_called());
1236 EXPECT_FALSE(tester_not_called_3.callback_called());
1237 EXPECT_EQ(3u, service->engagement_callbacks_.size());
1238 }
1239
1240 // Register a callback for level MAX.
1241 {
1242 CallbackTester tester(url_level_6, 100);
1243 service->RegisterCallback(base::Bind(&CallbackTester::EngagementCallback,
1244 base::Unretained(&tester)),
1245 url_level_5,
1246 SiteEngagementService::ENGAGEMENT_LEVEL_MAX);
1247 for (int i = 0; i < 9; ++i) {
1248 current_day += base::TimeDelta::FromDays(1);
1249 clock->SetNow(current_day);
1250 service->AddPoints(url_level_4, 5.0);
1251 }
1252 EXPECT_FALSE(tester.callback_called());
1253 current_day += base::TimeDelta::FromDays(1);
1254 clock->SetNow(current_day);
1255 service->AddPoints(url_level_6, 5.0);
1256 tester.Wait();
1257
1258 EXPECT_FALSE(tester_not_called_1.callback_called());
1259 EXPECT_FALSE(tester_not_called_2.callback_called());
1260 EXPECT_FALSE(tester_not_called_3.callback_called());
1261 EXPECT_EQ(3u, service->engagement_callbacks_.size());
1262 }
1263 }
1264
986 TEST_F(SiteEngagementServiceTest, ScoreDecayHistograms) { 1265 TEST_F(SiteEngagementServiceTest, ScoreDecayHistograms) {
987 base::SimpleTestClock* clock = new base::SimpleTestClock(); 1266 base::SimpleTestClock* clock = new base::SimpleTestClock();
988 std::unique_ptr<SiteEngagementService> service( 1267 std::unique_ptr<SiteEngagementService> service(
989 new SiteEngagementService(profile(), base::WrapUnique(clock))); 1268 new SiteEngagementService(profile(), base::WrapUnique(clock)));
990 1269
991 base::Time current_day = GetReferenceTime(); 1270 base::Time current_day = GetReferenceTime();
992 clock->SetNow(current_day); 1271 clock->SetNow(current_day);
993 base::HistogramTester histograms; 1272 base::HistogramTester histograms;
994 GURL origin1("http://www.google.com/"); 1273 GURL origin1("http://www.google.com/");
995 GURL origin2("http://drive.google.com/"); 1274 GURL origin2("http://drive.google.com/");
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1065 0, 2); 1344 0, 2);
1066 1345
1067 // Add more points and ensure no more samples are present. 1346 // Add more points and ensure no more samples are present.
1068 service->AddPoints(origin1, 0.01); 1347 service->AddPoints(origin1, 0.01);
1069 service->AddPoints(origin2, 0.01); 1348 service->AddPoints(origin2, 0.01);
1070 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedFromHistogram, 1349 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedFromHistogram,
1071 4); 1350 4);
1072 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedToHistogram, 1351 histograms.ExpectTotalCount(SiteEngagementMetrics::kScoreDecayedToHistogram,
1073 4); 1352 4);
1074 } 1353 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698