| // 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 <memory> |
| #include <utility> |
| |
| #include "base/memory/ptr_util.h" |
| #include "base/run_loop.h" |
| #include "base/test/scoped_task_environment.h" |
| #include "chromeos/dbus/power/power_manager_client.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace chromeos { |
| |
| namespace { |
| |
| // Returns true iff |Start| on |timer| succeeds and timer expiration occurs too. |
| // The underlying fake power manager implementation expires the timer |
| // immediately and the test doesn't sleep. |
| bool CheckStartTimerAndExpiration(NativeTimer* timer, |
| base::TimeTicks absolute_expiration_ticks) { |
| base::RunLoop start_timer_loop; |
| base::RunLoop expiration_loop; |
| bool start_timer_result = false; |
| bool expiration_result = false; |
| timer->Start( |
| absolute_expiration_ticks, |
| base::BindOnce( |
| [](bool* result_out, base::OnceClosure quit_closure) { |
| *result_out = true; |
| std::move(quit_closure).Run(); |
| }, |
| &expiration_result, expiration_loop.QuitClosure()), |
| base::BindOnce( |
| [](bool* result_out, base::OnceClosure quit_closure, bool result) { |
| *result_out = result; |
| std::move(quit_closure).Run(); |
| }, |
| &start_timer_result, start_timer_loop.QuitClosure())); |
| start_timer_loop.Run(); |
| if (!start_timer_result) { |
| return false; |
| } |
| |
| // Run until timer expiration and check for the result. |
| expiration_loop.Run(); |
| if (!expiration_result) { |
| return false; |
| } |
| return true; |
| } |
| |
| } // namespace |
| |
| class NativeTimerTest : public testing::Test { |
| public: |
| NativeTimerTest() |
| : scoped_task_environment_( |
| base::test::ScopedTaskEnvironment::MainThreadType::IO) {} |
| |
| ~NativeTimerTest() override = default; |
| |
| // testing::Test: |
| void SetUp() override { PowerManagerClient::InitializeFake(); } |
| |
| void TearDown() override { PowerManagerClient::Shutdown(); } |
| |
| protected: |
| base::test::ScopedTaskEnvironment scoped_task_environment_; |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(NativeTimerTest); |
| }; |
| |
| 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::TimeTicks() + base::TimeDelta::FromMilliseconds(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::TimeTicks() + base::TimeDelta::FromMilliseconds(1000))); |
| |
| // Start another timer and check if starting the timer and its expiration |
| // succeeded. |
| EXPECT_TRUE(CheckStartTimerAndExpiration( |
| &timer, base::TimeTicks() + base::TimeDelta::FromMilliseconds(1000))); |
| } |
| |
| } // namespace chromeos |