/* * Copyright 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include namespace android::test { using namespace com::android::graphics::surfaceflinger; class BinderTest : public ::testing::Test { protected: BinderTest(); void SetUp() override; void getSchedulingPolicy(gui::SchedulingPolicy* outPolicy); void getNonAidlSchedulingPolicy(gui::SchedulingPolicy* outPolicy); void getClientSchedulingPolicy(gui::SchedulingPolicy* outPolicy); void getDisplayEventConnectionSchedulingPolicy(gui::SchedulingPolicy* outPolicy); private: sp mISurfaceComposerAidl; sp mISurfaceComposer; sp mISurfaceComposerClient; sp mConnection; }; BinderTest::BinderTest() { const String16 name("SurfaceFlingerAIDL"); mISurfaceComposerAidl = waitForService(String16("SurfaceFlingerAIDL")); mISurfaceComposer = waitForService(String16("SurfaceFlinger")); mISurfaceComposerAidl->createConnection(&mISurfaceComposerClient); mISurfaceComposerAidl ->createDisplayEventConnection(gui::ISurfaceComposer::VsyncSource::eVsyncSourceApp, gui::ISurfaceComposer::EventRegistration(0), {}, &mConnection); } void BinderTest::SetUp() { ASSERT_TRUE(mISurfaceComposerAidl); ASSERT_TRUE(mISurfaceComposer); ASSERT_TRUE(mISurfaceComposerClient); ASSERT_TRUE(mConnection); } void BinderTest::getSchedulingPolicy(gui::SchedulingPolicy* outPolicy) { const auto status = mISurfaceComposerAidl->getSchedulingPolicy(outPolicy); ASSERT_TRUE(status.isOk()); } void BinderTest::getNonAidlSchedulingPolicy(gui::SchedulingPolicy* outPolicy) { Parcel data, reply; const status_t status = IInterface::asBinder(mISurfaceComposer) ->transact(BnSurfaceComposer::GET_SCHEDULING_POLICY, data, &reply); ASSERT_EQ(OK, status); outPolicy->policy = reply.readInt32(); outPolicy->priority = reply.readInt32(); } void BinderTest::getClientSchedulingPolicy(gui::SchedulingPolicy* outPolicy) { const auto status = mISurfaceComposerClient->getSchedulingPolicy(outPolicy); ASSERT_TRUE(status.isOk()); } void BinderTest::getDisplayEventConnectionSchedulingPolicy(gui::SchedulingPolicy* outPolicy) { const auto status = mConnection->getSchedulingPolicy(outPolicy); ASSERT_TRUE(status.isOk()); } TEST_F(BinderTest, SchedulingPolicy) { if (!flags::misc1()) GTEST_SKIP(); const int policy = SCHED_FIFO; const int priority = sched_get_priority_min(policy); gui::SchedulingPolicy sfPolicy; ASSERT_NO_FATAL_FAILURE(getSchedulingPolicy(&sfPolicy)); ASSERT_EQ(policy, sfPolicy.policy & (~SCHED_RESET_ON_FORK)); ASSERT_EQ(priority, sfPolicy.priority); } TEST_F(BinderTest, NonAidlSchedulingPolicy) { const int policy = SCHED_FIFO; const int priority = sched_get_priority_min(policy); gui::SchedulingPolicy sfPolicy; ASSERT_NO_FATAL_FAILURE(getNonAidlSchedulingPolicy(&sfPolicy)); ASSERT_EQ(policy, sfPolicy.policy & (~SCHED_RESET_ON_FORK)); ASSERT_EQ(priority, sfPolicy.priority); } TEST_F(BinderTest, ClientSchedulingPolicy) { if (!flags::misc1()) GTEST_SKIP(); const int policy = SCHED_FIFO; const int priority = sched_get_priority_min(policy); gui::SchedulingPolicy sfPolicy; ASSERT_NO_FATAL_FAILURE(getClientSchedulingPolicy(&sfPolicy)); ASSERT_EQ(policy, sfPolicy.policy & (~SCHED_RESET_ON_FORK)); ASSERT_EQ(priority, sfPolicy.priority); } TEST_F(BinderTest, DisplayEventConnectionSchedulingPolicy) { if (!flags::misc1()) GTEST_SKIP(); const int policy = SCHED_FIFO; const int priority = sched_get_priority_min(policy); gui::SchedulingPolicy sfPolicy; ASSERT_NO_FATAL_FAILURE(getDisplayEventConnectionSchedulingPolicy(&sfPolicy)); ASSERT_EQ(policy, sfPolicy.policy & (~SCHED_RESET_ON_FORK)); ASSERT_EQ(priority, sfPolicy.priority); } class BinderTestRtCaller : public BinderTest { protected: void SetUp() override; void TearDown() override; private: int mOrigPolicy; int mOrigPriority; }; void BinderTestRtCaller::SetUp() { const int policy = SCHED_FIFO; const int priority = sched_get_priority_min(policy); mOrigPolicy = sched_getscheduler(0); struct sched_param origSchedParam; ASSERT_GE(0, sched_getparam(0, &origSchedParam)) << "errno: " << strerror(errno); mOrigPriority = origSchedParam.sched_priority; struct sched_param param; param.sched_priority = priority; ASSERT_GE(0, sched_setscheduler(0, policy, ¶m)) << "errno: " << strerror(errno); } void BinderTestRtCaller::TearDown() { struct sched_param origSchedParam; origSchedParam.sched_priority = mOrigPriority; ASSERT_GE(0, sched_setscheduler(0, mOrigPolicy, &origSchedParam)) << "errno: " << strerror(errno); } TEST_F(BinderTestRtCaller, SchedulingPolicy) { if (!flags::misc1()) GTEST_SKIP(); const int policy = SCHED_FIFO; const int priority = sched_get_priority_min(policy); gui::SchedulingPolicy sfPolicy; ASSERT_NO_FATAL_FAILURE(getSchedulingPolicy(&sfPolicy)); ASSERT_EQ(policy, sfPolicy.policy & (~SCHED_RESET_ON_FORK)); ASSERT_EQ(priority, sfPolicy.priority); } TEST_F(BinderTestRtCaller, NonAidlSchedulingPolicy) { const int policy = SCHED_FIFO; const int priority = sched_get_priority_min(policy); gui::SchedulingPolicy sfPolicy; ASSERT_NO_FATAL_FAILURE(getNonAidlSchedulingPolicy(&sfPolicy)); ASSERT_EQ(policy, sfPolicy.policy & (~SCHED_RESET_ON_FORK)); ASSERT_EQ(priority, sfPolicy.priority); } TEST_F(BinderTestRtCaller, ClientSchedulingPolicy) { if (!flags::misc1()) GTEST_SKIP(); const int policy = SCHED_FIFO; const int priority = sched_get_priority_min(policy); gui::SchedulingPolicy sfPolicy; ASSERT_NO_FATAL_FAILURE(getClientSchedulingPolicy(&sfPolicy)); ASSERT_EQ(policy, sfPolicy.policy & (~SCHED_RESET_ON_FORK)); ASSERT_EQ(priority, sfPolicy.priority); } TEST_F(BinderTestRtCaller, DisplayEventConnectionSchedulingPolicy) { if (!flags::misc1()) GTEST_SKIP(); const int policy = SCHED_FIFO; const int priority = sched_get_priority_min(policy); gui::SchedulingPolicy sfPolicy; ASSERT_NO_FATAL_FAILURE(getDisplayEventConnectionSchedulingPolicy(&sfPolicy)); ASSERT_EQ(policy, sfPolicy.policy & (~SCHED_RESET_ON_FORK)); ASSERT_EQ(priority, sfPolicy.priority); } } // namespace android::test