blob: 15601aac291f7d97d8f8ea348569a436d12c4177 [file] [log] [blame]
Ronghua Wu231c3d12015-03-11 15:10:32 -07001/*
Ronghua Wu67e7f542015-03-13 10:47:08 -07002 * Copyright 2015 The Android Open Source Project
Ronghua Wu231c3d12015-03-11 15:10:32 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17//#define LOG_NDEBUG 0
18#define LOG_TAG "ResourceManagerService_test"
Chong Zhanga9d45c72020-09-09 12:41:17 -070019
Ronghua Wu231c3d12015-03-11 15:10:32 -070020#include <utils/Log.h>
21
Chong Zhanga9d45c72020-09-09 12:41:17 -070022#include "ResourceManagerServiceTestUtils.h"
Ronghua Wu231c3d12015-03-11 15:10:32 -070023#include "ResourceManagerService.h"
Chong Zhang181e6952019-10-09 13:23:39 -070024
Chong Zhangfdd512a2019-11-22 11:03:14 -080025namespace android {
Ronghua Wu231c3d12015-03-11 15:10:32 -070026
Chong Zhanga9d45c72020-09-09 12:41:17 -070027class ResourceManagerServiceTest : public ResourceManagerServiceTestBase {
Ronghua Wu231c3d12015-03-11 15:10:32 -070028public:
Chong Zhanga9d45c72020-09-09 12:41:17 -070029 ResourceManagerServiceTest() : ResourceManagerServiceTestBase() {}
Ronghua Wu231c3d12015-03-11 15:10:32 -070030
31 void verifyClients(bool c1, bool c2, bool c3) {
32 TestClient *client1 = static_cast<TestClient*>(mTestClient1.get());
33 TestClient *client2 = static_cast<TestClient*>(mTestClient2.get());
34 TestClient *client3 = static_cast<TestClient*>(mTestClient3.get());
35
36 EXPECT_EQ(c1, client1->reclaimed());
37 EXPECT_EQ(c2, client2->reclaimed());
38 EXPECT_EQ(c3, client3->reclaimed());
39
40 client1->reset();
41 client2->reset();
42 client3->reset();
43 }
44
Ronghua Wu67e7f542015-03-13 10:47:08 -070045 // test set up
46 // ---------------------------------------------------------------------------------
47 // pid priority client type number
48 // ---------------------------------------------------------------------------------
49 // kTestPid1(30) 30 mTestClient1 secure codec 1
50 // graphic memory 200
51 // graphic memory 200
52 // ---------------------------------------------------------------------------------
53 // kTestPid2(20) 20 mTestClient2 non-secure codec 1
54 // graphic memory 300
55 // -------------------------------------------
56 // mTestClient3 secure codec 1
57 // graphic memory 100
58 // ---------------------------------------------------------------------------------
Ronghua Wu231c3d12015-03-11 15:10:32 -070059 void addResource() {
60 // kTestPid1 mTestClient1
Chong Zhang181e6952019-10-09 13:23:39 -070061 std::vector<MediaResourceParcel> resources1;
62 resources1.push_back(MediaResource(MediaResource::Type::kSecureCodec, 1));
Chong Zhangee33d642019-08-08 14:26:43 -070063 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
Chong Zhang181e6952019-10-09 13:23:39 -070064 resources1.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 200));
65 std::vector<MediaResourceParcel> resources11;
66 resources11.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 200));
Chong Zhangee33d642019-08-08 14:26:43 -070067 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources11);
Ronghua Wu231c3d12015-03-11 15:10:32 -070068
69 // kTestPid2 mTestClient2
Chong Zhang181e6952019-10-09 13:23:39 -070070 std::vector<MediaResourceParcel> resources2;
71 resources2.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, 1));
72 resources2.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 300));
Chong Zhangee33d642019-08-08 14:26:43 -070073 mService->addResource(kTestPid2, kTestUid2, getId(mTestClient2), mTestClient2, resources2);
Ronghua Wu231c3d12015-03-11 15:10:32 -070074
75 // kTestPid2 mTestClient3
Chong Zhang181e6952019-10-09 13:23:39 -070076 std::vector<MediaResourceParcel> resources3;
Chong Zhangee33d642019-08-08 14:26:43 -070077 mService->addResource(kTestPid2, kTestUid2, getId(mTestClient3), mTestClient3, resources3);
Chong Zhang181e6952019-10-09 13:23:39 -070078 resources3.push_back(MediaResource(MediaResource::Type::kSecureCodec, 1));
79 resources3.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 100));
Chong Zhangee33d642019-08-08 14:26:43 -070080 mService->addResource(kTestPid2, kTestUid2, getId(mTestClient3), mTestClient3, resources3);
Ronghua Wu231c3d12015-03-11 15:10:32 -070081
82 const PidResourceInfosMap &map = mService->mMap;
83 EXPECT_EQ(2u, map.size());
84 ssize_t index1 = map.indexOfKey(kTestPid1);
85 ASSERT_GE(index1, 0);
86 const ResourceInfos &infos1 = map[index1];
87 EXPECT_EQ(1u, infos1.size());
Chong Zhangfb092d32019-08-12 09:45:44 -070088 expectEqResourceInfo(infos1.valueFor(getId(mTestClient1)), kTestUid1, mTestClient1, resources1);
Ronghua Wu231c3d12015-03-11 15:10:32 -070089
90 ssize_t index2 = map.indexOfKey(kTestPid2);
91 ASSERT_GE(index2, 0);
92 const ResourceInfos &infos2 = map[index2];
93 EXPECT_EQ(2u, infos2.size());
Chong Zhangfb092d32019-08-12 09:45:44 -070094 expectEqResourceInfo(infos2.valueFor(getId(mTestClient2)), kTestUid2, mTestClient2, resources2);
95 expectEqResourceInfo(infos2.valueFor(getId(mTestClient3)), kTestUid2, mTestClient3, resources3);
Ronghua Wu231c3d12015-03-11 15:10:32 -070096 }
97
Chong Zhang181e6952019-10-09 13:23:39 -070098 void testCombineResourceWithNegativeValues() {
99 // kTestPid1 mTestClient1
100 std::vector<MediaResourceParcel> resources1;
101 resources1.push_back(MediaResource(MediaResource::Type::kDrmSession, -100));
102 resources1.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, -100));
103 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
104
105 // Expected result:
106 // 1) the client should have been added;
107 // 2) both resource entries should have been rejected, resource list should be empty.
108 const PidResourceInfosMap &map = mService->mMap;
109 EXPECT_EQ(1u, map.size());
110 ssize_t index1 = map.indexOfKey(kTestPid1);
111 ASSERT_GE(index1, 0);
112 const ResourceInfos &infos1 = map[index1];
113 EXPECT_EQ(1u, infos1.size());
114 std::vector<MediaResourceParcel> expected;
115 expectEqResourceInfo(infos1.valueFor(getId(mTestClient1)), kTestUid1, mTestClient1, expected);
116
117 resources1.clear();
118 resources1.push_back(MediaResource(MediaResource::Type::kDrmSession, INT64_MAX));
119 resources1.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, INT64_MAX));
120 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
121 resources1.clear();
122 resources1.push_back(MediaResource(MediaResource::Type::kDrmSession, 10));
123 resources1.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, 10));
124 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
125
126 // Expected result:
127 // Both values should saturate to INT64_MAX
128 expected.push_back(MediaResource(MediaResource::Type::kDrmSession, INT64_MAX));
129 expected.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, INT64_MAX));
130 expectEqResourceInfo(infos1.valueFor(getId(mTestClient1)), kTestUid1, mTestClient1, expected);
131
132 resources1.clear();
133 resources1.push_back(MediaResource(MediaResource::Type::kDrmSession, -10));
134 resources1.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, -10));
135 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
136
137 // Expected result:
138 // 1) DrmSession resource should allow negative value addition, and value should drop accordingly
139 // 2) Non-drm session resource should ignore negative value addition.
140 expected.push_back(MediaResource(MediaResource::Type::kDrmSession, INT64_MAX - 10));
141 expected.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, INT64_MAX));
142 expectEqResourceInfo(infos1.valueFor(getId(mTestClient1)), kTestUid1, mTestClient1, expected);
143
144 resources1.clear();
145 resources1.push_back(MediaResource(MediaResource::Type::kDrmSession, INT64_MIN));
146 expected.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, INT64_MIN));
147 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
148
149 // Expected result:
150 // 1) DrmSession resource value should drop to 0, but the entry shouldn't be removed.
151 // 2) Non-drm session resource should ignore negative value addition.
152 expected.clear();
153 expected.push_back(MediaResource(MediaResource::Type::kDrmSession, 0));
154 expected.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, INT64_MAX));
155 expectEqResourceInfo(infos1.valueFor(getId(mTestClient1)), kTestUid1, mTestClient1, expected);
156 }
157
Ronghua Wu231c3d12015-03-11 15:10:32 -0700158 void testConfig() {
159 EXPECT_TRUE(mService->mSupportsMultipleSecureCodecs);
160 EXPECT_TRUE(mService->mSupportsSecureWithNonSecureCodec);
161
Chong Zhang181e6952019-10-09 13:23:39 -0700162 std::vector<MediaResourcePolicyParcel> policies1;
Ronghua Wu231c3d12015-03-11 15:10:32 -0700163 policies1.push_back(
Ronghua Wu9ba21b92015-04-21 14:23:06 -0700164 MediaResourcePolicy(
Chong Zhangfdd512a2019-11-22 11:03:14 -0800165 IResourceManagerService::kPolicySupportsMultipleSecureCodecs,
Chong Zhang181e6952019-10-09 13:23:39 -0700166 "true"));
Ronghua Wu9ba21b92015-04-21 14:23:06 -0700167 policies1.push_back(
168 MediaResourcePolicy(
Chong Zhangfdd512a2019-11-22 11:03:14 -0800169 IResourceManagerService::kPolicySupportsSecureWithNonSecureCodec,
Chong Zhang181e6952019-10-09 13:23:39 -0700170 "false"));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700171 mService->config(policies1);
172 EXPECT_TRUE(mService->mSupportsMultipleSecureCodecs);
173 EXPECT_FALSE(mService->mSupportsSecureWithNonSecureCodec);
174
Chong Zhang181e6952019-10-09 13:23:39 -0700175 std::vector<MediaResourcePolicyParcel> policies2;
Ronghua Wu231c3d12015-03-11 15:10:32 -0700176 policies2.push_back(
Ronghua Wu9ba21b92015-04-21 14:23:06 -0700177 MediaResourcePolicy(
Chong Zhangfdd512a2019-11-22 11:03:14 -0800178 IResourceManagerService::kPolicySupportsMultipleSecureCodecs,
Chong Zhang181e6952019-10-09 13:23:39 -0700179 "false"));
Ronghua Wu9ba21b92015-04-21 14:23:06 -0700180 policies2.push_back(
181 MediaResourcePolicy(
Chong Zhangfdd512a2019-11-22 11:03:14 -0800182 IResourceManagerService::kPolicySupportsSecureWithNonSecureCodec,
Chong Zhang181e6952019-10-09 13:23:39 -0700183 "true"));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700184 mService->config(policies2);
185 EXPECT_FALSE(mService->mSupportsMultipleSecureCodecs);
186 EXPECT_TRUE(mService->mSupportsSecureWithNonSecureCodec);
187 }
188
Chong Zhangfb092d32019-08-12 09:45:44 -0700189 void testCombineResource() {
190 // kTestPid1 mTestClient1
Chong Zhang181e6952019-10-09 13:23:39 -0700191 std::vector<MediaResourceParcel> resources1;
192 resources1.push_back(MediaResource(MediaResource::Type::kSecureCodec, 1));
Chong Zhangfb092d32019-08-12 09:45:44 -0700193 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
194
Chong Zhang181e6952019-10-09 13:23:39 -0700195 std::vector<MediaResourceParcel> resources11;
196 resources11.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 200));
Chong Zhangfb092d32019-08-12 09:45:44 -0700197 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources11);
198
199 const PidResourceInfosMap &map = mService->mMap;
200 EXPECT_EQ(1u, map.size());
201 ssize_t index1 = map.indexOfKey(kTestPid1);
202 ASSERT_GE(index1, 0);
203 const ResourceInfos &infos1 = map[index1];
204 EXPECT_EQ(1u, infos1.size());
205
206 // test adding existing types to combine values
Chong Zhang181e6952019-10-09 13:23:39 -0700207 resources1.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 100));
Chong Zhangfb092d32019-08-12 09:45:44 -0700208 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
209
Chong Zhang181e6952019-10-09 13:23:39 -0700210 std::vector<MediaResourceParcel> expected;
211 expected.push_back(MediaResource(MediaResource::Type::kSecureCodec, 2));
212 expected.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 300));
Chong Zhangfb092d32019-08-12 09:45:44 -0700213 expectEqResourceInfo(infos1.valueFor(getId(mTestClient1)), kTestUid1, mTestClient1, expected);
214
215 // test adding new types (including types that differs only in subType)
Chong Zhang181e6952019-10-09 13:23:39 -0700216 resources11.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, 1));
217 resources11.push_back(MediaResource(MediaResource::Type::kSecureCodec, MediaResource::SubType::kVideoCodec, 1));
Chong Zhangfb092d32019-08-12 09:45:44 -0700218 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources11);
219
220 expected.clear();
Chong Zhang181e6952019-10-09 13:23:39 -0700221 expected.push_back(MediaResource(MediaResource::Type::kSecureCodec, 2));
222 expected.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, 1));
223 expected.push_back(MediaResource(MediaResource::Type::kSecureCodec, MediaResource::SubType::kVideoCodec, 1));
224 expected.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 500));
Chong Zhangfb092d32019-08-12 09:45:44 -0700225 expectEqResourceInfo(infos1.valueFor(getId(mTestClient1)), kTestUid1, mTestClient1, expected);
226 }
227
Ronghua Wu231c3d12015-03-11 15:10:32 -0700228 void testRemoveResource() {
Chong Zhangfb092d32019-08-12 09:45:44 -0700229 // kTestPid1 mTestClient1
Chong Zhang181e6952019-10-09 13:23:39 -0700230 std::vector<MediaResourceParcel> resources1;
231 resources1.push_back(MediaResource(MediaResource::Type::kSecureCodec, 1));
Chong Zhangfb092d32019-08-12 09:45:44 -0700232 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
233
Chong Zhang181e6952019-10-09 13:23:39 -0700234 std::vector<MediaResourceParcel> resources11;
235 resources11.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 200));
Chong Zhangfb092d32019-08-12 09:45:44 -0700236 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources11);
237
238 const PidResourceInfosMap &map = mService->mMap;
239 EXPECT_EQ(1u, map.size());
240 ssize_t index1 = map.indexOfKey(kTestPid1);
241 ASSERT_GE(index1, 0);
242 const ResourceInfos &infos1 = map[index1];
243 EXPECT_EQ(1u, infos1.size());
244
245 // test partial removal
Chong Zhang181e6952019-10-09 13:23:39 -0700246 resources11[0].value = 100;
Chong Zhangfb092d32019-08-12 09:45:44 -0700247 mService->removeResource(kTestPid1, getId(mTestClient1), resources11);
248
Chong Zhang181e6952019-10-09 13:23:39 -0700249 std::vector<MediaResourceParcel> expected;
250 expected.push_back(MediaResource(MediaResource::Type::kSecureCodec, 1));
251 expected.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 100));
252 expectEqResourceInfo(infos1.valueFor(getId(mTestClient1)), kTestUid1, mTestClient1, expected);
253
254 // test removal request with negative value, should be ignored
255 resources11[0].value = -10000;
256 mService->removeResource(kTestPid1, getId(mTestClient1), resources11);
257
Chong Zhangfb092d32019-08-12 09:45:44 -0700258 expectEqResourceInfo(infos1.valueFor(getId(mTestClient1)), kTestUid1, mTestClient1, expected);
259
260 // test complete removal with overshoot value
Chong Zhang181e6952019-10-09 13:23:39 -0700261 resources11[0].value = 1000;
Chong Zhangfb092d32019-08-12 09:45:44 -0700262 mService->removeResource(kTestPid1, getId(mTestClient1), resources11);
263
264 expected.clear();
Chong Zhang181e6952019-10-09 13:23:39 -0700265 expected.push_back(MediaResource(MediaResource::Type::kSecureCodec, 1));
Chong Zhangfb092d32019-08-12 09:45:44 -0700266 expectEqResourceInfo(infos1.valueFor(getId(mTestClient1)), kTestUid1, mTestClient1, expected);
267 }
268
Henry Fang32762922020-01-28 18:40:39 -0800269 void testOverridePid() {
270
271 bool result;
272 std::vector<MediaResourceParcel> resources;
273 resources.push_back(MediaResource(MediaResource::Type::kSecureCodec, 1));
274 resources.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 150));
275
276 // ### secure codec can't coexist and secure codec can coexist with non-secure codec ###
277 {
278 addResource();
279 mService->mSupportsMultipleSecureCodecs = false;
280 mService->mSupportsSecureWithNonSecureCodec = true;
281
282 // priority too low to reclaim resource
283 CHECK_STATUS_FALSE(mService->reclaimResource(kLowPriorityPid, resources, &result));
284
285 // override Low Priority Pid with High Priority Pid
286 mService->overridePid(kLowPriorityPid, kHighPriorityPid);
287 CHECK_STATUS_TRUE(mService->reclaimResource(kLowPriorityPid, resources, &result));
288
289 // restore Low Priority Pid
290 mService->overridePid(kLowPriorityPid, -1);
291 CHECK_STATUS_FALSE(mService->reclaimResource(kLowPriorityPid, resources, &result));
292 }
293 }
294
Wonsik Kimd20e9362020-04-28 10:42:57 -0700295 void testMarkClientForPendingRemoval() {
296 bool result;
297
298 {
299 addResource();
300 mService->mSupportsSecureWithNonSecureCodec = true;
301
302 std::vector<MediaResourceParcel> resources;
303 resources.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, 1));
304
305 // Remove low priority clients
306 mService->removeClient(kTestPid1, getId(mTestClient1));
307
308 // no lower priority client
309 CHECK_STATUS_FALSE(mService->reclaimResource(kTestPid2, resources, &result));
310 verifyClients(false /* c1 */, false /* c2 */, false /* c3 */);
311
312 mService->markClientForPendingRemoval(kTestPid2, getId(mTestClient2));
313
314 // client marked for pending removal from the same process got reclaimed
315 CHECK_STATUS_TRUE(mService->reclaimResource(kTestPid2, resources, &result));
316 verifyClients(false /* c1 */, true /* c2 */, false /* c3 */);
317
318 // clean up client 3 which still left
319 mService->removeClient(kTestPid2, getId(mTestClient3));
320 }
321
322 {
323 addResource();
324 mService->mSupportsSecureWithNonSecureCodec = true;
325
326 std::vector<MediaResourceParcel> resources;
327 resources.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, 1));
328
329 mService->markClientForPendingRemoval(kTestPid2, getId(mTestClient2));
330
331 // client marked for pending removal from the same process got reclaimed
332 // first, even though there are lower priority process
333 CHECK_STATUS_TRUE(mService->reclaimResource(kTestPid2, resources, &result));
334 verifyClients(false /* c1 */, true /* c2 */, false /* c3 */);
335
336 // lower priority client got reclaimed
337 CHECK_STATUS_TRUE(mService->reclaimResource(kTestPid2, resources, &result));
338 verifyClients(true /* c1 */, false /* c2 */, false /* c3 */);
339
340 // clean up client 3 which still left
341 mService->removeClient(kTestPid2, getId(mTestClient3));
342 }
343 }
344
Chong Zhangfb092d32019-08-12 09:45:44 -0700345 void testRemoveClient() {
Ronghua Wu231c3d12015-03-11 15:10:32 -0700346 addResource();
347
Chong Zhangfb092d32019-08-12 09:45:44 -0700348 mService->removeClient(kTestPid2, getId(mTestClient2));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700349
350 const PidResourceInfosMap &map = mService->mMap;
351 EXPECT_EQ(2u, map.size());
352 const ResourceInfos &infos1 = map.valueFor(kTestPid1);
353 const ResourceInfos &infos2 = map.valueFor(kTestPid2);
354 EXPECT_EQ(1u, infos1.size());
355 EXPECT_EQ(1u, infos2.size());
356 // mTestClient2 has been removed.
Chong Zhangfb092d32019-08-12 09:45:44 -0700357 // (OK to use infos2[0] as there is only 1 entry)
Ronghua Wu231c3d12015-03-11 15:10:32 -0700358 EXPECT_EQ(mTestClient3, infos2[0].client);
359 }
360
361 void testGetAllClients() {
362 addResource();
363
Chong Zhang181e6952019-10-09 13:23:39 -0700364 MediaResource::Type type = MediaResource::Type::kSecureCodec;
Chong Zhangfdd512a2019-11-22 11:03:14 -0800365 Vector<std::shared_ptr<IResourceManagerClient> > clients;
Ronghua Wu05d89f12015-07-07 16:47:42 -0700366 EXPECT_FALSE(mService->getAllClients_l(kLowPriorityPid, type, &clients));
Ronghua Wu67e7f542015-03-13 10:47:08 -0700367 // some higher priority process (e.g. kTestPid2) owns the resource, so getAllClients_l
368 // will fail.
Ronghua Wu05d89f12015-07-07 16:47:42 -0700369 EXPECT_FALSE(mService->getAllClients_l(kMidPriorityPid, type, &clients));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700370 EXPECT_TRUE(mService->getAllClients_l(kHighPriorityPid, type, &clients));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700371
372 EXPECT_EQ(2u, clients.size());
Chong Zhangfb092d32019-08-12 09:45:44 -0700373 // (OK to require ordering in clients[], as the pid map is sorted)
Ronghua Wu231c3d12015-03-11 15:10:32 -0700374 EXPECT_EQ(mTestClient3, clients[0]);
375 EXPECT_EQ(mTestClient1, clients[1]);
376 }
377
378 void testReclaimResourceSecure() {
Chong Zhang181e6952019-10-09 13:23:39 -0700379 bool result;
380 std::vector<MediaResourceParcel> resources;
381 resources.push_back(MediaResource(MediaResource::Type::kSecureCodec, 1));
382 resources.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 150));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700383
384 // ### secure codec can't coexist and secure codec can coexist with non-secure codec ###
385 {
386 addResource();
387 mService->mSupportsMultipleSecureCodecs = false;
388 mService->mSupportsSecureWithNonSecureCodec = true;
389
390 // priority too low
Chong Zhang181e6952019-10-09 13:23:39 -0700391 CHECK_STATUS_FALSE(mService->reclaimResource(kLowPriorityPid, resources, &result));
392 CHECK_STATUS_FALSE(mService->reclaimResource(kMidPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700393
394 // reclaim all secure codecs
Chong Zhang181e6952019-10-09 13:23:39 -0700395 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700396 verifyClients(true /* c1 */, false /* c2 */, true /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700397
398 // call again should reclaim one largest graphic memory from lowest process
Chong Zhang181e6952019-10-09 13:23:39 -0700399 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700400 verifyClients(false /* c1 */, true /* c2 */, false /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700401
402 // nothing left
Chong Zhang181e6952019-10-09 13:23:39 -0700403 CHECK_STATUS_FALSE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700404 }
405
406 // ### secure codecs can't coexist and secure codec can't coexist with non-secure codec ###
407 {
408 addResource();
409 mService->mSupportsMultipleSecureCodecs = false;
410 mService->mSupportsSecureWithNonSecureCodec = false;
411
412 // priority too low
Chong Zhang181e6952019-10-09 13:23:39 -0700413 CHECK_STATUS_FALSE(mService->reclaimResource(kLowPriorityPid, resources, &result));
414 CHECK_STATUS_FALSE(mService->reclaimResource(kMidPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700415
416 // reclaim all secure and non-secure codecs
Chong Zhang181e6952019-10-09 13:23:39 -0700417 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700418 verifyClients(true /* c1 */, true /* c2 */, true /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700419
420 // nothing left
Chong Zhang181e6952019-10-09 13:23:39 -0700421 CHECK_STATUS_FALSE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700422 }
423
424
425 // ### secure codecs can coexist but secure codec can't coexist with non-secure codec ###
426 {
427 addResource();
428 mService->mSupportsMultipleSecureCodecs = true;
429 mService->mSupportsSecureWithNonSecureCodec = false;
430
431 // priority too low
Chong Zhang181e6952019-10-09 13:23:39 -0700432 CHECK_STATUS_FALSE(mService->reclaimResource(kLowPriorityPid, resources, &result));
433 CHECK_STATUS_FALSE(mService->reclaimResource(kMidPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700434
435 // reclaim all non-secure codecs
Chong Zhang181e6952019-10-09 13:23:39 -0700436 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700437 verifyClients(false /* c1 */, true /* c2 */, false /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700438
439 // call again should reclaim one largest graphic memory from lowest process
Chong Zhang181e6952019-10-09 13:23:39 -0700440 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700441 verifyClients(true /* c1 */, false /* c2 */, false /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700442
443 // call again should reclaim another largest graphic memory from lowest process
Chong Zhang181e6952019-10-09 13:23:39 -0700444 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700445 verifyClients(false /* c1 */, false /* c2 */, true /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700446
447 // nothing left
Chong Zhang181e6952019-10-09 13:23:39 -0700448 CHECK_STATUS_FALSE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700449 }
450
451 // ### secure codecs can coexist and secure codec can coexist with non-secure codec ###
452 {
453 addResource();
454 mService->mSupportsMultipleSecureCodecs = true;
455 mService->mSupportsSecureWithNonSecureCodec = true;
456
457 // priority too low
Chong Zhang181e6952019-10-09 13:23:39 -0700458 CHECK_STATUS_FALSE(mService->reclaimResource(kLowPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700459
Chong Zhang181e6952019-10-09 13:23:39 -0700460 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700461 // one largest graphic memory from lowest process got reclaimed
Ronghua Wu05d89f12015-07-07 16:47:42 -0700462 verifyClients(true /* c1 */, false /* c2 */, false /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700463
464 // call again should reclaim another graphic memory from lowest process
Chong Zhang181e6952019-10-09 13:23:39 -0700465 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700466 verifyClients(false /* c1 */, true /* c2 */, false /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700467
468 // call again should reclaim another graphic memory from lowest process
Chong Zhang181e6952019-10-09 13:23:39 -0700469 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700470 verifyClients(false /* c1 */, false /* c2 */, true /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700471
472 // nothing left
Chong Zhang181e6952019-10-09 13:23:39 -0700473 CHECK_STATUS_FALSE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700474 }
Ronghua Wu67e7f542015-03-13 10:47:08 -0700475
476 // ### secure codecs can coexist and secure codec can coexist with non-secure codec ###
477 {
478 addResource();
479 mService->mSupportsMultipleSecureCodecs = true;
480 mService->mSupportsSecureWithNonSecureCodec = true;
481
Chong Zhang181e6952019-10-09 13:23:39 -0700482 std::vector<MediaResourceParcel> resources;
483 resources.push_back(MediaResource(MediaResource::Type::kSecureCodec, 1));
Ronghua Wu67e7f542015-03-13 10:47:08 -0700484
Chong Zhang181e6952019-10-09 13:23:39 -0700485 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu67e7f542015-03-13 10:47:08 -0700486 // secure codec from lowest process got reclaimed
Ronghua Wu05d89f12015-07-07 16:47:42 -0700487 verifyClients(true /* c1 */, false /* c2 */, false /* c3 */);
Ronghua Wu67e7f542015-03-13 10:47:08 -0700488
489 // call again should reclaim another secure codec from lowest process
Chong Zhang181e6952019-10-09 13:23:39 -0700490 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700491 verifyClients(false /* c1 */, false /* c2 */, true /* c3 */);
Ronghua Wu67e7f542015-03-13 10:47:08 -0700492
Ronghua Wu05d89f12015-07-07 16:47:42 -0700493 // no more secure codec, non-secure codec will be reclaimed.
Chong Zhang181e6952019-10-09 13:23:39 -0700494 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700495 verifyClients(false /* c1 */, true /* c2 */, false /* c3 */);
Ronghua Wu67e7f542015-03-13 10:47:08 -0700496 }
Ronghua Wu231c3d12015-03-11 15:10:32 -0700497 }
498
499 void testReclaimResourceNonSecure() {
Chong Zhang181e6952019-10-09 13:23:39 -0700500 bool result;
501 std::vector<MediaResourceParcel> resources;
502 resources.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, 1));
503 resources.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 150));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700504
505 // ### secure codec can't coexist with non-secure codec ###
506 {
507 addResource();
508 mService->mSupportsSecureWithNonSecureCodec = false;
509
510 // priority too low
Chong Zhang181e6952019-10-09 13:23:39 -0700511 CHECK_STATUS_FALSE(mService->reclaimResource(kLowPriorityPid, resources, &result));
512 CHECK_STATUS_FALSE(mService->reclaimResource(kMidPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700513
514 // reclaim all secure codecs
Chong Zhang181e6952019-10-09 13:23:39 -0700515 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700516 verifyClients(true /* c1 */, false /* c2 */, true /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700517
518 // call again should reclaim one graphic memory from lowest process
Chong Zhang181e6952019-10-09 13:23:39 -0700519 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700520 verifyClients(false /* c1 */, true /* c2 */, false /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700521
522 // nothing left
Chong Zhang181e6952019-10-09 13:23:39 -0700523 CHECK_STATUS_FALSE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700524 }
525
526
527 // ### secure codec can coexist with non-secure codec ###
528 {
529 addResource();
530 mService->mSupportsSecureWithNonSecureCodec = true;
531
532 // priority too low
Chong Zhang181e6952019-10-09 13:23:39 -0700533 CHECK_STATUS_FALSE(mService->reclaimResource(kLowPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700534
Chong Zhang181e6952019-10-09 13:23:39 -0700535 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700536 // one largest graphic memory from lowest process got reclaimed
Ronghua Wu05d89f12015-07-07 16:47:42 -0700537 verifyClients(true /* c1 */, false /* c2 */, false /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700538
539 // call again should reclaim another graphic memory from lowest process
Chong Zhang181e6952019-10-09 13:23:39 -0700540 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700541 verifyClients(false /* c1 */, true /* c2 */, false /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700542
543 // call again should reclaim another graphic memory from lowest process
Chong Zhang181e6952019-10-09 13:23:39 -0700544 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700545 verifyClients(false /* c1 */, false /* c2 */, true /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700546
547 // nothing left
Chong Zhang181e6952019-10-09 13:23:39 -0700548 CHECK_STATUS_FALSE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700549 }
Ronghua Wu67e7f542015-03-13 10:47:08 -0700550
551 // ### secure codec can coexist with non-secure codec ###
552 {
553 addResource();
554 mService->mSupportsSecureWithNonSecureCodec = true;
555
Chong Zhang181e6952019-10-09 13:23:39 -0700556 std::vector<MediaResourceParcel> resources;
557 resources.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, 1));
Ronghua Wu67e7f542015-03-13 10:47:08 -0700558
Chong Zhang181e6952019-10-09 13:23:39 -0700559 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu67e7f542015-03-13 10:47:08 -0700560 // one non secure codec from lowest process got reclaimed
Ronghua Wu05d89f12015-07-07 16:47:42 -0700561 verifyClients(false /* c1 */, true /* c2 */, false /* c3 */);
Ronghua Wu67e7f542015-03-13 10:47:08 -0700562
Ronghua Wu05d89f12015-07-07 16:47:42 -0700563 // no more non-secure codec, secure codec from lowest priority process will be reclaimed
Chong Zhang181e6952019-10-09 13:23:39 -0700564 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700565 verifyClients(true /* c1 */, false /* c2 */, false /* c3 */);
Ronghua Wu67e7f542015-03-13 10:47:08 -0700566
Ronghua Wu05d89f12015-07-07 16:47:42 -0700567 // clean up client 3 which still left
Chong Zhangfb092d32019-08-12 09:45:44 -0700568 mService->removeClient(kTestPid2, getId(mTestClient3));
Ronghua Wu67e7f542015-03-13 10:47:08 -0700569 }
Ronghua Wu231c3d12015-03-11 15:10:32 -0700570 }
571
572 void testGetLowestPriorityBiggestClient() {
Chong Zhang181e6952019-10-09 13:23:39 -0700573 MediaResource::Type type = MediaResource::Type::kGraphicMemory;
Chong Zhangfdd512a2019-11-22 11:03:14 -0800574 std::shared_ptr<IResourceManagerClient> client;
Ronghua Wu05d89f12015-07-07 16:47:42 -0700575 EXPECT_FALSE(mService->getLowestPriorityBiggestClient_l(kHighPriorityPid, type, &client));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700576
577 addResource();
578
Ronghua Wu05d89f12015-07-07 16:47:42 -0700579 EXPECT_FALSE(mService->getLowestPriorityBiggestClient_l(kLowPriorityPid, type, &client));
580 EXPECT_TRUE(mService->getLowestPriorityBiggestClient_l(kHighPriorityPid, type, &client));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700581
Chong Zhang181e6952019-10-09 13:23:39 -0700582 // kTestPid1 is the lowest priority process with MediaResource::Type::kGraphicMemory.
583 // mTestClient1 has the largest MediaResource::Type::kGraphicMemory within kTestPid1.
Ronghua Wu231c3d12015-03-11 15:10:32 -0700584 EXPECT_EQ(mTestClient1, client);
585 }
586
587 void testGetLowestPriorityPid() {
588 int pid;
589 int priority;
590 TestProcessInfo processInfo;
591
Chong Zhang181e6952019-10-09 13:23:39 -0700592 MediaResource::Type type = MediaResource::Type::kGraphicMemory;
Ronghua Wu231c3d12015-03-11 15:10:32 -0700593 EXPECT_FALSE(mService->getLowestPriorityPid_l(type, &pid, &priority));
594
595 addResource();
596
597 EXPECT_TRUE(mService->getLowestPriorityPid_l(type, &pid, &priority));
598 EXPECT_EQ(kTestPid1, pid);
599 int priority1;
600 processInfo.getPriority(kTestPid1, &priority1);
601 EXPECT_EQ(priority1, priority);
602
Chong Zhang181e6952019-10-09 13:23:39 -0700603 type = MediaResource::Type::kNonSecureCodec;
Ronghua Wu231c3d12015-03-11 15:10:32 -0700604 EXPECT_TRUE(mService->getLowestPriorityPid_l(type, &pid, &priority));
605 EXPECT_EQ(kTestPid2, pid);
606 int priority2;
607 processInfo.getPriority(kTestPid2, &priority2);
608 EXPECT_EQ(priority2, priority);
609 }
610
611 void testGetBiggestClient() {
Chong Zhang181e6952019-10-09 13:23:39 -0700612 MediaResource::Type type = MediaResource::Type::kGraphicMemory;
Chong Zhangfdd512a2019-11-22 11:03:14 -0800613 std::shared_ptr<IResourceManagerClient> client;
Ronghua Wu231c3d12015-03-11 15:10:32 -0700614 EXPECT_FALSE(mService->getBiggestClient_l(kTestPid2, type, &client));
615
616 addResource();
617
618 EXPECT_TRUE(mService->getBiggestClient_l(kTestPid2, type, &client));
619 EXPECT_EQ(mTestClient2, client);
620 }
621
622 void testIsCallingPriorityHigher() {
623 EXPECT_FALSE(mService->isCallingPriorityHigher_l(101, 100));
624 EXPECT_FALSE(mService->isCallingPriorityHigher_l(100, 100));
625 EXPECT_TRUE(mService->isCallingPriorityHigher_l(99, 100));
626 }
627
Chong Zhangdd726802019-08-21 17:24:13 -0700628 void testBatteryStats() {
629 // reset should always be called when ResourceManagerService is created (restarted)
630 EXPECT_EQ(1u, mSystemCB->eventCount());
631 EXPECT_EQ(EventType::VIDEO_RESET, mSystemCB->lastEventType());
632
633 // new client request should cause VIDEO_ON
Chong Zhang181e6952019-10-09 13:23:39 -0700634 std::vector<MediaResourceParcel> resources1;
635 resources1.push_back(MediaResource(MediaResource::Type::kBattery, MediaResource::SubType::kVideoCodec, 1));
Chong Zhangdd726802019-08-21 17:24:13 -0700636 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
637 EXPECT_EQ(2u, mSystemCB->eventCount());
638 EXPECT_EQ(EventEntry({EventType::VIDEO_ON, kTestUid1}), mSystemCB->lastEvent());
639
640 // each client should only cause 1 VIDEO_ON
641 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
642 EXPECT_EQ(2u, mSystemCB->eventCount());
643
644 // new client request should cause VIDEO_ON
Chong Zhang181e6952019-10-09 13:23:39 -0700645 std::vector<MediaResourceParcel> resources2;
646 resources2.push_back(MediaResource(MediaResource::Type::kBattery, MediaResource::SubType::kVideoCodec, 2));
Chong Zhangdd726802019-08-21 17:24:13 -0700647 mService->addResource(kTestPid2, kTestUid2, getId(mTestClient2), mTestClient2, resources2);
648 EXPECT_EQ(3u, mSystemCB->eventCount());
649 EXPECT_EQ(EventEntry({EventType::VIDEO_ON, kTestUid2}), mSystemCB->lastEvent());
650
651 // partially remove mTestClient1's request, shouldn't be any VIDEO_OFF
652 mService->removeResource(kTestPid1, getId(mTestClient1), resources1);
653 EXPECT_EQ(3u, mSystemCB->eventCount());
654
655 // remove mTestClient1's request, should be VIDEO_OFF for kTestUid1
656 // (use resource2 to test removing more instances than previously requested)
657 mService->removeResource(kTestPid1, getId(mTestClient1), resources2);
658 EXPECT_EQ(4u, mSystemCB->eventCount());
659 EXPECT_EQ(EventEntry({EventType::VIDEO_OFF, kTestUid1}), mSystemCB->lastEvent());
660
661 // remove mTestClient2, should be VIDEO_OFF for kTestUid2
662 mService->removeClient(kTestPid2, getId(mTestClient2));
663 EXPECT_EQ(5u, mSystemCB->eventCount());
664 EXPECT_EQ(EventEntry({EventType::VIDEO_OFF, kTestUid2}), mSystemCB->lastEvent());
665 }
666
667 void testCpusetBoost() {
668 // reset should always be called when ResourceManagerService is created (restarted)
669 EXPECT_EQ(1u, mSystemCB->eventCount());
670 EXPECT_EQ(EventType::VIDEO_RESET, mSystemCB->lastEventType());
671
672 // new client request should cause CPUSET_ENABLE
Chong Zhang181e6952019-10-09 13:23:39 -0700673 std::vector<MediaResourceParcel> resources1;
674 resources1.push_back(MediaResource(MediaResource::Type::kCpuBoost, 1));
Chong Zhangdd726802019-08-21 17:24:13 -0700675 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
676 EXPECT_EQ(2u, mSystemCB->eventCount());
677 EXPECT_EQ(EventType::CPUSET_ENABLE, mSystemCB->lastEventType());
678
679 // each client should only cause 1 CPUSET_ENABLE
680 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
681 EXPECT_EQ(2u, mSystemCB->eventCount());
682
683 // new client request should cause CPUSET_ENABLE
Chong Zhang181e6952019-10-09 13:23:39 -0700684 std::vector<MediaResourceParcel> resources2;
685 resources2.push_back(MediaResource(MediaResource::Type::kCpuBoost, 2));
Chong Zhangdd726802019-08-21 17:24:13 -0700686 mService->addResource(kTestPid2, kTestUid2, getId(mTestClient2), mTestClient2, resources2);
687 EXPECT_EQ(3u, mSystemCB->eventCount());
688 EXPECT_EQ(EventType::CPUSET_ENABLE, mSystemCB->lastEventType());
689
690 // remove mTestClient2 should not cause CPUSET_DISABLE, mTestClient1 still active
691 mService->removeClient(kTestPid2, getId(mTestClient2));
692 EXPECT_EQ(3u, mSystemCB->eventCount());
693
694 // remove 1 cpuboost from mTestClient1, should not be CPUSET_DISABLE (still 1 left)
695 mService->removeResource(kTestPid1, getId(mTestClient1), resources1);
696 EXPECT_EQ(3u, mSystemCB->eventCount());
697
698 // remove 2 cpuboost from mTestClient1, should be CPUSET_DISABLE
699 // (use resource2 to test removing more than previously requested)
700 mService->removeResource(kTestPid1, getId(mTestClient1), resources2);
701 EXPECT_EQ(4u, mSystemCB->eventCount());
702 EXPECT_EQ(EventType::CPUSET_DISABLE, mSystemCB->lastEventType());
703 }
Ronghua Wu231c3d12015-03-11 15:10:32 -0700704};
705
706TEST_F(ResourceManagerServiceTest, config) {
707 testConfig();
708}
709
710TEST_F(ResourceManagerServiceTest, addResource) {
711 addResource();
712}
713
Chong Zhangfb092d32019-08-12 09:45:44 -0700714TEST_F(ResourceManagerServiceTest, combineResource) {
715 testCombineResource();
716}
717
Chong Zhang181e6952019-10-09 13:23:39 -0700718TEST_F(ResourceManagerServiceTest, combineResourceNegative) {
719 testCombineResourceWithNegativeValues();
720}
721
Ronghua Wu231c3d12015-03-11 15:10:32 -0700722TEST_F(ResourceManagerServiceTest, removeResource) {
723 testRemoveResource();
724}
725
Chong Zhangfb092d32019-08-12 09:45:44 -0700726TEST_F(ResourceManagerServiceTest, removeClient) {
727 testRemoveClient();
728}
729
Ronghua Wu231c3d12015-03-11 15:10:32 -0700730TEST_F(ResourceManagerServiceTest, reclaimResource) {
731 testReclaimResourceSecure();
732 testReclaimResourceNonSecure();
733}
734
735TEST_F(ResourceManagerServiceTest, getAllClients_l) {
736 testGetAllClients();
737}
738
739TEST_F(ResourceManagerServiceTest, getLowestPriorityBiggestClient_l) {
740 testGetLowestPriorityBiggestClient();
741}
742
743TEST_F(ResourceManagerServiceTest, getLowestPriorityPid_l) {
744 testGetLowestPriorityPid();
745}
746
747TEST_F(ResourceManagerServiceTest, getBiggestClient_l) {
748 testGetBiggestClient();
749}
750
751TEST_F(ResourceManagerServiceTest, isCallingPriorityHigher_l) {
752 testIsCallingPriorityHigher();
753}
754
Chong Zhangdd726802019-08-21 17:24:13 -0700755TEST_F(ResourceManagerServiceTest, testBatteryStats) {
756 testBatteryStats();
757}
758
759TEST_F(ResourceManagerServiceTest, testCpusetBoost) {
760 testCpusetBoost();
761}
762
Henry Fang32762922020-01-28 18:40:39 -0800763TEST_F(ResourceManagerServiceTest, overridePid) {
764 testOverridePid();
765}
766
Wonsik Kimd20e9362020-04-28 10:42:57 -0700767TEST_F(ResourceManagerServiceTest, markClientForPendingRemoval) {
768 testMarkClientForPendingRemoval();
769}
770
Ronghua Wu231c3d12015-03-11 15:10:32 -0700771} // namespace android