110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu/*
210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu * Copyright (C) 2015 The Android Open Source Project
310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu *
410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu * Licensed under the Apache License, Version 2.0 (the "License");
510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu * you may not use this file except in compliance with the License.
610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu * You may obtain a copy of the License at
710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu *
810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu *      http://www.apache.org/licenses/LICENSE-2.0
910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu *
1010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu * Unless required by applicable law or agreed to in writing, software
1110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu * distributed under the License is distributed on an "AS IS" BASIS,
1210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu * See the License for the specific language governing permissions and
1410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu * limitations under the License.
1510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu */
1610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
1710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu//#define LOG_NDEBUG 0
1810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu#define LOG_TAG "DrmSessionManager_test"
1910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu#include <utils/Log.h>
2010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
2110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu#include <gtest/gtest.h>
2210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
233003807fcfa96c9cbfea18d643f47108aa116cd5Jeff Tinker#include <media/Drm.h>
243003807fcfa96c9cbfea18d643f47108aa116cd5Jeff Tinker#include <media/DrmSessionClientInterface.h>
253003807fcfa96c9cbfea18d643f47108aa116cd5Jeff Tinker#include <media/DrmSessionManager.h>
2610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu#include <media/stagefright/foundation/ADebug.h>
2714bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu#include <media/stagefright/ProcessInfoInterface.h>
2810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
2910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wunamespace android {
3010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
3110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wustruct FakeProcessInfo : public ProcessInfoInterface {
3210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    FakeProcessInfo() {}
3310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    virtual ~FakeProcessInfo() {}
3410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
355c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu    virtual bool getPriority(int pid, int* priority) {
365c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu        // For testing, use pid as priority.
375c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu        // Lower the value higher the priority.
385c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu        *priority = pid;
395c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu        return true;
405c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu    }
4110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
42d11c43a12917e017d715db88c13e4e7550eb9151Ronghua Wu    virtual bool isValidPid(int /* pid */) {
43d11c43a12917e017d715db88c13e4e7550eb9151Ronghua Wu        return true;
44d11c43a12917e017d715db88c13e4e7550eb9151Ronghua Wu    }
45d11c43a12917e017d715db88c13e4e7550eb9151Ronghua Wu
4610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wuprivate:
4710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    DISALLOW_EVIL_CONSTRUCTORS(FakeProcessInfo);
4810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu};
4910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
5010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wustruct FakeDrm : public DrmSessionClientInterface {
5110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    FakeDrm() {}
5210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    virtual ~FakeDrm() {}
5310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
5410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    virtual bool reclaimSession(const Vector<uint8_t>& sessionId) {
5510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        mReclaimedSessions.push_back(sessionId);
5610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        return true;
5710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    }
5810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
5910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    const Vector<Vector<uint8_t> >& reclaimedSessions() const {
6010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        return mReclaimedSessions;
6110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    }
6210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
6310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wuprivate:
6410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    Vector<Vector<uint8_t> > mReclaimedSessions;
6510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
6610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    DISALLOW_EVIL_CONSTRUCTORS(FakeDrm);
6710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu};
6810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
695c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wustatic const int kTestPid1 = 30;
7010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wustatic const int kTestPid2 = 20;
7110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wustatic const uint8_t kTestSessionId1[] = {1, 2, 3};
7210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wustatic const uint8_t kTestSessionId2[] = {4, 5, 6, 7, 8};
7310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wustatic const uint8_t kTestSessionId3[] = {9, 0};
7410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
7510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wuclass DrmSessionManagerTest : public ::testing::Test {
7610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wupublic:
7710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    DrmSessionManagerTest()
7810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        : mDrmSessionManager(new DrmSessionManager(new FakeProcessInfo())),
7910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu          mTestDrm1(new FakeDrm()),
8010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu          mTestDrm2(new FakeDrm()) {
8110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        GetSessionId(kTestSessionId1, ARRAY_SIZE(kTestSessionId1), &mSessionId1);
8210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        GetSessionId(kTestSessionId2, ARRAY_SIZE(kTestSessionId2), &mSessionId2);
8310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        GetSessionId(kTestSessionId3, ARRAY_SIZE(kTestSessionId3), &mSessionId3);
8410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    }
8510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
8610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wuprotected:
8710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    static void GetSessionId(const uint8_t* ids, size_t num, Vector<uint8_t>* sessionId) {
8810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        for (size_t i = 0; i < num; ++i) {
8910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu            sessionId->push_back(ids[i]);
9010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        }
9110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    }
9210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
9310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    static void ExpectEqSessionInfo(const SessionInfo& info, sp<DrmSessionClientInterface> drm,
9410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu            const Vector<uint8_t>& sessionId, int64_t timeStamp) {
9510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        EXPECT_EQ(drm, info.drm);
9610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        EXPECT_TRUE(isEqualSessionId(sessionId, info.sessionId));
9710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        EXPECT_EQ(timeStamp, info.timeStamp);
9810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    }
9910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
10010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    void addSession() {
10110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        mDrmSessionManager->addSession(kTestPid1, mTestDrm1, mSessionId1);
10210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        mDrmSessionManager->addSession(kTestPid2, mTestDrm2, mSessionId2);
10310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        mDrmSessionManager->addSession(kTestPid2, mTestDrm2, mSessionId3);
10410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        const PidSessionInfosMap& map = sessionMap();
1056d339f1f764bbd32e3381dae7bfa7c6c575bb493Lajos Molnar        EXPECT_EQ(2u, map.size());
10610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        ssize_t index1 = map.indexOfKey(kTestPid1);
10710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        ASSERT_GE(index1, 0);
10810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        const SessionInfos& infos1 = map[index1];
1096d339f1f764bbd32e3381dae7bfa7c6c575bb493Lajos Molnar        EXPECT_EQ(1u, infos1.size());
11010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        ExpectEqSessionInfo(infos1[0], mTestDrm1, mSessionId1, 0);
11110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
11210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        ssize_t index2 = map.indexOfKey(kTestPid2);
11310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        ASSERT_GE(index2, 0);
11410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        const SessionInfos& infos2 = map[index2];
1156d339f1f764bbd32e3381dae7bfa7c6c575bb493Lajos Molnar        EXPECT_EQ(2u, infos2.size());
11610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        ExpectEqSessionInfo(infos2[0], mTestDrm2, mSessionId2, 1);
11710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        ExpectEqSessionInfo(infos2[1], mTestDrm2, mSessionId3, 2);
11810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    }
11910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
12010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    const PidSessionInfosMap& sessionMap() {
12110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        return mDrmSessionManager->mSessionMap;
12210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    }
12310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
12410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    void testGetLowestPriority() {
12510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        int pid;
12610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        int priority;
12710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        EXPECT_FALSE(mDrmSessionManager->getLowestPriority_l(&pid, &priority));
12810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
12910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        addSession();
13010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        EXPECT_TRUE(mDrmSessionManager->getLowestPriority_l(&pid, &priority));
13110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
13210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        EXPECT_EQ(kTestPid1, pid);
13310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        FakeProcessInfo processInfo;
1345c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu        int priority1;
1355c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu        processInfo.getPriority(kTestPid1, &priority1);
1365c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu        EXPECT_EQ(priority1, priority);
13710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    }
13810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
13910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    void testGetLeastUsedSession() {
14010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        sp<DrmSessionClientInterface> drm;
14110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        Vector<uint8_t> sessionId;
14210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        EXPECT_FALSE(mDrmSessionManager->getLeastUsedSession_l(kTestPid1, &drm, &sessionId));
14310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
14410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        addSession();
14510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
14610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        EXPECT_TRUE(mDrmSessionManager->getLeastUsedSession_l(kTestPid1, &drm, &sessionId));
14710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        EXPECT_EQ(mTestDrm1, drm);
14810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        EXPECT_TRUE(isEqualSessionId(mSessionId1, sessionId));
14910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
15010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        EXPECT_TRUE(mDrmSessionManager->getLeastUsedSession_l(kTestPid2, &drm, &sessionId));
15110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        EXPECT_EQ(mTestDrm2, drm);
15210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        EXPECT_TRUE(isEqualSessionId(mSessionId2, sessionId));
15310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
15410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        // mSessionId2 is no longer the least used session.
15510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        mDrmSessionManager->useSession(mSessionId2);
15610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        EXPECT_TRUE(mDrmSessionManager->getLeastUsedSession_l(kTestPid2, &drm, &sessionId));
15710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        EXPECT_EQ(mTestDrm2, drm);
15810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu        EXPECT_TRUE(isEqualSessionId(mSessionId3, sessionId));
15910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    }
16010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
16110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    sp<DrmSessionManager> mDrmSessionManager;
16210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    sp<FakeDrm> mTestDrm1;
16310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    sp<FakeDrm> mTestDrm2;
16410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    Vector<uint8_t> mSessionId1;
16510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    Vector<uint8_t> mSessionId2;
16610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    Vector<uint8_t> mSessionId3;
16710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu};
16810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
16910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua WuTEST_F(DrmSessionManagerTest, addSession) {
17010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    addSession();
17110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu}
17210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
17310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua WuTEST_F(DrmSessionManagerTest, useSession) {
17410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    addSession();
17510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
17610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    mDrmSessionManager->useSession(mSessionId1);
17710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    mDrmSessionManager->useSession(mSessionId3);
17810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
17910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    const PidSessionInfosMap& map = sessionMap();
18010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    const SessionInfos& infos1 = map.valueFor(kTestPid1);
18110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    const SessionInfos& infos2 = map.valueFor(kTestPid2);
18210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    ExpectEqSessionInfo(infos1[0], mTestDrm1, mSessionId1, 3);
18310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    ExpectEqSessionInfo(infos2[1], mTestDrm2, mSessionId3, 4);
18410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu}
18510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
18610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua WuTEST_F(DrmSessionManagerTest, removeSession) {
18710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    addSession();
18810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
18910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    mDrmSessionManager->removeSession(mSessionId2);
19010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
19110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    const PidSessionInfosMap& map = sessionMap();
1926d339f1f764bbd32e3381dae7bfa7c6c575bb493Lajos Molnar    EXPECT_EQ(2u, map.size());
19310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    const SessionInfos& infos1 = map.valueFor(kTestPid1);
19410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    const SessionInfos& infos2 = map.valueFor(kTestPid2);
1956d339f1f764bbd32e3381dae7bfa7c6c575bb493Lajos Molnar    EXPECT_EQ(1u, infos1.size());
1966d339f1f764bbd32e3381dae7bfa7c6c575bb493Lajos Molnar    EXPECT_EQ(1u, infos2.size());
19710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    // mSessionId2 has been removed.
19810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    ExpectEqSessionInfo(infos2[0], mTestDrm2, mSessionId3, 2);
19910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu}
20010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
20110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua WuTEST_F(DrmSessionManagerTest, removeDrm) {
20210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    addSession();
20310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
20410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    sp<FakeDrm> drm = new FakeDrm;
20510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    const uint8_t ids[] = {123};
20610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    Vector<uint8_t> sessionId;
20710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    GetSessionId(ids, ARRAY_SIZE(ids), &sessionId);
20810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    mDrmSessionManager->addSession(kTestPid2, drm, sessionId);
20910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
21010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    mDrmSessionManager->removeDrm(mTestDrm2);
21110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
21210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    const PidSessionInfosMap& map = sessionMap();
21310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    const SessionInfos& infos2 = map.valueFor(kTestPid2);
2146d339f1f764bbd32e3381dae7bfa7c6c575bb493Lajos Molnar    EXPECT_EQ(1u, infos2.size());
21510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    // mTestDrm2 has been removed.
21610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    ExpectEqSessionInfo(infos2[0], drm, sessionId, 3);
21710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu}
21810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
21910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua WuTEST_F(DrmSessionManagerTest, reclaimSession) {
22010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    EXPECT_FALSE(mDrmSessionManager->reclaimSession(kTestPid1));
22110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    addSession();
22210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
22310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    // calling pid priority is too low
2245c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu    EXPECT_FALSE(mDrmSessionManager->reclaimSession(50));
22510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
2265c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu    EXPECT_TRUE(mDrmSessionManager->reclaimSession(10));
2276d339f1f764bbd32e3381dae7bfa7c6c575bb493Lajos Molnar    EXPECT_EQ(1u, mTestDrm1->reclaimedSessions().size());
22810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    EXPECT_TRUE(isEqualSessionId(mSessionId1, mTestDrm1->reclaimedSessions()[0]));
22910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
23010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    mDrmSessionManager->removeSession(mSessionId1);
23110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
23210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    // add a session from a higher priority process.
23310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    sp<FakeDrm> drm = new FakeDrm;
2341db71be52d989364e62971e997bea78703bf9f97Ronghua Wu    const uint8_t ids[] = {1, 3, 5};
23510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    Vector<uint8_t> sessionId;
23610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    GetSessionId(ids, ARRAY_SIZE(ids), &sessionId);
2375c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu    mDrmSessionManager->addSession(15, drm, sessionId);
23810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
2395c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu    EXPECT_TRUE(mDrmSessionManager->reclaimSession(18));
2406d339f1f764bbd32e3381dae7bfa7c6c575bb493Lajos Molnar    EXPECT_EQ(1u, mTestDrm2->reclaimedSessions().size());
24110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    // mSessionId2 is reclaimed.
24210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    EXPECT_TRUE(isEqualSessionId(mSessionId2, mTestDrm2->reclaimedSessions()[0]));
24310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu}
24410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
24510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua WuTEST_F(DrmSessionManagerTest, getLowestPriority) {
24610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    testGetLowestPriority();
24710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu}
24810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
24910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua WuTEST_F(DrmSessionManagerTest, getLeastUsedSession_l) {
25010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    testGetLeastUsedSession();
25110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu}
25210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
25310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu} // namespace android
254