blob: 2ba038ea6c4717e805a6a720c88049103530fd5e [file] [log] [blame]
// Copyright 2018 The Fuchsia 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 "src/cobalt/bin/utils/clock.h"
#include <lib/sys/cpp/testing/component_context_provider.h>
#include <lib/syslog/cpp/macros.h>
#include <zircon/syscalls.h>
#include <zircon/syscalls/clock.h>
#include <future>
#include <optional>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "lib/fidl/cpp/binding_set.h"
#include "lib/gtest/test_loop_fixture.h"
namespace cobalt {
using namespace testing;
class FuchsiaSystemClockTest : public ::gtest::TestLoopFixture {
public:
~FuchsiaSystemClockTest() override = default;
protected:
void SetUp() override {
EXPECT_EQ(ZX_OK, zx::clock::create(0, nullptr, &zircon_clock_));
clock_.reset(new FuchsiaSystemClock(dispatcher(), zircon_clock_.borrow()));
}
void TearDown() override { clock_.reset(); }
void SignalClockStarted() {
zx::clock::update_args args;
args.set_value(zx::time(3000));
EXPECT_EQ(ZX_OK, zircon_clock_.update(args));
}
zx::clock zircon_clock_;
std::unique_ptr<FuchsiaSystemClock> clock_;
};
TEST_F(FuchsiaSystemClockTest, AwaitExternalSourceInitiallyAccurate) {
SignalClockStarted();
bool called = false;
clock_->AwaitExternalSource([&called]() { called = true; });
RunLoopUntilIdle();
EXPECT_TRUE(called);
}
TEST_F(FuchsiaSystemClockTest, AwaitExternalSourceInitiallyInaccurate) {
bool called = false;
clock_->AwaitExternalSource([&called]() { called = true; });
RunLoopUntilIdle();
EXPECT_FALSE(called);
SignalClockStarted();
RunLoopUntilIdle();
EXPECT_TRUE(called);
}
TEST_F(FuchsiaSystemClockTest, NowBeforeInitialized) { EXPECT_EQ(clock_->now(), std::nullopt); }
TEST_F(FuchsiaSystemClockTest, NowAfterInitialized) {
SignalClockStarted();
clock_->AwaitExternalSource([]() {});
RunLoopUntilIdle();
EXPECT_NE(clock_->now(), std::nullopt);
}
// Tests our use of an atomic_bool. We can set |accurate_| true in
// one thread and read it as true in another thread.
TEST_F(FuchsiaSystemClockTest, NowFromAnotherThread) {
SignalClockStarted();
clock_->AwaitExternalSource([]() {});
RunLoopUntilIdle();
EXPECT_NE(std::async(std::launch::async, [this]() { return clock_->now(); }).get(), std::nullopt);
}
} // namespace cobalt