// Copyright 2019 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chromeos/dbus/power/native_timer.h" #include #include #include "base/memory/ptr_util.h" #include "base/run_loop.h" #include "base/test/task_environment.h" #include "chromeos/dbus/power/fake_power_manager_client.h" #include "chromeos/dbus/power/power_manager_client.h" #include "testing/gtest/include/gtest/gtest.h" namespace chromeos { class NativeTimerTest : public testing::Test { public: NativeTimerTest() : task_environment_(base::test::TaskEnvironment::MainThreadType::IO, base::test::TaskEnvironment::TimeSource::MOCK_TIME) {} NativeTimerTest(const NativeTimerTest&) = delete; NativeTimerTest& operator=(const NativeTimerTest&) = delete; ~NativeTimerTest() override = default; // testing::Test: void SetUp() override { PowerManagerClient::InitializeFake(); FakePowerManagerClient::Get()->set_tick_clock( task_environment_.GetMockTickClock()); } void TearDown() override { PowerManagerClient::Shutdown(); } protected: // Returns true iff |Start| on |timer| succeeds and timer expiration occurs // too. The underlying fake power manager implementation expires the timer bool CheckStartTimerAndExpiration(NativeTimer* timer, base::TimeDelta delay) { base::RunLoop start_timer_loop; base::RunLoop expiration_loop; bool start_timer_result = false; bool expiration_result = false; timer->Start(task_environment_.GetMockTickClock()->NowTicks() + delay, base::BindOnce([](bool* result_out) { *result_out = true; }, &expiration_result), base::BindOnce([](bool* result_out, bool result) { *result_out = result; }, &start_timer_result)); // Both starting the timer and timer firing should succeed. task_environment_.FastForwardBy(delay); if (!start_timer_result) return false; return expiration_result; } base::test::TaskEnvironment task_environment_; }; TEST_F(NativeTimerTest, CheckCreateFailure) { // Create the timer. It queues async operations; enclose it in a run loop. // This should fail internally as an empty tag is provided. base::RunLoop create_timer_loop; NativeTimer timer(""); create_timer_loop.RunUntilIdle(); // Starting the timer should fail as timer creation failed. EXPECT_FALSE(CheckStartTimerAndExpiration(&timer, base::Milliseconds(1000))); } TEST_F(NativeTimerTest, CheckCreateAndStartTimer) { // Create the timer. It queues async operations; enclose it in a run loop. base::RunLoop create_timer_loop; NativeTimer timer("Assistant"); create_timer_loop.RunUntilIdle(); // Start timer and check if starting the timer and its expiration succeeded. EXPECT_TRUE(CheckStartTimerAndExpiration(&timer, base::Milliseconds(1000))); // Start another timer and check if starting the timer and its expiration // succeeded. EXPECT_TRUE(CheckStartTimerAndExpiration(&timer, base::Milliseconds(1000))); } } // namespace chromeos