blob: 21dc852e2dfd054b3f4627659c08028099aaa9da [file] [log] [blame]
// Copyright 2020 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/app/cobalt_controller_impl.h"
#include <gtest/gtest.h>
namespace cobalt {
// If ListenForInitialized() is invoked before OnSystemClockBecomesAccurate()
// then the callback will not be immediately invoked. But it will later be
// invoked when OnSystemClockBecomesAccurate() is invoked.
TEST(ListenForInitialized, ListenBeforeAccurate) {
CobaltControllerImpl controller_impl(nullptr, nullptr);
fuchsia::cobalt::Controller* controller = &controller_impl;
bool callback_invoked = false;
controller->ListenForInitialized([&callback_invoked]() { callback_invoked = true; });
EXPECT_FALSE(callback_invoked);
controller_impl.OnSystemClockBecomesAccurate();
EXPECT_TRUE(callback_invoked);
}
// If ListenForInitialized() is invoked after OnSystemClockBecomesAccurate()
// is invoked then the callback is immediately invoked.
TEST(ListenForInitialized, ListenAfterAccurate) {
CobaltControllerImpl controller_impl(nullptr, nullptr);
fuchsia::cobalt::Controller* controller = &controller_impl;
bool callback_invoked = false;
controller_impl.OnSystemClockBecomesAccurate();
controller->ListenForInitialized([&callback_invoked]() { callback_invoked = true; });
EXPECT_TRUE(callback_invoked);
}
// Like ListenBeforeAccurate but with many invocatoins of
// ListenForInitialized().
TEST(ListenForInitialized, ListenBeforeAccurateMany) {
CobaltControllerImpl controller_impl(nullptr, nullptr);
fuchsia::cobalt::Controller* controller = &controller_impl;
static const size_t kNumCallbacks = 10;
bool callback_invoked[kNumCallbacks] = {false};
for (auto i = 0; i < kNumCallbacks; i++) {
controller->ListenForInitialized([&invoked = callback_invoked[i]]() { invoked = true; });
}
for (auto i = 0; i < kNumCallbacks; i++) {
EXPECT_FALSE(callback_invoked[i]);
}
controller_impl.OnSystemClockBecomesAccurate();
for (auto i = 0; i < kNumCallbacks; i++) {
EXPECT_TRUE(callback_invoked[i]);
}
}
// Like ListenAfterAccurate but with many invocatoins of
// ListenForInitialized().
TEST(ListenForInitialized, ListenAfterAccurateMany) {
CobaltControllerImpl controller_impl(nullptr, nullptr);
fuchsia::cobalt::Controller* controller = &controller_impl;
controller_impl.OnSystemClockBecomesAccurate();
for (auto i = 0; i < 10; i++) {
bool callback_invoked = false;
controller->ListenForInitialized([&callback_invoked]() { callback_invoked = true; });
EXPECT_TRUE(callback_invoked);
}
}
// Combines all of the previous cases into one more complicated situation
// with multiple invocations of OnSystemClockBecomesAccurate().
TEST(ListenForInitialized, MultipleInterleaved) {
CobaltControllerImpl controller_impl(nullptr, nullptr);
fuchsia::cobalt::Controller* controller = &controller_impl;
static const size_t kNumCallbacks = 10;
bool callback_invoked[kNumCallbacks] = {false};
for (auto i = 0; i < kNumCallbacks; i++) {
controller->ListenForInitialized([&invoked = callback_invoked[i]]() { invoked = true; });
}
for (auto i = 0; i < kNumCallbacks; i++) {
EXPECT_FALSE(callback_invoked[i]);
}
controller_impl.OnSystemClockBecomesAccurate();
controller_impl.OnSystemClockBecomesAccurate();
controller_impl.OnSystemClockBecomesAccurate();
for (auto i = 0; i < kNumCallbacks; i++) {
EXPECT_TRUE(callback_invoked[i]);
}
for (auto i = 0; i < 10; i++) {
bool callback_invoked = false;
controller->ListenForInitialized([&callback_invoked]() { callback_invoked = true; });
EXPECT_TRUE(callback_invoked);
}
controller_impl.OnSystemClockBecomesAccurate();
controller_impl.OnSystemClockBecomesAccurate();
controller_impl.OnSystemClockBecomesAccurate();
for (auto i = 0; i < 10; i++) {
bool callback_invoked = false;
controller->ListenForInitialized([&callback_invoked]() { callback_invoked = true; });
EXPECT_TRUE(callback_invoked);
}
}
} // namespace cobalt