blob: f114046b79aba49159e0ac92a0d370dddcc73616 [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
Ronghua Wu10305cc2015-02-22 07:55:32 -080068private:
69 DISALLOW_EVIL_CONSTRUCTORS(FakeProcessInfo);
70};
71
Chong Zhange45ac602019-11-26 14:35:06 -080072struct FakeDrm : public BnResourceManagerClient {
Robert Shihc3af31b2019-09-20 21:45:01 -070073 FakeDrm(const std::vector<uint8_t>& sessionId, const sp<DrmSessionManager>& manager)
74 : mSessionId(toAndroidVector(sessionId)),
75 mReclaimed(false),
76 mDrmSessionManager(manager) {}
77
Chong Zhange45ac602019-11-26 14:35:06 -080078 Status reclaimResource(bool* _aidl_return) {
Robert Shihc3af31b2019-09-20 21:45:01 -070079 mReclaimed = true;
80 mDrmSessionManager->removeSession(mSessionId);
Chong Zhang181e6952019-10-09 13:23:39 -070081 *_aidl_return = true;
Chong Zhange45ac602019-11-26 14:35:06 -080082 return Status::ok();
Ronghua Wu10305cc2015-02-22 07:55:32 -080083 }
84
Chong Zhange45ac602019-11-26 14:35:06 -080085 Status getName(::std::string* _aidl_return) {
Robert Shihc3af31b2019-09-20 21:45:01 -070086 String8 name("FakeDrm[");
87 for (size_t i = 0; i < mSessionId.size(); ++i) {
88 name.appendFormat("%02x", mSessionId[i]);
89 }
90 name.append("]");
Chong Zhang181e6952019-10-09 13:23:39 -070091 *_aidl_return = name;
Chong Zhange45ac602019-11-26 14:35:06 -080092 return Status::ok();
Ronghua Wu10305cc2015-02-22 07:55:32 -080093 }
94
Robert Shihc3af31b2019-09-20 21:45:01 -070095 bool isReclaimed() const {
96 return mReclaimed;
97 }
98
99 const Vector<uint8_t> mSessionId;
100
Ronghua Wu10305cc2015-02-22 07:55:32 -0800101private:
Robert Shihc3af31b2019-09-20 21:45:01 -0700102 bool mReclaimed;
103 const sp<DrmSessionManager> mDrmSessionManager;
Ronghua Wu10305cc2015-02-22 07:55:32 -0800104
105 DISALLOW_EVIL_CONSTRUCTORS(FakeDrm);
106};
107
Robert Shihc3af31b2019-09-20 21:45:01 -0700108struct FakeSystemCallback :
109 public ResourceManagerService::SystemCallbackInterface {
110 FakeSystemCallback() {}
111
112 virtual void noteStartVideo(int /*uid*/) override {}
113
114 virtual void noteStopVideo(int /*uid*/) override {}
115
116 virtual void noteResetVideo() override {}
117
Chong Zhange45ac602019-11-26 14:35:06 -0800118 virtual bool requestCpusetBoost(bool /*enable*/) override {
Robert Shihc3af31b2019-09-20 21:45:01 -0700119 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()
Chong Zhange45ac602019-11-26 14:35:06 -0800139 : mService(::ndk::SharedRefBase::make<ResourceManagerService>
140 (new FakeProcessInfo(), new FakeSystemCallback())),
141 mDrmSessionManager(new DrmSessionManager(mService)),
142 mTestDrm1(::ndk::SharedRefBase::make<FakeDrm>(
143 kTestSessionId1, mDrmSessionManager)),
144 mTestDrm2(::ndk::SharedRefBase::make<FakeDrm>(
145 kTestSessionId2, mDrmSessionManager)),
146 mTestDrm3(::ndk::SharedRefBase::make<FakeDrm>(
147 kTestSessionId3, mDrmSessionManager)) {
Ronghua Wu10305cc2015-02-22 07:55:32 -0800148 }
149
150protected:
Ronghua Wu10305cc2015-02-22 07:55:32 -0800151 void addSession() {
Chong Zhange45ac602019-11-26 14:35:06 -0800152 mDrmSessionManager->addSession(kTestPid1, mTestDrm1, mTestDrm1->mSessionId);
153 mDrmSessionManager->addSession(kTestPid2, mTestDrm2, mTestDrm2->mSessionId);
154 mDrmSessionManager->addSession(kTestPid2, mTestDrm3, mTestDrm3->mSessionId);
Ronghua Wu10305cc2015-02-22 07:55:32 -0800155 }
156
Chong Zhange45ac602019-11-26 14:35:06 -0800157 std::shared_ptr<ResourceManagerService> mService;
Ronghua Wu10305cc2015-02-22 07:55:32 -0800158 sp<DrmSessionManager> mDrmSessionManager;
Robert Shiha90aee32019-11-14 15:43:39 -0800159 std::shared_ptr<FakeDrm> mTestDrm1;
160 std::shared_ptr<FakeDrm> mTestDrm2;
161 std::shared_ptr<FakeDrm> mTestDrm3;
Ronghua Wu10305cc2015-02-22 07:55:32 -0800162};
163
164TEST_F(DrmSessionManagerTest, addSession) {
165 addSession();
Robert Shihc3af31b2019-09-20 21:45:01 -0700166
167 EXPECT_EQ(3u, mDrmSessionManager->getSessionCount());
168 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm1->mSessionId));
169 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm2->mSessionId));
170 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm3->mSessionId));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800171}
172
173TEST_F(DrmSessionManagerTest, useSession) {
174 addSession();
175
Robert Shihc3af31b2019-09-20 21:45:01 -0700176 mDrmSessionManager->useSession(mTestDrm1->mSessionId);
177 mDrmSessionManager->useSession(mTestDrm3->mSessionId);
Ronghua Wu10305cc2015-02-22 07:55:32 -0800178
Robert Shihc3af31b2019-09-20 21:45:01 -0700179 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, removeSession) {
186 addSession();
187
Robert Shihc3af31b2019-09-20 21:45:01 -0700188 mDrmSessionManager->removeSession(mTestDrm2->mSessionId);
Ronghua Wu10305cc2015-02-22 07:55:32 -0800189
Robert Shihc3af31b2019-09-20 21:45:01 -0700190 EXPECT_EQ(2u, mDrmSessionManager->getSessionCount());
191 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm1->mSessionId));
192 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm2->mSessionId));
193 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm3->mSessionId));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800194}
195
196TEST_F(DrmSessionManagerTest, reclaimSession) {
197 EXPECT_FALSE(mDrmSessionManager->reclaimSession(kTestPid1));
198 addSession();
199
200 // calling pid priority is too low
Ronghua Wu5c3da202015-02-22 08:45:28 -0800201 EXPECT_FALSE(mDrmSessionManager->reclaimSession(50));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800202
Ronghua Wu5c3da202015-02-22 08:45:28 -0800203 EXPECT_TRUE(mDrmSessionManager->reclaimSession(10));
Robert Shihc3af31b2019-09-20 21:45:01 -0700204 EXPECT_TRUE(mTestDrm1->isReclaimed());
Ronghua Wu10305cc2015-02-22 07:55:32 -0800205
206 // add a session from a higher priority process.
Robert Shihc3af31b2019-09-20 21:45:01 -0700207 const std::vector<uint8_t> sid{1, 3, 5};
Chong Zhange45ac602019-11-26 14:35:06 -0800208 std::shared_ptr<FakeDrm> drm =
209 ::ndk::SharedRefBase::make<FakeDrm>(sid, mDrmSessionManager);
210 mDrmSessionManager->addSession(15, drm, drm->mSessionId);
Ronghua Wu10305cc2015-02-22 07:55:32 -0800211
Robert Shihc3af31b2019-09-20 21:45:01 -0700212 // make sure mTestDrm2 is reclaimed next instead of mTestDrm3
213 mDrmSessionManager->useSession(mTestDrm3->mSessionId);
Ronghua Wu5c3da202015-02-22 08:45:28 -0800214 EXPECT_TRUE(mDrmSessionManager->reclaimSession(18));
Robert Shihc3af31b2019-09-20 21:45:01 -0700215 EXPECT_TRUE(mTestDrm2->isReclaimed());
216
217 EXPECT_EQ(2u, mDrmSessionManager->getSessionCount());
218 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm1->mSessionId));
219 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm2->mSessionId));
220 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm3->mSessionId));
221 EXPECT_TRUE(mDrmSessionManager->containsSession(drm->mSessionId));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800222}
223
Robert Shihc3af31b2019-09-20 21:45:01 -0700224TEST_F(DrmSessionManagerTest, reclaimAfterUse) {
225 // nothing to reclaim yet
226 EXPECT_FALSE(mDrmSessionManager->reclaimSession(kTestPid1));
227 EXPECT_FALSE(mDrmSessionManager->reclaimSession(kTestPid2));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800228
Robert Shihc3af31b2019-09-20 21:45:01 -0700229 // add sessions from same pid
Chong Zhange45ac602019-11-26 14:35:06 -0800230 mDrmSessionManager->addSession(kTestPid2, mTestDrm1, mTestDrm1->mSessionId);
231 mDrmSessionManager->addSession(kTestPid2, mTestDrm2, mTestDrm2->mSessionId);
232 mDrmSessionManager->addSession(kTestPid2, mTestDrm3, mTestDrm3->mSessionId);
Robert Shihc3af31b2019-09-20 21:45:01 -0700233
234 // use some but not all sessions
235 mDrmSessionManager->useSession(mTestDrm1->mSessionId);
236 mDrmSessionManager->useSession(mTestDrm1->mSessionId);
237 mDrmSessionManager->useSession(mTestDrm2->mSessionId);
238
239 // calling pid priority is too low
240 int lowPriorityPid = kTestPid2 + 1;
241 EXPECT_FALSE(mDrmSessionManager->reclaimSession(lowPriorityPid));
242
243 // unused session is reclaimed first
244 int highPriorityPid = kTestPid2 - 1;
245 EXPECT_TRUE(mDrmSessionManager->reclaimSession(highPriorityPid));
246 EXPECT_FALSE(mTestDrm1->isReclaimed());
247 EXPECT_FALSE(mTestDrm2->isReclaimed());
248 EXPECT_TRUE(mTestDrm3->isReclaimed());
249 mDrmSessionManager->removeSession(mTestDrm3->mSessionId);
250
251 // less-used session is reclaimed next
252 EXPECT_TRUE(mDrmSessionManager->reclaimSession(highPriorityPid));
253 EXPECT_FALSE(mTestDrm1->isReclaimed());
254 EXPECT_TRUE(mTestDrm2->isReclaimed());
255 EXPECT_TRUE(mTestDrm3->isReclaimed());
256
257 // most-used session still open
258 EXPECT_EQ(1u, mDrmSessionManager->getSessionCount());
259 EXPECT_TRUE(mDrmSessionManager->containsSession(mTestDrm1->mSessionId));
260 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm2->mSessionId));
261 EXPECT_FALSE(mDrmSessionManager->containsSession(mTestDrm3->mSessionId));
Ronghua Wu10305cc2015-02-22 07:55:32 -0800262}
263
264} // namespace android