Chromium Code Reviews| 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 3d34e06663735018885742b6c7005964a3636db7..25a646e231a91035dc1500e43c58a2db9049d8da 100644 |
| --- a/chrome/browser/budget_service/budget_database_unittest.cc |
| +++ b/chrome/browser/budget_service/budget_database_unittest.cc |
| @@ -5,6 +5,7 @@ |
| #include "chrome/browser/budget_service/budget_database.h" |
| #include "base/run_loop.h" |
| +#include "base/test/simple_test_clock.h" |
| #include "base/threading/thread_task_runner_handle.h" |
| #include "chrome/browser/budget_service/budget.pb.h" |
| #include "chrome/test/base/testing_profile.h" |
| @@ -16,13 +17,14 @@ |
| namespace { |
| -const double kDefaultDebt = -0.72; |
| const double kDefaultBudget1 = 1.234; |
| const double kDefaultBudget2 = 2.345; |
| -const double kDefaultExpiration = 3600000000; |
| +const double kDefaultExpirationInHours = 72.0; |
|
Peter Beverloo
2016/08/01 17:33:09
nit: no ".0"
harkness
2016/08/03 11:17:48
Done.
|
| const char kTestOrigin[] = "https://example.com"; |
| +} // namespace |
| + |
| class BudgetDatabaseTest : public ::testing::Test { |
| public: |
| BudgetDatabaseTest() |
| @@ -30,49 +32,23 @@ class BudgetDatabaseTest : public ::testing::Test { |
| db_(profile_.GetPath().Append(FILE_PATH_LITERAL("BudgetDabase")), |
| base::ThreadTaskRunnerHandle::Get()) {} |
| - void SetBudgetComplete(base::Closure run_loop_closure, bool success) { |
| - success_ = success; |
| - run_loop_closure.Run(); |
| - } |
| - |
| - // Set up basic default values. |
| - bool SetBudgetWithDefaultValues() { |
| - budget_service::Budget budget; |
| - budget.set_debt(kDefaultDebt); |
| - |
| - // Create two chunks and give them default values. |
| - budget_service::BudgetChunk* budget_chunk = budget.add_budget(); |
| - budget_chunk->set_amount(kDefaultBudget1); |
| - budget_chunk->set_expiration(kDefaultExpiration); |
| - budget_chunk = budget.add_budget(); |
| - budget_chunk->set_amount(kDefaultBudget2); |
| - budget_chunk->set_expiration(kDefaultExpiration + 1); |
| - |
| - base::RunLoop run_loop; |
| - db_.SetValue(GURL(kTestOrigin), budget, |
| - base::Bind(&BudgetDatabaseTest::SetBudgetComplete, |
| - base::Unretained(this), run_loop.QuitClosure())); |
| - run_loop.Run(); |
| - |
| - return success_; |
| - } |
| + // The BudgetDatabase assumes that a budget will always be queried before it |
| + // is written to. Use GetBudgetDetails() to pre-populate the cache. |
| + void SetUp() override { GetBudgetDetails(); } |
| - void GetBudgetComplete(base::Closure run_loop_closure, |
| - bool success, |
| - std::unique_ptr<budget_service::Budget> budget) { |
| - budget_ = std::move(budget); |
| + void AddBudgetComplete(base::Closure run_loop_closure, bool success) { |
| success_ = success; |
| run_loop_closure.Run(); |
| } |
| - // Excercise the very basic get method. |
| - std::unique_ptr<budget_service::Budget> GetBudget() { |
| + // Add budget to the origin. |
| + bool AddBudget(const GURL& origin, double amount) { |
| base::RunLoop run_loop; |
| - db_.GetValue(GURL(kTestOrigin), |
| - base::Bind(&BudgetDatabaseTest::GetBudgetComplete, |
| - base::Unretained(this), run_loop.QuitClosure())); |
| + db_.AddBudget(origin, amount, |
| + base::Bind(&BudgetDatabaseTest::AddBudgetComplete, |
| + base::Unretained(this), run_loop.QuitClosure())); |
| run_loop.Run(); |
| - return std::move(budget_); |
| + return success_; |
| } |
| void GetBudgetDetailsComplete( |
| @@ -86,6 +62,7 @@ class BudgetDatabaseTest : public ::testing::Test { |
| run_loop_closure.Run(); |
| } |
| + // Get the full set of budget expectations for the origin. |
| void GetBudgetDetails() { |
| base::RunLoop run_loop; |
| db_.GetBudgetDetails( |
| @@ -100,6 +77,13 @@ class BudgetDatabaseTest : public ::testing::Test { |
| return expectation_; |
| } |
| + // Setup a test clock so that the tests can control time. |
| + base::SimpleTestClock* SetClockForTesting() { |
| + base::SimpleTestClock* clock = new base::SimpleTestClock(); |
| + db_.SetClockForTesting(base::WrapUnique(clock)); |
| + return clock; |
| + } |
| + |
| protected: |
| bool success_; |
| @@ -113,18 +97,19 @@ class BudgetDatabaseTest : public ::testing::Test { |
| }; |
| TEST_F(BudgetDatabaseTest, ReadAndWriteTest) { |
| - ASSERT_TRUE(SetBudgetWithDefaultValues()); |
| - std::unique_ptr<budget_service::Budget> b = GetBudget(); |
| - |
| - ASSERT_TRUE(success_); |
| - EXPECT_EQ(kDefaultDebt, b->debt()); |
| - EXPECT_EQ(kDefaultBudget1, b->budget(0).amount()); |
| - EXPECT_EQ(kDefaultBudget2, b->budget(1).amount()); |
| - EXPECT_EQ(kDefaultExpiration, b->budget(0).expiration()); |
| -} |
| - |
| -TEST_F(BudgetDatabaseTest, BudgetDetailsTest) { |
| - ASSERT_TRUE(SetBudgetWithDefaultValues()); |
| + const GURL origin(kTestOrigin); |
| + base::SimpleTestClock* clock = SetClockForTesting(); |
| + base::TimeDelta expiration( |
| + base::TimeDelta::FromHours(kDefaultExpirationInHours)); |
| + base::Time expiration_time = clock->Now() + expiration; |
| + |
| + // Add two budget chunks with different expirations (default expiration and |
| + // default expiration + 1 day). |
| + ASSERT_TRUE(AddBudget(origin, kDefaultBudget1)); |
| + clock->Advance(base::TimeDelta::FromDays(1)); |
| + ASSERT_TRUE(AddBudget(origin, kDefaultBudget2)); |
| + |
| + // Get the budget. |
| GetBudgetDetails(); |
| // Get the expectation and validate it. |
| @@ -138,18 +123,17 @@ TEST_F(BudgetDatabaseTest, BudgetDetailsTest) { |
| // First value should be [total_budget, now] |
| EXPECT_EQ(kDefaultBudget1 + kDefaultBudget2, iter->first); |
| // TODO(harkness): This will be "now" in the final version. For now, it's |
| - // just 0.0. |
| + // just 0. |
| EXPECT_EQ(0, iter->second); |
| // The next value should be the budget after the first chunk expires. |
| iter++; |
| EXPECT_EQ(kDefaultBudget2, iter->first); |
| - EXPECT_EQ(kDefaultExpiration, iter->second); |
| + EXPECT_EQ(expiration_time.ToInternalValue(), iter->second); |
| // The final value gives the budget of 0.0 after the second chunk expires. |
| + expiration_time += base::TimeDelta::FromDays(1); |
| iter++; |
| EXPECT_EQ(0, iter->first); |
| - EXPECT_EQ(kDefaultExpiration + 1, iter->second); |
| + EXPECT_EQ(expiration_time.ToInternalValue(), iter->second); |
| } |
| - |
| -} // namespace |