blob: c81a659c841da7b2e7dafc560e771c74f92d7cb7 [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>
Ronghua Wu14bcaca2015-03-16 11:24:30 -070028#include <media/stagefright/ProcessInfoInterface.h>
Jeff Tinker7d2c6e82018-02-16 16:14:59 -080029#include <mediadrm/DrmSessionManager.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
Ronghua Wud11c43a2016-01-27 16:26:12 -080064 virtual bool isValidPid(int /* pid */) {
65 return true;
66 }
67
Chong Zhang97d367b2020-09-16 12:53:14 -070068 virtual bool overrideProcessInfo(
69 int /* pid */, int /* procState */, int /* oomScore */) {
70 return true;
71 }
72
73 virtual void removeProcessInfoOverride(int /* pid */) {
74 }
75
Ronghua Wu10305cc2015-02-22 07:55:32 -080076private:
77 DISALLOW_EVIL_CONSTRUCTORS(FakeProcessInfo);
78};
79
Chong Zhange45ac602019-11-26 14:35:06 -080080struct FakeDrm : public BnResourceManagerClient {
Robert Shihc3af31b2019-09-20 21:45:01 -070081 FakeDrm(const std::vector<uint8_t>& sessionId, const sp<DrmSessionManager>& manager)
82 : mSessionId(toAndroidVector(sessionId)),
83 mReclaimed(false),
84 mDrmSessionManager(manager) {}
85
Chong Zhange45ac602019-11-26 14:35:06 -080086 Status reclaimResource(bool* _aidl_return) {
Robert Shihc3af31b2019-09-20 21:45:01 -070087 mReclaimed = true;
88 mDrmSessionManager->removeSession(mSessionId);
Chong Zhang181e6952019-10-09 13:23:39 -070089 *_aidl_return = true;
Chong Zhange45ac602019-11-26 14:35:06 -080090 return Status::ok();
Ronghua Wu10305cc2015-02-22 07:55:32 -080091 }
92
Chong Zhange45ac602019-11-26 14:35:06 -080093 Status getName(::std::string* _aidl_return) {
Robert Shihc3af31b2019-09-20 21:45:01 -070094 String8 name("FakeDrm[");
95 for (size_t i = 0; i < mSessionId.size(); ++i) {
96 name.appendFormat("%02x", mSessionId[i]);
97 }
98 name.append("]");
Chong Zhang181e6952019-10-09 13:23:39 -070099 *_aidl_return = name;
Chong Zhange45ac602019-11-26 14:35:06 -0800100 return Status::ok();
Ronghua Wu10305cc2015-02-22 07:55:32 -0800101 }
102
Robert Shihc3af31b2019-09-20 21:45:01 -0700103 bool isReclaimed() const {
104 return mReclaimed;
105 }
106
107 const Vector<uint8_t> mSessionId;
108
Ronghua Wu10305cc2015-02-22 07:55:32 -0800109private:
Robert Shihc3af31b2019-09-20 21:45:01 -0700110 bool mReclaimed;
111 const sp<DrmSessionManager> mDrmSessionManager;
Ronghua Wu10305cc2015-02-22 07:55:32 -0800112
113 DISALLOW_EVIL_CONSTRUCTORS(FakeDrm);
114};
115
Robert Shihc3af31b2019-09-20 21:45:01 -0700116struct FakeSystemCallback :
117 public ResourceManagerService::SystemCallbackInterface {
118 FakeSystemCallback() {}
119
120 virtual void noteStartVideo(int /*uid*/) override {}
121
122 virtual void noteStopVideo(int /*uid*/) override {}
123
124 virtual void noteResetVideo() override {}
125
Chong Zhange45ac602019-11-26 14:35:06 -0800126 virtual bool requestCpusetBoost(bool /*enable*/) override {
Robert Shihc3af31b2019-09-20 21:45:01 -0700127 return true;
128 }
129
130protected:
131 virtual ~FakeSystemCallback() {}
132
133private:
134
135 DISALLOW_EVIL_CONSTRUCTORS(FakeSystemCallback);
136};
137
Ronghua Wu5c3da202015-02-22 08:45:28 -0800138static const int kTestPid1 = 30;
Ronghua Wu10305cc2015-02-22 07:55:32 -0800139static const int kTestPid2 = 20;
Robert Shihc3af31b2019-09-20 21:45:01 -0700140static const std::vector<uint8_t> kTestSessionId1{1, 2, 3};
141static const std::vector<uint8_t> kTestSessionId2{4, 5, 6, 7, 8};
142static const std::vector<uint8_t> kTestSessionId3{9, 0};
Ronghua Wu10305cc2015-02-22 07:55:32 -0800143
144class DrmSessionManagerTest : public ::testing::Test {
145public:
146 DrmSessionManagerTest()
Chong Zhange45ac602019-11-26 14:35:06 -0800147 : mService(::ndk::SharedRefBase::make<ResourceManagerService>
148 (new FakeProcessInfo(), new FakeSystemCallback())),
149 mDrmSessionManager(new DrmSessionManager(mService)),
150 mTestDrm1(::ndk::SharedRefBase::make<FakeDrm>(
151 kTestSessionId1, mDrmSessionManager)),
152 mTestDrm2(::ndk::SharedRefBase::make<FakeDrm>(
153 kTestSessionId2, mDrmSessionManager)),
154 mTestDrm3(::ndk::SharedRefBase::make<FakeDrm>(
155 kTestSessionId3, mDrmSessionManager)) {
Ronghua Wu10305cc2015-02-22 07:55:32 -0800156 }
157
158protected:
Ronghua Wu10305cc2015-02-22 07:55:32 -0800159 void addSession() {
Chong Zhange45ac602019-11-26 14:35:06 -0800160 mDrmSessionManager->addSession(kTestPid1, mTestDrm1, mTestDrm1->mSessionId);
161 mDrmSessionManager->addSession(kTestPid2, mTestDrm2, mTestDrm2->mSessionId);
162 mDrmSessionManager->addSession(kTestPid2, mTestDrm3, mTestDrm3->mSessionId);
Ronghua Wu10305cc2015-02-22 07:55:32 -0800163 }
164
Chong Zhange45ac602019-11-26 14:35:06 -0800165 std::shared_ptr<ResourceManagerService> mService;
Ronghua Wu10305cc2015-02-22 07:55:32 -0800166 sp<DrmSessionManager> mDrmSessionManager;
Robert Shiha90aee32019-11-14 15:43:39 -0800167 std::shared_ptr<FakeDrm> mTestDrm1;
168 std::shared_ptr<FakeDrm> mTestDrm2;
169 std::shared_ptr<FakeDrm> mTestDrm3;
Ronghua Wu10305cc2015-02-22 07:55:32 -0800170};
171
172TEST_F(DrmSessionManagerTest, addSession) {
173 addSession();
Robert Shihc3af31b2019-09-20 21:45:01 -0700174
175 EXPECT_EQ(3u, mDrmSessionManager->getSessionCount());
176 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm1->mSessionId));
177 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm2->mSessionId));
178 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm3->mSessionId));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800179}
180
181TEST_F(DrmSessionManagerTest, useSession) {
182 addSession();
183
Robert Shihc3af31b2019-09-20 21:45:01 -0700184 mDrmSessionManager->useSession(mTestDrm1->mSessionId);
185 mDrmSessionManager->useSession(mTestDrm3->mSessionId);
Ronghua Wu10305cc2015-02-22 07:55:32 -0800186
Robert Shihc3af31b2019-09-20 21:45:01 -0700187 EXPECT_EQ(3u, mDrmSessionManager->getSessionCount());
188 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm1->mSessionId));
189 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm2->mSessionId));
190 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm3->mSessionId));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800191}
192
193TEST_F(DrmSessionManagerTest, removeSession) {
194 addSession();
195
Robert Shihc3af31b2019-09-20 21:45:01 -0700196 mDrmSessionManager->removeSession(mTestDrm2->mSessionId);
Ronghua Wu10305cc2015-02-22 07:55:32 -0800197
Robert Shihc3af31b2019-09-20 21:45:01 -0700198 EXPECT_EQ(2u, mDrmSessionManager->getSessionCount());
199 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm1->mSessionId));
200 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm2->mSessionId));
201 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm3->mSessionId));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800202}
203
204TEST_F(DrmSessionManagerTest, reclaimSession) {
205 EXPECT_FALSE(mDrmSessionManager->reclaimSession(kTestPid1));
206 addSession();
207
208 // calling pid priority is too low
Ronghua Wu5c3da202015-02-22 08:45:28 -0800209 EXPECT_FALSE(mDrmSessionManager->reclaimSession(50));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800210
Ronghua Wu5c3da202015-02-22 08:45:28 -0800211 EXPECT_TRUE(mDrmSessionManager->reclaimSession(10));
Robert Shihc3af31b2019-09-20 21:45:01 -0700212 EXPECT_TRUE(mTestDrm1->isReclaimed());
Ronghua Wu10305cc2015-02-22 07:55:32 -0800213
214 // add a session from a higher priority process.
Robert Shihc3af31b2019-09-20 21:45:01 -0700215 const std::vector<uint8_t> sid{1, 3, 5};
Chong Zhange45ac602019-11-26 14:35:06 -0800216 std::shared_ptr<FakeDrm> drm =
217 ::ndk::SharedRefBase::make<FakeDrm>(sid, mDrmSessionManager);
218 mDrmSessionManager->addSession(15, drm, drm->mSessionId);
Ronghua Wu10305cc2015-02-22 07:55:32 -0800219
Robert Shihc3af31b2019-09-20 21:45:01 -0700220 // make sure mTestDrm2 is reclaimed next instead of mTestDrm3
221 mDrmSessionManager->useSession(mTestDrm3->mSessionId);
Ronghua Wu5c3da202015-02-22 08:45:28 -0800222 EXPECT_TRUE(mDrmSessionManager->reclaimSession(18));
Robert Shihc3af31b2019-09-20 21:45:01 -0700223 EXPECT_TRUE(mTestDrm2->isReclaimed());
224
225 EXPECT_EQ(2u, mDrmSessionManager->getSessionCount());
226 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm1->mSessionId));
227 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm2->mSessionId));
228 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm3->mSessionId));
229 EXPECT_TRUE(mDrmSessionManager->containsSession(drm->mSessionId));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800230}
231
Robert Shihc3af31b2019-09-20 21:45:01 -0700232TEST_F(DrmSessionManagerTest, reclaimAfterUse) {
233 // nothing to reclaim yet
234 EXPECT_FALSE(mDrmSessionManager->reclaimSession(kTestPid1));
235 EXPECT_FALSE(mDrmSessionManager->reclaimSession(kTestPid2));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800236
Robert Shihc3af31b2019-09-20 21:45:01 -0700237 // add sessions from same pid
Chong Zhange45ac602019-11-26 14:35:06 -0800238 mDrmSessionManager->addSession(kTestPid2, mTestDrm1, mTestDrm1->mSessionId);
239 mDrmSessionManager->addSession(kTestPid2, mTestDrm2, mTestDrm2->mSessionId);
240 mDrmSessionManager->addSession(kTestPid2, mTestDrm3, mTestDrm3->mSessionId);
Robert Shihc3af31b2019-09-20 21:45:01 -0700241
242 // use some but not all sessions
243 mDrmSessionManager->useSession(mTestDrm1->mSessionId);
244 mDrmSessionManager->useSession(mTestDrm1->mSessionId);
245 mDrmSessionManager->useSession(mTestDrm2->mSessionId);
246
247 // calling pid priority is too low
248 int lowPriorityPid = kTestPid2 + 1;
249 EXPECT_FALSE(mDrmSessionManager->reclaimSession(lowPriorityPid));
250
251 // unused session is reclaimed first
252 int highPriorityPid = kTestPid2 - 1;
253 EXPECT_TRUE(mDrmSessionManager->reclaimSession(highPriorityPid));
254 EXPECT_FALSE(mTestDrm1->isReclaimed());
255 EXPECT_FALSE(mTestDrm2->isReclaimed());
256 EXPECT_TRUE(mTestDrm3->isReclaimed());
257 mDrmSessionManager->removeSession(mTestDrm3->mSessionId);
258
259 // less-used session is reclaimed next
260 EXPECT_TRUE(mDrmSessionManager->reclaimSession(highPriorityPid));
261 EXPECT_FALSE(mTestDrm1->isReclaimed());
262 EXPECT_TRUE(mTestDrm2->isReclaimed());
263 EXPECT_TRUE(mTestDrm3->isReclaimed());
264
265 // most-used session still open
266 EXPECT_EQ(1u, mDrmSessionManager->getSessionCount());
267 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm1->mSessionId));
268 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm2->mSessionId));
269 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm3->mSessionId));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800270}
271
272} // namespace android