blob: 58e4beeb6bc941726aa534b220e8b21cc735ffba [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"
19#include <utils/Log.h>
20
21#include <gtest/gtest.h>
22
Robert Shih79673cf2019-09-20 21:45:01 -070023#include <media/IResourceManagerService.h>
24#include <media/IResourceManagerClient.h>
Ronghua Wu10305cc2015-02-22 07:55:32 -080025#include <media/stagefright/foundation/ADebug.h>
Ronghua Wu14bcaca2015-03-16 11:24:30 -070026#include <media/stagefright/ProcessInfoInterface.h>
Jeff Tinker7d2c6e82018-02-16 16:14:59 -080027#include <mediadrm/DrmHal.h>
28#include <mediadrm/DrmSessionClientInterface.h>
29#include <mediadrm/DrmSessionManager.h>
Ronghua Wu10305cc2015-02-22 07:55:32 -080030
Robert Shih79673cf2019-09-20 21:45:01 -070031#include <algorithm>
32#include <vector>
33
34#include "ResourceManagerService.h"
35
Ronghua Wu10305cc2015-02-22 07:55:32 -080036namespace android {
37
Robert Shih79673cf2019-09-20 21:45:01 -070038static Vector<uint8_t> toAndroidVector(const std::vector<uint8_t> &vec) {
39 Vector<uint8_t> aVec;
40 for (auto b : vec) {
41 aVec.push_back(b);
42 }
43 return aVec;
44}
45
Ronghua Wu10305cc2015-02-22 07:55:32 -080046struct FakeProcessInfo : public ProcessInfoInterface {
47 FakeProcessInfo() {}
48 virtual ~FakeProcessInfo() {}
49
Ronghua Wu5c3da202015-02-22 08:45:28 -080050 virtual bool getPriority(int pid, int* priority) {
51 // For testing, use pid as priority.
52 // Lower the value higher the priority.
53 *priority = pid;
54 return true;
55 }
Ronghua Wu10305cc2015-02-22 07:55:32 -080056
Ronghua Wud11c43a2016-01-27 16:26:12 -080057 virtual bool isValidPid(int /* pid */) {
58 return true;
59 }
60
Ronghua Wu10305cc2015-02-22 07:55:32 -080061private:
62 DISALLOW_EVIL_CONSTRUCTORS(FakeProcessInfo);
63};
64
Robert Shih79673cf2019-09-20 21:45:01 -070065struct FakeDrm : public BnResourceManagerClient {
66 FakeDrm(const std::vector<uint8_t>& sessionId, const sp<DrmSessionManager>& manager)
67 : mSessionId(toAndroidVector(sessionId)),
68 mReclaimed(false),
69 mDrmSessionManager(manager) {}
70
Ronghua Wu10305cc2015-02-22 07:55:32 -080071 virtual ~FakeDrm() {}
72
Robert Shih79673cf2019-09-20 21:45:01 -070073 virtual bool reclaimResource() {
74 mReclaimed = true;
75 mDrmSessionManager->removeSession(mSessionId);
Ronghua Wu10305cc2015-02-22 07:55:32 -080076 return true;
77 }
78
Robert Shih79673cf2019-09-20 21:45:01 -070079 virtual String8 getName() {
80 String8 name("FakeDrm[");
81 for (size_t i = 0; i < mSessionId.size(); ++i) {
82 name.appendFormat("%02x", mSessionId[i]);
83 }
84 name.append("]");
85 return name;
Ronghua Wu10305cc2015-02-22 07:55:32 -080086 }
87
Robert Shih79673cf2019-09-20 21:45:01 -070088 bool isReclaimed() const {
89 return mReclaimed;
90 }
91
92 const Vector<uint8_t> mSessionId;
93
Ronghua Wu10305cc2015-02-22 07:55:32 -080094private:
Robert Shih79673cf2019-09-20 21:45:01 -070095 bool mReclaimed;
96 const sp<DrmSessionManager> mDrmSessionManager;
Ronghua Wu10305cc2015-02-22 07:55:32 -080097
98 DISALLOW_EVIL_CONSTRUCTORS(FakeDrm);
99};
100
Robert Shih79673cf2019-09-20 21:45:01 -0700101struct FakeSystemCallback :
102 public ResourceManagerService::SystemCallbackInterface {
103 FakeSystemCallback() {}
104
105 virtual void noteStartVideo(int /*uid*/) override {}
106
107 virtual void noteStopVideo(int /*uid*/) override {}
108
109 virtual void noteResetVideo() override {}
110
111 virtual bool requestCpusetBoost(
112 bool /*enable*/, const sp<IInterface> &/*client*/) override {
113 return true;
114 }
115
116protected:
117 virtual ~FakeSystemCallback() {}
118
119private:
120
121 DISALLOW_EVIL_CONSTRUCTORS(FakeSystemCallback);
122};
123
Ronghua Wu5c3da202015-02-22 08:45:28 -0800124static const int kTestPid1 = 30;
Ronghua Wu10305cc2015-02-22 07:55:32 -0800125static const int kTestPid2 = 20;
Robert Shih79673cf2019-09-20 21:45:01 -0700126static const std::vector<uint8_t> kTestSessionId1{1, 2, 3};
127static const std::vector<uint8_t> kTestSessionId2{4, 5, 6, 7, 8};
128static const std::vector<uint8_t> kTestSessionId3{9, 0};
Ronghua Wu10305cc2015-02-22 07:55:32 -0800129
130class DrmSessionManagerTest : public ::testing::Test {
131public:
132 DrmSessionManagerTest()
Robert Shih79673cf2019-09-20 21:45:01 -0700133 : mService(new ResourceManagerService(new FakeProcessInfo(), new FakeSystemCallback())),
134 mDrmSessionManager(new DrmSessionManager(mService)),
135 mTestDrm1(new FakeDrm(kTestSessionId1, mDrmSessionManager)),
136 mTestDrm2(new FakeDrm(kTestSessionId2, mDrmSessionManager)),
137 mTestDrm3(new FakeDrm(kTestSessionId3, mDrmSessionManager)) {
138 DrmSessionManager *ptr = new DrmSessionManager(mService);
139 EXPECT_NE(ptr, nullptr);
140 /* mDrmSessionManager = ptr; */
Ronghua Wu10305cc2015-02-22 07:55:32 -0800141 }
142
143protected:
Ronghua Wu10305cc2015-02-22 07:55:32 -0800144 void addSession() {
Robert Shih79673cf2019-09-20 21:45:01 -0700145 mDrmSessionManager->addSession(kTestPid1, mTestDrm1, mTestDrm1->mSessionId);
146 mDrmSessionManager->addSession(kTestPid2, mTestDrm2, mTestDrm2->mSessionId);
147 mDrmSessionManager->addSession(kTestPid2, mTestDrm3, mTestDrm3->mSessionId);
Ronghua Wu10305cc2015-02-22 07:55:32 -0800148 }
149
Robert Shih79673cf2019-09-20 21:45:01 -0700150 sp<IResourceManagerService> mService;
Ronghua Wu10305cc2015-02-22 07:55:32 -0800151 sp<DrmSessionManager> mDrmSessionManager;
152 sp<FakeDrm> mTestDrm1;
153 sp<FakeDrm> mTestDrm2;
Robert Shih79673cf2019-09-20 21:45:01 -0700154 sp<FakeDrm> mTestDrm3;
Ronghua Wu10305cc2015-02-22 07:55:32 -0800155};
156
157TEST_F(DrmSessionManagerTest, addSession) {
158 addSession();
Robert Shih79673cf2019-09-20 21:45:01 -0700159
160 EXPECT_EQ(3u, mDrmSessionManager->getSessionCount());
161 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm1->mSessionId));
162 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm2->mSessionId));
163 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm3->mSessionId));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800164}
165
166TEST_F(DrmSessionManagerTest, useSession) {
167 addSession();
168
Robert Shih79673cf2019-09-20 21:45:01 -0700169 mDrmSessionManager->useSession(mTestDrm1->mSessionId);
170 mDrmSessionManager->useSession(mTestDrm3->mSessionId);
Ronghua Wu10305cc2015-02-22 07:55:32 -0800171
Robert Shih79673cf2019-09-20 21:45:01 -0700172 EXPECT_EQ(3u, mDrmSessionManager->getSessionCount());
173 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm1->mSessionId));
174 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm2->mSessionId));
175 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm3->mSessionId));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800176}
177
178TEST_F(DrmSessionManagerTest, removeSession) {
179 addSession();
180
Robert Shih79673cf2019-09-20 21:45:01 -0700181 mDrmSessionManager->removeSession(mTestDrm2->mSessionId);
Ronghua Wu10305cc2015-02-22 07:55:32 -0800182
Robert Shih79673cf2019-09-20 21:45:01 -0700183 EXPECT_EQ(2u, mDrmSessionManager->getSessionCount());
184 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm1->mSessionId));
185 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm2->mSessionId));
186 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm3->mSessionId));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800187}
188
189TEST_F(DrmSessionManagerTest, reclaimSession) {
190 EXPECT_FALSE(mDrmSessionManager->reclaimSession(kTestPid1));
191 addSession();
192
193 // calling pid priority is too low
Ronghua Wu5c3da202015-02-22 08:45:28 -0800194 EXPECT_FALSE(mDrmSessionManager->reclaimSession(50));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800195
Ronghua Wu5c3da202015-02-22 08:45:28 -0800196 EXPECT_TRUE(mDrmSessionManager->reclaimSession(10));
Robert Shih79673cf2019-09-20 21:45:01 -0700197 EXPECT_TRUE(mTestDrm1->isReclaimed());
Ronghua Wu10305cc2015-02-22 07:55:32 -0800198
199 // add a session from a higher priority process.
Robert Shih79673cf2019-09-20 21:45:01 -0700200 const std::vector<uint8_t> sid{1, 3, 5};
201 sp<FakeDrm> drm = new FakeDrm(sid, mDrmSessionManager);
202 mDrmSessionManager->addSession(15, drm, drm->mSessionId);
Ronghua Wu10305cc2015-02-22 07:55:32 -0800203
Robert Shih79673cf2019-09-20 21:45:01 -0700204 // make sure mTestDrm2 is reclaimed next instead of mTestDrm3
205 mDrmSessionManager->useSession(mTestDrm3->mSessionId);
Ronghua Wu5c3da202015-02-22 08:45:28 -0800206 EXPECT_TRUE(mDrmSessionManager->reclaimSession(18));
Robert Shih79673cf2019-09-20 21:45:01 -0700207 EXPECT_TRUE(mTestDrm2->isReclaimed());
208
209 EXPECT_EQ(2u, mDrmSessionManager->getSessionCount());
210 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm1->mSessionId));
211 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm2->mSessionId));
212 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm3->mSessionId));
213 EXPECT_TRUE(mDrmSessionManager->containsSession(drm->mSessionId));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800214}
215
Robert Shih79673cf2019-09-20 21:45:01 -0700216TEST_F(DrmSessionManagerTest, reclaimAfterUse) {
217 // nothing to reclaim yet
218 EXPECT_FALSE(mDrmSessionManager->reclaimSession(kTestPid1));
219 EXPECT_FALSE(mDrmSessionManager->reclaimSession(kTestPid2));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800220
Robert Shih79673cf2019-09-20 21:45:01 -0700221 // add sessions from same pid
222 mDrmSessionManager->addSession(kTestPid2, mTestDrm1, mTestDrm1->mSessionId);
223 mDrmSessionManager->addSession(kTestPid2, mTestDrm2, mTestDrm2->mSessionId);
224 mDrmSessionManager->addSession(kTestPid2, mTestDrm3, mTestDrm3->mSessionId);
225
226 // use some but not all sessions
227 mDrmSessionManager->useSession(mTestDrm1->mSessionId);
228 mDrmSessionManager->useSession(mTestDrm1->mSessionId);
229 mDrmSessionManager->useSession(mTestDrm2->mSessionId);
230
231 // calling pid priority is too low
232 int lowPriorityPid = kTestPid2 + 1;
233 EXPECT_FALSE(mDrmSessionManager->reclaimSession(lowPriorityPid));
234
235 // unused session is reclaimed first
236 int highPriorityPid = kTestPid2 - 1;
237 EXPECT_TRUE(mDrmSessionManager->reclaimSession(highPriorityPid));
238 EXPECT_FALSE(mTestDrm1->isReclaimed());
239 EXPECT_FALSE(mTestDrm2->isReclaimed());
240 EXPECT_TRUE(mTestDrm3->isReclaimed());
241 mDrmSessionManager->removeSession(mTestDrm3->mSessionId);
242
243 // less-used session is reclaimed next
244 EXPECT_TRUE(mDrmSessionManager->reclaimSession(highPriorityPid));
245 EXPECT_FALSE(mTestDrm1->isReclaimed());
246 EXPECT_TRUE(mTestDrm2->isReclaimed());
247 EXPECT_TRUE(mTestDrm3->isReclaimed());
248
249 // most-used session still open
250 EXPECT_EQ(1u, mDrmSessionManager->getSessionCount());
251 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm1->mSessionId));
252 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm2->mSessionId));
253 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm3->mSessionId));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800254}
255
256} // namespace android