Index: chrome/browser/budget_service/budget_database_unittest.cc |
diff --git a/chrome/browser/budget_service/budget_database_unittest.cc b/chrome/browser/budget_service/budget_database_unittest.cc |
index 60132248a4fe9b9ae3b0a2a5900b3e6c19222a8b..5e0a818f56a9e7834797f58efd7fc2bc9f54d238 100644 |
--- a/chrome/browser/budget_service/budget_database_unittest.cc |
+++ b/chrome/browser/budget_service/budget_database_unittest.cc |
@@ -4,6 +4,8 @@ |
#include "chrome/browser/budget_service/budget_database.h" |
+#include <math.h> |
+ |
Peter Beverloo
2017/01/12 14:40:04
style nit: no newline
harkness
2017/01/12 17:44:15
Done.
|
#include <vector> |
#include "base/memory/ptr_util.h" |
@@ -25,8 +27,10 @@ |
namespace { |
-const double kDefaultExpirationInHours = 96; |
-const double kDefaultEngagement = 30.0; |
+const double kDefaultExpirationInDays = 4; |
+const double kDefaultEngagement = 25; |
Peter Beverloo
2017/01/12 14:40:04
Is this true? The amount of bootstrap points in Si
harkness
2017/01/12 17:44:15
That's just the value we set for the purposes of t
|
+const double kMaxDailyBudget = 12; |
+const double kMaxSES = 100; |
Peter Beverloo
2017/01/12 14:40:04
constexpr
Would also be good to document whether
Peter Beverloo
2017/01/12 14:40:04
kMaxSES -> SiteEngagementScore::kMaxPoints
harkness
2017/01/12 17:44:15
Done.
harkness
2017/01/12 17:44:15
Done.
|
const char kTestOrigin[] = "https://example.com"; |
@@ -115,16 +119,19 @@ TEST_F(BudgetDatabaseTest, GetBudgetNoBudgetOrSES) { |
TEST_F(BudgetDatabaseTest, AddEngagementBudgetTest) { |
base::SimpleTestClock* clock = SetClockForTesting(); |
base::Time expiration_time = |
- clock->Now() + base::TimeDelta::FromHours(kDefaultExpirationInHours); |
+ clock->Now() + base::TimeDelta::FromDays(kDefaultExpirationInDays); |
// Set the default site engagement. |
SetSiteEngagementScore(kDefaultEngagement); |
- // The budget should include a full share of the engagement. |
+ // The budget should include kDefaultExpirationInDays days worth of |
+ // engagement. |
+ double daily_budget = kMaxDailyBudget * kDefaultEngagement / kMaxSES; |
GetBudgetDetails(); |
ASSERT_TRUE(success_); |
ASSERT_EQ(2U, prediction_.size()); |
- ASSERT_EQ(kDefaultEngagement, prediction_[0]->budget_at); |
+ ASSERT_DOUBLE_EQ(daily_budget * kDefaultExpirationInDays, |
+ prediction_[0]->budget_at); |
ASSERT_EQ(0, prediction_[1]->budget_at); |
ASSERT_EQ(expiration_time.ToDoubleT(), prediction_[1]->time); |
@@ -135,12 +142,11 @@ TEST_F(BudgetDatabaseTest, AddEngagementBudgetTest) { |
// The budget should now have 1 full share plus 1 daily budget. |
ASSERT_TRUE(success_); |
ASSERT_EQ(3U, prediction_.size()); |
- double daily_budget = kDefaultEngagement * 24 / kDefaultExpirationInHours; |
- ASSERT_DOUBLE_EQ(kDefaultEngagement + daily_budget, |
+ ASSERT_DOUBLE_EQ(daily_budget * (kDefaultExpirationInDays + 1), |
prediction_[0]->budget_at); |
ASSERT_DOUBLE_EQ(daily_budget, prediction_[1]->budget_at); |
ASSERT_EQ(expiration_time.ToDoubleT(), prediction_[1]->time); |
- ASSERT_EQ(0, prediction_[2]->budget_at); |
+ ASSERT_DOUBLE_EQ(0, prediction_[2]->budget_at); |
ASSERT_EQ((expiration_time + base::TimeDelta::FromDays(1)).ToDoubleT(), |
prediction_[2]->time); |
@@ -152,7 +158,7 @@ TEST_F(BudgetDatabaseTest, AddEngagementBudgetTest) { |
// The budget should be the same as before the attempted add. |
ASSERT_TRUE(success_); |
ASSERT_EQ(3U, prediction_.size()); |
- ASSERT_DOUBLE_EQ(kDefaultEngagement + daily_budget, |
+ ASSERT_DOUBLE_EQ(daily_budget * (kDefaultExpirationInDays + 1), |
prediction_[0]->budget_at); |
} |
@@ -169,15 +175,15 @@ TEST_F(BudgetDatabaseTest, SpendBudgetTest) { |
clock->Advance(base::TimeDelta::FromDays(1)); |
GetBudgetDetails(); |
- // Spend an amount of budget less than kDefaultEngagement. |
+ // Spend an amount of budget less than the daily budget. |
ASSERT_TRUE(SpendBudget(1)); |
GetBudgetDetails(); |
- // There should still be three chunks of budget of size kDefaultEngagement-1, |
- // kDefaultEngagement, and kDefaultEngagement. |
+ // There should still be three chunks of budget of size daily_budget-1, |
+ // daily_budget, and kDefaultExpirationInDays * daily_budget. |
+ double daily_budget = kMaxDailyBudget * kDefaultEngagement / kMaxSES; |
ASSERT_EQ(4U, prediction_.size()); |
- double daily_budget = kDefaultEngagement * 24 / kDefaultExpirationInHours; |
- ASSERT_DOUBLE_EQ(kDefaultEngagement + 2 * daily_budget - 1, |
+ ASSERT_DOUBLE_EQ((2 + kDefaultExpirationInDays) * daily_budget - 1, |
prediction_[0]->budget_at); |
ASSERT_DOUBLE_EQ(daily_budget * 2, prediction_[1]->budget_at); |
ASSERT_DOUBLE_EQ(daily_budget, prediction_[2]->budget_at); |
@@ -185,7 +191,7 @@ TEST_F(BudgetDatabaseTest, SpendBudgetTest) { |
// Now spend enough that it will use up the rest of the first chunk and all of |
// the second chunk, but not all of the third chunk. |
- ASSERT_TRUE(SpendBudget(kDefaultEngagement + daily_budget)); |
+ ASSERT_TRUE(SpendBudget((1 + kDefaultExpirationInDays) * daily_budget)); |
GetBudgetDetails(); |
ASSERT_EQ(2U, prediction_.size()); |
ASSERT_DOUBLE_EQ(daily_budget - 1, prediction_[0]->budget_at); |
@@ -199,8 +205,8 @@ TEST_F(BudgetDatabaseTest, SpendBudgetTest) { |
// Advance time until the last remaining chunk should be expired, then query |
// for the full engagement worth of budget. |
- clock->Advance(base::TimeDelta::FromHours(kDefaultExpirationInHours + 1)); |
- EXPECT_TRUE(SpendBudget(kDefaultEngagement)); |
+ clock->Advance(base::TimeDelta::FromDays(kDefaultExpirationInDays + 1)); |
+ EXPECT_TRUE(SpendBudget(daily_budget * kDefaultExpirationInDays)); |
} |
// There are times when a device's clock could move backwards in time, either |
@@ -248,11 +254,11 @@ TEST_F(BudgetDatabaseTest, CheckBackgroundBudgetHistogram) { |
// engagement), 15 budget (half of the engagement), 0 budget (less than an |
// hour), and then after the first two expire, another 30 budget. |
GetBudgetDetails(); |
- clock->Advance(base::TimeDelta::FromHours(kDefaultExpirationInHours / 2)); |
+ clock->Advance(base::TimeDelta::FromDays(kDefaultExpirationInDays / 2)); |
GetBudgetDetails(); |
clock->Advance(base::TimeDelta::FromMinutes(59)); |
GetBudgetDetails(); |
- clock->Advance(base::TimeDelta::FromHours(kDefaultExpirationInHours + 1)); |
+ clock->Advance(base::TimeDelta::FromDays(kDefaultExpirationInDays + 1)); |
GetBudgetDetails(); |
// The BackgroundBudget UMA is recorded when budget is added to the origin. |
@@ -260,20 +266,24 @@ TEST_F(BudgetDatabaseTest, CheckBackgroundBudgetHistogram) { |
std::vector<base::Bucket> buckets = |
GetHistogramTester()->GetAllSamples("PushMessaging.BackgroundBudget"); |
ASSERT_EQ(2U, buckets.size()); |
- // First bucket is for full engagement, which should have 2 entries. |
- EXPECT_EQ(kDefaultEngagement, buckets[0].min); |
+ // First bucket is for full award, which should have 2 entries. |
+ double full_award = |
+ kMaxDailyBudget * kDefaultEngagement / kMaxSES * kDefaultExpirationInDays; |
+ EXPECT_EQ(floor(full_award), buckets[0].min); |
Peter Beverloo
2017/01/12 14:40:04
Out of interest, why is this necessary?
harkness
2017/01/12 17:44:15
The buckets in the histograms have a min set to in
|
EXPECT_EQ(2, buckets[0].count); |
- // Second bucket is for 1.5 * engagement, which should have 1 entry. |
- EXPECT_EQ(kDefaultEngagement * 1.5, buckets[1].min); |
+ // Second bucket is for 1.5 * award, which should have 1 entry. |
+ EXPECT_EQ(floor(full_award * 1.5), buckets[1].min); |
EXPECT_EQ(1, buckets[1].count); |
} |
TEST_F(BudgetDatabaseTest, CheckEngagementHistograms) { |
base::SimpleTestClock* clock = SetClockForTesting(); |
- // Set the engagement to twice the cost of an action. |
+ // Manipulate the engagement so that the budget is twice the cost of an |
+ // action. |
double cost = 2; |
- double engagement = cost * 2; |
+ double engagement = |
+ 2 * cost * kMaxSES / kDefaultExpirationInDays / kMaxDailyBudget; |
SetSiteEngagementScore(engagement); |
// Get the budget, which will award a chunk of budget equal to engagement. |
@@ -300,17 +310,17 @@ TEST_F(BudgetDatabaseTest, CheckEngagementHistograms) { |
std::vector<base::Bucket> no_budget_buckets = |
GetHistogramTester()->GetAllSamples("PushMessaging.SESForNoBudgetOrigin"); |
ASSERT_EQ(2U, no_budget_buckets.size()); |
- EXPECT_EQ(engagement, no_budget_buckets[0].min); |
+ EXPECT_EQ(floor(engagement), no_budget_buckets[0].min); |
EXPECT_EQ(1, no_budget_buckets[0].count); |
- EXPECT_EQ(engagement * 2, no_budget_buckets[1].min); |
+ EXPECT_EQ(floor(engagement * 2), no_budget_buckets[1].min); |
EXPECT_EQ(1, no_budget_buckets[1].count); |
std::vector<base::Bucket> low_budget_buckets = |
GetHistogramTester()->GetAllSamples( |
"PushMessaging.SESForLowBudgetOrigin"); |
ASSERT_EQ(2U, low_budget_buckets.size()); |
- EXPECT_EQ(engagement, low_budget_buckets[0].min); |
+ EXPECT_EQ(floor(engagement), low_budget_buckets[0].min); |
EXPECT_EQ(1, low_budget_buckets[0].count); |
- EXPECT_EQ(engagement * 2, low_budget_buckets[1].min); |
+ EXPECT_EQ(floor(engagement * 2), low_budget_buckets[1].min); |
EXPECT_EQ(1, low_budget_buckets[1].count); |
} |