blob: ad2da27fa8b89a92fb0149925d3636440d1856ad [file] [log] [blame]
// Copyright 2019 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/ui/scenic/lib/scheduling/delegating_frame_scheduler.h"
#include <gtest/gtest.h>
#include "src/ui/scenic/lib/scheduling/tests/mocks/frame_scheduler_mocks.h"
namespace scheduling {
namespace test {
TEST(DelegatingFrameSchedulerTest, SetNullFrameScheduler_ShouldCrash) {
EXPECT_DEATH_IF_SUPPORTED(
{
DelegatingFrameScheduler delegating_frame_scheduler;
delegating_frame_scheduler.SetFrameScheduler(nullptr);
},
"");
}
TEST(DelegatingFrameSchedulerTest, SecondSetFrameSchedulerAttempt_ShouldCrash) {
DelegatingFrameScheduler delegating_frame_scheduler;
auto frame_scheduler1 = std::make_shared<MockFrameScheduler>();
auto frame_scheduler2 = std::make_shared<MockFrameScheduler>();
delegating_frame_scheduler.SetFrameScheduler(frame_scheduler1);
EXPECT_DEATH_IF_SUPPORTED(delegating_frame_scheduler.SetFrameScheduler(frame_scheduler2), "");
}
TEST(DelegatingFrameSchedulerTest, CallbacksFiredOnInitialization) {
std::shared_ptr<MockFrameScheduler> empty_frame_scheduler;
DelegatingFrameScheduler delegating_frame_scheduler;
auto frame_scheduler1 = std::make_shared<MockFrameScheduler>();
// Set mock method callbacks.
uint32_t num_register_present_callbacks = 0;
scheduling::PresentId last_present_id = 0;
uint32_t num_schedule_update_callbacks = 0;
uint32_t num_set_render_continuosly_callbacks = 0;
uint32_t num_get_future_presentation_infos_callbacks = 0;
uint32_t num_set_on_frame_presented_callback_for_session_callbacks = 0;
{
frame_scheduler1->set_register_present_callback(
[&](SessionId, std::variant<OnPresentedCallback, Present2Info>, std::vector<zx::event>,
PresentId present_id) {
num_register_present_callbacks++;
last_present_id = present_id;
});
frame_scheduler1->set_schedule_update_for_session_callback(
[&](auto...) { num_schedule_update_callbacks++; });
frame_scheduler1->set_set_render_continuously_callback(
[&](auto...) { num_set_render_continuosly_callbacks++; });
frame_scheduler1->set_get_future_presentation_infos_callback(
[&](auto...) -> std::vector<fuchsia::scenic::scheduling::PresentationInfo> {
num_get_future_presentation_infos_callbacks++;
return {};
});
frame_scheduler1->set_set_on_frame_presented_callback_for_session_callback(
[&](auto, auto) { num_set_on_frame_presented_callback_for_session_callbacks++; });
}
const scheduling::SessionId kSessionId = 1;
// Call public methods on the DelegatingFrameScheduler.
const auto present_id1 = delegating_frame_scheduler.RegisterPresent(kSessionId, {}, {});
delegating_frame_scheduler.ScheduleUpdateForSession(
/*presentation_time=*/zx::time(0), {.session_id = kSessionId, .present_id = present_id1});
delegating_frame_scheduler.SetRenderContinuously(true);
delegating_frame_scheduler.GetFuturePresentationInfos(zx::duration(0), [](auto infos) {});
delegating_frame_scheduler.SetOnFramePresentedCallbackForSession(0, [](auto info) {});
EXPECT_EQ(0u, num_register_present_callbacks);
EXPECT_EQ(0u, num_schedule_update_callbacks);
EXPECT_EQ(0u, num_set_render_continuosly_callbacks);
EXPECT_EQ(0u, num_get_future_presentation_infos_callbacks);
EXPECT_EQ(0u, num_set_on_frame_presented_callback_for_session_callbacks);
// Set a frame scheduler, mock method callbacks fired.
delegating_frame_scheduler.SetFrameScheduler(frame_scheduler1);
EXPECT_EQ(1u, num_register_present_callbacks);
EXPECT_NE(last_present_id, 0u);
EXPECT_EQ(1u, num_schedule_update_callbacks);
EXPECT_EQ(1u, num_set_render_continuosly_callbacks);
EXPECT_EQ(1u, num_get_future_presentation_infos_callbacks);
EXPECT_EQ(1u, num_set_on_frame_presented_callback_for_session_callbacks);
}
} // namespace test
} // namespace scheduling