Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8964b85a authored by Henry Fang's avatar Henry Fang
Browse files

make descrambler test optional since it may be provided through tuner module since cas@1.2

bug: 176799453
Test: Manual
Change-Id: Iffbd76723c53ba0d94ccfcbd8c22beb1d8173fad
parent a4b2edb9
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@ cc_test {
    srcs: ["VtsHalCasV1_0TargetTest.cpp"],
    static_libs: [
        "android.hardware.cas@1.0",
        "android.hardware.cas@1.1",
        "android.hardware.cas@1.2",
        "android.hardware.cas.native@1.0",
        "android.hidl.allocator@1.0",
        "android.hidl.memory@1.0",
+180 −180
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include <android/hardware/cas/1.0/IDescramblerBase.h>
#include <android/hardware/cas/1.0/IMediaCasService.h>
#include <android/hardware/cas/1.0/types.h>
#include <android/hardware/cas/1.2/IMediaCasService.h>
#include <android/hardware/cas/native/1.0/IDescrambler.h>
#include <android/hardware/cas/native/1.0/types.h>
#include <binder/MemoryDealer.h>
@@ -212,6 +213,10 @@ void MediaCasListener::testEventEcho(sp<ICas>& mediaCas, int32_t& event, int32_t
class MediaCasHidlTest : public testing::TestWithParam<std::string> {
  public:
    virtual void SetUp() override {
        if (android::hardware::cas::V1_2::IMediaCasService::getService(GetParam()) == nullptr) {
            ALOGI("Descrambler is need to be tested before cas@1.2.");
            mIsTestDescrambler = true;
        }
        mService = IMediaCasService::getService(GetParam());
        ASSERT_NE(mService, nullptr);
    }
@@ -226,6 +231,7 @@ class MediaCasHidlTest : public testing::TestWithParam<std::string> {
    sp<ICas> mMediaCas;
    sp<IDescramblerBase> mDescramblerBase;
    sp<MediaCasListener> mCasListener;
    bool mIsTestDescrambler = false;
    typedef struct _OobInputTestParams {
        const SubSample* subSamples;
        uint32_t numSubSamples;
@@ -270,8 +276,14 @@ class MediaCasHidlTest : public testing::TestWithParam<std::string> {

    auto descramblerStatus = mService->createDescrambler(caSystemId);
    if (!descramblerStatus.isOk()) {
        if (mIsTestDescrambler) {
            return ::testing::AssertionFailure();
        } else {
            ALOGI("Skip Descrambler test since it's not required in cas@1.2.");
            return ::testing::AssertionSuccess();
        }
    }
    mIsTestDescrambler = true;
    mDescramblerBase = descramblerStatus;
    return ::testing::AssertionResult(mDescramblerBase != nullptr);
}
@@ -494,7 +506,7 @@ TEST_P(MediaCasHidlTest, TestClearKeyApis) {
    returnStatus = mMediaCas->setSessionPrivateData(streamSessionId, hidlPvtData);
    EXPECT_TRUE(returnStatus.isOk());
    EXPECT_EQ(Status::OK, returnStatus);

    if (mIsTestDescrambler) {
        returnStatus = mDescramblerBase->setMediaCasSession(sessionId);
        EXPECT_TRUE(returnStatus.isOk());
        EXPECT_EQ(Status::OK, returnStatus);
@@ -502,6 +514,7 @@ TEST_P(MediaCasHidlTest, TestClearKeyApis) {
        returnStatus = mDescramblerBase->setMediaCasSession(streamSessionId);
        EXPECT_TRUE(returnStatus.isOk());
        EXPECT_EQ(Status::OK, returnStatus);
    }

    hidl_vec<uint8_t> hidlNullPtr;
    hidlNullPtr.setToExternal(static_cast<uint8_t*>(nullptr), 0);
@@ -543,6 +556,7 @@ TEST_P(MediaCasHidlTest, TestClearKeyApis) {
    EXPECT_TRUE(returnStatus.isOk());
    EXPECT_EQ(Status::OK, returnStatus);

    if (mIsTestDescrambler) {
        EXPECT_FALSE(mDescramblerBase->requiresSecureDecoderComponent("video/avc"));

        sp<IDescrambler> descrambler;
@@ -556,16 +570,18 @@ TEST_P(MediaCasHidlTest, TestClearKeyApis) {
        EXPECT_EQ(Status::OK, descrambleStatus);

        ASSERT_NE(nullptr, dataMemory.get());
    uint8_t* opBuffer = static_cast<uint8_t*>(static_cast<void*>(dataMemory->unsecurePointer()));
        uint8_t* opBuffer =
                static_cast<uint8_t*>(static_cast<void*>(dataMemory->unsecurePointer()));

        int compareResult =
        memcmp(static_cast<const void*>(opBuffer), static_cast<const void*>(kOutRefBinaryBuffer),
               sizeof(kOutRefBinaryBuffer));
                memcmp(static_cast<const void*>(opBuffer),
                       static_cast<const void*>(kOutRefBinaryBuffer), sizeof(kOutRefBinaryBuffer));
        EXPECT_EQ(0, compareResult);

        returnStatus = mDescramblerBase->release();
        EXPECT_TRUE(returnStatus.isOk());
        EXPECT_EQ(Status::OK, returnStatus);
    }

    returnStatus = mMediaCas->release();
    EXPECT_TRUE(returnStatus.isOk());
@@ -590,6 +606,7 @@ TEST_P(MediaCasHidlTest, TestClearKeySessionClosedAfterRelease) {
    EXPECT_TRUE(returnStatus.isOk());
    EXPECT_EQ(Status::OK, returnStatus);

    if (mIsTestDescrambler) {
        returnStatus = mDescramblerBase->setMediaCasSession(sessionId);
        EXPECT_TRUE(returnStatus.isOk());
        EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, returnStatus);
@@ -598,6 +615,7 @@ TEST_P(MediaCasHidlTest, TestClearKeySessionClosedAfterRelease) {
        EXPECT_TRUE(returnStatus.isOk());
        EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, returnStatus);
    }
}

TEST_P(MediaCasHidlTest, TestClearKeyErrors) {
    description("Test that invalid call sequences fail with expected error codes");
@@ -654,6 +672,7 @@ TEST_P(MediaCasHidlTest, TestClearKeyErrors) {
    EXPECT_TRUE(returnStatus.isOk());
    EXPECT_EQ(Status::ERROR_CAS_UNKNOWN, returnStatus);

    if (mIsTestDescrambler) {
        /*
         * Test MediaDescrambler error codes
         */
@@ -687,6 +706,7 @@ TEST_P(MediaCasHidlTest, TestClearKeyErrors) {
        // Verify that requiresSecureDecoderComponent handles invalid mime
        EXPECT_FALSE(mDescramblerBase->requiresSecureDecoderComponent("bad"));
    }
}

TEST_P(MediaCasHidlTest, TestClearKeyOobFails) {
    description("Test that oob descramble request fails with expected error");
@@ -700,9 +720,11 @@ TEST_P(MediaCasHidlTest, TestClearKeyOobFails) {
    std::vector<uint8_t> sessionId;
    ASSERT_TRUE(openCasSession(&sessionId));

    if (mIsTestDescrambler) {
        returnStatus = mDescramblerBase->setMediaCasSession(sessionId);
        EXPECT_TRUE(returnStatus.isOk());
        EXPECT_EQ(Status::OK, returnStatus);
    }

    hidl_vec<uint8_t> hidlEcm;
    hidlEcm.setToExternal(const_cast<uint8_t*>(kEcmBinaryBuffer), sizeof(kEcmBinaryBuffer));
@@ -710,126 +732,104 @@ TEST_P(MediaCasHidlTest, TestClearKeyOobFails) {
    EXPECT_TRUE(returnStatus.isOk());
    EXPECT_EQ(Status::OK, returnStatus);

    if (mIsTestDescrambler) {
        sp<IDescrambler> descrambler = IDescrambler::castFrom(mDescramblerBase);
        ASSERT_NE(nullptr, descrambler.get());

        Status descrambleStatus = Status::OK;

        // test invalid src buffer offset
    ASSERT_TRUE(descrambleTestOobInput(
            descrambler,
            &descrambleStatus,
            {
                .subSamples     = kSubSamples,
        ASSERT_TRUE(
                descrambleTestOobInput(descrambler, &descrambleStatus,
                                       {.subSamples = kSubSamples,
                                        .numSubSamples = sizeof(kSubSamples) / sizeof(SubSample),
                                        .imemSizeActual = sizeof(kInBinaryBuffer),
                                        .imemOffset = 0xcccccc,
                                        .imemSize = sizeof(kInBinaryBuffer),
                                        .srcOffset = 0,
                .dstOffset      = 0
            }));
                                        .dstOffset = 0}));
        EXPECT_EQ(Status::BAD_VALUE, descrambleStatus);

        // test invalid src buffer size
    ASSERT_TRUE(descrambleTestOobInput(
            descrambler,
            &descrambleStatus,
            {
                .subSamples     = kSubSamples,
        ASSERT_TRUE(
                descrambleTestOobInput(descrambler, &descrambleStatus,
                                       {.subSamples = kSubSamples,
                                        .numSubSamples = sizeof(kSubSamples) / sizeof(SubSample),
                                        .imemSizeActual = sizeof(kInBinaryBuffer),
                                        .imemOffset = 0,
                                        .imemSize = 0xcccccc,
                                        .srcOffset = 0,
                .dstOffset      = 0
            }));
                                        .dstOffset = 0}));
        EXPECT_EQ(Status::BAD_VALUE, descrambleStatus);

        // test invalid src buffer size
    ASSERT_TRUE(descrambleTestOobInput(
            descrambler,
            &descrambleStatus,
            {
                .subSamples     = kSubSamples,
        ASSERT_TRUE(
                descrambleTestOobInput(descrambler, &descrambleStatus,
                                       {.subSamples = kSubSamples,
                                        .numSubSamples = sizeof(kSubSamples) / sizeof(SubSample),
                                        .imemSizeActual = sizeof(kInBinaryBuffer),
                                        .imemOffset = 1,
                                        .imemSize = (uint64_t)-1,
                                        .srcOffset = 0,
                .dstOffset      = 0
            }));
                                        .dstOffset = 0}));
        EXPECT_EQ(Status::BAD_VALUE, descrambleStatus);

        // test invalid srcOffset
    ASSERT_TRUE(descrambleTestOobInput(
            descrambler,
            &descrambleStatus,
            {
                .subSamples     = kSubSamples,
        ASSERT_TRUE(
                descrambleTestOobInput(descrambler, &descrambleStatus,
                                       {.subSamples = kSubSamples,
                                        .numSubSamples = sizeof(kSubSamples) / sizeof(SubSample),
                                        .imemSizeActual = sizeof(kInBinaryBuffer),
                                        .imemOffset = 0,
                                        .imemSize = sizeof(kInBinaryBuffer),
                                        .srcOffset = 0xcccccc,
                .dstOffset      = 0
            }));
                                        .dstOffset = 0}));
        EXPECT_EQ(Status::BAD_VALUE, descrambleStatus);

        // test invalid dstOffset
    ASSERT_TRUE(descrambleTestOobInput(
            descrambler,
            &descrambleStatus,
            {
                .subSamples     = kSubSamples,
        ASSERT_TRUE(
                descrambleTestOobInput(descrambler, &descrambleStatus,
                                       {.subSamples = kSubSamples,
                                        .numSubSamples = sizeof(kSubSamples) / sizeof(SubSample),
                                        .imemSizeActual = sizeof(kInBinaryBuffer),
                                        .imemOffset = 0,
                                        .imemSize = sizeof(kInBinaryBuffer),
                                        .srcOffset = 0,
                .dstOffset      = 0xcccccc
            }));
                                        .dstOffset = 0xcccccc}));
        EXPECT_EQ(Status::BAD_VALUE, descrambleStatus);

        // test detection of oob subsample sizes
    const SubSample invalidSubSamples1[] =
        {{162, 0}, {0, 184}, {0, 0xdddddd}};
        const SubSample invalidSubSamples1[] = {{162, 0}, {0, 184}, {0, 0xdddddd}};

        ASSERT_TRUE(descrambleTestOobInput(
            descrambler,
            &descrambleStatus,
            {
                .subSamples     = invalidSubSamples1,
                descrambler, &descrambleStatus,
                {.subSamples = invalidSubSamples1,
                 .numSubSamples = sizeof(invalidSubSamples1) / sizeof(SubSample),
                 .imemSizeActual = sizeof(kInBinaryBuffer),
                 .imemOffset = 0,
                 .imemSize = sizeof(kInBinaryBuffer),
                 .srcOffset = 0,
                .dstOffset      = 0
            }));
                 .dstOffset = 0}));
        EXPECT_EQ(Status::BAD_VALUE, descrambleStatus);

        // test detection of overflowing subsample sizes
    const SubSample invalidSubSamples2[] =
        {{162, 0}, {0, 184}, {2, (uint32_t)-1}};
        const SubSample invalidSubSamples2[] = {{162, 0}, {0, 184}, {2, (uint32_t)-1}};

        ASSERT_TRUE(descrambleTestOobInput(
            descrambler,
            &descrambleStatus,
            {
                .subSamples     = invalidSubSamples2,
                descrambler, &descrambleStatus,
                {.subSamples = invalidSubSamples2,
                 .numSubSamples = sizeof(invalidSubSamples2) / sizeof(SubSample),
                 .imemSizeActual = sizeof(kInBinaryBuffer),
                 .imemOffset = 0,
                 .imemSize = sizeof(kInBinaryBuffer),
                 .srcOffset = 0,
                .dstOffset      = 0
            }));
                 .dstOffset = 0}));
        EXPECT_EQ(Status::BAD_VALUE, descrambleStatus);

        returnStatus = mDescramblerBase->release();
        EXPECT_TRUE(returnStatus.isOk());
        EXPECT_EQ(Status::OK, returnStatus);

    }
    returnStatus = mMediaCas->release();
    EXPECT_TRUE(returnStatus.isOk());
    EXPECT_EQ(Status::OK, returnStatus);
+1 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ cc_test {
    static_libs: [
        "android.hardware.cas@1.0",
        "android.hardware.cas@1.1",
        "android.hardware.cas@1.2",
        "android.hardware.cas.native@1.0",
        "android.hidl.allocator@1.0",
        "android.hidl.memory@1.0",
+41 −24
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include <android/hardware/cas/1.1/ICas.h>
#include <android/hardware/cas/1.1/ICasListener.h>
#include <android/hardware/cas/1.1/IMediaCasService.h>
#include <android/hardware/cas/1.2/IMediaCasService.h>
#include <android/hardware/cas/native/1.0/IDescrambler.h>
#include <android/hardware/cas/native/1.0/types.h>
#include <binder/MemoryDealer.h>
@@ -255,6 +256,10 @@ void MediaCasListener::testSessionEventEcho(sp<ICas>& mediaCas, const hidl_vec<u
class MediaCasHidlTest : public testing::TestWithParam<std::string> {
  public:
    virtual void SetUp() override {
        if (android::hardware::cas::V1_2::IMediaCasService::getService(GetParam()) == nullptr) {
            ALOGI("Descrambler is need to be tested before cas@1.2.");
            mIsTestDescrambler = true;
        }
        mService = IMediaCasService::getService(GetParam());
        ASSERT_NE(mService, nullptr);
    }
@@ -269,6 +274,7 @@ class MediaCasHidlTest : public testing::TestWithParam<std::string> {
    sp<ICas> mMediaCas;
    sp<IDescramblerBase> mDescramblerBase;
    sp<MediaCasListener> mCasListener;
    bool mIsTestDescrambler = false;
    typedef struct _OobInputTestParams {
        const SubSample* subSamples;
        uint32_t numSubSamples;
@@ -311,8 +317,15 @@ class MediaCasHidlTest : public testing::TestWithParam<std::string> {

    auto descramblerStatus = mService->createDescrambler(caSystemId);
    if (!descramblerStatus.isOk()) {
        if (mIsTestDescrambler) {
            return ::testing::AssertionFailure();
        } else {
            ALOGI("Skip Descrambler test since it's not required in cas@1.2.");
            return ::testing::AssertionSuccess();
        }
    }
    mIsTestDescrambler = true;

    mDescramblerBase = descramblerStatus;
    return ::testing::AssertionResult(mDescramblerBase != nullptr);
}
@@ -468,6 +481,7 @@ TEST_P(MediaCasHidlTest, TestClearKeyApisWithSession) {
    EXPECT_TRUE(returnStatus.isOk());
    EXPECT_EQ(Status::OK, returnStatus);

    if (mIsTestDescrambler) {
        returnStatus = mDescramblerBase->setMediaCasSession(sessionId);
        EXPECT_TRUE(returnStatus.isOk());
        EXPECT_EQ(Status::OK, returnStatus);
@@ -475,6 +489,7 @@ TEST_P(MediaCasHidlTest, TestClearKeyApisWithSession) {
        returnStatus = mDescramblerBase->setMediaCasSession(streamSessionId);
        EXPECT_TRUE(returnStatus.isOk());
        EXPECT_EQ(Status::OK, returnStatus);
    }

    hidl_vec<uint8_t> hidlNullPtr;
    hidlNullPtr.setToExternal(static_cast<uint8_t*>(nullptr), 0);
@@ -518,6 +533,7 @@ TEST_P(MediaCasHidlTest, TestClearKeyApisWithSession) {
    EXPECT_TRUE(returnStatus.isOk());
    EXPECT_EQ(Status::OK, returnStatus);

    if (mIsTestDescrambler) {
        EXPECT_FALSE(mDescramblerBase->requiresSecureDecoderComponent("video/avc"));

        sp<IDescrambler> descrambler;
@@ -541,6 +557,7 @@ TEST_P(MediaCasHidlTest, TestClearKeyApisWithSession) {
        returnStatus = mDescramblerBase->release();
        EXPECT_TRUE(returnStatus.isOk());
        EXPECT_EQ(Status::OK, returnStatus);
    }

    returnStatus = mMediaCas->release();
    EXPECT_TRUE(returnStatus.isOk());
+32 −25
Original line number Diff line number Diff line
@@ -311,6 +311,7 @@ class MediaCasHidlTest : public testing::TestWithParam<std::string> {
    sp<ICas> mMediaCas;
    sp<IDescramblerBase> mDescramblerBase;
    sp<MediaCasListener> mCasListener;
    bool mIsTestDescrambler = false;
    typedef struct _OobInputTestParams {
        const SubSample* subSamples;
        uint32_t numSubSamples;
@@ -355,8 +356,11 @@ class MediaCasHidlTest : public testing::TestWithParam<std::string> {

    auto descramblerStatus = mService->createDescrambler(caSystemId);
    if (!descramblerStatus.isOk()) {
        return ::testing::AssertionFailure();
        ALOGI("Skip Descrambler test since it's not required in cas@1.2.");
        return ::testing::AssertionSuccess();
    }
    mIsTestDescrambler = true;

    mDescramblerBase = descramblerStatus;
    return ::testing::AssertionResult(mDescramblerBase != nullptr);
}
@@ -512,6 +516,7 @@ TEST_P(MediaCasHidlTest, TestClearKeyApisWithSession) {
    EXPECT_TRUE(returnStatus.isOk());
    EXPECT_EQ(Status::OK, returnStatus);

    if (mIsTestDescrambler) {
        returnStatus = mDescramblerBase->setMediaCasSession(sessionId);
        EXPECT_TRUE(returnStatus.isOk());
        EXPECT_EQ(Status::OK, returnStatus);
@@ -519,7 +524,7 @@ TEST_P(MediaCasHidlTest, TestClearKeyApisWithSession) {
        returnStatus = mDescramblerBase->setMediaCasSession(streamSessionId);
        EXPECT_TRUE(returnStatus.isOk());
        EXPECT_EQ(Status::OK, returnStatus);

    }
    hidl_vec<uint8_t> hidlNullPtr;
    hidlNullPtr.setToExternal(static_cast<uint8_t*>(nullptr), 0);
    returnStatus = mMediaCas->refreshEntitlements(3, hidlNullPtr);
@@ -566,6 +571,7 @@ TEST_P(MediaCasHidlTest, TestClearKeyApisWithSession) {
    EXPECT_TRUE(returnStatus.isOk());
    EXPECT_EQ(Status::OK, returnStatus);

    if (mIsTestDescrambler) {
        EXPECT_FALSE(mDescramblerBase->requiresSecureDecoderComponent("video/avc"));

        sp<IDescrambler> descrambler;
@@ -589,6 +595,7 @@ TEST_P(MediaCasHidlTest, TestClearKeyApisWithSession) {
        returnStatus = mDescramblerBase->release();
        EXPECT_TRUE(returnStatus.isOk());
        EXPECT_EQ(Status::OK, returnStatus);
    }

    returnStatus = mMediaCas->release();
    EXPECT_TRUE(returnStatus.isOk());