| OLD | NEW |
| 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" |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 #include "content/public/test/web_contents_tester.h" | 35 #include "content/public/test/web_contents_tester.h" |
| 36 #include "testing/gtest/include/gtest/gtest.h" | 36 #include "testing/gtest/include/gtest/gtest.h" |
| 37 | 37 |
| 38 namespace { | 38 namespace { |
| 39 | 39 |
| 40 base::FilePath g_temp_history_dir; | 40 base::FilePath g_temp_history_dir; |
| 41 | 41 |
| 42 const int kMoreAccumulationsThanNeededToMaxDailyEngagement = 40; | 42 const int kMoreAccumulationsThanNeededToMaxDailyEngagement = 40; |
| 43 const int kMoreDaysThanNeededToMaxTotalEngagement = 40; | 43 const int kMoreDaysThanNeededToMaxTotalEngagement = 40; |
| 44 const int kMorePeriodsThanNeededToDecayMaxScore = 40; | 44 const int kMorePeriodsThanNeededToDecayMaxScore = 40; |
| 45 const double kMaxRoundingDeviation = 0.0001; |
| 45 | 46 |
| 46 // Waits until a change is observed in site engagement content settings. | 47 // Waits until a change is observed in site engagement content settings. |
| 47 class SiteEngagementChangeWaiter : public content_settings::Observer { | 48 class SiteEngagementChangeWaiter : public content_settings::Observer { |
| 48 public: | 49 public: |
| 49 explicit SiteEngagementChangeWaiter(Profile* profile) : profile_(profile) { | 50 explicit SiteEngagementChangeWaiter(Profile* profile) : profile_(profile) { |
| 50 HostContentSettingsMapFactory::GetForProfile(profile)->AddObserver(this); | 51 HostContentSettingsMapFactory::GetForProfile(profile)->AddObserver(this); |
| 51 } | 52 } |
| 52 ~SiteEngagementChangeWaiter() override { | 53 ~SiteEngagementChangeWaiter() override { |
| 53 HostContentSettingsMapFactory::GetForProfile(profile_)->RemoveObserver( | 54 HostContentSettingsMapFactory::GetForProfile(profile_)->RemoveObserver( |
| 54 this); | 55 this); |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 content::WebContentsTester::For(web_contents()) | 176 content::WebContentsTester::For(web_contents()) |
| 176 ->TestDidNavigate(web_contents()->GetMainFrame(), 1, pending_id, true, | 177 ->TestDidNavigate(web_contents()->GetMainFrame(), 1, pending_id, true, |
| 177 url, transition); | 178 url, transition); |
| 178 EXPECT_EQ(prev_score, service->GetScore(url)); | 179 EXPECT_EQ(prev_score, service->GetScore(url)); |
| 179 } | 180 } |
| 180 | 181 |
| 181 void SetParamValue(SiteEngagementScore::Variation variation, double value) { | 182 void SetParamValue(SiteEngagementScore::Variation variation, double value) { |
| 182 SiteEngagementScore::GetParamValues()[variation].second = value; | 183 SiteEngagementScore::GetParamValues()[variation].second = value; |
| 183 } | 184 } |
| 184 | 185 |
| 186 void AssertInRange(double expected, double actual) { |
| 187 EXPECT_NEAR(expected, actual, kMaxRoundingDeviation); |
| 188 } |
| 189 |
| 185 private: | 190 private: |
| 186 base::ScopedTempDir temp_dir_; | 191 base::ScopedTempDir temp_dir_; |
| 187 }; | 192 }; |
| 188 | 193 |
| 189 TEST_F(SiteEngagementServiceTest, GetMedianEngagement) { | 194 TEST_F(SiteEngagementServiceTest, GetMedianEngagement) { |
| 190 SiteEngagementService* service = SiteEngagementService::Get(profile()); | 195 SiteEngagementService* service = SiteEngagementService::Get(profile()); |
| 191 ASSERT_TRUE(service); | 196 ASSERT_TRUE(service); |
| 192 | 197 |
| 193 GURL url1("http://www.google.com/"); | 198 GURL url1("http://www.google.com/"); |
| 194 GURL url2("https://www.google.com/"); | 199 GURL url2("https://www.google.com/"); |
| (...skipping 754 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 949 GURL url1("https://www.google.com/"); | 954 GURL url1("https://www.google.com/"); |
| 950 GURL url2("https://www.somewhereelse.com/"); | 955 GURL url2("https://www.somewhereelse.com/"); |
| 951 | 956 |
| 952 service->AddPoints(url1, 1.0); | 957 service->AddPoints(url1, 1.0); |
| 953 service->AddPoints(url2, 1.2); | 958 service->AddPoints(url2, 1.2); |
| 954 | 959 |
| 955 current_day += base::TimeDelta::FromDays(7); | 960 current_day += base::TimeDelta::FromDays(7); |
| 956 clock->SetNow(current_day); | 961 clock->SetNow(current_day); |
| 957 std::map<GURL, double> score_map = service->GetScoreMap(); | 962 std::map<GURL, double> score_map = service->GetScoreMap(); |
| 958 EXPECT_EQ(2u, score_map.size()); | 963 EXPECT_EQ(2u, score_map.size()); |
| 959 EXPECT_EQ(0.5, service->GetScore(url1)); | 964 AssertInRange(0.5, service->GetScore(url1)); |
| 960 EXPECT_EQ(0.6, service->GetScore(url2)); | 965 AssertInRange(0.6, service->GetScore(url2)); |
| 961 | 966 |
| 962 service->CleanupEngagementScores(false); | 967 service->CleanupEngagementScores(false); |
| 963 score_map = service->GetScoreMap(); | 968 score_map = service->GetScoreMap(); |
| 964 EXPECT_EQ(1u, score_map.size()); | 969 EXPECT_EQ(1u, score_map.size()); |
| 965 EXPECT_EQ(0, service->GetScore(url1)); | 970 EXPECT_EQ(0, service->GetScore(url1)); |
| 966 EXPECT_EQ(0.6, service->GetScore(url2)); | 971 AssertInRange(0.6, service->GetScore(url2)); |
| 967 } | 972 } |
| 968 | 973 |
| 969 TEST_F(SiteEngagementServiceTest, NavigationAccumulation) { | 974 TEST_F(SiteEngagementServiceTest, NavigationAccumulation) { |
| 970 GURL url("https://www.google.com/"); | 975 GURL url("https://www.google.com/"); |
| 971 | 976 |
| 972 SiteEngagementService* service = SiteEngagementService::Get(profile()); | 977 SiteEngagementService* service = SiteEngagementService::Get(profile()); |
| 973 ASSERT_TRUE(service); | 978 ASSERT_TRUE(service); |
| 974 | 979 |
| 975 // Create the helper manually since it isn't present when a tab isn't created. | 980 // Create the helper manually since it isn't present when a tab isn't created. |
| 976 SiteEngagementService::Helper::CreateForWebContents(web_contents()); | 981 SiteEngagementService::Helper::CreateForWebContents(web_contents()); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1058 history->AddPage(origin2a, yesterday_afternoon, history::SOURCE_BROWSED); | 1063 history->AddPage(origin2a, yesterday_afternoon, history::SOURCE_BROWSED); |
| 1059 engagement->AddPoints(origin2, 5.0); | 1064 engagement->AddPoints(origin2, 5.0); |
| 1060 | 1065 |
| 1061 history->AddPage(origin3, today, history::SOURCE_BROWSED); | 1066 history->AddPage(origin3, today, history::SOURCE_BROWSED); |
| 1062 engagement->AddPoints(origin3, 5.0); | 1067 engagement->AddPoints(origin3, 5.0); |
| 1063 | 1068 |
| 1064 history->AddPage(origin4, yesterday_week, history::SOURCE_BROWSED); | 1069 history->AddPage(origin4, yesterday_week, history::SOURCE_BROWSED); |
| 1065 history->AddPage(origin4a, yesterday_afternoon, history::SOURCE_BROWSED); | 1070 history->AddPage(origin4a, yesterday_afternoon, history::SOURCE_BROWSED); |
| 1066 engagement->AddPoints(origin4, 5.0); | 1071 engagement->AddPoints(origin4, 5.0); |
| 1067 | 1072 |
| 1068 EXPECT_EQ(3.0, engagement->GetScore(origin1)); | 1073 AssertInRange(3.0, engagement->GetScore(origin1)); |
| 1069 EXPECT_EQ(5.0, engagement->GetScore(origin2)); | 1074 AssertInRange(5.0, engagement->GetScore(origin2)); |
| 1070 EXPECT_EQ(5.0, engagement->GetScore(origin3)); | 1075 AssertInRange(5.0, engagement->GetScore(origin3)); |
| 1071 EXPECT_EQ(5.0, engagement->GetScore(origin4)); | 1076 AssertInRange(5.0, engagement->GetScore(origin4)); |
| 1072 | 1077 |
| 1073 { | 1078 { |
| 1074 SiteEngagementChangeWaiter waiter(profile()); | 1079 SiteEngagementChangeWaiter waiter(profile()); |
| 1075 | 1080 |
| 1076 base::CancelableTaskTracker task_tracker; | 1081 base::CancelableTaskTracker task_tracker; |
| 1077 // Expire origin1, origin2, origin2a, and origin4's most recent visit. | 1082 // Expire origin1, origin2, origin2a, and origin4's most recent visit. |
| 1078 history->ExpireHistoryBetween(std::set<GURL>(), yesterday, today, | 1083 history->ExpireHistoryBetween(std::set<GURL>(), yesterday, today, |
| 1079 base::Bind(&base::DoNothing), &task_tracker); | 1084 base::Bind(&base::DoNothing), &task_tracker); |
| 1080 waiter.Wait(); | 1085 waiter.Wait(); |
| 1081 | 1086 |
| 1082 // origin2 is cleaned up because all its urls are deleted. origin1a and | 1087 // origin2 is cleaned up because all its urls are deleted. origin1a and |
| 1083 // origin1b are still in history, but 33% of urls have been deleted, thus | 1088 // origin1b are still in history, but 33% of urls have been deleted, thus |
| 1084 // cutting origin1's score by 1/3. origin3 is untouched. origin4 has 1 URL | 1089 // cutting origin1's score by 1/3. origin3 is untouched. origin4 has 1 URL |
| 1085 // deleted and 1 remaining, but its most recent visit is more than 1 week in | 1090 // deleted and 1 remaining, but its most recent visit is more than 1 week in |
| 1086 // the past. Ensure that its scored is halved, and not decayed further. | 1091 // the past. Ensure that its scored is halved, and not decayed further. |
| 1087 EXPECT_EQ(2, engagement->GetScore(origin1)); | 1092 AssertInRange(2, engagement->GetScore(origin1)); |
| 1088 EXPECT_EQ(0, engagement->GetScore(origin2)); | 1093 EXPECT_EQ(0, engagement->GetScore(origin2)); |
| 1089 EXPECT_EQ(5.0, engagement->GetScore(origin3)); | 1094 AssertInRange(5.0, engagement->GetScore(origin3)); |
| 1090 EXPECT_EQ(2.5, engagement->GetScore(origin4)); | 1095 AssertInRange(2.5, engagement->GetScore(origin4)); |
| 1091 EXPECT_EQ(9.5, engagement->GetTotalEngagementPoints()); | 1096 AssertInRange(9.5, engagement->GetTotalEngagementPoints()); |
| 1092 } | 1097 } |
| 1093 | 1098 |
| 1094 { | 1099 { |
| 1095 SiteEngagementChangeWaiter waiter(profile()); | 1100 SiteEngagementChangeWaiter waiter(profile()); |
| 1096 | 1101 |
| 1097 // Expire origin1a. | 1102 // Expire origin1a. |
| 1098 std::vector<history::ExpireHistoryArgs> expire_list; | 1103 std::vector<history::ExpireHistoryArgs> expire_list; |
| 1099 history::ExpireHistoryArgs args; | 1104 history::ExpireHistoryArgs args; |
| 1100 args.urls.insert(origin1a); | 1105 args.urls.insert(origin1a); |
| 1101 args.SetTimeRangeForOneDay(yesterday_week); | 1106 args.SetTimeRangeForOneDay(yesterday_week); |
| 1102 expire_list.push_back(args); | 1107 expire_list.push_back(args); |
| 1103 | 1108 |
| 1104 base::CancelableTaskTracker task_tracker; | 1109 base::CancelableTaskTracker task_tracker; |
| 1105 history->ExpireHistory(expire_list, base::Bind(&base::DoNothing), | 1110 history->ExpireHistory(expire_list, base::Bind(&base::DoNothing), |
| 1106 &task_tracker); | 1111 &task_tracker); |
| 1107 waiter.Wait(); | 1112 waiter.Wait(); |
| 1108 | 1113 |
| 1109 // origin1's score should be halved again. origin3 and origin4 remain | 1114 // origin1's score should be halved again. origin3 and origin4 remain |
| 1110 // untouched. | 1115 // untouched. |
| 1111 EXPECT_EQ(1, engagement->GetScore(origin1)); | 1116 AssertInRange(1, engagement->GetScore(origin1)); |
| 1112 EXPECT_EQ(0, engagement->GetScore(origin2)); | 1117 EXPECT_EQ(0, engagement->GetScore(origin2)); |
| 1113 EXPECT_EQ(5.0, engagement->GetScore(origin3)); | 1118 AssertInRange(5.0, engagement->GetScore(origin3)); |
| 1114 EXPECT_EQ(2.5, engagement->GetScore(origin4)); | 1119 AssertInRange(2.5, engagement->GetScore(origin4)); |
| 1115 EXPECT_EQ(8.5, engagement->GetTotalEngagementPoints()); | 1120 AssertInRange(8.5, engagement->GetTotalEngagementPoints()); |
| 1116 } | 1121 } |
| 1117 | 1122 |
| 1118 { | 1123 { |
| 1119 SiteEngagementChangeWaiter waiter(profile()); | 1124 SiteEngagementChangeWaiter waiter(profile()); |
| 1120 | 1125 |
| 1121 // Expire origin1b. | 1126 // Expire origin1b. |
| 1122 std::vector<history::ExpireHistoryArgs> expire_list; | 1127 std::vector<history::ExpireHistoryArgs> expire_list; |
| 1123 history::ExpireHistoryArgs args; | 1128 history::ExpireHistoryArgs args; |
| 1124 args.urls.insert(origin1b); | 1129 args.urls.insert(origin1b); |
| 1125 args.SetTimeRangeForOneDay(today); | 1130 args.SetTimeRangeForOneDay(today); |
| 1126 expire_list.push_back(args); | 1131 expire_list.push_back(args); |
| 1127 | 1132 |
| 1128 base::CancelableTaskTracker task_tracker; | 1133 base::CancelableTaskTracker task_tracker; |
| 1129 history->ExpireHistory(expire_list, base::Bind(&base::DoNothing), | 1134 history->ExpireHistory(expire_list, base::Bind(&base::DoNothing), |
| 1130 &task_tracker); | 1135 &task_tracker); |
| 1131 waiter.Wait(); | 1136 waiter.Wait(); |
| 1132 | 1137 |
| 1133 // origin1 should be removed. origin3 and origin4 remain untouched. | 1138 // origin1 should be removed. origin3 and origin4 remain untouched. |
| 1134 EXPECT_EQ(0, engagement->GetScore(origin1)); | 1139 EXPECT_EQ(0, engagement->GetScore(origin1)); |
| 1135 EXPECT_EQ(0, engagement->GetScore(origin2)); | 1140 EXPECT_EQ(0, engagement->GetScore(origin2)); |
| 1136 EXPECT_EQ(5.0, engagement->GetScore(origin3)); | 1141 AssertInRange(5.0, engagement->GetScore(origin3)); |
| 1137 EXPECT_EQ(2.5, engagement->GetScore(origin4)); | 1142 AssertInRange(2.5, engagement->GetScore(origin4)); |
| 1138 EXPECT_EQ(7.5, engagement->GetTotalEngagementPoints()); | 1143 AssertInRange(7.5, engagement->GetTotalEngagementPoints()); |
| 1139 } | 1144 } |
| 1140 } | 1145 } |
| 1141 | 1146 |
| 1142 TEST_F(SiteEngagementServiceTest, EngagementLevel) { | 1147 TEST_F(SiteEngagementServiceTest, EngagementLevel) { |
| 1143 static_assert(SiteEngagementService::ENGAGEMENT_LEVEL_NONE != | 1148 static_assert(SiteEngagementService::ENGAGEMENT_LEVEL_NONE != |
| 1144 SiteEngagementService::ENGAGEMENT_LEVEL_LOW, | 1149 SiteEngagementService::ENGAGEMENT_LEVEL_LOW, |
| 1145 "enum values should not be equal"); | 1150 "enum values should not be equal"); |
| 1146 static_assert(SiteEngagementService::ENGAGEMENT_LEVEL_LOW != | 1151 static_assert(SiteEngagementService::ENGAGEMENT_LEVEL_LOW != |
| 1147 SiteEngagementService::ENGAGEMENT_LEVEL_MEDIUM, | 1152 SiteEngagementService::ENGAGEMENT_LEVEL_MEDIUM, |
| 1148 "enum values should not be equal"); | 1153 "enum values should not be equal"); |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1458 base::Time later_in_day = current_day + base::TimeDelta::FromSeconds(30); | 1463 base::Time later_in_day = current_day + base::TimeDelta::FromSeconds(30); |
| 1459 clock->SetNow(later_in_day); | 1464 clock->SetNow(later_in_day); |
| 1460 service->AddPoints(origin, 3); | 1465 service->AddPoints(origin, 3); |
| 1461 | 1466 |
| 1462 last_engagement_time = base::Time::FromInternalValue( | 1467 last_engagement_time = base::Time::FromInternalValue( |
| 1463 profile()->GetPrefs()->GetInt64(prefs::kSiteEngagementLastUpdateTime)); | 1468 profile()->GetPrefs()->GetInt64(prefs::kSiteEngagementLastUpdateTime)); |
| 1464 | 1469 |
| 1465 EXPECT_EQ(later_in_day, last_engagement_time); | 1470 EXPECT_EQ(later_in_day, last_engagement_time); |
| 1466 EXPECT_EQ(later_in_day, service->GetLastEngagementTime()); | 1471 EXPECT_EQ(later_in_day, service->GetLastEngagementTime()); |
| 1467 } | 1472 } |
| OLD | NEW |