blob: 30f6a91c2a4c6f432f17326247c3b42578516547 [file] [log] [blame]
Ronghua Wu10305cc2015-02-22 07:55:32 -08001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
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 "DrmSessionManager_test"
Robert Shiha90aee32019-11-14 15:43:39 -080019#include <android/binder_auto_utils.h>
Ronghua Wu10305cc2015-02-22 07:55:32 -080020#include <utils/Log.h>
21
22#include <gtest/gtest.h>
23
Robert Shiha90aee32019-11-14 15:43:39 -080024#include <aidl/android/media/BnResourceManagerClient.h>
25#include <aidl/android/media/BnResourceManagerService.h>
Robert Shiha90aee32019-11-14 15:43:39 -080026
Ronghua Wu10305cc2015-02-22 07:55:32 -080027#include <media/stagefright/foundation/ADebug.h>
Jeff Tinker7d2c6e82018-02-16 16:14:59 -080028#include <mediadrm/DrmSessionManager.h>
Atneya Nairf5b68512022-05-23 20:02:49 -040029#include <mediautils/ProcessInfoInterface.h>
Ronghua Wu10305cc2015-02-22 07:55:32 -080030
Robert Shihc3af31b2019-09-20 21:45:01 -070031#include <algorithm>
Robert Shiha90aee32019-11-14 15:43:39 -080032#include <iostream>
Robert Shihc3af31b2019-09-20 21:45:01 -070033#include <vector>
34
35#include "ResourceManagerService.h"
36
Ronghua Wu10305cc2015-02-22 07:55:32 -080037namespace android {
38
Chong Zhange45ac602019-11-26 14:35:06 -080039using Status = ::ndk::ScopedAStatus;
40using ::aidl::android::media::BnResourceManagerClient;
41using ::aidl::android::media::BnResourceManagerService;
42using ::aidl::android::media::MediaResourceParcel;
43using ::aidl::android::media::IResourceManagerClient;
Chong Zhang181e6952019-10-09 13:23:39 -070044
Robert Shihc3af31b2019-09-20 21:45:01 -070045static Vector<uint8_t> toAndroidVector(const std::vector<uint8_t> &vec) {
46 Vector<uint8_t> aVec;
47 for (auto b : vec) {
48 aVec.push_back(b);
49 }
50 return aVec;
51}
52
Ronghua Wu10305cc2015-02-22 07:55:32 -080053struct FakeProcessInfo : public ProcessInfoInterface {
54 FakeProcessInfo() {}
55 virtual ~FakeProcessInfo() {}
56
Ronghua Wu5c3da202015-02-22 08:45:28 -080057 virtual bool getPriority(int pid, int* priority) {
58 // For testing, use pid as priority.
59 // Lower the value higher the priority.
60 *priority = pid;
61 return true;
62 }
Ronghua Wu10305cc2015-02-22 07:55:32 -080063
Brian Lindahlcf3bafb2022-01-27 14:21:38 +010064 virtual bool isPidTrusted(int /* pid */) {
65 return true;
66 }
67
68 virtual bool isPidUidTrusted(int /* pid */, int /* uid */) {
Ronghua Wud11c43a2016-01-27 16:26:12 -080069 return true;
70 }
71
Chong Zhang97d367b2020-09-16 12:53:14 -070072 virtual bool overrideProcessInfo(
73 int /* pid */, int /* procState */, int /* oomScore */) {
74 return true;
75 }
76
77 virtual void removeProcessInfoOverride(int /* pid */) {
78 }
79
Ronghua Wu10305cc2015-02-22 07:55:32 -080080private:
81 DISALLOW_EVIL_CONSTRUCTORS(FakeProcessInfo);
82};
83
Chong Zhange45ac602019-11-26 14:35:06 -080084struct FakeDrm : public BnResourceManagerClient {
Robert Shihc3af31b2019-09-20 21:45:01 -070085 FakeDrm(const std::vector<uint8_t>& sessionId, const sp<DrmSessionManager>& manager)
86 : mSessionId(toAndroidVector(sessionId)),
87 mReclaimed(false),
88 mDrmSessionManager(manager) {}
89
Chong Zhange45ac602019-11-26 14:35:06 -080090 Status reclaimResource(bool* _aidl_return) {
Robert Shihc3af31b2019-09-20 21:45:01 -070091 mReclaimed = true;
92 mDrmSessionManager->removeSession(mSessionId);
Chong Zhang181e6952019-10-09 13:23:39 -070093 *_aidl_return = true;
Chong Zhange45ac602019-11-26 14:35:06 -080094 return Status::ok();
Ronghua Wu10305cc2015-02-22 07:55:32 -080095 }
96
Chong Zhange45ac602019-11-26 14:35:06 -080097 Status getName(::std::string* _aidl_return) {
Robert Shihc3af31b2019-09-20 21:45:01 -070098 String8 name("FakeDrm[");
99 for (size_t i = 0; i < mSessionId.size(); ++i) {
100 name.appendFormat("%02x", mSessionId[i]);
101 }
102 name.append("]");
Chong Zhang181e6952019-10-09 13:23:39 -0700103 *_aidl_return = name;
Chong Zhange45ac602019-11-26 14:35:06 -0800104 return Status::ok();
Ronghua Wu10305cc2015-02-22 07:55:32 -0800105 }
106
Robert Shihc3af31b2019-09-20 21:45:01 -0700107 bool isReclaimed() const {
108 return mReclaimed;
109 }
110
111 const Vector<uint8_t> mSessionId;
112
Ronghua Wu10305cc2015-02-22 07:55:32 -0800113private:
Robert Shihc3af31b2019-09-20 21:45:01 -0700114 bool mReclaimed;
115 const sp<DrmSessionManager> mDrmSessionManager;
Ronghua Wu10305cc2015-02-22 07:55:32 -0800116
117 DISALLOW_EVIL_CONSTRUCTORS(FakeDrm);
118};
119
Robert Shihc3af31b2019-09-20 21:45:01 -0700120struct FakeSystemCallback :
121 public ResourceManagerService::SystemCallbackInterface {
122 FakeSystemCallback() {}
123
124 virtual void noteStartVideo(int /*uid*/) override {}
125
126 virtual void noteStopVideo(int /*uid*/) override {}
127
128 virtual void noteResetVideo() override {}
129
Chong Zhange45ac602019-11-26 14:35:06 -0800130 virtual bool requestCpusetBoost(bool /*enable*/) override {
Robert Shihc3af31b2019-09-20 21:45:01 -0700131 return true;
132 }
133
134protected:
135 virtual ~FakeSystemCallback() {}
136
137private:
138
139 DISALLOW_EVIL_CONSTRUCTORS(FakeSystemCallback);
140};
141
Ronghua Wu5c3da202015-02-22 08:45:28 -0800142static const int kTestPid1 = 30;
Ronghua Wu10305cc2015-02-22 07:55:32 -0800143static const int kTestPid2 = 20;
Robert Shihc3af31b2019-09-20 21:45:01 -0700144static const std::vector<uint8_t> kTestSessionId1{1, 2, 3};
145static const std::vector<uint8_t> kTestSessionId2{4, 5, 6, 7, 8};
146static const std::vector<uint8_t> kTestSessionId3{9, 0};
Ronghua Wu10305cc2015-02-22 07:55:32 -0800147
148class DrmSessionManagerTest : public ::testing::Test {
149public:
150 DrmSessionManagerTest()
Chong Zhange45ac602019-11-26 14:35:06 -0800151 : mService(::ndk::SharedRefBase::make<ResourceManagerService>
152 (new FakeProcessInfo(), new FakeSystemCallback())),
153 mDrmSessionManager(new DrmSessionManager(mService)),
154 mTestDrm1(::ndk::SharedRefBase::make<FakeDrm>(
155 kTestSessionId1, mDrmSessionManager)),
156 mTestDrm2(::ndk::SharedRefBase::make<FakeDrm>(
157 kTestSessionId2, mDrmSessionManager)),
158 mTestDrm3(::ndk::SharedRefBase::make<FakeDrm>(
159 kTestSessionId3, mDrmSessionManager)) {
Ronghua Wu10305cc2015-02-22 07:55:32 -0800160 }
161
162protected:
Ronghua Wu10305cc2015-02-22 07:55:32 -0800163 void addSession() {
Chong Zhange45ac602019-11-26 14:35:06 -0800164 mDrmSessionManager->addSession(kTestPid1, mTestDrm1, mTestDrm1->mSessionId);
165 mDrmSessionManager->addSession(kTestPid2, mTestDrm2, mTestDrm2->mSessionId);
166 mDrmSessionManager->addSession(kTestPid2, mTestDrm3, mTestDrm3->mSessionId);
Ronghua Wu10305cc2015-02-22 07:55:32 -0800167 }
168
Chong Zhange45ac602019-11-26 14:35:06 -0800169 std::shared_ptr<ResourceManagerService> mService;
Ronghua Wu10305cc2015-02-22 07:55:32 -0800170 sp<DrmSessionManager> mDrmSessionManager;
Robert Shiha90aee32019-11-14 15:43:39 -0800171 std::shared_ptr<FakeDrm> mTestDrm1;
172 std::shared_ptr<FakeDrm> mTestDrm2;
173 std::shared_ptr<FakeDrm> mTestDrm3;
Ronghua Wu10305cc2015-02-22 07:55:32 -0800174};
175
176TEST_F(DrmSessionManagerTest, addSession) {
177 addSession();
Robert Shihc3af31b2019-09-20 21:45:01 -0700178
179 EXPECT_EQ(3u, mDrmSessionManager->getSessionCount());
180 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm1->mSessionId));
181 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm2->mSessionId));
182 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm3->mSessionId));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800183}
184
185TEST_F(DrmSessionManagerTest, useSession) {
186 addSession();
187
Robert Shihc3af31b2019-09-20 21:45:01 -0700188 mDrmSessionManager->useSession(mTestDrm1->mSessionId);
189 mDrmSessionManager->useSession(mTestDrm3->mSessionId);
Ronghua Wu10305cc2015-02-22 07:55:32 -0800190
Robert Shihc3af31b2019-09-20 21:45:01 -0700191 EXPECT_EQ(3u, mDrmSessionManager->getSessionCount());
192 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm1->mSessionId));
193 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm2->mSessionId));
194 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm3->mSessionId));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800195}
196
197TEST_F(DrmSessionManagerTest, removeSession) {
198 addSession();
199
Robert Shihc3af31b2019-09-20 21:45:01 -0700200 mDrmSessionManager->removeSession(mTestDrm2->mSessionId);
Ronghua Wu10305cc2015-02-22 07:55:32 -0800201
Robert Shihc3af31b2019-09-20 21:45:01 -0700202 EXPECT_EQ(2u, mDrmSessionManager->getSessionCount());
203 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm1->mSessionId));
204 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm2->mSessionId));
205 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm3->mSessionId));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800206}
207
208TEST_F(DrmSessionManagerTest, reclaimSession) {
209 EXPECT_FALSE(mDrmSessionManager->reclaimSession(kTestPid1));
210 addSession();
211
212 // calling pid priority is too low
Ronghua Wu5c3da202015-02-22 08:45:28 -0800213 EXPECT_FALSE(mDrmSessionManager->reclaimSession(50));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800214
Ronghua Wu5c3da202015-02-22 08:45:28 -0800215 EXPECT_TRUE(mDrmSessionManager->reclaimSession(10));
Robert Shihc3af31b2019-09-20 21:45:01 -0700216 EXPECT_TRUE(mTestDrm1->isReclaimed());
Ronghua Wu10305cc2015-02-22 07:55:32 -0800217
218 // add a session from a higher priority process.
Robert Shihc3af31b2019-09-20 21:45:01 -0700219 const std::vector<uint8_t> sid{1, 3, 5};
Chong Zhange45ac602019-11-26 14:35:06 -0800220 std::shared_ptr<FakeDrm> drm =
221 ::ndk::SharedRefBase::make<FakeDrm>(sid, mDrmSessionManager);
222 mDrmSessionManager->addSession(15, drm, drm->mSessionId);
Ronghua Wu10305cc2015-02-22 07:55:32 -0800223
Robert Shihc3af31b2019-09-20 21:45:01 -0700224 // make sure mTestDrm2 is reclaimed next instead of mTestDrm3
225 mDrmSessionManager->useSession(mTestDrm3->mSessionId);
Ronghua Wu5c3da202015-02-22 08:45:28 -0800226 EXPECT_TRUE(mDrmSessionManager->reclaimSession(18));
Robert Shihc3af31b2019-09-20 21:45:01 -0700227 EXPECT_TRUE(mTestDrm2->isReclaimed());
228
229 EXPECT_EQ(2u, mDrmSessionManager->getSessionCount());
230 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm1->mSessionId));
231 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm2->mSessionId));
232 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm3->mSessionId));
233 EXPECT_TRUE(mDrmSessionManager->containsSession(drm->mSessionId));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800234}
235
Robert Shihc3af31b2019-09-20 21:45:01 -0700236TEST_F(DrmSessionManagerTest, reclaimAfterUse) {
237 // nothing to reclaim yet
238 EXPECT_FALSE(mDrmSessionManager->reclaimSession(kTestPid1));
239 EXPECT_FALSE(mDrmSessionManager->reclaimSession(kTestPid2));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800240
Robert Shihc3af31b2019-09-20 21:45:01 -0700241 // add sessions from same pid
Chong Zhange45ac602019-11-26 14:35:06 -0800242 mDrmSessionManager->addSession(kTestPid2, mTestDrm1, mTestDrm1->mSessionId);
243 mDrmSessionManager->addSession(kTestPid2, mTestDrm2, mTestDrm2->mSessionId);
244 mDrmSessionManager->addSession(kTestPid2, mTestDrm3, mTestDrm3->mSessionId);
Robert Shihc3af31b2019-09-20 21:45:01 -0700245
246 // use some but not all sessions
247 mDrmSessionManager->useSession(mTestDrm1->mSessionId);
248 mDrmSessionManager->useSession(mTestDrm1->mSessionId);
249 mDrmSessionManager->useSession(mTestDrm2->mSessionId);
250
251 // calling pid priority is too low
252 int lowPriorityPid = kTestPid2 + 1;
253 EXPECT_FALSE(mDrmSessionManager->reclaimSession(lowPriorityPid));
254
255 // unused session is reclaimed first
256 int highPriorityPid = kTestPid2 - 1;
257 EXPECT_TRUE(mDrmSessionManager->reclaimSession(highPriorityPid));
258 EXPECT_FALSE(mTestDrm1->isReclaimed());
259 EXPECT_FALSE(mTestDrm2->isReclaimed());
260 EXPECT_TRUE(mTestDrm3->isReclaimed());
261 mDrmSessionManager->removeSession(mTestDrm3->mSessionId);
262
263 // less-used session is reclaimed next
264 EXPECT_TRUE(mDrmSessionManager->reclaimSession(highPriorityPid));
265 EXPECT_FALSE(mTestDrm1->isReclaimed());
266 EXPECT_TRUE(mTestDrm2->isReclaimed());
267 EXPECT_TRUE(mTestDrm3->isReclaimed());
268
269 // most-used session still open
270 EXPECT_EQ(1u, mDrmSessionManager->getSessionCount());
271 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm1->mSessionId));
272 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm2->mSessionId));
273 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm3->mSessionId));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800274}
275
276} // namespace android