blob: 262fe320c2b9186ea3e98c7ed3cd6184cee3ee4e [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
Chong Zhang181e6952019-10-09 13:23:39 -070023#include <android/media/BnResourceManagerClient.h>
24#include <android/media/IResourceManagerService.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 Shihc3af31b2019-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
Chong Zhang181e6952019-10-09 13:23:39 -070038using ::android::binder::Status;
39using ::android::media::BnResourceManagerClient;
40using ::android::media::ResourceManagerService;
41
Robert Shihc3af31b2019-09-20 21:45:01 -070042static Vector<uint8_t> toAndroidVector(const std::vector<uint8_t> &vec) {
43 Vector<uint8_t> aVec;
44 for (auto b : vec) {
45 aVec.push_back(b);
46 }
47 return aVec;
48}
49
Ronghua Wu10305cc2015-02-22 07:55:32 -080050struct FakeProcessInfo : public ProcessInfoInterface {
51 FakeProcessInfo() {}
52 virtual ~FakeProcessInfo() {}
53
Ronghua Wu5c3da202015-02-22 08:45:28 -080054 virtual bool getPriority(int pid, int* priority) {
55 // For testing, use pid as priority.
56 // Lower the value higher the priority.
57 *priority = pid;
58 return true;
59 }
Ronghua Wu10305cc2015-02-22 07:55:32 -080060
Ronghua Wud11c43a2016-01-27 16:26:12 -080061 virtual bool isValidPid(int /* pid */) {
62 return true;
63 }
64
Ronghua Wu10305cc2015-02-22 07:55:32 -080065private:
66 DISALLOW_EVIL_CONSTRUCTORS(FakeProcessInfo);
67};
68
Robert Shihc3af31b2019-09-20 21:45:01 -070069struct FakeDrm : public BnResourceManagerClient {
70 FakeDrm(const std::vector<uint8_t>& sessionId, const sp<DrmSessionManager>& manager)
71 : mSessionId(toAndroidVector(sessionId)),
72 mReclaimed(false),
73 mDrmSessionManager(manager) {}
74
Ronghua Wu10305cc2015-02-22 07:55:32 -080075 virtual ~FakeDrm() {}
76
Chong Zhang181e6952019-10-09 13:23:39 -070077 Status reclaimResource(bool* _aidl_return) {
Robert Shihc3af31b2019-09-20 21:45:01 -070078 mReclaimed = true;
79 mDrmSessionManager->removeSession(mSessionId);
Chong Zhang181e6952019-10-09 13:23:39 -070080 *_aidl_return = true;
81 return Status::ok();
Ronghua Wu10305cc2015-02-22 07:55:32 -080082 }
83
Chong Zhang181e6952019-10-09 13:23:39 -070084 Status getName(::std::string* _aidl_return) {
Robert Shihc3af31b2019-09-20 21:45:01 -070085 String8 name("FakeDrm[");
86 for (size_t i = 0; i < mSessionId.size(); ++i) {
87 name.appendFormat("%02x", mSessionId[i]);
88 }
89 name.append("]");
Chong Zhang181e6952019-10-09 13:23:39 -070090 *_aidl_return = name;
91 return Status::ok();
Ronghua Wu10305cc2015-02-22 07:55:32 -080092 }
93
Robert Shihc3af31b2019-09-20 21:45:01 -070094 bool isReclaimed() const {
95 return mReclaimed;
96 }
97
98 const Vector<uint8_t> mSessionId;
99
Ronghua Wu10305cc2015-02-22 07:55:32 -0800100private:
Robert Shihc3af31b2019-09-20 21:45:01 -0700101 bool mReclaimed;
102 const sp<DrmSessionManager> mDrmSessionManager;
Ronghua Wu10305cc2015-02-22 07:55:32 -0800103
104 DISALLOW_EVIL_CONSTRUCTORS(FakeDrm);
105};
106
Robert Shihc3af31b2019-09-20 21:45:01 -0700107struct FakeSystemCallback :
108 public ResourceManagerService::SystemCallbackInterface {
109 FakeSystemCallback() {}
110
111 virtual void noteStartVideo(int /*uid*/) override {}
112
113 virtual void noteStopVideo(int /*uid*/) override {}
114
115 virtual void noteResetVideo() override {}
116
117 virtual bool requestCpusetBoost(
118 bool /*enable*/, const sp<IInterface> &/*client*/) override {
119 return true;
120 }
121
122protected:
123 virtual ~FakeSystemCallback() {}
124
125private:
126
127 DISALLOW_EVIL_CONSTRUCTORS(FakeSystemCallback);
128};
129
Ronghua Wu5c3da202015-02-22 08:45:28 -0800130static const int kTestPid1 = 30;
Ronghua Wu10305cc2015-02-22 07:55:32 -0800131static const int kTestPid2 = 20;
Robert Shihc3af31b2019-09-20 21:45:01 -0700132static const std::vector<uint8_t> kTestSessionId1{1, 2, 3};
133static const std::vector<uint8_t> kTestSessionId2{4, 5, 6, 7, 8};
134static const std::vector<uint8_t> kTestSessionId3{9, 0};
Ronghua Wu10305cc2015-02-22 07:55:32 -0800135
136class DrmSessionManagerTest : public ::testing::Test {
137public:
138 DrmSessionManagerTest()
Robert Shihc3af31b2019-09-20 21:45:01 -0700139 : mService(new ResourceManagerService(new FakeProcessInfo(), new FakeSystemCallback())),
140 mDrmSessionManager(new DrmSessionManager(mService)),
141 mTestDrm1(new FakeDrm(kTestSessionId1, mDrmSessionManager)),
142 mTestDrm2(new FakeDrm(kTestSessionId2, mDrmSessionManager)),
143 mTestDrm3(new FakeDrm(kTestSessionId3, mDrmSessionManager)) {
144 DrmSessionManager *ptr = new DrmSessionManager(mService);
145 EXPECT_NE(ptr, nullptr);
146 /* mDrmSessionManager = ptr; */
Ronghua Wu10305cc2015-02-22 07:55:32 -0800147 }
148
149protected:
Ronghua Wu10305cc2015-02-22 07:55:32 -0800150 void addSession() {
Robert Shihc3af31b2019-09-20 21:45:01 -0700151 mDrmSessionManager->addSession(kTestPid1, mTestDrm1, mTestDrm1->mSessionId);
152 mDrmSessionManager->addSession(kTestPid2, mTestDrm2, mTestDrm2->mSessionId);
153 mDrmSessionManager->addSession(kTestPid2, mTestDrm3, mTestDrm3->mSessionId);
Ronghua Wu10305cc2015-02-22 07:55:32 -0800154 }
155
Robert Shihc3af31b2019-09-20 21:45:01 -0700156 sp<IResourceManagerService> mService;
Ronghua Wu10305cc2015-02-22 07:55:32 -0800157 sp<DrmSessionManager> mDrmSessionManager;
158 sp<FakeDrm> mTestDrm1;
159 sp<FakeDrm> mTestDrm2;
Robert Shihc3af31b2019-09-20 21:45:01 -0700160 sp<FakeDrm> mTestDrm3;
Ronghua Wu10305cc2015-02-22 07:55:32 -0800161};
162
163TEST_F(DrmSessionManagerTest, addSession) {
164 addSession();
Robert Shihc3af31b2019-09-20 21:45:01 -0700165
166 EXPECT_EQ(3u, mDrmSessionManager->getSessionCount());
167 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm1->mSessionId));
168 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm2->mSessionId));
169 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm3->mSessionId));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800170}
171
172TEST_F(DrmSessionManagerTest, useSession) {
173 addSession();
174
Robert Shihc3af31b2019-09-20 21:45:01 -0700175 mDrmSessionManager->useSession(mTestDrm1->mSessionId);
176 mDrmSessionManager->useSession(mTestDrm3->mSessionId);
Ronghua Wu10305cc2015-02-22 07:55:32 -0800177
Robert Shihc3af31b2019-09-20 21:45:01 -0700178 EXPECT_EQ(3u, mDrmSessionManager->getSessionCount());
179 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm1->mSessionId));
180 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm2->mSessionId));
181 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm3->mSessionId));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800182}
183
184TEST_F(DrmSessionManagerTest, removeSession) {
185 addSession();
186
Robert Shihc3af31b2019-09-20 21:45:01 -0700187 mDrmSessionManager->removeSession(mTestDrm2->mSessionId);
Ronghua Wu10305cc2015-02-22 07:55:32 -0800188
Robert Shihc3af31b2019-09-20 21:45:01 -0700189 EXPECT_EQ(2u, mDrmSessionManager->getSessionCount());
190 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm1->mSessionId));
191 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm2->mSessionId));
192 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm3->mSessionId));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800193}
194
195TEST_F(DrmSessionManagerTest, reclaimSession) {
196 EXPECT_FALSE(mDrmSessionManager->reclaimSession(kTestPid1));
197 addSession();
198
199 // calling pid priority is too low
Ronghua Wu5c3da202015-02-22 08:45:28 -0800200 EXPECT_FALSE(mDrmSessionManager->reclaimSession(50));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800201
Ronghua Wu5c3da202015-02-22 08:45:28 -0800202 EXPECT_TRUE(mDrmSessionManager->reclaimSession(10));
Robert Shihc3af31b2019-09-20 21:45:01 -0700203 EXPECT_TRUE(mTestDrm1->isReclaimed());
Ronghua Wu10305cc2015-02-22 07:55:32 -0800204
205 // add a session from a higher priority process.
Robert Shihc3af31b2019-09-20 21:45:01 -0700206 const std::vector<uint8_t> sid{1, 3, 5};
207 sp<FakeDrm> drm = new FakeDrm(sid, mDrmSessionManager);
208 mDrmSessionManager->addSession(15, drm, drm->mSessionId);
Ronghua Wu10305cc2015-02-22 07:55:32 -0800209
Robert Shihc3af31b2019-09-20 21:45:01 -0700210 // make sure mTestDrm2 is reclaimed next instead of mTestDrm3
211 mDrmSessionManager->useSession(mTestDrm3->mSessionId);
Ronghua Wu5c3da202015-02-22 08:45:28 -0800212 EXPECT_TRUE(mDrmSessionManager->reclaimSession(18));
Robert Shihc3af31b2019-09-20 21:45:01 -0700213 EXPECT_TRUE(mTestDrm2->isReclaimed());
214
215 EXPECT_EQ(2u, mDrmSessionManager->getSessionCount());
216 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm1->mSessionId));
217 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm2->mSessionId));
218 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm3->mSessionId));
219 EXPECT_TRUE(mDrmSessionManager->containsSession(drm->mSessionId));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800220}
221
Robert Shihc3af31b2019-09-20 21:45:01 -0700222TEST_F(DrmSessionManagerTest, reclaimAfterUse) {
223 // nothing to reclaim yet
224 EXPECT_FALSE(mDrmSessionManager->reclaimSession(kTestPid1));
225 EXPECT_FALSE(mDrmSessionManager->reclaimSession(kTestPid2));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800226
Robert Shihc3af31b2019-09-20 21:45:01 -0700227 // add sessions from same pid
228 mDrmSessionManager->addSession(kTestPid2, mTestDrm1, mTestDrm1->mSessionId);
229 mDrmSessionManager->addSession(kTestPid2, mTestDrm2, mTestDrm2->mSessionId);
230 mDrmSessionManager->addSession(kTestPid2, mTestDrm3, mTestDrm3->mSessionId);
231
232 // use some but not all sessions
233 mDrmSessionManager->useSession(mTestDrm1->mSessionId);
234 mDrmSessionManager->useSession(mTestDrm1->mSessionId);
235 mDrmSessionManager->useSession(mTestDrm2->mSessionId);
236
237 // calling pid priority is too low
238 int lowPriorityPid = kTestPid2 + 1;
239 EXPECT_FALSE(mDrmSessionManager->reclaimSession(lowPriorityPid));
240
241 // unused session is reclaimed first
242 int highPriorityPid = kTestPid2 - 1;
243 EXPECT_TRUE(mDrmSessionManager->reclaimSession(highPriorityPid));
244 EXPECT_FALSE(mTestDrm1->isReclaimed());
245 EXPECT_FALSE(mTestDrm2->isReclaimed());
246 EXPECT_TRUE(mTestDrm3->isReclaimed());
247 mDrmSessionManager->removeSession(mTestDrm3->mSessionId);
248
249 // less-used session is reclaimed next
250 EXPECT_TRUE(mDrmSessionManager->reclaimSession(highPriorityPid));
251 EXPECT_FALSE(mTestDrm1->isReclaimed());
252 EXPECT_TRUE(mTestDrm2->isReclaimed());
253 EXPECT_TRUE(mTestDrm3->isReclaimed());
254
255 // most-used session still open
256 EXPECT_EQ(1u, mDrmSessionManager->getSessionCount());
257 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm1->mSessionId));
258 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm2->mSessionId));
259 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm3->mSessionId));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800260}
261
262} // namespace android