blob: ebcb9d8736c14a8963cb328fc4c6b376b3e15ef0 [file] [log] [blame]
Ana Krulec0c8cd522018-08-31 12:27:28 -07001#undef LOG_TAG
2#define LOG_TAG "SchedulerUnittests"
3
4#include <gmock/gmock.h>
5#include <gtest/gtest.h>
Ana Krulec0c8cd522018-08-31 12:27:28 -07006#include <log/log.h>
7
Ana Krulece588e312018-09-18 12:32:24 -07008#include <mutex>
9
Ana Krulece588e312018-09-18 12:32:24 -070010#include "Scheduler/EventControlThread.h"
Ana Krulec0c8cd522018-08-31 12:27:28 -070011#include "Scheduler/EventThread.h"
Dominik Laskowski98041832019-08-01 18:35:59 -070012#include "TestableScheduler.h"
Ana Krulec0c8cd522018-08-31 12:27:28 -070013#include "mock/MockEventThread.h"
14
15using testing::_;
16using testing::Return;
17
18namespace android {
19
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -080020constexpr PhysicalDisplayId PHYSICAL_DISPLAY_ID = 999;
21
Ana Krulec0c8cd522018-08-31 12:27:28 -070022class SchedulerTest : public testing::Test {
23protected:
Ana Krulec85c39af2018-12-26 17:29:57 -080024 class MockEventThreadConnection : public android::EventThreadConnection {
Ana Krulec0c8cd522018-08-31 12:27:28 -070025 public:
Ana Krulec85c39af2018-12-26 17:29:57 -080026 explicit MockEventThreadConnection(EventThread* eventThread)
Ady Abraham0f4a1b12019-06-04 16:04:04 -070027 : EventThreadConnection(eventThread, ResyncCallback(),
28 ISurfaceComposer::eConfigChangedSuppress) {}
Ana Krulec0c8cd522018-08-31 12:27:28 -070029 ~MockEventThreadConnection() = default;
30
31 MOCK_METHOD1(stealReceiveChannel, status_t(gui::BitTube* outChannel));
32 MOCK_METHOD1(setVsyncRate, status_t(uint32_t count));
33 MOCK_METHOD0(requestNextVsync, void());
34 };
35
Ana Krulec0c8cd522018-08-31 12:27:28 -070036 SchedulerTest();
37 ~SchedulerTest() override;
38
Dominik Laskowski98041832019-08-01 18:35:59 -070039 scheduler::RefreshRateConfigs mRefreshRateConfigs;
40 TestableScheduler mScheduler{mRefreshRateConfigs};
41
42 Scheduler::ConnectionHandle mConnectionHandle;
Ana Krulec0c8cd522018-08-31 12:27:28 -070043 mock::EventThread* mEventThread;
Ana Krulec0c8cd522018-08-31 12:27:28 -070044 sp<MockEventThreadConnection> mEventThreadConnection;
Ana Krulec0c8cd522018-08-31 12:27:28 -070045};
46
47SchedulerTest::SchedulerTest() {
48 const ::testing::TestInfo* const test_info =
49 ::testing::UnitTest::GetInstance()->current_test_info();
50 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
51
Dominik Laskowski98041832019-08-01 18:35:59 -070052 auto eventThread = std::make_unique<mock::EventThread>();
Ana Krulec0c8cd522018-08-31 12:27:28 -070053 mEventThread = eventThread.get();
Ana Krulec85c39af2018-12-26 17:29:57 -080054 EXPECT_CALL(*mEventThread, registerDisplayEventConnection(_)).WillOnce(Return(0));
55
56 mEventThreadConnection = new MockEventThreadConnection(mEventThread);
Ana Krulec0c8cd522018-08-31 12:27:28 -070057
58 // createConnection call to scheduler makes a createEventConnection call to EventThread. Make
59 // sure that call gets executed and returns an EventThread::Connection object.
Ady Abraham0f4a1b12019-06-04 16:04:04 -070060 EXPECT_CALL(*mEventThread, createEventConnection(_, _))
Ana Krulec0c8cd522018-08-31 12:27:28 -070061 .WillRepeatedly(Return(mEventThreadConnection));
62
Dominik Laskowski98041832019-08-01 18:35:59 -070063 mConnectionHandle = mScheduler.createConnection(std::move(eventThread));
64 EXPECT_TRUE(mConnectionHandle);
Ana Krulec0c8cd522018-08-31 12:27:28 -070065}
66
67SchedulerTest::~SchedulerTest() {
68 const ::testing::TestInfo* const test_info =
69 ::testing::UnitTest::GetInstance()->current_test_info();
70 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
71}
72
73namespace {
74/* ------------------------------------------------------------------------
75 * Test cases
76 */
Ana Krulec0c8cd522018-08-31 12:27:28 -070077
Ana Krulec0c8cd522018-08-31 12:27:28 -070078TEST_F(SchedulerTest, invalidConnectionHandle) {
Dominik Laskowski98041832019-08-01 18:35:59 -070079 Scheduler::ConnectionHandle handle;
Ana Krulec0c8cd522018-08-31 12:27:28 -070080
Dominik Laskowski98041832019-08-01 18:35:59 -070081 sp<IDisplayEventConnection> connection;
Dominik Laskowskif654d572018-12-20 11:03:06 -080082 ASSERT_NO_FATAL_FAILURE(
Dominik Laskowski98041832019-08-01 18:35:59 -070083 connection = mScheduler.createDisplayEventConnection(handle, ResyncCallback(),
84 ISurfaceComposer::
85 eConfigChangedSuppress));
86 EXPECT_FALSE(connection);
87 EXPECT_FALSE(mScheduler.getEventThread(handle));
88 EXPECT_FALSE(mScheduler.getEventConnection(handle));
Ana Krulec0c8cd522018-08-31 12:27:28 -070089
90 // The EXPECT_CALLS make sure we don't call the functions on the subsequent event threads.
91 EXPECT_CALL(*mEventThread, onHotplugReceived(_, _)).Times(0);
Dominik Laskowski98041832019-08-01 18:35:59 -070092 ASSERT_NO_FATAL_FAILURE(mScheduler.onHotplugReceived(handle, PHYSICAL_DISPLAY_ID, false));
Ana Krulec0c8cd522018-08-31 12:27:28 -070093
94 EXPECT_CALL(*mEventThread, onScreenAcquired()).Times(0);
Dominik Laskowski98041832019-08-01 18:35:59 -070095 ASSERT_NO_FATAL_FAILURE(mScheduler.onScreenAcquired(handle));
Ana Krulec0c8cd522018-08-31 12:27:28 -070096
97 EXPECT_CALL(*mEventThread, onScreenReleased()).Times(0);
Dominik Laskowski98041832019-08-01 18:35:59 -070098 ASSERT_NO_FATAL_FAILURE(mScheduler.onScreenReleased(handle));
Ana Krulec0c8cd522018-08-31 12:27:28 -070099
Dominik Laskowski98041832019-08-01 18:35:59 -0700100 std::string output;
Ana Krulec0c8cd522018-08-31 12:27:28 -0700101 EXPECT_CALL(*mEventThread, dump(_)).Times(0);
Dominik Laskowski98041832019-08-01 18:35:59 -0700102 ASSERT_NO_FATAL_FAILURE(mScheduler.dump(handle, output));
103 EXPECT_TRUE(output.empty());
Ana Krulec0c8cd522018-08-31 12:27:28 -0700104
105 EXPECT_CALL(*mEventThread, setPhaseOffset(_)).Times(0);
Dominik Laskowski98041832019-08-01 18:35:59 -0700106 ASSERT_NO_FATAL_FAILURE(mScheduler.setPhaseOffset(handle, 10));
Ana Krulec0c8cd522018-08-31 12:27:28 -0700107}
108
109TEST_F(SchedulerTest, validConnectionHandle) {
Dominik Laskowski98041832019-08-01 18:35:59 -0700110 sp<IDisplayEventConnection> connection;
Dominik Laskowskif654d572018-12-20 11:03:06 -0800111 ASSERT_NO_FATAL_FAILURE(
Dominik Laskowski98041832019-08-01 18:35:59 -0700112 connection =
113 mScheduler.createDisplayEventConnection(mConnectionHandle, ResyncCallback(),
114 ISurfaceComposer::
115 eConfigChangedSuppress));
116 ASSERT_EQ(mEventThreadConnection, connection);
Ana Krulec0c8cd522018-08-31 12:27:28 -0700117
Dominik Laskowski98041832019-08-01 18:35:59 -0700118 EXPECT_TRUE(mScheduler.getEventThread(mConnectionHandle));
119 EXPECT_TRUE(mScheduler.getEventConnection(mConnectionHandle));
Ana Krulec0c8cd522018-08-31 12:27:28 -0700120
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -0800121 EXPECT_CALL(*mEventThread, onHotplugReceived(PHYSICAL_DISPLAY_ID, false)).Times(1);
122 ASSERT_NO_FATAL_FAILURE(
Dominik Laskowski98041832019-08-01 18:35:59 -0700123 mScheduler.onHotplugReceived(mConnectionHandle, PHYSICAL_DISPLAY_ID, false));
Ana Krulec0c8cd522018-08-31 12:27:28 -0700124
125 EXPECT_CALL(*mEventThread, onScreenAcquired()).Times(1);
Dominik Laskowski98041832019-08-01 18:35:59 -0700126 ASSERT_NO_FATAL_FAILURE(mScheduler.onScreenAcquired(mConnectionHandle));
Ana Krulec0c8cd522018-08-31 12:27:28 -0700127
128 EXPECT_CALL(*mEventThread, onScreenReleased()).Times(1);
Dominik Laskowski98041832019-08-01 18:35:59 -0700129 ASSERT_NO_FATAL_FAILURE(mScheduler.onScreenReleased(mConnectionHandle));
Ana Krulec0c8cd522018-08-31 12:27:28 -0700130
Dominik Laskowski98041832019-08-01 18:35:59 -0700131 std::string output("dump");
132 EXPECT_CALL(*mEventThread, dump(output)).Times(1);
133 ASSERT_NO_FATAL_FAILURE(mScheduler.dump(mConnectionHandle, output));
134 EXPECT_FALSE(output.empty());
Ana Krulec0c8cd522018-08-31 12:27:28 -0700135
136 EXPECT_CALL(*mEventThread, setPhaseOffset(10)).Times(1);
Dominik Laskowski98041832019-08-01 18:35:59 -0700137 ASSERT_NO_FATAL_FAILURE(mScheduler.setPhaseOffset(mConnectionHandle, 10));
Ana Krulec0c8cd522018-08-31 12:27:28 -0700138}
Dominik Laskowski98041832019-08-01 18:35:59 -0700139
Ana Krulec0c8cd522018-08-31 12:27:28 -0700140} // namespace
Ana Krulec3084c052018-11-21 20:27:17 +0100141} // namespace android