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

Commit 24dedfeb authored by Henry Fang's avatar Henry Fang Committed by Android (Google) Code Review
Browse files

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

parents dc7c456d 8964b85a
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());