blob: 203baf5815d036f85a1c2020bca711d1bd9a05e0 [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"
19#include <utils/Log.h>
20
21#include <gtest/gtest.h>
22
23#include "ResourceManagerService.h"
Chong Zhang181e6952019-10-09 13:23:39 -070024#include <android/media/BnResourceManagerClient.h>
Ronghua Wu231c3d12015-03-11 15:10:32 -070025#include <media/MediaResource.h>
26#include <media/MediaResourcePolicy.h>
27#include <media/stagefright/foundation/ADebug.h>
28#include <media/stagefright/ProcessInfoInterface.h>
29
30namespace android {
Chong Zhang181e6952019-10-09 13:23:39 -070031namespace media {
32
33using ::android::binder::Status;
Ronghua Wu231c3d12015-03-11 15:10:32 -070034
Chih-Hung Hsieh51873d82016-08-09 14:18:51 -070035static int64_t getId(const sp<IResourceManagerClient>& client) {
Ronghua Wu37c89242015-07-15 12:23:48 -070036 return (int64_t) client.get();
37}
38
Ronghua Wu231c3d12015-03-11 15:10:32 -070039struct TestProcessInfo : public ProcessInfoInterface {
40 TestProcessInfo() {}
41 virtual ~TestProcessInfo() {}
42
43 virtual bool getPriority(int pid, int *priority) {
44 // For testing, use pid as priority.
45 // Lower the value higher the priority.
46 *priority = pid;
47 return true;
48 }
49
Ronghua Wud11c43a2016-01-27 16:26:12 -080050 virtual bool isValidPid(int /* pid */) {
51 return true;
52 }
53
Ronghua Wu231c3d12015-03-11 15:10:32 -070054private:
55 DISALLOW_EVIL_CONSTRUCTORS(TestProcessInfo);
56};
57
Chong Zhangdd726802019-08-21 17:24:13 -070058struct TestSystemCallback :
59 public ResourceManagerService::SystemCallbackInterface {
60 TestSystemCallback() :
61 mLastEvent({EventType::INVALID, 0}), mEventCount(0) {}
62
63 enum EventType {
64 INVALID = -1,
65 VIDEO_ON = 0,
66 VIDEO_OFF = 1,
67 VIDEO_RESET = 2,
68 CPUSET_ENABLE = 3,
69 CPUSET_DISABLE = 4,
70 };
71
72 struct EventEntry {
73 EventType type;
74 int arg;
75 };
76
77 virtual void noteStartVideo(int uid) override {
78 mLastEvent = {EventType::VIDEO_ON, uid};
79 mEventCount++;
80 }
81
82 virtual void noteStopVideo(int uid) override {
83 mLastEvent = {EventType::VIDEO_OFF, uid};
84 mEventCount++;
85 }
86
87 virtual void noteResetVideo() override {
88 mLastEvent = {EventType::VIDEO_RESET, 0};
89 mEventCount++;
90 }
91
92 virtual bool requestCpusetBoost(
93 bool enable, const sp<IInterface> &/*client*/) override {
94 mLastEvent = {enable ? EventType::CPUSET_ENABLE : EventType::CPUSET_DISABLE, 0};
95 mEventCount++;
96 return true;
97 }
98
99 size_t eventCount() { return mEventCount; }
100 EventType lastEventType() { return mLastEvent.type; }
101 EventEntry lastEvent() { return mLastEvent; }
102
103protected:
104 virtual ~TestSystemCallback() {}
105
106private:
107 EventEntry mLastEvent;
108 size_t mEventCount;
109
110 DISALLOW_EVIL_CONSTRUCTORS(TestSystemCallback);
111};
112
113
Ronghua Wu231c3d12015-03-11 15:10:32 -0700114struct TestClient : public BnResourceManagerClient {
Ronghua Wu37c89242015-07-15 12:23:48 -0700115 TestClient(int pid, sp<ResourceManagerService> service)
116 : mReclaimed(false), mPid(pid), mService(service) {}
Ronghua Wu231c3d12015-03-11 15:10:32 -0700117
Chong Zhang181e6952019-10-09 13:23:39 -0700118 Status reclaimResource(bool* _aidl_return) override {
Ronghua Wu231c3d12015-03-11 15:10:32 -0700119 sp<IResourceManagerClient> client(this);
Chong Zhangfb092d32019-08-12 09:45:44 -0700120 mService->removeClient(mPid, (int64_t) client.get());
Ronghua Wu231c3d12015-03-11 15:10:32 -0700121 mReclaimed = true;
Chong Zhang181e6952019-10-09 13:23:39 -0700122 *_aidl_return = true;
123 return Status::ok();
Ronghua Wu231c3d12015-03-11 15:10:32 -0700124 }
125
Chong Zhang181e6952019-10-09 13:23:39 -0700126 Status getName(::std::string* _aidl_return) override {
127 *_aidl_return = "test_client";
128 return Status::ok();
Ronghua Wu8f9dd872015-04-23 15:24:25 -0700129 }
130
Ronghua Wu231c3d12015-03-11 15:10:32 -0700131 bool reclaimed() const {
132 return mReclaimed;
133 }
134
135 void reset() {
136 mReclaimed = false;
137 }
138
139protected:
140 virtual ~TestClient() {}
141
142private:
143 bool mReclaimed;
Ronghua Wu37c89242015-07-15 12:23:48 -0700144 int mPid;
Ronghua Wu231c3d12015-03-11 15:10:32 -0700145 sp<ResourceManagerService> mService;
146 DISALLOW_EVIL_CONSTRUCTORS(TestClient);
147};
148
149static const int kTestPid1 = 30;
Chong Zhangee33d642019-08-08 14:26:43 -0700150static const int kTestUid1 = 1010;
151
Ronghua Wu231c3d12015-03-11 15:10:32 -0700152static const int kTestPid2 = 20;
Chong Zhangee33d642019-08-08 14:26:43 -0700153static const int kTestUid2 = 1011;
Ronghua Wu231c3d12015-03-11 15:10:32 -0700154
Ronghua Wu05d89f12015-07-07 16:47:42 -0700155static const int kLowPriorityPid = 40;
156static const int kMidPriorityPid = 25;
157static const int kHighPriorityPid = 10;
158
Chong Zhangdd726802019-08-21 17:24:13 -0700159using EventType = TestSystemCallback::EventType;
160using EventEntry = TestSystemCallback::EventEntry;
161bool operator== (const EventEntry& lhs, const EventEntry& rhs) {
162 return lhs.type == rhs.type && lhs.arg == rhs.arg;
163}
164
Chong Zhang181e6952019-10-09 13:23:39 -0700165#define CHECK_STATUS_TRUE(condition) \
166 EXPECT_TRUE((condition).isOk() && (result))
167
168#define CHECK_STATUS_FALSE(condition) \
169 EXPECT_TRUE((condition).isOk() && !(result))
170
Ronghua Wu231c3d12015-03-11 15:10:32 -0700171class ResourceManagerServiceTest : public ::testing::Test {
172public:
173 ResourceManagerServiceTest()
Chong Zhangdd726802019-08-21 17:24:13 -0700174 : mSystemCB(new TestSystemCallback()),
175 mService(new ResourceManagerService(new TestProcessInfo, mSystemCB)),
Ronghua Wu37c89242015-07-15 12:23:48 -0700176 mTestClient1(new TestClient(kTestPid1, mService)),
177 mTestClient2(new TestClient(kTestPid2, mService)),
178 mTestClient3(new TestClient(kTestPid2, mService)) {
Ronghua Wu231c3d12015-03-11 15:10:32 -0700179 }
180
181protected:
Chong Zhang181e6952019-10-09 13:23:39 -0700182 static bool isEqualResources(const std::vector<MediaResourceParcel> &resources1,
Chong Zhangfb092d32019-08-12 09:45:44 -0700183 const ResourceList &resources2) {
184 // convert resource1 to ResourceList
185 ResourceList r1;
Ronghua Wu231c3d12015-03-11 15:10:32 -0700186 for (size_t i = 0; i < resources1.size(); ++i) {
Robert Shihc3af31b2019-09-20 21:45:01 -0700187 const auto &res = resources1[i];
Chong Zhang181e6952019-10-09 13:23:39 -0700188 const auto resType = std::tuple(res.type, res.subType, res.id);
Robert Shihc3af31b2019-09-20 21:45:01 -0700189 r1[resType] = res;
Ronghua Wu231c3d12015-03-11 15:10:32 -0700190 }
Chong Zhangfb092d32019-08-12 09:45:44 -0700191 return r1 == resources2;
Ronghua Wu231c3d12015-03-11 15:10:32 -0700192 }
193
Chong Zhangee33d642019-08-08 14:26:43 -0700194 static void expectEqResourceInfo(const ResourceInfo &info,
195 int uid,
196 sp<IResourceManagerClient> client,
Chong Zhang181e6952019-10-09 13:23:39 -0700197 const std::vector<MediaResourceParcel> &resources) {
Chong Zhangee33d642019-08-08 14:26:43 -0700198 EXPECT_EQ(uid, info.uid);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700199 EXPECT_EQ(client, info.client);
200 EXPECT_TRUE(isEqualResources(resources, info.resources));
201 }
202
203 void verifyClients(bool c1, bool c2, bool c3) {
204 TestClient *client1 = static_cast<TestClient*>(mTestClient1.get());
205 TestClient *client2 = static_cast<TestClient*>(mTestClient2.get());
206 TestClient *client3 = static_cast<TestClient*>(mTestClient3.get());
207
208 EXPECT_EQ(c1, client1->reclaimed());
209 EXPECT_EQ(c2, client2->reclaimed());
210 EXPECT_EQ(c3, client3->reclaimed());
211
212 client1->reset();
213 client2->reset();
214 client3->reset();
215 }
216
Ronghua Wu67e7f542015-03-13 10:47:08 -0700217 // test set up
218 // ---------------------------------------------------------------------------------
219 // pid priority client type number
220 // ---------------------------------------------------------------------------------
221 // kTestPid1(30) 30 mTestClient1 secure codec 1
222 // graphic memory 200
223 // graphic memory 200
224 // ---------------------------------------------------------------------------------
225 // kTestPid2(20) 20 mTestClient2 non-secure codec 1
226 // graphic memory 300
227 // -------------------------------------------
228 // mTestClient3 secure codec 1
229 // graphic memory 100
230 // ---------------------------------------------------------------------------------
Ronghua Wu231c3d12015-03-11 15:10:32 -0700231 void addResource() {
232 // kTestPid1 mTestClient1
Chong Zhang181e6952019-10-09 13:23:39 -0700233 std::vector<MediaResourceParcel> resources1;
234 resources1.push_back(MediaResource(MediaResource::Type::kSecureCodec, 1));
Chong Zhangee33d642019-08-08 14:26:43 -0700235 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
Chong Zhang181e6952019-10-09 13:23:39 -0700236 resources1.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 200));
237 std::vector<MediaResourceParcel> resources11;
238 resources11.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 200));
Chong Zhangee33d642019-08-08 14:26:43 -0700239 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources11);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700240
241 // kTestPid2 mTestClient2
Chong Zhang181e6952019-10-09 13:23:39 -0700242 std::vector<MediaResourceParcel> resources2;
243 resources2.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, 1));
244 resources2.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 300));
Chong Zhangee33d642019-08-08 14:26:43 -0700245 mService->addResource(kTestPid2, kTestUid2, getId(mTestClient2), mTestClient2, resources2);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700246
247 // kTestPid2 mTestClient3
Chong Zhang181e6952019-10-09 13:23:39 -0700248 std::vector<MediaResourceParcel> resources3;
Chong Zhangee33d642019-08-08 14:26:43 -0700249 mService->addResource(kTestPid2, kTestUid2, getId(mTestClient3), mTestClient3, resources3);
Chong Zhang181e6952019-10-09 13:23:39 -0700250 resources3.push_back(MediaResource(MediaResource::Type::kSecureCodec, 1));
251 resources3.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 100));
Chong Zhangee33d642019-08-08 14:26:43 -0700252 mService->addResource(kTestPid2, kTestUid2, getId(mTestClient3), mTestClient3, resources3);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700253
254 const PidResourceInfosMap &map = mService->mMap;
255 EXPECT_EQ(2u, map.size());
256 ssize_t index1 = map.indexOfKey(kTestPid1);
257 ASSERT_GE(index1, 0);
258 const ResourceInfos &infos1 = map[index1];
259 EXPECT_EQ(1u, infos1.size());
Chong Zhangfb092d32019-08-12 09:45:44 -0700260 expectEqResourceInfo(infos1.valueFor(getId(mTestClient1)), kTestUid1, mTestClient1, resources1);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700261
262 ssize_t index2 = map.indexOfKey(kTestPid2);
263 ASSERT_GE(index2, 0);
264 const ResourceInfos &infos2 = map[index2];
265 EXPECT_EQ(2u, infos2.size());
Chong Zhangfb092d32019-08-12 09:45:44 -0700266 expectEqResourceInfo(infos2.valueFor(getId(mTestClient2)), kTestUid2, mTestClient2, resources2);
267 expectEqResourceInfo(infos2.valueFor(getId(mTestClient3)), kTestUid2, mTestClient3, resources3);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700268 }
269
Chong Zhang181e6952019-10-09 13:23:39 -0700270 void testCombineResourceWithNegativeValues() {
271 // kTestPid1 mTestClient1
272 std::vector<MediaResourceParcel> resources1;
273 resources1.push_back(MediaResource(MediaResource::Type::kDrmSession, -100));
274 resources1.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, -100));
275 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
276
277 // Expected result:
278 // 1) the client should have been added;
279 // 2) both resource entries should have been rejected, resource list should be empty.
280 const PidResourceInfosMap &map = mService->mMap;
281 EXPECT_EQ(1u, map.size());
282 ssize_t index1 = map.indexOfKey(kTestPid1);
283 ASSERT_GE(index1, 0);
284 const ResourceInfos &infos1 = map[index1];
285 EXPECT_EQ(1u, infos1.size());
286 std::vector<MediaResourceParcel> expected;
287 expectEqResourceInfo(infos1.valueFor(getId(mTestClient1)), kTestUid1, mTestClient1, expected);
288
289 resources1.clear();
290 resources1.push_back(MediaResource(MediaResource::Type::kDrmSession, INT64_MAX));
291 resources1.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, INT64_MAX));
292 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
293 resources1.clear();
294 resources1.push_back(MediaResource(MediaResource::Type::kDrmSession, 10));
295 resources1.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, 10));
296 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
297
298 // Expected result:
299 // Both values should saturate to INT64_MAX
300 expected.push_back(MediaResource(MediaResource::Type::kDrmSession, INT64_MAX));
301 expected.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, INT64_MAX));
302 expectEqResourceInfo(infos1.valueFor(getId(mTestClient1)), kTestUid1, mTestClient1, expected);
303
304 resources1.clear();
305 resources1.push_back(MediaResource(MediaResource::Type::kDrmSession, -10));
306 resources1.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, -10));
307 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
308
309 // Expected result:
310 // 1) DrmSession resource should allow negative value addition, and value should drop accordingly
311 // 2) Non-drm session resource should ignore negative value addition.
312 expected.push_back(MediaResource(MediaResource::Type::kDrmSession, INT64_MAX - 10));
313 expected.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, INT64_MAX));
314 expectEqResourceInfo(infos1.valueFor(getId(mTestClient1)), kTestUid1, mTestClient1, expected);
315
316 resources1.clear();
317 resources1.push_back(MediaResource(MediaResource::Type::kDrmSession, INT64_MIN));
318 expected.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, INT64_MIN));
319 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
320
321 // Expected result:
322 // 1) DrmSession resource value should drop to 0, but the entry shouldn't be removed.
323 // 2) Non-drm session resource should ignore negative value addition.
324 expected.clear();
325 expected.push_back(MediaResource(MediaResource::Type::kDrmSession, 0));
326 expected.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, INT64_MAX));
327 expectEqResourceInfo(infos1.valueFor(getId(mTestClient1)), kTestUid1, mTestClient1, expected);
328 }
329
Ronghua Wu231c3d12015-03-11 15:10:32 -0700330 void testConfig() {
331 EXPECT_TRUE(mService->mSupportsMultipleSecureCodecs);
332 EXPECT_TRUE(mService->mSupportsSecureWithNonSecureCodec);
333
Chong Zhang181e6952019-10-09 13:23:39 -0700334 std::vector<MediaResourcePolicyParcel> policies1;
Ronghua Wu231c3d12015-03-11 15:10:32 -0700335 policies1.push_back(
Ronghua Wu9ba21b92015-04-21 14:23:06 -0700336 MediaResourcePolicy(
Chong Zhang181e6952019-10-09 13:23:39 -0700337 IResourceManagerService::kPolicySupportsMultipleSecureCodecs(),
338 "true"));
Ronghua Wu9ba21b92015-04-21 14:23:06 -0700339 policies1.push_back(
340 MediaResourcePolicy(
Chong Zhang181e6952019-10-09 13:23:39 -0700341 IResourceManagerService::kPolicySupportsSecureWithNonSecureCodec(),
342 "false"));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700343 mService->config(policies1);
344 EXPECT_TRUE(mService->mSupportsMultipleSecureCodecs);
345 EXPECT_FALSE(mService->mSupportsSecureWithNonSecureCodec);
346
Chong Zhang181e6952019-10-09 13:23:39 -0700347 std::vector<MediaResourcePolicyParcel> policies2;
Ronghua Wu231c3d12015-03-11 15:10:32 -0700348 policies2.push_back(
Ronghua Wu9ba21b92015-04-21 14:23:06 -0700349 MediaResourcePolicy(
Chong Zhang181e6952019-10-09 13:23:39 -0700350 IResourceManagerService::kPolicySupportsMultipleSecureCodecs(),
351 "false"));
Ronghua Wu9ba21b92015-04-21 14:23:06 -0700352 policies2.push_back(
353 MediaResourcePolicy(
Chong Zhang181e6952019-10-09 13:23:39 -0700354 IResourceManagerService::kPolicySupportsSecureWithNonSecureCodec(),
355 "true"));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700356 mService->config(policies2);
357 EXPECT_FALSE(mService->mSupportsMultipleSecureCodecs);
358 EXPECT_TRUE(mService->mSupportsSecureWithNonSecureCodec);
359 }
360
Chong Zhangfb092d32019-08-12 09:45:44 -0700361 void testCombineResource() {
362 // kTestPid1 mTestClient1
Chong Zhang181e6952019-10-09 13:23:39 -0700363 std::vector<MediaResourceParcel> resources1;
364 resources1.push_back(MediaResource(MediaResource::Type::kSecureCodec, 1));
Chong Zhangfb092d32019-08-12 09:45:44 -0700365 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
366
Chong Zhang181e6952019-10-09 13:23:39 -0700367 std::vector<MediaResourceParcel> resources11;
368 resources11.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 200));
Chong Zhangfb092d32019-08-12 09:45:44 -0700369 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources11);
370
371 const PidResourceInfosMap &map = mService->mMap;
372 EXPECT_EQ(1u, map.size());
373 ssize_t index1 = map.indexOfKey(kTestPid1);
374 ASSERT_GE(index1, 0);
375 const ResourceInfos &infos1 = map[index1];
376 EXPECT_EQ(1u, infos1.size());
377
378 // test adding existing types to combine values
Chong Zhang181e6952019-10-09 13:23:39 -0700379 resources1.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 100));
Chong Zhangfb092d32019-08-12 09:45:44 -0700380 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
381
Chong Zhang181e6952019-10-09 13:23:39 -0700382 std::vector<MediaResourceParcel> expected;
383 expected.push_back(MediaResource(MediaResource::Type::kSecureCodec, 2));
384 expected.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 300));
Chong Zhangfb092d32019-08-12 09:45:44 -0700385 expectEqResourceInfo(infos1.valueFor(getId(mTestClient1)), kTestUid1, mTestClient1, expected);
386
387 // test adding new types (including types that differs only in subType)
Chong Zhang181e6952019-10-09 13:23:39 -0700388 resources11.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, 1));
389 resources11.push_back(MediaResource(MediaResource::Type::kSecureCodec, MediaResource::SubType::kVideoCodec, 1));
Chong Zhangfb092d32019-08-12 09:45:44 -0700390 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources11);
391
392 expected.clear();
Chong Zhang181e6952019-10-09 13:23:39 -0700393 expected.push_back(MediaResource(MediaResource::Type::kSecureCodec, 2));
394 expected.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, 1));
395 expected.push_back(MediaResource(MediaResource::Type::kSecureCodec, MediaResource::SubType::kVideoCodec, 1));
396 expected.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 500));
Chong Zhangfb092d32019-08-12 09:45:44 -0700397 expectEqResourceInfo(infos1.valueFor(getId(mTestClient1)), kTestUid1, mTestClient1, expected);
398 }
399
Ronghua Wu231c3d12015-03-11 15:10:32 -0700400 void testRemoveResource() {
Chong Zhangfb092d32019-08-12 09:45:44 -0700401 // kTestPid1 mTestClient1
Chong Zhang181e6952019-10-09 13:23:39 -0700402 std::vector<MediaResourceParcel> resources1;
403 resources1.push_back(MediaResource(MediaResource::Type::kSecureCodec, 1));
Chong Zhangfb092d32019-08-12 09:45:44 -0700404 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
405
Chong Zhang181e6952019-10-09 13:23:39 -0700406 std::vector<MediaResourceParcel> resources11;
407 resources11.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 200));
Chong Zhangfb092d32019-08-12 09:45:44 -0700408 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources11);
409
410 const PidResourceInfosMap &map = mService->mMap;
411 EXPECT_EQ(1u, map.size());
412 ssize_t index1 = map.indexOfKey(kTestPid1);
413 ASSERT_GE(index1, 0);
414 const ResourceInfos &infos1 = map[index1];
415 EXPECT_EQ(1u, infos1.size());
416
417 // test partial removal
Chong Zhang181e6952019-10-09 13:23:39 -0700418 resources11[0].value = 100;
Chong Zhangfb092d32019-08-12 09:45:44 -0700419 mService->removeResource(kTestPid1, getId(mTestClient1), resources11);
420
Chong Zhang181e6952019-10-09 13:23:39 -0700421 std::vector<MediaResourceParcel> expected;
422 expected.push_back(MediaResource(MediaResource::Type::kSecureCodec, 1));
423 expected.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 100));
424 expectEqResourceInfo(infos1.valueFor(getId(mTestClient1)), kTestUid1, mTestClient1, expected);
425
426 // test removal request with negative value, should be ignored
427 resources11[0].value = -10000;
428 mService->removeResource(kTestPid1, getId(mTestClient1), resources11);
429
Chong Zhangfb092d32019-08-12 09:45:44 -0700430 expectEqResourceInfo(infos1.valueFor(getId(mTestClient1)), kTestUid1, mTestClient1, expected);
431
432 // test complete removal with overshoot value
Chong Zhang181e6952019-10-09 13:23:39 -0700433 resources11[0].value = 1000;
Chong Zhangfb092d32019-08-12 09:45:44 -0700434 mService->removeResource(kTestPid1, getId(mTestClient1), resources11);
435
436 expected.clear();
Chong Zhang181e6952019-10-09 13:23:39 -0700437 expected.push_back(MediaResource(MediaResource::Type::kSecureCodec, 1));
Chong Zhangfb092d32019-08-12 09:45:44 -0700438 expectEqResourceInfo(infos1.valueFor(getId(mTestClient1)), kTestUid1, mTestClient1, expected);
439 }
440
441 void testRemoveClient() {
Ronghua Wu231c3d12015-03-11 15:10:32 -0700442 addResource();
443
Chong Zhangfb092d32019-08-12 09:45:44 -0700444 mService->removeClient(kTestPid2, getId(mTestClient2));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700445
446 const PidResourceInfosMap &map = mService->mMap;
447 EXPECT_EQ(2u, map.size());
448 const ResourceInfos &infos1 = map.valueFor(kTestPid1);
449 const ResourceInfos &infos2 = map.valueFor(kTestPid2);
450 EXPECT_EQ(1u, infos1.size());
451 EXPECT_EQ(1u, infos2.size());
452 // mTestClient2 has been removed.
Chong Zhangfb092d32019-08-12 09:45:44 -0700453 // (OK to use infos2[0] as there is only 1 entry)
Ronghua Wu231c3d12015-03-11 15:10:32 -0700454 EXPECT_EQ(mTestClient3, infos2[0].client);
455 }
456
457 void testGetAllClients() {
458 addResource();
459
Chong Zhang181e6952019-10-09 13:23:39 -0700460 MediaResource::Type type = MediaResource::Type::kSecureCodec;
Ronghua Wu231c3d12015-03-11 15:10:32 -0700461 Vector<sp<IResourceManagerClient> > clients;
Ronghua Wu05d89f12015-07-07 16:47:42 -0700462 EXPECT_FALSE(mService->getAllClients_l(kLowPriorityPid, type, &clients));
Ronghua Wu67e7f542015-03-13 10:47:08 -0700463 // some higher priority process (e.g. kTestPid2) owns the resource, so getAllClients_l
464 // will fail.
Ronghua Wu05d89f12015-07-07 16:47:42 -0700465 EXPECT_FALSE(mService->getAllClients_l(kMidPriorityPid, type, &clients));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700466 EXPECT_TRUE(mService->getAllClients_l(kHighPriorityPid, type, &clients));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700467
468 EXPECT_EQ(2u, clients.size());
Chong Zhangfb092d32019-08-12 09:45:44 -0700469 // (OK to require ordering in clients[], as the pid map is sorted)
Ronghua Wu231c3d12015-03-11 15:10:32 -0700470 EXPECT_EQ(mTestClient3, clients[0]);
471 EXPECT_EQ(mTestClient1, clients[1]);
472 }
473
474 void testReclaimResourceSecure() {
Chong Zhang181e6952019-10-09 13:23:39 -0700475 bool result;
476 std::vector<MediaResourceParcel> resources;
477 resources.push_back(MediaResource(MediaResource::Type::kSecureCodec, 1));
478 resources.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 150));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700479
480 // ### secure codec can't coexist and secure codec can coexist with non-secure codec ###
481 {
482 addResource();
483 mService->mSupportsMultipleSecureCodecs = false;
484 mService->mSupportsSecureWithNonSecureCodec = true;
485
486 // priority too low
Chong Zhang181e6952019-10-09 13:23:39 -0700487 CHECK_STATUS_FALSE(mService->reclaimResource(kLowPriorityPid, resources, &result));
488 CHECK_STATUS_FALSE(mService->reclaimResource(kMidPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700489
490 // reclaim all secure codecs
Chong Zhang181e6952019-10-09 13:23:39 -0700491 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700492 verifyClients(true /* c1 */, false /* c2 */, true /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700493
494 // call again should reclaim one largest graphic memory from lowest process
Chong Zhang181e6952019-10-09 13:23:39 -0700495 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700496 verifyClients(false /* c1 */, true /* c2 */, false /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700497
498 // nothing left
Chong Zhang181e6952019-10-09 13:23:39 -0700499 CHECK_STATUS_FALSE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700500 }
501
502 // ### secure codecs can't coexist and secure codec can't coexist with non-secure codec ###
503 {
504 addResource();
505 mService->mSupportsMultipleSecureCodecs = false;
506 mService->mSupportsSecureWithNonSecureCodec = false;
507
508 // priority too low
Chong Zhang181e6952019-10-09 13:23:39 -0700509 CHECK_STATUS_FALSE(mService->reclaimResource(kLowPriorityPid, resources, &result));
510 CHECK_STATUS_FALSE(mService->reclaimResource(kMidPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700511
512 // reclaim all secure and non-secure codecs
Chong Zhang181e6952019-10-09 13:23:39 -0700513 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700514 verifyClients(true /* c1 */, true /* c2 */, true /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700515
516 // nothing left
Chong Zhang181e6952019-10-09 13:23:39 -0700517 CHECK_STATUS_FALSE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700518 }
519
520
521 // ### secure codecs can coexist but secure codec can't coexist with non-secure codec ###
522 {
523 addResource();
524 mService->mSupportsMultipleSecureCodecs = true;
525 mService->mSupportsSecureWithNonSecureCodec = false;
526
527 // priority too low
Chong Zhang181e6952019-10-09 13:23:39 -0700528 CHECK_STATUS_FALSE(mService->reclaimResource(kLowPriorityPid, resources, &result));
529 CHECK_STATUS_FALSE(mService->reclaimResource(kMidPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700530
531 // reclaim all non-secure codecs
Chong Zhang181e6952019-10-09 13:23:39 -0700532 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700533 verifyClients(false /* c1 */, true /* c2 */, false /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700534
535 // call again should reclaim one largest graphic memory from lowest process
Chong Zhang181e6952019-10-09 13:23:39 -0700536 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
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 largest 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 */, false /* c2 */, true /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700542
543 // nothing left
Chong Zhang181e6952019-10-09 13:23:39 -0700544 CHECK_STATUS_FALSE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700545 }
546
547 // ### secure codecs can coexist and secure codec can coexist with non-secure codec ###
548 {
549 addResource();
550 mService->mSupportsMultipleSecureCodecs = true;
551 mService->mSupportsSecureWithNonSecureCodec = true;
552
553 // priority too low
Chong Zhang181e6952019-10-09 13:23:39 -0700554 CHECK_STATUS_FALSE(mService->reclaimResource(kLowPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700555
Chong Zhang181e6952019-10-09 13:23:39 -0700556 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700557 // one largest graphic memory from lowest process got reclaimed
Ronghua Wu05d89f12015-07-07 16:47:42 -0700558 verifyClients(true /* c1 */, false /* c2 */, false /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700559
560 // call again should reclaim another graphic memory from lowest process
Chong Zhang181e6952019-10-09 13:23:39 -0700561 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700562 verifyClients(false /* c1 */, true /* c2 */, false /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700563
564 // call again should reclaim another graphic memory from lowest process
Chong Zhang181e6952019-10-09 13:23:39 -0700565 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700566 verifyClients(false /* c1 */, false /* c2 */, true /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700567
568 // nothing left
Chong Zhang181e6952019-10-09 13:23:39 -0700569 CHECK_STATUS_FALSE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700570 }
Ronghua Wu67e7f542015-03-13 10:47:08 -0700571
572 // ### secure codecs can coexist and secure codec can coexist with non-secure codec ###
573 {
574 addResource();
575 mService->mSupportsMultipleSecureCodecs = true;
576 mService->mSupportsSecureWithNonSecureCodec = true;
577
Chong Zhang181e6952019-10-09 13:23:39 -0700578 std::vector<MediaResourceParcel> resources;
579 resources.push_back(MediaResource(MediaResource::Type::kSecureCodec, 1));
Ronghua Wu67e7f542015-03-13 10:47:08 -0700580
Chong Zhang181e6952019-10-09 13:23:39 -0700581 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu67e7f542015-03-13 10:47:08 -0700582 // secure codec from lowest process got reclaimed
Ronghua Wu05d89f12015-07-07 16:47:42 -0700583 verifyClients(true /* c1 */, false /* c2 */, false /* c3 */);
Ronghua Wu67e7f542015-03-13 10:47:08 -0700584
585 // call again should reclaim another secure codec from lowest process
Chong Zhang181e6952019-10-09 13:23:39 -0700586 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700587 verifyClients(false /* c1 */, false /* c2 */, true /* c3 */);
Ronghua Wu67e7f542015-03-13 10:47:08 -0700588
Ronghua Wu05d89f12015-07-07 16:47:42 -0700589 // no more secure codec, non-secure codec will be reclaimed.
Chong Zhang181e6952019-10-09 13:23:39 -0700590 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700591 verifyClients(false /* c1 */, true /* c2 */, false /* c3 */);
Ronghua Wu67e7f542015-03-13 10:47:08 -0700592 }
Ronghua Wu231c3d12015-03-11 15:10:32 -0700593 }
594
595 void testReclaimResourceNonSecure() {
Chong Zhang181e6952019-10-09 13:23:39 -0700596 bool result;
597 std::vector<MediaResourceParcel> resources;
598 resources.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, 1));
599 resources.push_back(MediaResource(MediaResource::Type::kGraphicMemory, 150));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700600
601 // ### secure codec can't coexist with non-secure codec ###
602 {
603 addResource();
604 mService->mSupportsSecureWithNonSecureCodec = false;
605
606 // priority too low
Chong Zhang181e6952019-10-09 13:23:39 -0700607 CHECK_STATUS_FALSE(mService->reclaimResource(kLowPriorityPid, resources, &result));
608 CHECK_STATUS_FALSE(mService->reclaimResource(kMidPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700609
610 // reclaim all secure codecs
Chong Zhang181e6952019-10-09 13:23:39 -0700611 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700612 verifyClients(true /* c1 */, false /* c2 */, true /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700613
614 // call again should reclaim one graphic memory from lowest process
Chong Zhang181e6952019-10-09 13:23:39 -0700615 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700616 verifyClients(false /* c1 */, true /* c2 */, false /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700617
618 // nothing left
Chong Zhang181e6952019-10-09 13:23:39 -0700619 CHECK_STATUS_FALSE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700620 }
621
622
623 // ### secure codec can coexist with non-secure codec ###
624 {
625 addResource();
626 mService->mSupportsSecureWithNonSecureCodec = true;
627
628 // priority too low
Chong Zhang181e6952019-10-09 13:23:39 -0700629 CHECK_STATUS_FALSE(mService->reclaimResource(kLowPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700630
Chong Zhang181e6952019-10-09 13:23:39 -0700631 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700632 // one largest graphic memory from lowest process got reclaimed
Ronghua Wu05d89f12015-07-07 16:47:42 -0700633 verifyClients(true /* c1 */, false /* c2 */, false /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700634
635 // call again should reclaim another graphic memory from lowest process
Chong Zhang181e6952019-10-09 13:23:39 -0700636 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700637 verifyClients(false /* c1 */, true /* c2 */, false /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700638
639 // call again should reclaim another graphic memory from lowest process
Chong Zhang181e6952019-10-09 13:23:39 -0700640 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700641 verifyClients(false /* c1 */, false /* c2 */, true /* c3 */);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700642
643 // nothing left
Chong Zhang181e6952019-10-09 13:23:39 -0700644 CHECK_STATUS_FALSE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700645 }
Ronghua Wu67e7f542015-03-13 10:47:08 -0700646
647 // ### secure codec can coexist with non-secure codec ###
648 {
649 addResource();
650 mService->mSupportsSecureWithNonSecureCodec = true;
651
Chong Zhang181e6952019-10-09 13:23:39 -0700652 std::vector<MediaResourceParcel> resources;
653 resources.push_back(MediaResource(MediaResource::Type::kNonSecureCodec, 1));
Ronghua Wu67e7f542015-03-13 10:47:08 -0700654
Chong Zhang181e6952019-10-09 13:23:39 -0700655 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu67e7f542015-03-13 10:47:08 -0700656 // one non secure codec from lowest process got reclaimed
Ronghua Wu05d89f12015-07-07 16:47:42 -0700657 verifyClients(false /* c1 */, true /* c2 */, false /* c3 */);
Ronghua Wu67e7f542015-03-13 10:47:08 -0700658
Ronghua Wu05d89f12015-07-07 16:47:42 -0700659 // no more non-secure codec, secure codec from lowest priority process will be reclaimed
Chong Zhang181e6952019-10-09 13:23:39 -0700660 CHECK_STATUS_TRUE(mService->reclaimResource(kHighPriorityPid, resources, &result));
Ronghua Wu05d89f12015-07-07 16:47:42 -0700661 verifyClients(true /* c1 */, false /* c2 */, false /* c3 */);
Ronghua Wu67e7f542015-03-13 10:47:08 -0700662
Ronghua Wu05d89f12015-07-07 16:47:42 -0700663 // clean up client 3 which still left
Chong Zhangfb092d32019-08-12 09:45:44 -0700664 mService->removeClient(kTestPid2, getId(mTestClient3));
Ronghua Wu67e7f542015-03-13 10:47:08 -0700665 }
Ronghua Wu231c3d12015-03-11 15:10:32 -0700666 }
667
668 void testGetLowestPriorityBiggestClient() {
Chong Zhang181e6952019-10-09 13:23:39 -0700669 MediaResource::Type type = MediaResource::Type::kGraphicMemory;
Ronghua Wu231c3d12015-03-11 15:10:32 -0700670 sp<IResourceManagerClient> client;
Ronghua Wu05d89f12015-07-07 16:47:42 -0700671 EXPECT_FALSE(mService->getLowestPriorityBiggestClient_l(kHighPriorityPid, type, &client));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700672
673 addResource();
674
Ronghua Wu05d89f12015-07-07 16:47:42 -0700675 EXPECT_FALSE(mService->getLowestPriorityBiggestClient_l(kLowPriorityPid, type, &client));
676 EXPECT_TRUE(mService->getLowestPriorityBiggestClient_l(kHighPriorityPid, type, &client));
Ronghua Wu231c3d12015-03-11 15:10:32 -0700677
Chong Zhang181e6952019-10-09 13:23:39 -0700678 // kTestPid1 is the lowest priority process with MediaResource::Type::kGraphicMemory.
679 // mTestClient1 has the largest MediaResource::Type::kGraphicMemory within kTestPid1.
Ronghua Wu231c3d12015-03-11 15:10:32 -0700680 EXPECT_EQ(mTestClient1, client);
681 }
682
683 void testGetLowestPriorityPid() {
684 int pid;
685 int priority;
686 TestProcessInfo processInfo;
687
Chong Zhang181e6952019-10-09 13:23:39 -0700688 MediaResource::Type type = MediaResource::Type::kGraphicMemory;
Ronghua Wu231c3d12015-03-11 15:10:32 -0700689 EXPECT_FALSE(mService->getLowestPriorityPid_l(type, &pid, &priority));
690
691 addResource();
692
693 EXPECT_TRUE(mService->getLowestPriorityPid_l(type, &pid, &priority));
694 EXPECT_EQ(kTestPid1, pid);
695 int priority1;
696 processInfo.getPriority(kTestPid1, &priority1);
697 EXPECT_EQ(priority1, priority);
698
Chong Zhang181e6952019-10-09 13:23:39 -0700699 type = MediaResource::Type::kNonSecureCodec;
Ronghua Wu231c3d12015-03-11 15:10:32 -0700700 EXPECT_TRUE(mService->getLowestPriorityPid_l(type, &pid, &priority));
701 EXPECT_EQ(kTestPid2, pid);
702 int priority2;
703 processInfo.getPriority(kTestPid2, &priority2);
704 EXPECT_EQ(priority2, priority);
705 }
706
707 void testGetBiggestClient() {
Chong Zhang181e6952019-10-09 13:23:39 -0700708 MediaResource::Type type = MediaResource::Type::kGraphicMemory;
Ronghua Wu231c3d12015-03-11 15:10:32 -0700709 sp<IResourceManagerClient> client;
710 EXPECT_FALSE(mService->getBiggestClient_l(kTestPid2, type, &client));
711
712 addResource();
713
714 EXPECT_TRUE(mService->getBiggestClient_l(kTestPid2, type, &client));
715 EXPECT_EQ(mTestClient2, client);
716 }
717
718 void testIsCallingPriorityHigher() {
719 EXPECT_FALSE(mService->isCallingPriorityHigher_l(101, 100));
720 EXPECT_FALSE(mService->isCallingPriorityHigher_l(100, 100));
721 EXPECT_TRUE(mService->isCallingPriorityHigher_l(99, 100));
722 }
723
Chong Zhangdd726802019-08-21 17:24:13 -0700724 void testBatteryStats() {
725 // reset should always be called when ResourceManagerService is created (restarted)
726 EXPECT_EQ(1u, mSystemCB->eventCount());
727 EXPECT_EQ(EventType::VIDEO_RESET, mSystemCB->lastEventType());
728
729 // new client request should cause VIDEO_ON
Chong Zhang181e6952019-10-09 13:23:39 -0700730 std::vector<MediaResourceParcel> resources1;
731 resources1.push_back(MediaResource(MediaResource::Type::kBattery, MediaResource::SubType::kVideoCodec, 1));
Chong Zhangdd726802019-08-21 17:24:13 -0700732 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
733 EXPECT_EQ(2u, mSystemCB->eventCount());
734 EXPECT_EQ(EventEntry({EventType::VIDEO_ON, kTestUid1}), mSystemCB->lastEvent());
735
736 // each client should only cause 1 VIDEO_ON
737 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
738 EXPECT_EQ(2u, mSystemCB->eventCount());
739
740 // new client request should cause VIDEO_ON
Chong Zhang181e6952019-10-09 13:23:39 -0700741 std::vector<MediaResourceParcel> resources2;
742 resources2.push_back(MediaResource(MediaResource::Type::kBattery, MediaResource::SubType::kVideoCodec, 2));
Chong Zhangdd726802019-08-21 17:24:13 -0700743 mService->addResource(kTestPid2, kTestUid2, getId(mTestClient2), mTestClient2, resources2);
744 EXPECT_EQ(3u, mSystemCB->eventCount());
745 EXPECT_EQ(EventEntry({EventType::VIDEO_ON, kTestUid2}), mSystemCB->lastEvent());
746
747 // partially remove mTestClient1's request, shouldn't be any VIDEO_OFF
748 mService->removeResource(kTestPid1, getId(mTestClient1), resources1);
749 EXPECT_EQ(3u, mSystemCB->eventCount());
750
751 // remove mTestClient1's request, should be VIDEO_OFF for kTestUid1
752 // (use resource2 to test removing more instances than previously requested)
753 mService->removeResource(kTestPid1, getId(mTestClient1), resources2);
754 EXPECT_EQ(4u, mSystemCB->eventCount());
755 EXPECT_EQ(EventEntry({EventType::VIDEO_OFF, kTestUid1}), mSystemCB->lastEvent());
756
757 // remove mTestClient2, should be VIDEO_OFF for kTestUid2
758 mService->removeClient(kTestPid2, getId(mTestClient2));
759 EXPECT_EQ(5u, mSystemCB->eventCount());
760 EXPECT_EQ(EventEntry({EventType::VIDEO_OFF, kTestUid2}), mSystemCB->lastEvent());
761 }
762
763 void testCpusetBoost() {
764 // reset should always be called when ResourceManagerService is created (restarted)
765 EXPECT_EQ(1u, mSystemCB->eventCount());
766 EXPECT_EQ(EventType::VIDEO_RESET, mSystemCB->lastEventType());
767
768 // new client request should cause CPUSET_ENABLE
Chong Zhang181e6952019-10-09 13:23:39 -0700769 std::vector<MediaResourceParcel> resources1;
770 resources1.push_back(MediaResource(MediaResource::Type::kCpuBoost, 1));
Chong Zhangdd726802019-08-21 17:24:13 -0700771 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
772 EXPECT_EQ(2u, mSystemCB->eventCount());
773 EXPECT_EQ(EventType::CPUSET_ENABLE, mSystemCB->lastEventType());
774
775 // each client should only cause 1 CPUSET_ENABLE
776 mService->addResource(kTestPid1, kTestUid1, getId(mTestClient1), mTestClient1, resources1);
777 EXPECT_EQ(2u, mSystemCB->eventCount());
778
779 // new client request should cause CPUSET_ENABLE
Chong Zhang181e6952019-10-09 13:23:39 -0700780 std::vector<MediaResourceParcel> resources2;
781 resources2.push_back(MediaResource(MediaResource::Type::kCpuBoost, 2));
Chong Zhangdd726802019-08-21 17:24:13 -0700782 mService->addResource(kTestPid2, kTestUid2, getId(mTestClient2), mTestClient2, resources2);
783 EXPECT_EQ(3u, mSystemCB->eventCount());
784 EXPECT_EQ(EventType::CPUSET_ENABLE, mSystemCB->lastEventType());
785
786 // remove mTestClient2 should not cause CPUSET_DISABLE, mTestClient1 still active
787 mService->removeClient(kTestPid2, getId(mTestClient2));
788 EXPECT_EQ(3u, mSystemCB->eventCount());
789
790 // remove 1 cpuboost from mTestClient1, should not be CPUSET_DISABLE (still 1 left)
791 mService->removeResource(kTestPid1, getId(mTestClient1), resources1);
792 EXPECT_EQ(3u, mSystemCB->eventCount());
793
794 // remove 2 cpuboost from mTestClient1, should be CPUSET_DISABLE
795 // (use resource2 to test removing more than previously requested)
796 mService->removeResource(kTestPid1, getId(mTestClient1), resources2);
797 EXPECT_EQ(4u, mSystemCB->eventCount());
798 EXPECT_EQ(EventType::CPUSET_DISABLE, mSystemCB->lastEventType());
799 }
800
801 sp<TestSystemCallback> mSystemCB;
Ronghua Wu231c3d12015-03-11 15:10:32 -0700802 sp<ResourceManagerService> mService;
803 sp<IResourceManagerClient> mTestClient1;
804 sp<IResourceManagerClient> mTestClient2;
805 sp<IResourceManagerClient> mTestClient3;
806};
807
808TEST_F(ResourceManagerServiceTest, config) {
809 testConfig();
810}
811
812TEST_F(ResourceManagerServiceTest, addResource) {
813 addResource();
814}
815
Chong Zhangfb092d32019-08-12 09:45:44 -0700816TEST_F(ResourceManagerServiceTest, combineResource) {
817 testCombineResource();
818}
819
Chong Zhang181e6952019-10-09 13:23:39 -0700820TEST_F(ResourceManagerServiceTest, combineResourceNegative) {
821 testCombineResourceWithNegativeValues();
822}
823
Ronghua Wu231c3d12015-03-11 15:10:32 -0700824TEST_F(ResourceManagerServiceTest, removeResource) {
825 testRemoveResource();
826}
827
Chong Zhangfb092d32019-08-12 09:45:44 -0700828TEST_F(ResourceManagerServiceTest, removeClient) {
829 testRemoveClient();
830}
831
Ronghua Wu231c3d12015-03-11 15:10:32 -0700832TEST_F(ResourceManagerServiceTest, reclaimResource) {
833 testReclaimResourceSecure();
834 testReclaimResourceNonSecure();
835}
836
837TEST_F(ResourceManagerServiceTest, getAllClients_l) {
838 testGetAllClients();
839}
840
841TEST_F(ResourceManagerServiceTest, getLowestPriorityBiggestClient_l) {
842 testGetLowestPriorityBiggestClient();
843}
844
845TEST_F(ResourceManagerServiceTest, getLowestPriorityPid_l) {
846 testGetLowestPriorityPid();
847}
848
849TEST_F(ResourceManagerServiceTest, getBiggestClient_l) {
850 testGetBiggestClient();
851}
852
853TEST_F(ResourceManagerServiceTest, isCallingPriorityHigher_l) {
854 testIsCallingPriorityHigher();
855}
856
Chong Zhangdd726802019-08-21 17:24:13 -0700857TEST_F(ResourceManagerServiceTest, testBatteryStats) {
858 testBatteryStats();
859}
860
861TEST_F(ResourceManagerServiceTest, testCpusetBoost) {
862 testCpusetBoost();
863}
864
Chong Zhang181e6952019-10-09 13:23:39 -0700865} // namespace media
Ronghua Wu231c3d12015-03-11 15:10:32 -0700866} // namespace android