DrmSessionManager_test.cpp revision 1db71be52d989364e62971e997bea78703bf9f97
1/* 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 23#include "Drm.h" 24#include "DrmSessionClientInterface.h" 25#include "DrmSessionManager.h" 26#include "ProcessInfoInterface.h" 27#include <media/stagefright/foundation/ADebug.h> 28 29namespace android { 30 31struct FakeProcessInfo : public ProcessInfoInterface { 32 FakeProcessInfo() {} 33 virtual ~FakeProcessInfo() {} 34 35 virtual int getPriority(int pid) { return pid; } 36 37private: 38 DISALLOW_EVIL_CONSTRUCTORS(FakeProcessInfo); 39}; 40 41struct FakeDrm : public DrmSessionClientInterface { 42 FakeDrm() {} 43 virtual ~FakeDrm() {} 44 45 virtual bool reclaimSession(const Vector<uint8_t>& sessionId) { 46 mReclaimedSessions.push_back(sessionId); 47 return true; 48 } 49 50 const Vector<Vector<uint8_t> >& reclaimedSessions() const { 51 return mReclaimedSessions; 52 } 53 54private: 55 Vector<Vector<uint8_t> > mReclaimedSessions; 56 57 DISALLOW_EVIL_CONSTRUCTORS(FakeDrm); 58}; 59 60static const int kTestPid1 = 10; 61static const int kTestPid2 = 20; 62static const uint8_t kTestSessionId1[] = {1, 2, 3}; 63static const uint8_t kTestSessionId2[] = {4, 5, 6, 7, 8}; 64static const uint8_t kTestSessionId3[] = {9, 0}; 65 66class DrmSessionManagerTest : public ::testing::Test { 67public: 68 DrmSessionManagerTest() 69 : mDrmSessionManager(new DrmSessionManager(new FakeProcessInfo())), 70 mTestDrm1(new FakeDrm()), 71 mTestDrm2(new FakeDrm()) { 72 GetSessionId(kTestSessionId1, ARRAY_SIZE(kTestSessionId1), &mSessionId1); 73 GetSessionId(kTestSessionId2, ARRAY_SIZE(kTestSessionId2), &mSessionId2); 74 GetSessionId(kTestSessionId3, ARRAY_SIZE(kTestSessionId3), &mSessionId3); 75 } 76 77protected: 78 static void GetSessionId(const uint8_t* ids, size_t num, Vector<uint8_t>* sessionId) { 79 for (size_t i = 0; i < num; ++i) { 80 sessionId->push_back(ids[i]); 81 } 82 } 83 84 static void ExpectEqSessionInfo(const SessionInfo& info, sp<DrmSessionClientInterface> drm, 85 const Vector<uint8_t>& sessionId, int64_t timeStamp) { 86 EXPECT_EQ(drm, info.drm); 87 EXPECT_TRUE(isEqualSessionId(sessionId, info.sessionId)); 88 EXPECT_EQ(timeStamp, info.timeStamp); 89 } 90 91 void addSession() { 92 mDrmSessionManager->addSession(kTestPid1, mTestDrm1, mSessionId1); 93 mDrmSessionManager->addSession(kTestPid2, mTestDrm2, mSessionId2); 94 mDrmSessionManager->addSession(kTestPid2, mTestDrm2, mSessionId3); 95 const PidSessionInfosMap& map = sessionMap(); 96 EXPECT_EQ(2, map.size()); 97 ssize_t index1 = map.indexOfKey(kTestPid1); 98 ASSERT_GE(index1, 0); 99 const SessionInfos& infos1 = map[index1]; 100 EXPECT_EQ(1, infos1.size()); 101 ExpectEqSessionInfo(infos1[0], mTestDrm1, mSessionId1, 0); 102 103 ssize_t index2 = map.indexOfKey(kTestPid2); 104 ASSERT_GE(index2, 0); 105 const SessionInfos& infos2 = map[index2]; 106 EXPECT_EQ(2, infos2.size()); 107 ExpectEqSessionInfo(infos2[0], mTestDrm2, mSessionId2, 1); 108 ExpectEqSessionInfo(infos2[1], mTestDrm2, mSessionId3, 2); 109 } 110 111 const PidSessionInfosMap& sessionMap() { 112 return mDrmSessionManager->mSessionMap; 113 } 114 115 void testGetLowestPriority() { 116 int pid; 117 int priority; 118 EXPECT_FALSE(mDrmSessionManager->getLowestPriority_l(&pid, &priority)); 119 120 addSession(); 121 EXPECT_TRUE(mDrmSessionManager->getLowestPriority_l(&pid, &priority)); 122 123 EXPECT_EQ(kTestPid1, pid); 124 FakeProcessInfo processInfo; 125 EXPECT_EQ(processInfo.getPriority(kTestPid1), priority); 126 } 127 128 void testGetLeastUsedSession() { 129 sp<DrmSessionClientInterface> drm; 130 Vector<uint8_t> sessionId; 131 EXPECT_FALSE(mDrmSessionManager->getLeastUsedSession_l(kTestPid1, &drm, &sessionId)); 132 133 addSession(); 134 135 EXPECT_TRUE(mDrmSessionManager->getLeastUsedSession_l(kTestPid1, &drm, &sessionId)); 136 EXPECT_EQ(mTestDrm1, drm); 137 EXPECT_TRUE(isEqualSessionId(mSessionId1, sessionId)); 138 139 EXPECT_TRUE(mDrmSessionManager->getLeastUsedSession_l(kTestPid2, &drm, &sessionId)); 140 EXPECT_EQ(mTestDrm2, drm); 141 EXPECT_TRUE(isEqualSessionId(mSessionId2, sessionId)); 142 143 // mSessionId2 is no longer the least used session. 144 mDrmSessionManager->useSession(mSessionId2); 145 EXPECT_TRUE(mDrmSessionManager->getLeastUsedSession_l(kTestPid2, &drm, &sessionId)); 146 EXPECT_EQ(mTestDrm2, drm); 147 EXPECT_TRUE(isEqualSessionId(mSessionId3, sessionId)); 148 } 149 150 sp<DrmSessionManager> mDrmSessionManager; 151 sp<FakeDrm> mTestDrm1; 152 sp<FakeDrm> mTestDrm2; 153 Vector<uint8_t> mSessionId1; 154 Vector<uint8_t> mSessionId2; 155 Vector<uint8_t> mSessionId3; 156}; 157 158TEST_F(DrmSessionManagerTest, addSession) { 159 addSession(); 160} 161 162TEST_F(DrmSessionManagerTest, useSession) { 163 addSession(); 164 165 mDrmSessionManager->useSession(mSessionId1); 166 mDrmSessionManager->useSession(mSessionId3); 167 168 const PidSessionInfosMap& map = sessionMap(); 169 const SessionInfos& infos1 = map.valueFor(kTestPid1); 170 const SessionInfos& infos2 = map.valueFor(kTestPid2); 171 ExpectEqSessionInfo(infos1[0], mTestDrm1, mSessionId1, 3); 172 ExpectEqSessionInfo(infos2[1], mTestDrm2, mSessionId3, 4); 173} 174 175TEST_F(DrmSessionManagerTest, removeSession) { 176 addSession(); 177 178 mDrmSessionManager->removeSession(mSessionId2); 179 180 const PidSessionInfosMap& map = sessionMap(); 181 EXPECT_EQ(2, map.size()); 182 const SessionInfos& infos1 = map.valueFor(kTestPid1); 183 const SessionInfos& infos2 = map.valueFor(kTestPid2); 184 EXPECT_EQ(1, infos1.size()); 185 EXPECT_EQ(1, infos2.size()); 186 // mSessionId2 has been removed. 187 ExpectEqSessionInfo(infos2[0], mTestDrm2, mSessionId3, 2); 188} 189 190TEST_F(DrmSessionManagerTest, removeDrm) { 191 addSession(); 192 193 sp<FakeDrm> drm = new FakeDrm; 194 const uint8_t ids[] = {123}; 195 Vector<uint8_t> sessionId; 196 GetSessionId(ids, ARRAY_SIZE(ids), &sessionId); 197 mDrmSessionManager->addSession(kTestPid2, drm, sessionId); 198 199 mDrmSessionManager->removeDrm(mTestDrm2); 200 201 const PidSessionInfosMap& map = sessionMap(); 202 const SessionInfos& infos2 = map.valueFor(kTestPid2); 203 EXPECT_EQ(1, infos2.size()); 204 // mTestDrm2 has been removed. 205 ExpectEqSessionInfo(infos2[0], drm, sessionId, 3); 206} 207 208TEST_F(DrmSessionManagerTest, reclaimSession) { 209 EXPECT_FALSE(mDrmSessionManager->reclaimSession(kTestPid1)); 210 addSession(); 211 212 // calling pid priority is too low 213 EXPECT_FALSE(mDrmSessionManager->reclaimSession(5)); 214 215 EXPECT_TRUE(mDrmSessionManager->reclaimSession(30)); 216 EXPECT_EQ(1, mTestDrm1->reclaimedSessions().size()); 217 EXPECT_TRUE(isEqualSessionId(mSessionId1, mTestDrm1->reclaimedSessions()[0])); 218 219 mDrmSessionManager->removeSession(mSessionId1); 220 221 // add a session from a higher priority process. 222 sp<FakeDrm> drm = new FakeDrm; 223 const uint8_t ids[] = {1, 3, 5}; 224 Vector<uint8_t> sessionId; 225 GetSessionId(ids, ARRAY_SIZE(ids), &sessionId); 226 mDrmSessionManager->addSession(30, drm, sessionId); 227 228 EXPECT_TRUE(mDrmSessionManager->reclaimSession(40)); 229 EXPECT_EQ(1, mTestDrm2->reclaimedSessions().size()); 230 // mSessionId2 is reclaimed. 231 EXPECT_TRUE(isEqualSessionId(mSessionId2, mTestDrm2->reclaimedSessions()[0])); 232} 233 234TEST_F(DrmSessionManagerTest, getLowestPriority) { 235 testGetLowestPriority(); 236} 237 238TEST_F(DrmSessionManagerTest, getLeastUsedSession_l) { 239 testGetLeastUsedSession(); 240} 241 242} // namespace android 243