blob: d0b1bb1d743486077e931471b63173d1a7e3584a [file] [log] [blame]
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/feature_engagement/internal/system_time_provider.h"
#include "base/time/time.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace feature_engagement {
namespace {
base::Time GetTime(int year, int month, int day) {
const base::Time::Exploded exploded_time = {
.year = year, .month = month, .day_of_month = day};
base::Time out_time;
EXPECT_TRUE(base::Time::FromUTCExploded(exploded_time, &out_time));
return out_time;
}
// A SystemTimeProvider where the current time can be defined at runtime.
class TestSystemTimeProvider : public SystemTimeProvider {
public:
TestSystemTimeProvider() = default;
TestSystemTimeProvider(const TestSystemTimeProvider&) = delete;
TestSystemTimeProvider& operator=(const TestSystemTimeProvider&) = delete;
// SystemTimeProvider implementation.
base::Time Now() const override { return current_time_; }
void SetCurrentTime(base::Time time) { current_time_ = time; }
private:
base::Time current_time_;
};
class SystemTimeProviderTest : public ::testing::Test {
public:
SystemTimeProviderTest() = default;
SystemTimeProviderTest(const SystemTimeProviderTest&) = delete;
SystemTimeProviderTest& operator=(const SystemTimeProviderTest&) = delete;
protected:
TestSystemTimeProvider time_provider_;
};
} // namespace
TEST_F(SystemTimeProviderTest, EpochIs0Days) {
time_provider_.SetCurrentTime(base::Time::UnixEpoch());
EXPECT_EQ(0u, time_provider_.GetCurrentDay());
}
TEST_F(SystemTimeProviderTest, TestDeltasFromEpoch) {
base::Time epoch = base::Time::UnixEpoch();
time_provider_.SetCurrentTime(epoch + base::Days(1));
EXPECT_EQ(1u, time_provider_.GetCurrentDay());
time_provider_.SetCurrentTime(epoch + base::Days(2));
EXPECT_EQ(2u, time_provider_.GetCurrentDay());
time_provider_.SetCurrentTime(epoch + base::Days(100));
EXPECT_EQ(100u, time_provider_.GetCurrentDay());
}
TEST_F(SystemTimeProviderTest, TestNegativeDeltasFromEpoch) {
base::Time epoch = base::Time::UnixEpoch();
time_provider_.SetCurrentTime(epoch - base::Days(1));
EXPECT_EQ(0u, time_provider_.GetCurrentDay());
time_provider_.SetCurrentTime(epoch - base::Days(2));
EXPECT_EQ(0u, time_provider_.GetCurrentDay());
time_provider_.SetCurrentTime(epoch - base::Days(100));
EXPECT_EQ(0u, time_provider_.GetCurrentDay());
}
TEST_F(SystemTimeProviderTest, TestManualDatesAroundEpoch) {
time_provider_.SetCurrentTime(GetTime(1970, 1, 1));
EXPECT_EQ(0u, time_provider_.GetCurrentDay());
time_provider_.SetCurrentTime(GetTime(1970, 1, 2));
EXPECT_EQ(1u, time_provider_.GetCurrentDay());
time_provider_.SetCurrentTime(GetTime(1970, 4, 11));
EXPECT_EQ(100u, time_provider_.GetCurrentDay());
}
TEST_F(SystemTimeProviderTest, TestManualDatesAroundGoogleIO2017) {
time_provider_.SetCurrentTime(GetTime(2017, 5, 17));
EXPECT_EQ(17303u, time_provider_.GetCurrentDay());
time_provider_.SetCurrentTime(GetTime(2017, 5, 18));
EXPECT_EQ(17304u, time_provider_.GetCurrentDay());
time_provider_.SetCurrentTime(GetTime(2017, 5, 19));
EXPECT_EQ(17305u, time_provider_.GetCurrentDay());
}
} // namespace feature_engagement