1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2020 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker *
4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker *
8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker *
10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker */
16*4d7e907cSAndroid Build Coastguard Worker #include <aidl/Gtest.h>
17*4d7e907cSAndroid Build Coastguard Worker #include <aidl/Vintf.h>
18*4d7e907cSAndroid Build Coastguard Worker
19*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/power/BnPower.h>
20*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/power/BnPowerHintSession.h>
21*4d7e907cSAndroid Build Coastguard Worker #include <android-base/properties.h>
22*4d7e907cSAndroid Build Coastguard Worker #include <android/binder_ibinder.h>
23*4d7e907cSAndroid Build Coastguard Worker #include <android/binder_manager.h>
24*4d7e907cSAndroid Build Coastguard Worker #include <android/binder_process.h>
25*4d7e907cSAndroid Build Coastguard Worker #include <android/binder_status.h>
26*4d7e907cSAndroid Build Coastguard Worker
27*4d7e907cSAndroid Build Coastguard Worker #include <fmq/AidlMessageQueue.h>
28*4d7e907cSAndroid Build Coastguard Worker #include <fmq/EventFlag.h>
29*4d7e907cSAndroid Build Coastguard Worker
30*4d7e907cSAndroid Build Coastguard Worker #include <unistd.h>
31*4d7e907cSAndroid Build Coastguard Worker #include <cstdint>
32*4d7e907cSAndroid Build Coastguard Worker #include "aidl/android/hardware/common/fmq/SynchronizedReadWrite.h"
33*4d7e907cSAndroid Build Coastguard Worker #include "aidl/android/hardware/power/CpuHeadroomParams.h"
34*4d7e907cSAndroid Build Coastguard Worker #include "aidl/android/hardware/power/GpuHeadroomParams.h"
35*4d7e907cSAndroid Build Coastguard Worker
36*4d7e907cSAndroid Build Coastguard Worker namespace aidl::android::hardware::power {
37*4d7e907cSAndroid Build Coastguard Worker namespace {
38*4d7e907cSAndroid Build Coastguard Worker
39*4d7e907cSAndroid Build Coastguard Worker using namespace std::chrono_literals;
40*4d7e907cSAndroid Build Coastguard Worker
41*4d7e907cSAndroid Build Coastguard Worker using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite;
42*4d7e907cSAndroid Build Coastguard Worker using ::android::AidlMessageQueue;
43*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::EventFlag;
44*4d7e907cSAndroid Build Coastguard Worker using android::hardware::power::Boost;
45*4d7e907cSAndroid Build Coastguard Worker using android::hardware::power::ChannelConfig;
46*4d7e907cSAndroid Build Coastguard Worker using android::hardware::power::ChannelMessage;
47*4d7e907cSAndroid Build Coastguard Worker using android::hardware::power::CpuHeadroomParams;
48*4d7e907cSAndroid Build Coastguard Worker using android::hardware::power::CpuHeadroomResult;
49*4d7e907cSAndroid Build Coastguard Worker using android::hardware::power::GpuHeadroomParams;
50*4d7e907cSAndroid Build Coastguard Worker using android::hardware::power::GpuHeadroomResult;
51*4d7e907cSAndroid Build Coastguard Worker using android::hardware::power::IPower;
52*4d7e907cSAndroid Build Coastguard Worker using android::hardware::power::IPowerHintSession;
53*4d7e907cSAndroid Build Coastguard Worker using android::hardware::power::Mode;
54*4d7e907cSAndroid Build Coastguard Worker using android::hardware::power::SessionHint;
55*4d7e907cSAndroid Build Coastguard Worker using android::hardware::power::SessionMode;
56*4d7e907cSAndroid Build Coastguard Worker using android::hardware::power::SupportInfo;
57*4d7e907cSAndroid Build Coastguard Worker using android::hardware::power::WorkDuration;
58*4d7e907cSAndroid Build Coastguard Worker using ChannelMessageContents = ChannelMessage::ChannelMessageContents;
59*4d7e907cSAndroid Build Coastguard Worker using ModeSetter = ChannelMessage::ChannelMessageContents::SessionModeSetter;
60*4d7e907cSAndroid Build Coastguard Worker using MessageTag = ChannelMessage::ChannelMessageContents::Tag;
61*4d7e907cSAndroid Build Coastguard Worker
62*4d7e907cSAndroid Build Coastguard Worker using SessionMessageQueue = AidlMessageQueue<ChannelMessage, SynchronizedReadWrite>;
63*4d7e907cSAndroid Build Coastguard Worker using FlagMessageQueue = AidlMessageQueue<int8_t, SynchronizedReadWrite>;
64*4d7e907cSAndroid Build Coastguard Worker
65*4d7e907cSAndroid Build Coastguard Worker const std::vector<Boost> kBoosts{ndk::enum_range<Boost>().begin(), ndk::enum_range<Boost>().end()};
66*4d7e907cSAndroid Build Coastguard Worker
67*4d7e907cSAndroid Build Coastguard Worker const std::vector<Mode> kModes{ndk::enum_range<Mode>().begin(), ndk::enum_range<Mode>().end()};
68*4d7e907cSAndroid Build Coastguard Worker
69*4d7e907cSAndroid Build Coastguard Worker const std::vector<SessionHint> kSessionHints{ndk::enum_range<SessionHint>().begin(),
70*4d7e907cSAndroid Build Coastguard Worker ndk::enum_range<SessionHint>().end()};
71*4d7e907cSAndroid Build Coastguard Worker
72*4d7e907cSAndroid Build Coastguard Worker const std::vector<SessionMode> kSessionModes{ndk::enum_range<SessionMode>().begin(),
73*4d7e907cSAndroid Build Coastguard Worker ndk::enum_range<SessionMode>().end()};
74*4d7e907cSAndroid Build Coastguard Worker
75*4d7e907cSAndroid Build Coastguard Worker const std::vector<Boost> kInvalidBoosts = {
76*4d7e907cSAndroid Build Coastguard Worker static_cast<Boost>(static_cast<int32_t>(kBoosts.front()) - 1),
77*4d7e907cSAndroid Build Coastguard Worker static_cast<Boost>(static_cast<int32_t>(kBoosts.back()) + 1),
78*4d7e907cSAndroid Build Coastguard Worker };
79*4d7e907cSAndroid Build Coastguard Worker
80*4d7e907cSAndroid Build Coastguard Worker const std::vector<Mode> kInvalidModes = {
81*4d7e907cSAndroid Build Coastguard Worker static_cast<Mode>(static_cast<int32_t>(kModes.front()) - 1),
82*4d7e907cSAndroid Build Coastguard Worker static_cast<Mode>(static_cast<int32_t>(kModes.back()) + 1),
83*4d7e907cSAndroid Build Coastguard Worker };
84*4d7e907cSAndroid Build Coastguard Worker
85*4d7e907cSAndroid Build Coastguard Worker const std::vector<SessionHint> kInvalidSessionHints = {
86*4d7e907cSAndroid Build Coastguard Worker static_cast<SessionHint>(static_cast<int32_t>(kSessionHints.front()) - 1),
87*4d7e907cSAndroid Build Coastguard Worker static_cast<SessionHint>(static_cast<int32_t>(kSessionHints.back()) + 1),
88*4d7e907cSAndroid Build Coastguard Worker };
89*4d7e907cSAndroid Build Coastguard Worker
90*4d7e907cSAndroid Build Coastguard Worker const std::vector<SessionMode> kInvalidSessionModes = {
91*4d7e907cSAndroid Build Coastguard Worker static_cast<SessionMode>(static_cast<int32_t>(kSessionModes.front()) - 1),
92*4d7e907cSAndroid Build Coastguard Worker static_cast<SessionMode>(static_cast<int32_t>(kSessionModes.back()) + 1),
93*4d7e907cSAndroid Build Coastguard Worker };
94*4d7e907cSAndroid Build Coastguard Worker
95*4d7e907cSAndroid Build Coastguard Worker template <class T>
enum_size()96*4d7e907cSAndroid Build Coastguard Worker constexpr size_t enum_size() {
97*4d7e907cSAndroid Build Coastguard Worker return static_cast<size_t>(*(ndk::enum_range<T>().end() - 1)) + 1;
98*4d7e907cSAndroid Build Coastguard Worker }
99*4d7e907cSAndroid Build Coastguard Worker
100*4d7e907cSAndroid Build Coastguard Worker template <class E>
supportFromBitset(int64_t & supportInt,E type)101*4d7e907cSAndroid Build Coastguard Worker bool supportFromBitset(int64_t& supportInt, E type) {
102*4d7e907cSAndroid Build Coastguard Worker return (supportInt >> static_cast<int>(type)) % 2;
103*4d7e907cSAndroid Build Coastguard Worker }
104*4d7e907cSAndroid Build Coastguard Worker
105*4d7e907cSAndroid Build Coastguard Worker class DurationWrapper : public WorkDuration {
106*4d7e907cSAndroid Build Coastguard Worker public:
DurationWrapper(int64_t dur,int64_t time)107*4d7e907cSAndroid Build Coastguard Worker DurationWrapper(int64_t dur, int64_t time) {
108*4d7e907cSAndroid Build Coastguard Worker durationNanos = dur;
109*4d7e907cSAndroid Build Coastguard Worker timeStampNanos = time;
110*4d7e907cSAndroid Build Coastguard Worker }
111*4d7e907cSAndroid Build Coastguard Worker };
112*4d7e907cSAndroid Build Coastguard Worker
113*4d7e907cSAndroid Build Coastguard Worker const std::vector<int32_t> kSelfTids = {
114*4d7e907cSAndroid Build Coastguard Worker gettid(),
115*4d7e907cSAndroid Build Coastguard Worker };
116*4d7e907cSAndroid Build Coastguard Worker
117*4d7e907cSAndroid Build Coastguard Worker const std::vector<int32_t> kEmptyTids = {};
118*4d7e907cSAndroid Build Coastguard Worker
119*4d7e907cSAndroid Build Coastguard Worker const std::vector<WorkDuration> kDurationsWithZero = {
120*4d7e907cSAndroid Build Coastguard Worker DurationWrapper(1000L, 1L),
121*4d7e907cSAndroid Build Coastguard Worker DurationWrapper(0L, 2L),
122*4d7e907cSAndroid Build Coastguard Worker };
123*4d7e907cSAndroid Build Coastguard Worker
124*4d7e907cSAndroid Build Coastguard Worker const std::vector<WorkDuration> kDurationsWithNegative = {
125*4d7e907cSAndroid Build Coastguard Worker DurationWrapper(1000L, 1L),
126*4d7e907cSAndroid Build Coastguard Worker DurationWrapper(-1000L, 2L),
127*4d7e907cSAndroid Build Coastguard Worker };
128*4d7e907cSAndroid Build Coastguard Worker
129*4d7e907cSAndroid Build Coastguard Worker const std::vector<WorkDuration> kDurations = {
130*4d7e907cSAndroid Build Coastguard Worker DurationWrapper(1L, 1L),
131*4d7e907cSAndroid Build Coastguard Worker DurationWrapper(1000L, 2L),
132*4d7e907cSAndroid Build Coastguard Worker DurationWrapper(1000000L, 3L),
133*4d7e907cSAndroid Build Coastguard Worker DurationWrapper(1000000000L, 4L),
134*4d7e907cSAndroid Build Coastguard Worker };
135*4d7e907cSAndroid Build Coastguard Worker
136*4d7e907cSAndroid Build Coastguard Worker class PowerAidl : public testing::TestWithParam<std::string> {
137*4d7e907cSAndroid Build Coastguard Worker public:
SetUp()138*4d7e907cSAndroid Build Coastguard Worker virtual void SetUp() override {
139*4d7e907cSAndroid Build Coastguard Worker AIBinder* binder = AServiceManager_waitForService(GetParam().c_str());
140*4d7e907cSAndroid Build Coastguard Worker ASSERT_NE(binder, nullptr);
141*4d7e907cSAndroid Build Coastguard Worker power = IPower::fromBinder(ndk::SpAIBinder(binder));
142*4d7e907cSAndroid Build Coastguard Worker auto status = power->getInterfaceVersion(&mServiceVersion);
143*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(status.isOk());
144*4d7e907cSAndroid Build Coastguard Worker if (mServiceVersion >= 2) {
145*4d7e907cSAndroid Build Coastguard Worker status = power->createHintSession(getpid(), getuid(), kSelfTids, 16666666L, &mSession);
146*4d7e907cSAndroid Build Coastguard Worker mSessionSupport = status.isOk();
147*4d7e907cSAndroid Build Coastguard Worker }
148*4d7e907cSAndroid Build Coastguard Worker if (mServiceVersion >= 6) {
149*4d7e907cSAndroid Build Coastguard Worker mSupportInfo = std::make_optional<SupportInfo>();
150*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(power->getSupportInfo(&(*mSupportInfo)).isOk());
151*4d7e907cSAndroid Build Coastguard Worker }
152*4d7e907cSAndroid Build Coastguard Worker }
153*4d7e907cSAndroid Build Coastguard Worker
154*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<IPower> power;
155*4d7e907cSAndroid Build Coastguard Worker int32_t mServiceVersion;
156*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<IPowerHintSession> mSession;
157*4d7e907cSAndroid Build Coastguard Worker bool mSessionSupport = false;
158*4d7e907cSAndroid Build Coastguard Worker std::optional<SupportInfo> mSupportInfo = std::nullopt;
159*4d7e907cSAndroid Build Coastguard Worker };
160*4d7e907cSAndroid Build Coastguard Worker
161*4d7e907cSAndroid Build Coastguard Worker class HintSessionAidl : public PowerAidl {
162*4d7e907cSAndroid Build Coastguard Worker public:
SetUp()163*4d7e907cSAndroid Build Coastguard Worker virtual void SetUp() override {
164*4d7e907cSAndroid Build Coastguard Worker PowerAidl::SetUp();
165*4d7e907cSAndroid Build Coastguard Worker if (mServiceVersion < 2) {
166*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "DEVICE not launching with Power V2 and beyond.";
167*4d7e907cSAndroid Build Coastguard Worker }
168*4d7e907cSAndroid Build Coastguard Worker if (!mSessionSupport) {
169*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "DEVICE not support Hint Session.";
170*4d7e907cSAndroid Build Coastguard Worker }
171*4d7e907cSAndroid Build Coastguard Worker ASSERT_NE(nullptr, mSession);
172*4d7e907cSAndroid Build Coastguard Worker }
173*4d7e907cSAndroid Build Coastguard Worker };
174*4d7e907cSAndroid Build Coastguard Worker
175*4d7e907cSAndroid Build Coastguard Worker class FMQAidl : public PowerAidl {
176*4d7e907cSAndroid Build Coastguard Worker public:
SetUp()177*4d7e907cSAndroid Build Coastguard Worker virtual void SetUp() override {
178*4d7e907cSAndroid Build Coastguard Worker PowerAidl::SetUp();
179*4d7e907cSAndroid Build Coastguard Worker if (mServiceVersion < 5) {
180*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "DEVICE not launching with Power V5 and beyond.";
181*4d7e907cSAndroid Build Coastguard Worker }
182*4d7e907cSAndroid Build Coastguard Worker
183*4d7e907cSAndroid Build Coastguard Worker auto status =
184*4d7e907cSAndroid Build Coastguard Worker power->createHintSessionWithConfig(getpid(), getuid(), kSelfTids, 16666666L,
185*4d7e907cSAndroid Build Coastguard Worker SessionTag::OTHER, &mSessionConfig, &mSession);
186*4d7e907cSAndroid Build Coastguard Worker mSessionSupport = status.isOk();
187*4d7e907cSAndroid Build Coastguard Worker if (!mSessionSupport) {
188*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "DEVICE not support Hint Session.";
189*4d7e907cSAndroid Build Coastguard Worker }
190*4d7e907cSAndroid Build Coastguard Worker ASSERT_NE(nullptr, mSession);
191*4d7e907cSAndroid Build Coastguard Worker
192*4d7e907cSAndroid Build Coastguard Worker status = power->getSessionChannel(getpid(), getuid(), &mChannelConfig);
193*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(status.isOk());
194*4d7e907cSAndroid Build Coastguard Worker mChannel = std::make_shared<SessionMessageQueue>(mChannelConfig.channelDescriptor, true);
195*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(mChannel->isValid());
196*4d7e907cSAndroid Build Coastguard Worker
197*4d7e907cSAndroid Build Coastguard Worker if (mChannelConfig.eventFlagDescriptor.has_value()) {
198*4d7e907cSAndroid Build Coastguard Worker mFlagChannel =
199*4d7e907cSAndroid Build Coastguard Worker std::make_shared<FlagMessageQueue>(*mChannelConfig.eventFlagDescriptor, true);
200*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(EventFlag::createEventFlag(mFlagChannel->getEventFlagWord(), &mEventFlag),
201*4d7e907cSAndroid Build Coastguard Worker ::android::OK);
202*4d7e907cSAndroid Build Coastguard Worker } else {
203*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(EventFlag::createEventFlag(mChannel->getEventFlagWord(), &mEventFlag),
204*4d7e907cSAndroid Build Coastguard Worker ::android::OK);
205*4d7e907cSAndroid Build Coastguard Worker }
206*4d7e907cSAndroid Build Coastguard Worker
207*4d7e907cSAndroid Build Coastguard Worker ASSERT_NE(mEventFlag, nullptr);
208*4d7e907cSAndroid Build Coastguard Worker }
TearDown()209*4d7e907cSAndroid Build Coastguard Worker virtual void TearDown() {
210*4d7e907cSAndroid Build Coastguard Worker if (mSession) {
211*4d7e907cSAndroid Build Coastguard Worker mSession->close();
212*4d7e907cSAndroid Build Coastguard Worker if (mChannel->isValid()) {
213*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(power->closeSessionChannel(getpid(), getuid()).isOk());
214*4d7e907cSAndroid Build Coastguard Worker }
215*4d7e907cSAndroid Build Coastguard Worker }
216*4d7e907cSAndroid Build Coastguard Worker }
217*4d7e907cSAndroid Build Coastguard Worker
218*4d7e907cSAndroid Build Coastguard Worker protected:
219*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<IPowerHintSession> mSession;
220*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<SessionMessageQueue> mChannel;
221*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<FlagMessageQueue> mFlagChannel;
222*4d7e907cSAndroid Build Coastguard Worker SessionConfig mSessionConfig;
223*4d7e907cSAndroid Build Coastguard Worker ChannelConfig mChannelConfig;
224*4d7e907cSAndroid Build Coastguard Worker ::android::hardware::EventFlag* mEventFlag;
225*4d7e907cSAndroid Build Coastguard Worker };
226*4d7e907cSAndroid Build Coastguard Worker
TEST_P(PowerAidl,setMode)227*4d7e907cSAndroid Build Coastguard Worker TEST_P(PowerAidl, setMode) {
228*4d7e907cSAndroid Build Coastguard Worker for (const auto& mode : kModes) {
229*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(power->setMode(mode, true).isOk());
230*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(power->setMode(mode, false).isOk());
231*4d7e907cSAndroid Build Coastguard Worker }
232*4d7e907cSAndroid Build Coastguard Worker for (const auto& mode : kInvalidModes) {
233*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(power->setMode(mode, true).isOk());
234*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(power->setMode(mode, false).isOk());
235*4d7e907cSAndroid Build Coastguard Worker }
236*4d7e907cSAndroid Build Coastguard Worker }
237*4d7e907cSAndroid Build Coastguard Worker
TEST_P(PowerAidl,isModeSupported)238*4d7e907cSAndroid Build Coastguard Worker TEST_P(PowerAidl, isModeSupported) {
239*4d7e907cSAndroid Build Coastguard Worker for (const auto& mode : kModes) {
240*4d7e907cSAndroid Build Coastguard Worker bool supported;
241*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(power->isModeSupported(mode, &supported).isOk());
242*4d7e907cSAndroid Build Coastguard Worker }
243*4d7e907cSAndroid Build Coastguard Worker for (const auto& mode : kInvalidModes) {
244*4d7e907cSAndroid Build Coastguard Worker bool supported;
245*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(power->isModeSupported(mode, &supported).isOk());
246*4d7e907cSAndroid Build Coastguard Worker // Should return false for values outside enum
247*4d7e907cSAndroid Build Coastguard Worker ASSERT_FALSE(supported);
248*4d7e907cSAndroid Build Coastguard Worker }
249*4d7e907cSAndroid Build Coastguard Worker }
250*4d7e907cSAndroid Build Coastguard Worker
TEST_P(PowerAidl,setBoost)251*4d7e907cSAndroid Build Coastguard Worker TEST_P(PowerAidl, setBoost) {
252*4d7e907cSAndroid Build Coastguard Worker for (const auto& boost : kBoosts) {
253*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(power->setBoost(boost, 0).isOk());
254*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(power->setBoost(boost, 1000).isOk());
255*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(power->setBoost(boost, -1).isOk());
256*4d7e907cSAndroid Build Coastguard Worker }
257*4d7e907cSAndroid Build Coastguard Worker for (const auto& boost : kInvalidBoosts) {
258*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(power->setBoost(boost, 0).isOk());
259*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(power->setBoost(boost, 1000).isOk());
260*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(power->setBoost(boost, -1).isOk());
261*4d7e907cSAndroid Build Coastguard Worker }
262*4d7e907cSAndroid Build Coastguard Worker }
263*4d7e907cSAndroid Build Coastguard Worker
TEST_P(PowerAidl,isBoostSupported)264*4d7e907cSAndroid Build Coastguard Worker TEST_P(PowerAidl, isBoostSupported) {
265*4d7e907cSAndroid Build Coastguard Worker for (const auto& boost : kBoosts) {
266*4d7e907cSAndroid Build Coastguard Worker bool supported;
267*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(power->isBoostSupported(boost, &supported).isOk());
268*4d7e907cSAndroid Build Coastguard Worker }
269*4d7e907cSAndroid Build Coastguard Worker for (const auto& boost : kInvalidBoosts) {
270*4d7e907cSAndroid Build Coastguard Worker bool supported;
271*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(power->isBoostSupported(boost, &supported).isOk());
272*4d7e907cSAndroid Build Coastguard Worker // Should return false for values outside enum
273*4d7e907cSAndroid Build Coastguard Worker ASSERT_FALSE(supported);
274*4d7e907cSAndroid Build Coastguard Worker }
275*4d7e907cSAndroid Build Coastguard Worker }
276*4d7e907cSAndroid Build Coastguard Worker
TEST_P(PowerAidl,getHintSessionPreferredRate)277*4d7e907cSAndroid Build Coastguard Worker TEST_P(PowerAidl, getHintSessionPreferredRate) {
278*4d7e907cSAndroid Build Coastguard Worker if (!mSessionSupport) {
279*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "DEVICE not support Hint Session.";
280*4d7e907cSAndroid Build Coastguard Worker }
281*4d7e907cSAndroid Build Coastguard Worker if (mServiceVersion < 2) {
282*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "DEVICE not launching with Power V2 and beyond.";
283*4d7e907cSAndroid Build Coastguard Worker }
284*4d7e907cSAndroid Build Coastguard Worker
285*4d7e907cSAndroid Build Coastguard Worker int64_t rate = -1;
286*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(power->getHintSessionPreferredRate(&rate).isOk());
287*4d7e907cSAndroid Build Coastguard Worker // At least 1ms rate limit from HAL
288*4d7e907cSAndroid Build Coastguard Worker ASSERT_GE(rate, 1000000);
289*4d7e907cSAndroid Build Coastguard Worker }
290*4d7e907cSAndroid Build Coastguard Worker
TEST_P(PowerAidl,createHintSessionWithConfig)291*4d7e907cSAndroid Build Coastguard Worker TEST_P(PowerAidl, createHintSessionWithConfig) {
292*4d7e907cSAndroid Build Coastguard Worker if (!mSessionSupport) {
293*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "DEVICE not support Hint Session.";
294*4d7e907cSAndroid Build Coastguard Worker }
295*4d7e907cSAndroid Build Coastguard Worker if (mServiceVersion < 5) {
296*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "DEVICE not launching with Power V5 and beyond.";
297*4d7e907cSAndroid Build Coastguard Worker }
298*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<IPowerHintSession> session;
299*4d7e907cSAndroid Build Coastguard Worker SessionConfig config;
300*4d7e907cSAndroid Build Coastguard Worker
301*4d7e907cSAndroid Build Coastguard Worker auto status = power->createHintSessionWithConfig(getpid(), getuid(), kSelfTids, 16666666L,
302*4d7e907cSAndroid Build Coastguard Worker SessionTag::OTHER, &config, &session);
303*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(status.isOk());
304*4d7e907cSAndroid Build Coastguard Worker ASSERT_NE(nullptr, session);
305*4d7e907cSAndroid Build Coastguard Worker }
306*4d7e907cSAndroid Build Coastguard Worker
TEST_P(PowerAidl,getCpuHeadroom)307*4d7e907cSAndroid Build Coastguard Worker TEST_P(PowerAidl, getCpuHeadroom) {
308*4d7e907cSAndroid Build Coastguard Worker if (mServiceVersion < 6) {
309*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "DEVICE not launching with Power V6 and beyond.";
310*4d7e907cSAndroid Build Coastguard Worker }
311*4d7e907cSAndroid Build Coastguard Worker CpuHeadroomParams params;
312*4d7e907cSAndroid Build Coastguard Worker CpuHeadroomResult headroom;
313*4d7e907cSAndroid Build Coastguard Worker auto ret = power->getCpuHeadroom(params, &headroom);
314*4d7e907cSAndroid Build Coastguard Worker if (!mSupportInfo->headroom.isCpuSupported) {
315*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(ret.getExceptionCode(), EX_UNSUPPORTED_OPERATION);
316*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "power->getCpuHeadroom is not supported";
317*4d7e907cSAndroid Build Coastguard Worker }
318*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(ret.isOk());
319*4d7e907cSAndroid Build Coastguard Worker ASSERT_GE(mSupportInfo->headroom.cpuMinIntervalMillis, 0);
320*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(headroom.getTag(), CpuHeadroomResult::globalHeadroom);
321*4d7e907cSAndroid Build Coastguard Worker ASSERT_GE(headroom.get<CpuHeadroomResult::globalHeadroom>(), 0.0f);
322*4d7e907cSAndroid Build Coastguard Worker ASSERT_LE(headroom.get<CpuHeadroomResult::globalHeadroom>(), 100.00f);
323*4d7e907cSAndroid Build Coastguard Worker }
324*4d7e907cSAndroid Build Coastguard Worker
TEST_P(PowerAidl,getGpuHeadroom)325*4d7e907cSAndroid Build Coastguard Worker TEST_P(PowerAidl, getGpuHeadroom) {
326*4d7e907cSAndroid Build Coastguard Worker if (mServiceVersion < 6) {
327*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "DEVICE not launching with Power V6 and beyond.";
328*4d7e907cSAndroid Build Coastguard Worker }
329*4d7e907cSAndroid Build Coastguard Worker GpuHeadroomParams params;
330*4d7e907cSAndroid Build Coastguard Worker GpuHeadroomResult headroom;
331*4d7e907cSAndroid Build Coastguard Worker auto ret = power->getGpuHeadroom(params, &headroom);
332*4d7e907cSAndroid Build Coastguard Worker if (!mSupportInfo->headroom.isGpuSupported) {
333*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(ret.getExceptionCode(), EX_UNSUPPORTED_OPERATION);
334*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "power->getGpuHeadroom is not supported";
335*4d7e907cSAndroid Build Coastguard Worker }
336*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(ret.isOk());
337*4d7e907cSAndroid Build Coastguard Worker ASSERT_GE(mSupportInfo->headroom.gpuMinIntervalMillis, 0);
338*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(headroom.getTag(), GpuHeadroomResult::globalHeadroom);
339*4d7e907cSAndroid Build Coastguard Worker ASSERT_GE(headroom.get<GpuHeadroomResult::globalHeadroom>(), 0.0f);
340*4d7e907cSAndroid Build Coastguard Worker ASSERT_LE(headroom.get<GpuHeadroomResult::globalHeadroom>(), 100.00f);
341*4d7e907cSAndroid Build Coastguard Worker }
342*4d7e907cSAndroid Build Coastguard Worker
343*4d7e907cSAndroid Build Coastguard Worker // FIXED_PERFORMANCE mode is required for all devices which ship on Android 11
344*4d7e907cSAndroid Build Coastguard Worker // or later
TEST_P(PowerAidl,hasFixedPerformance)345*4d7e907cSAndroid Build Coastguard Worker TEST_P(PowerAidl, hasFixedPerformance) {
346*4d7e907cSAndroid Build Coastguard Worker bool supported;
347*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(power->isModeSupported(Mode::FIXED_PERFORMANCE, &supported).isOk());
348*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(supported);
349*4d7e907cSAndroid Build Coastguard Worker }
350*4d7e907cSAndroid Build Coastguard Worker
TEST_P(PowerAidl,hasSupportInfo)351*4d7e907cSAndroid Build Coastguard Worker TEST_P(PowerAidl, hasSupportInfo) {
352*4d7e907cSAndroid Build Coastguard Worker if (mServiceVersion < 6) {
353*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "DEVICE not launching with Power V6 and beyond.";
354*4d7e907cSAndroid Build Coastguard Worker }
355*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(mSupportInfo.has_value());
356*4d7e907cSAndroid Build Coastguard Worker for (Mode mode : kModes) {
357*4d7e907cSAndroid Build Coastguard Worker bool supported;
358*4d7e907cSAndroid Build Coastguard Worker power->isModeSupported(mode, &supported);
359*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(supported, supportFromBitset(mSupportInfo->modes, mode));
360*4d7e907cSAndroid Build Coastguard Worker }
361*4d7e907cSAndroid Build Coastguard Worker for (Boost boost : kBoosts) {
362*4d7e907cSAndroid Build Coastguard Worker bool supported;
363*4d7e907cSAndroid Build Coastguard Worker power->isBoostSupported(boost, &supported);
364*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(supported, supportFromBitset(mSupportInfo->boosts, boost));
365*4d7e907cSAndroid Build Coastguard Worker }
366*4d7e907cSAndroid Build Coastguard Worker }
367*4d7e907cSAndroid Build Coastguard Worker
TEST_P(PowerAidl,receivesCompositionData)368*4d7e907cSAndroid Build Coastguard Worker TEST_P(PowerAidl, receivesCompositionData) {
369*4d7e907cSAndroid Build Coastguard Worker if (mServiceVersion < 6) {
370*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "DEVICE not launching with Power V6 and beyond.";
371*4d7e907cSAndroid Build Coastguard Worker }
372*4d7e907cSAndroid Build Coastguard Worker if (mSupportInfo->compositionData.isSupported) {
373*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "Composition data marked as unsupported.";
374*4d7e907cSAndroid Build Coastguard Worker }
375*4d7e907cSAndroid Build Coastguard Worker // Sending an empty object is fine, we just want to confirm it accepts the tx
376*4d7e907cSAndroid Build Coastguard Worker std::vector<CompositionData> out{};
377*4d7e907cSAndroid Build Coastguard Worker out.emplace_back();
378*4d7e907cSAndroid Build Coastguard Worker auto status = power->sendCompositionData(out);
379*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(status.isOk());
380*4d7e907cSAndroid Build Coastguard Worker }
381*4d7e907cSAndroid Build Coastguard Worker
TEST_P(PowerAidl,receivesCompositionUpdate)382*4d7e907cSAndroid Build Coastguard Worker TEST_P(PowerAidl, receivesCompositionUpdate) {
383*4d7e907cSAndroid Build Coastguard Worker if (mServiceVersion < 6) {
384*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "DEVICE not launching with Power V6 and beyond.";
385*4d7e907cSAndroid Build Coastguard Worker }
386*4d7e907cSAndroid Build Coastguard Worker if (mSupportInfo->compositionData.isSupported) {
387*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "Composition data marked as unsupported.";
388*4d7e907cSAndroid Build Coastguard Worker }
389*4d7e907cSAndroid Build Coastguard Worker
390*4d7e907cSAndroid Build Coastguard Worker CompositionUpdate out{};
391*4d7e907cSAndroid Build Coastguard Worker auto status = power->sendCompositionUpdate(out);
392*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(status.isOk());
393*4d7e907cSAndroid Build Coastguard Worker }
394*4d7e907cSAndroid Build Coastguard Worker
TEST_P(HintSessionAidl,createAndCloseHintSession)395*4d7e907cSAndroid Build Coastguard Worker TEST_P(HintSessionAidl, createAndCloseHintSession) {
396*4d7e907cSAndroid Build Coastguard Worker if (!mSessionSupport) {
397*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "DEVICE not support Hint Session.";
398*4d7e907cSAndroid Build Coastguard Worker }
399*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(mSession->pause().isOk());
400*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(mSession->resume().isOk());
401*4d7e907cSAndroid Build Coastguard Worker // Test normal destroy operation
402*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(mSession->close().isOk());
403*4d7e907cSAndroid Build Coastguard Worker mSession.reset();
404*4d7e907cSAndroid Build Coastguard Worker }
405*4d7e907cSAndroid Build Coastguard Worker
TEST_P(HintSessionAidl,createHintSessionFailed)406*4d7e907cSAndroid Build Coastguard Worker TEST_P(HintSessionAidl, createHintSessionFailed) {
407*4d7e907cSAndroid Build Coastguard Worker if (!mSessionSupport) {
408*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "DEVICE not support Hint Session.";
409*4d7e907cSAndroid Build Coastguard Worker }
410*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<IPowerHintSession> session;
411*4d7e907cSAndroid Build Coastguard Worker auto status = power->createHintSession(getpid(), getuid(), kEmptyTids, 16666666L, &session);
412*4d7e907cSAndroid Build Coastguard Worker
413*4d7e907cSAndroid Build Coastguard Worker // Regardless of whether V2 and beyond is supported, the status is always not STATUS_OK.
414*4d7e907cSAndroid Build Coastguard Worker ASSERT_FALSE(status.isOk());
415*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(EX_ILLEGAL_ARGUMENT, status.getExceptionCode());
416*4d7e907cSAndroid Build Coastguard Worker }
417*4d7e907cSAndroid Build Coastguard Worker
TEST_P(HintSessionAidl,updateAndReportDurations)418*4d7e907cSAndroid Build Coastguard Worker TEST_P(HintSessionAidl, updateAndReportDurations) {
419*4d7e907cSAndroid Build Coastguard Worker if (!mSessionSupport) {
420*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "DEVICE not support Hint Session.";
421*4d7e907cSAndroid Build Coastguard Worker }
422*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(mSession->updateTargetWorkDuration(16666667LL).isOk());
423*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(mSession->reportActualWorkDuration(kDurations).isOk());
424*4d7e907cSAndroid Build Coastguard Worker }
425*4d7e907cSAndroid Build Coastguard Worker
TEST_P(HintSessionAidl,sendSessionHint)426*4d7e907cSAndroid Build Coastguard Worker TEST_P(HintSessionAidl, sendSessionHint) {
427*4d7e907cSAndroid Build Coastguard Worker if (!mSessionSupport) {
428*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "DEVICE not support Hint Session.";
429*4d7e907cSAndroid Build Coastguard Worker }
430*4d7e907cSAndroid Build Coastguard Worker if (mServiceVersion < 4) {
431*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "DEVICE not launching with Power V4 and beyond.";
432*4d7e907cSAndroid Build Coastguard Worker }
433*4d7e907cSAndroid Build Coastguard Worker
434*4d7e907cSAndroid Build Coastguard Worker for (const auto& sessionHint : kSessionHints) {
435*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(mSession->sendHint(sessionHint).isOk());
436*4d7e907cSAndroid Build Coastguard Worker }
437*4d7e907cSAndroid Build Coastguard Worker for (const auto& sessionHint : kInvalidSessionHints) {
438*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(mSession->sendHint(sessionHint).isOk());
439*4d7e907cSAndroid Build Coastguard Worker }
440*4d7e907cSAndroid Build Coastguard Worker }
441*4d7e907cSAndroid Build Coastguard Worker
TEST_P(HintSessionAidl,setThreads)442*4d7e907cSAndroid Build Coastguard Worker TEST_P(HintSessionAidl, setThreads) {
443*4d7e907cSAndroid Build Coastguard Worker if (!mSessionSupport) {
444*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "DEVICE not support Hint Session.";
445*4d7e907cSAndroid Build Coastguard Worker }
446*4d7e907cSAndroid Build Coastguard Worker if (mServiceVersion < 4) {
447*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "DEVICE not launching with Power V4 and beyond.";
448*4d7e907cSAndroid Build Coastguard Worker }
449*4d7e907cSAndroid Build Coastguard Worker
450*4d7e907cSAndroid Build Coastguard Worker auto status = mSession->setThreads(kEmptyTids);
451*4d7e907cSAndroid Build Coastguard Worker ASSERT_FALSE(status.isOk());
452*4d7e907cSAndroid Build Coastguard Worker ASSERT_EQ(EX_ILLEGAL_ARGUMENT, status.getExceptionCode());
453*4d7e907cSAndroid Build Coastguard Worker
454*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(mSession->setThreads(kSelfTids).isOk());
455*4d7e907cSAndroid Build Coastguard Worker }
456*4d7e907cSAndroid Build Coastguard Worker
TEST_P(HintSessionAidl,setSessionMode)457*4d7e907cSAndroid Build Coastguard Worker TEST_P(HintSessionAidl, setSessionMode) {
458*4d7e907cSAndroid Build Coastguard Worker if (!mSessionSupport) {
459*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "DEVICE not support Hint Session.";
460*4d7e907cSAndroid Build Coastguard Worker }
461*4d7e907cSAndroid Build Coastguard Worker if (mServiceVersion < 5) {
462*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "DEVICE not launching with Power V5 and beyond.";
463*4d7e907cSAndroid Build Coastguard Worker }
464*4d7e907cSAndroid Build Coastguard Worker
465*4d7e907cSAndroid Build Coastguard Worker for (const auto& sessionMode : kSessionModes) {
466*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(mSession->setMode(sessionMode, true).isOk());
467*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(mSession->setMode(sessionMode, false).isOk());
468*4d7e907cSAndroid Build Coastguard Worker }
469*4d7e907cSAndroid Build Coastguard Worker for (const auto& sessionMode : kInvalidSessionModes) {
470*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(mSession->setMode(sessionMode, true).isOk());
471*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(mSession->setMode(sessionMode, false).isOk());
472*4d7e907cSAndroid Build Coastguard Worker }
473*4d7e907cSAndroid Build Coastguard Worker }
474*4d7e907cSAndroid Build Coastguard Worker
TEST_P(HintSessionAidl,getSessionConfig)475*4d7e907cSAndroid Build Coastguard Worker TEST_P(HintSessionAidl, getSessionConfig) {
476*4d7e907cSAndroid Build Coastguard Worker if (!mSessionSupport) {
477*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "DEVICE not support Hint Session.";
478*4d7e907cSAndroid Build Coastguard Worker }
479*4d7e907cSAndroid Build Coastguard Worker if (mServiceVersion < 5) {
480*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "DEVICE not launching with Power V5 and beyond.";
481*4d7e907cSAndroid Build Coastguard Worker }
482*4d7e907cSAndroid Build Coastguard Worker SessionConfig config;
483*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(mSession->getSessionConfig(&config).isOk());
484*4d7e907cSAndroid Build Coastguard Worker }
485*4d7e907cSAndroid Build Coastguard Worker
TEST_P(FMQAidl,getAndCloseSessionChannel)486*4d7e907cSAndroid Build Coastguard Worker TEST_P(FMQAidl, getAndCloseSessionChannel) {}
487*4d7e907cSAndroid Build Coastguard Worker
TEST_P(FMQAidl,writeItems)488*4d7e907cSAndroid Build Coastguard Worker TEST_P(FMQAidl, writeItems) {
489*4d7e907cSAndroid Build Coastguard Worker std::vector<ChannelMessage> messages{
490*4d7e907cSAndroid Build Coastguard Worker {.sessionID = static_cast<int32_t>(mSessionConfig.id),
491*4d7e907cSAndroid Build Coastguard Worker .timeStampNanos = 1000,
492*4d7e907cSAndroid Build Coastguard Worker .data = ChannelMessageContents::make<MessageTag::workDuration, WorkDurationFixedV1>(
493*4d7e907cSAndroid Build Coastguard Worker {.durationNanos = 1000,
494*4d7e907cSAndroid Build Coastguard Worker .workPeriodStartTimestampNanos = 10,
495*4d7e907cSAndroid Build Coastguard Worker .cpuDurationNanos = 900,
496*4d7e907cSAndroid Build Coastguard Worker .gpuDurationNanos = 100})},
497*4d7e907cSAndroid Build Coastguard Worker {.sessionID = static_cast<int32_t>(mSessionConfig.id),
498*4d7e907cSAndroid Build Coastguard Worker .timeStampNanos = 1000,
499*4d7e907cSAndroid Build Coastguard Worker .data = ChannelMessageContents::make<MessageTag::mode, ModeSetter>(
500*4d7e907cSAndroid Build Coastguard Worker {.modeInt = SessionMode::POWER_EFFICIENCY, .enabled = true})},
501*4d7e907cSAndroid Build Coastguard Worker {.sessionID = static_cast<int32_t>(mSessionConfig.id),
502*4d7e907cSAndroid Build Coastguard Worker .timeStampNanos = 1000,
503*4d7e907cSAndroid Build Coastguard Worker .data = ChannelMessageContents::make<MessageTag::hint, SessionHint>(
504*4d7e907cSAndroid Build Coastguard Worker SessionHint::CPU_LOAD_UP)},
505*4d7e907cSAndroid Build Coastguard Worker {.sessionID = static_cast<int32_t>(mSessionConfig.id),
506*4d7e907cSAndroid Build Coastguard Worker .timeStampNanos = 1000,
507*4d7e907cSAndroid Build Coastguard Worker .data = ChannelMessageContents::make<MessageTag::targetDuration, int64_t>(
508*4d7e907cSAndroid Build Coastguard Worker 10000000 /* 10ms */)},
509*4d7e907cSAndroid Build Coastguard Worker };
510*4d7e907cSAndroid Build Coastguard Worker for (auto& message : messages) {
511*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(mChannel->writeBlocking(&message, 1, mChannelConfig.readFlagBitmask,
512*4d7e907cSAndroid Build Coastguard Worker mChannelConfig.writeFlagBitmask, 100000000,
513*4d7e907cSAndroid Build Coastguard Worker mEventFlag));
514*4d7e907cSAndroid Build Coastguard Worker }
515*4d7e907cSAndroid Build Coastguard Worker // Make sure this still works after everything else is done to check crash
516*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(mSession->setThreads(kSelfTids).isOk());
517*4d7e907cSAndroid Build Coastguard Worker }
518*4d7e907cSAndroid Build Coastguard Worker
TEST_P(FMQAidl,writeExcess)519*4d7e907cSAndroid Build Coastguard Worker TEST_P(FMQAidl, writeExcess) {
520*4d7e907cSAndroid Build Coastguard Worker std::vector<ChannelMessage> messages;
521*4d7e907cSAndroid Build Coastguard Worker size_t channelSize = mChannel->getQuantumCount();
522*4d7e907cSAndroid Build Coastguard Worker for (size_t i = 0; i < channelSize; ++i) {
523*4d7e907cSAndroid Build Coastguard Worker messages.push_back({.sessionID = static_cast<int32_t>(mSessionConfig.id),
524*4d7e907cSAndroid Build Coastguard Worker .timeStampNanos = 1000,
525*4d7e907cSAndroid Build Coastguard Worker .data = ChannelMessageContents::make<MessageTag::hint, SessionHint>(
526*4d7e907cSAndroid Build Coastguard Worker SessionHint::CPU_LOAD_UP)});
527*4d7e907cSAndroid Build Coastguard Worker }
528*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(mChannel->writeBlocking(messages.data(), messages.size(),
529*4d7e907cSAndroid Build Coastguard Worker mChannelConfig.readFlagBitmask,
530*4d7e907cSAndroid Build Coastguard Worker mChannelConfig.writeFlagBitmask, 100000000, mEventFlag));
531*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(mChannel->writeBlocking(messages.data(), messages.size(),
532*4d7e907cSAndroid Build Coastguard Worker mChannelConfig.readFlagBitmask,
533*4d7e907cSAndroid Build Coastguard Worker mChannelConfig.writeFlagBitmask, 1000000000, mEventFlag));
534*4d7e907cSAndroid Build Coastguard Worker // Make sure this still works after everything else is done to check crash
535*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(mSession->setThreads(kSelfTids).isOk());
536*4d7e907cSAndroid Build Coastguard Worker }
537*4d7e907cSAndroid Build Coastguard Worker
538*4d7e907cSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(PowerAidl);
539*4d7e907cSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(HintSessionAidl);
540*4d7e907cSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(FMQAidl);
541*4d7e907cSAndroid Build Coastguard Worker
542*4d7e907cSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(Power, PowerAidl,
543*4d7e907cSAndroid Build Coastguard Worker testing::ValuesIn(::android::getAidlHalInstanceNames(IPower::descriptor)),
544*4d7e907cSAndroid Build Coastguard Worker ::android::PrintInstanceNameToString);
545*4d7e907cSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(Power, HintSessionAidl,
546*4d7e907cSAndroid Build Coastguard Worker testing::ValuesIn(::android::getAidlHalInstanceNames(IPower::descriptor)),
547*4d7e907cSAndroid Build Coastguard Worker ::android::PrintInstanceNameToString);
548*4d7e907cSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(Power, FMQAidl,
549*4d7e907cSAndroid Build Coastguard Worker testing::ValuesIn(::android::getAidlHalInstanceNames(IPower::descriptor)),
550*4d7e907cSAndroid Build Coastguard Worker ::android::PrintInstanceNameToString);
551*4d7e907cSAndroid Build Coastguard Worker
552*4d7e907cSAndroid Build Coastguard Worker } // namespace
553*4d7e907cSAndroid Build Coastguard Worker } // namespace aidl::android::hardware::power
554*4d7e907cSAndroid Build Coastguard Worker
main(int argc,char ** argv)555*4d7e907cSAndroid Build Coastguard Worker int main(int argc, char** argv) {
556*4d7e907cSAndroid Build Coastguard Worker ::testing::InitGoogleTest(&argc, argv);
557*4d7e907cSAndroid Build Coastguard Worker ABinderProcess_setThreadPoolMaxThreadCount(1);
558*4d7e907cSAndroid Build Coastguard Worker ABinderProcess_startThreadPool();
559*4d7e907cSAndroid Build Coastguard Worker return RUN_ALL_TESTS();
560*4d7e907cSAndroid Build Coastguard Worker }
561