diff options
author | Xin Li <delphij@google.com> | 2021-08-17 18:14:12 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2021-08-17 18:14:12 +0000 |
commit | c541e8abb62a9a888de1cf48bbded105f7869cc0 (patch) | |
tree | 8a9c3f56607bb90577557ddd3261d36ae2ec2b93 /cas | |
parent | 1aa8cad8558884c9dd0293dffbf823e45614a25d (diff) | |
parent | e287df40b90fe64c226f90c66353a33e8ef40063 (diff) |
Merge "Merge sc-dev-plus-aosp-without-vendor@7634622" into stage-aosp-master
Diffstat (limited to 'cas')
-rw-r--r-- | cas/1.0/default/Android.bp | 2 | ||||
-rw-r--r-- | cas/1.0/default/FactoryLoader.h | 10 | ||||
-rw-r--r-- | cas/1.0/vts/functional/Android.bp | 2 | ||||
-rw-r--r-- | cas/1.0/vts/functional/VtsHalCasV1_0TargetTest.cpp | 367 | ||||
-rw-r--r-- | cas/1.1/default/Android.bp | 2 | ||||
-rw-r--r-- | cas/1.1/default/FactoryLoader.h | 8 | ||||
-rw-r--r-- | cas/1.1/vts/functional/Android.bp | 1 | ||||
-rw-r--r-- | cas/1.1/vts/functional/VtsHalCasV1_1TargetTest.cpp | 71 | ||||
-rw-r--r-- | cas/1.2/default/Android.bp | 2 | ||||
-rw-r--r-- | cas/1.2/default/FactoryLoader.h | 8 | ||||
-rw-r--r-- | cas/1.2/vts/functional/VtsHalCasV1_2TargetTest.cpp | 62 |
11 files changed, 306 insertions, 229 deletions
diff --git a/cas/1.0/default/Android.bp b/cas/1.0/default/Android.bp index e8b1a069e0..fc5b3b4361 100644 --- a/cas/1.0/default/Android.bp +++ b/cas/1.0/default/Android.bp @@ -21,6 +21,8 @@ cc_defaults { "TypeConvert.cpp", ], + compile_multilib: "prefer32", + shared_libs: [ "android.hardware.cas@1.0", "android.hardware.cas.native@1.0", diff --git a/cas/1.0/default/FactoryLoader.h b/cas/1.0/default/FactoryLoader.h index 18c2186dcb..45e515afbf 100644 --- a/cas/1.0/default/FactoryLoader.h +++ b/cas/1.0/default/FactoryLoader.h @@ -92,7 +92,12 @@ bool FactoryLoader<T>::findFactoryForScheme( } // no luck, have to search +#ifdef __LP64__ + String8 dirPath("/vendor/lib64/mediacas"); +#else String8 dirPath("/vendor/lib/mediacas"); +#endif + DIR* pDir = opendir(dirPath.string()); if (pDir == NULL) { @@ -127,7 +132,12 @@ bool FactoryLoader<T>::enumeratePlugins( results->clear(); +#ifdef __LP64__ + String8 dirPath("/vendor/lib64/mediacas"); +#else String8 dirPath("/vendor/lib/mediacas"); +#endif + DIR* pDir = opendir(dirPath.string()); if (pDir == NULL) { diff --git a/cas/1.0/vts/functional/Android.bp b/cas/1.0/vts/functional/Android.bp index fbfb7a7d3e..6d06cabfc3 100644 --- a/cas/1.0/vts/functional/Android.bp +++ b/cas/1.0/vts/functional/Android.bp @@ -29,6 +29,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", diff --git a/cas/1.0/vts/functional/VtsHalCasV1_0TargetTest.cpp b/cas/1.0/vts/functional/VtsHalCasV1_0TargetTest.cpp index 0f16de5e90..a1d5930386 100644 --- a/cas/1.0/vts/functional/VtsHalCasV1_0TargetTest.cpp +++ b/cas/1.0/vts/functional/VtsHalCasV1_0TargetTest.cpp @@ -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; @@ -250,12 +256,19 @@ class MediaCasHidlTest : public testing::TestWithParam<std::string> { ::testing::AssertionResult MediaCasHidlTest::createCasPlugin(int32_t caSystemId) { auto status = mService->isSystemIdSupported(caSystemId); + bool skipDescrambler = false; if (!status.isOk() || !status) { return ::testing::AssertionFailure(); } status = mService->isDescramblerSupported(caSystemId); if (!status.isOk() || !status) { - return ::testing::AssertionFailure(); + if (mIsTestDescrambler) { + return ::testing::AssertionFailure(); + } else { + ALOGI("Skip Descrambler test since it's not required in cas@1.2."); + mDescramblerBase = nullptr; + skipDescrambler = true; + } } mCasListener = new MediaCasListener(); @@ -268,10 +281,15 @@ class MediaCasHidlTest : public testing::TestWithParam<std::string> { return ::testing::AssertionFailure(); } + if (skipDescrambler) { + return ::testing::AssertionSuccess(); + } + auto descramblerStatus = mService->createDescrambler(caSystemId); if (!descramblerStatus.isOk()) { return ::testing::AssertionFailure(); } + mDescramblerBase = descramblerStatus; return ::testing::AssertionResult(mDescramblerBase != nullptr); } @@ -494,14 +512,15 @@ TEST_P(MediaCasHidlTest, TestClearKeyApis) { returnStatus = mMediaCas->setSessionPrivateData(streamSessionId, hidlPvtData); EXPECT_TRUE(returnStatus.isOk()); EXPECT_EQ(Status::OK, returnStatus); - - returnStatus = mDescramblerBase->setMediaCasSession(sessionId); - EXPECT_TRUE(returnStatus.isOk()); - EXPECT_EQ(Status::OK, returnStatus); - - returnStatus = mDescramblerBase->setMediaCasSession(streamSessionId); - EXPECT_TRUE(returnStatus.isOk()); - EXPECT_EQ(Status::OK, returnStatus); + if (mDescramblerBase != nullptr) { + returnStatus = mDescramblerBase->setMediaCasSession(sessionId); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); + + 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,29 +562,32 @@ TEST_P(MediaCasHidlTest, TestClearKeyApis) { EXPECT_TRUE(returnStatus.isOk()); EXPECT_EQ(Status::OK, returnStatus); - EXPECT_FALSE(mDescramblerBase->requiresSecureDecoderComponent("video/avc")); + if (mDescramblerBase != nullptr) { + EXPECT_FALSE(mDescramblerBase->requiresSecureDecoderComponent("video/avc")); - sp<IDescrambler> descrambler; - descrambler = IDescrambler::castFrom(mDescramblerBase); - ASSERT_NE(descrambler, nullptr); + sp<IDescrambler> descrambler; + descrambler = IDescrambler::castFrom(mDescramblerBase); + ASSERT_NE(descrambler, nullptr); - Status descrambleStatus = Status::OK; - sp<IMemory> dataMemory; + Status descrambleStatus = Status::OK; + sp<IMemory> dataMemory; - ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &dataMemory)); - EXPECT_EQ(Status::OK, descrambleStatus); + ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &dataMemory)); + EXPECT_EQ(Status::OK, descrambleStatus); - ASSERT_NE(nullptr, dataMemory.get()); - uint8_t* opBuffer = static_cast<uint8_t*>(static_cast<void*>(dataMemory->unsecurePointer())); + ASSERT_NE(nullptr, dataMemory.get()); + 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)); - EXPECT_EQ(0, compareResult); + int compareResult = + 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 = mDescramblerBase->release(); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); + } returnStatus = mMediaCas->release(); EXPECT_TRUE(returnStatus.isOk()); @@ -590,13 +612,15 @@ TEST_P(MediaCasHidlTest, TestClearKeySessionClosedAfterRelease) { EXPECT_TRUE(returnStatus.isOk()); EXPECT_EQ(Status::OK, returnStatus); - returnStatus = mDescramblerBase->setMediaCasSession(sessionId); - EXPECT_TRUE(returnStatus.isOk()); - EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, returnStatus); + if (mDescramblerBase != nullptr) { + returnStatus = mDescramblerBase->setMediaCasSession(sessionId); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, returnStatus); - returnStatus = mDescramblerBase->setMediaCasSession(streamSessionId); - EXPECT_TRUE(returnStatus.isOk()); - EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, returnStatus); + returnStatus = mDescramblerBase->setMediaCasSession(streamSessionId); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, returnStatus); + } } TEST_P(MediaCasHidlTest, TestClearKeyErrors) { @@ -654,38 +678,40 @@ TEST_P(MediaCasHidlTest, TestClearKeyErrors) { EXPECT_TRUE(returnStatus.isOk()); EXPECT_EQ(Status::ERROR_CAS_UNKNOWN, returnStatus); - /* - * Test MediaDescrambler error codes - */ - // setMediaCasSession should fail with an invalid session id - returnStatus = mDescramblerBase->setMediaCasSession(invalidSessionId); - EXPECT_TRUE(returnStatus.isOk()); - EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, returnStatus); + if (mDescramblerBase != nullptr) { + /* + * Test MediaDescrambler error codes + */ + // setMediaCasSession should fail with an invalid session id + returnStatus = mDescramblerBase->setMediaCasSession(invalidSessionId); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, returnStatus); - // descramble should fail without a valid session - sp<IDescrambler> descrambler; - descrambler = IDescrambler::castFrom(mDescramblerBase); - ASSERT_NE(descrambler, nullptr); + // descramble should fail without a valid session + sp<IDescrambler> descrambler; + descrambler = IDescrambler::castFrom(mDescramblerBase); + ASSERT_NE(descrambler, nullptr); - Status descrambleStatus = Status::OK; - sp<IMemory> dataMemory; + Status descrambleStatus = Status::OK; + sp<IMemory> dataMemory; - ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &dataMemory)); - EXPECT_EQ(Status::ERROR_CAS_DECRYPT_UNIT_NOT_INITIALIZED, descrambleStatus); + ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &dataMemory)); + EXPECT_EQ(Status::ERROR_CAS_DECRYPT_UNIT_NOT_INITIALIZED, descrambleStatus); - // Now set a valid session, should still fail because no valid ecm is processed - returnStatus = mDescramblerBase->setMediaCasSession(sessionId); - EXPECT_TRUE(returnStatus.isOk()); - EXPECT_EQ(Status::OK, returnStatus); + // Now set a valid session, should still fail because no valid ecm is processed + returnStatus = mDescramblerBase->setMediaCasSession(sessionId); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); - ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &dataMemory)); - EXPECT_EQ(Status::ERROR_CAS_DECRYPT, descrambleStatus); + ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &dataMemory)); + EXPECT_EQ(Status::ERROR_CAS_DECRYPT, descrambleStatus); - // Verify that requiresSecureDecoderComponent handles empty mime - EXPECT_FALSE(mDescramblerBase->requiresSecureDecoderComponent("")); + // Verify that requiresSecureDecoderComponent handles empty mime + EXPECT_FALSE(mDescramblerBase->requiresSecureDecoderComponent("")); - // Verify that requiresSecureDecoderComponent handles invalid mime - EXPECT_FALSE(mDescramblerBase->requiresSecureDecoderComponent("bad")); + // Verify that requiresSecureDecoderComponent handles invalid mime + EXPECT_FALSE(mDescramblerBase->requiresSecureDecoderComponent("bad")); + } } TEST_P(MediaCasHidlTest, TestClearKeyOobFails) { @@ -700,9 +726,11 @@ TEST_P(MediaCasHidlTest, TestClearKeyOobFails) { std::vector<uint8_t> sessionId; ASSERT_TRUE(openCasSession(&sessionId)); - returnStatus = mDescramblerBase->setMediaCasSession(sessionId); - EXPECT_TRUE(returnStatus.isOk()); - EXPECT_EQ(Status::OK, returnStatus); + if (mDescramblerBase != nullptr) { + 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 +738,104 @@ TEST_P(MediaCasHidlTest, TestClearKeyOobFails) { EXPECT_TRUE(returnStatus.isOk()); EXPECT_EQ(Status::OK, returnStatus); - 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, - .numSubSamples = sizeof(kSubSamples)/sizeof(SubSample), - .imemSizeActual = sizeof(kInBinaryBuffer), - .imemOffset = 0xcccccc, - .imemSize = sizeof(kInBinaryBuffer), - .srcOffset = 0, - .dstOffset = 0 - })); - EXPECT_EQ(Status::BAD_VALUE, descrambleStatus); - - // test invalid src buffer size - ASSERT_TRUE(descrambleTestOobInput( - descrambler, - &descrambleStatus, - { - .subSamples = kSubSamples, - .numSubSamples = sizeof(kSubSamples)/sizeof(SubSample), - .imemSizeActual = sizeof(kInBinaryBuffer), - .imemOffset = 0, - .imemSize = 0xcccccc, - .srcOffset = 0, - .dstOffset = 0 - })); - EXPECT_EQ(Status::BAD_VALUE, descrambleStatus); - - // test invalid src buffer size - 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 - })); - EXPECT_EQ(Status::BAD_VALUE, descrambleStatus); - - // test invalid srcOffset - ASSERT_TRUE(descrambleTestOobInput( - descrambler, - &descrambleStatus, - { - .subSamples = kSubSamples, - .numSubSamples = sizeof(kSubSamples)/sizeof(SubSample), - .imemSizeActual = sizeof(kInBinaryBuffer), - .imemOffset = 0, - .imemSize = sizeof(kInBinaryBuffer), - .srcOffset = 0xcccccc, - .dstOffset = 0 - })); - EXPECT_EQ(Status::BAD_VALUE, descrambleStatus); - - // test invalid dstOffset - ASSERT_TRUE(descrambleTestOobInput( - descrambler, - &descrambleStatus, - { - .subSamples = kSubSamples, - .numSubSamples = sizeof(kSubSamples)/sizeof(SubSample), - .imemSizeActual = sizeof(kInBinaryBuffer), - .imemOffset = 0, - .imemSize = sizeof(kInBinaryBuffer), - .srcOffset = 0, - .dstOffset = 0xcccccc - })); - EXPECT_EQ(Status::BAD_VALUE, descrambleStatus); - - // test detection of oob subsample sizes - const SubSample invalidSubSamples1[] = - {{162, 0}, {0, 184}, {0, 0xdddddd}}; - - ASSERT_TRUE(descrambleTestOobInput( - descrambler, - &descrambleStatus, - { - .subSamples = invalidSubSamples1, - .numSubSamples = sizeof(invalidSubSamples1)/sizeof(SubSample), - .imemSizeActual = sizeof(kInBinaryBuffer), - .imemOffset = 0, - .imemSize = sizeof(kInBinaryBuffer), - .srcOffset = 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}}; - - ASSERT_TRUE(descrambleTestOobInput( - descrambler, - &descrambleStatus, - { - .subSamples = invalidSubSamples2, - .numSubSamples = sizeof(invalidSubSamples2)/sizeof(SubSample), - .imemSizeActual = sizeof(kInBinaryBuffer), - .imemOffset = 0, - .imemSize = sizeof(kInBinaryBuffer), - .srcOffset = 0, - .dstOffset = 0 - })); - EXPECT_EQ(Status::BAD_VALUE, descrambleStatus); - - returnStatus = mDescramblerBase->release(); - EXPECT_TRUE(returnStatus.isOk()); - EXPECT_EQ(Status::OK, returnStatus); - + if (mDescramblerBase != nullptr) { + 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, + .numSubSamples = sizeof(kSubSamples) / sizeof(SubSample), + .imemSizeActual = sizeof(kInBinaryBuffer), + .imemOffset = 0xcccccc, + .imemSize = sizeof(kInBinaryBuffer), + .srcOffset = 0, + .dstOffset = 0})); + EXPECT_EQ(Status::BAD_VALUE, descrambleStatus); + + // test invalid src buffer size + ASSERT_TRUE( + descrambleTestOobInput(descrambler, &descrambleStatus, + {.subSamples = kSubSamples, + .numSubSamples = sizeof(kSubSamples) / sizeof(SubSample), + .imemSizeActual = sizeof(kInBinaryBuffer), + .imemOffset = 0, + .imemSize = 0xcccccc, + .srcOffset = 0, + .dstOffset = 0})); + EXPECT_EQ(Status::BAD_VALUE, descrambleStatus); + + // test invalid src buffer size + 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})); + EXPECT_EQ(Status::BAD_VALUE, descrambleStatus); + + // test invalid srcOffset + ASSERT_TRUE( + descrambleTestOobInput(descrambler, &descrambleStatus, + {.subSamples = kSubSamples, + .numSubSamples = sizeof(kSubSamples) / sizeof(SubSample), + .imemSizeActual = sizeof(kInBinaryBuffer), + .imemOffset = 0, + .imemSize = sizeof(kInBinaryBuffer), + .srcOffset = 0xcccccc, + .dstOffset = 0})); + EXPECT_EQ(Status::BAD_VALUE, descrambleStatus); + + // test invalid dstOffset + ASSERT_TRUE( + descrambleTestOobInput(descrambler, &descrambleStatus, + {.subSamples = kSubSamples, + .numSubSamples = sizeof(kSubSamples) / sizeof(SubSample), + .imemSizeActual = sizeof(kInBinaryBuffer), + .imemOffset = 0, + .imemSize = sizeof(kInBinaryBuffer), + .srcOffset = 0, + .dstOffset = 0xcccccc})); + EXPECT_EQ(Status::BAD_VALUE, descrambleStatus); + + // test detection of oob subsample sizes + const SubSample invalidSubSamples1[] = {{162, 0}, {0, 184}, {0, 0xdddddd}}; + + ASSERT_TRUE(descrambleTestOobInput( + descrambler, &descrambleStatus, + {.subSamples = invalidSubSamples1, + .numSubSamples = sizeof(invalidSubSamples1) / sizeof(SubSample), + .imemSizeActual = sizeof(kInBinaryBuffer), + .imemOffset = 0, + .imemSize = sizeof(kInBinaryBuffer), + .srcOffset = 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}}; + + ASSERT_TRUE(descrambleTestOobInput( + descrambler, &descrambleStatus, + {.subSamples = invalidSubSamples2, + .numSubSamples = sizeof(invalidSubSamples2) / sizeof(SubSample), + .imemSizeActual = sizeof(kInBinaryBuffer), + .imemOffset = 0, + .imemSize = sizeof(kInBinaryBuffer), + .srcOffset = 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); @@ -837,6 +843,7 @@ TEST_P(MediaCasHidlTest, TestClearKeyOobFails) { } // anonymous namespace +GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(MediaCasHidlTest); INSTANTIATE_TEST_SUITE_P( PerInstance, MediaCasHidlTest, testing::ValuesIn(android::hardware::getAllHalInstanceNames(IMediaCasService::descriptor)), diff --git a/cas/1.1/default/Android.bp b/cas/1.1/default/Android.bp index f60357398a..2cfc0b90fb 100644 --- a/cas/1.1/default/Android.bp +++ b/cas/1.1/default/Android.bp @@ -21,6 +21,8 @@ cc_defaults { "TypeConvert.cpp", ], + compile_multilib: "prefer32", + shared_libs: [ "android.hardware.cas@1.0", "android.hardware.cas@1.1", diff --git a/cas/1.1/default/FactoryLoader.h b/cas/1.1/default/FactoryLoader.h index c4a48e2852..121f90c333 100644 --- a/cas/1.1/default/FactoryLoader.h +++ b/cas/1.1/default/FactoryLoader.h @@ -85,7 +85,11 @@ bool FactoryLoader<T>::findFactoryForScheme(int32_t CA_system_id, sp<SharedLibra } // no luck, have to search +#ifdef __LP64__ + String8 dirPath("/vendor/lib64/mediacas"); +#else String8 dirPath("/vendor/lib/mediacas"); +#endif DIR* pDir = opendir(dirPath.string()); if (pDir == NULL) { @@ -118,7 +122,11 @@ bool FactoryLoader<T>::enumeratePlugins(vector<HidlCasPluginDescriptor>* results results->clear(); +#ifdef __LP64__ + String8 dirPath("/vendor/lib64/mediacas"); +#else String8 dirPath("/vendor/lib/mediacas"); +#endif DIR* pDir = opendir(dirPath.string()); if (pDir == NULL) { diff --git a/cas/1.1/vts/functional/Android.bp b/cas/1.1/vts/functional/Android.bp index 48731577f3..a598554123 100644 --- a/cas/1.1/vts/functional/Android.bp +++ b/cas/1.1/vts/functional/Android.bp @@ -30,6 +30,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", diff --git a/cas/1.1/vts/functional/VtsHalCasV1_1TargetTest.cpp b/cas/1.1/vts/functional/VtsHalCasV1_1TargetTest.cpp index 1b5797b845..42d70cfeb9 100644 --- a/cas/1.1/vts/functional/VtsHalCasV1_1TargetTest.cpp +++ b/cas/1.1/vts/functional/VtsHalCasV1_1TargetTest.cpp @@ -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; @@ -291,12 +297,19 @@ class MediaCasHidlTest : public testing::TestWithParam<std::string> { ::testing::AssertionResult MediaCasHidlTest::createCasPlugin(int32_t caSystemId) { auto status = mService->isSystemIdSupported(caSystemId); + bool skipDescrambler = false; if (!status.isOk() || !status) { return ::testing::AssertionFailure(); } status = mService->isDescramblerSupported(caSystemId); if (!status.isOk() || !status) { - return ::testing::AssertionFailure(); + if (mIsTestDescrambler) { + return ::testing::AssertionFailure(); + } else { + ALOGI("Skip Descrambler test since it's not required in cas@1.2."); + mDescramblerBase = nullptr; + skipDescrambler = true; + } } mCasListener = new MediaCasListener(); @@ -309,10 +322,15 @@ class MediaCasHidlTest : public testing::TestWithParam<std::string> { return ::testing::AssertionFailure(); } + if (skipDescrambler) { + return ::testing::AssertionSuccess(); + } + auto descramblerStatus = mService->createDescrambler(caSystemId); if (!descramblerStatus.isOk()) { return ::testing::AssertionFailure(); } + mDescramblerBase = descramblerStatus; return ::testing::AssertionResult(mDescramblerBase != nullptr); } @@ -468,13 +486,15 @@ TEST_P(MediaCasHidlTest, TestClearKeyApisWithSession) { EXPECT_TRUE(returnStatus.isOk()); EXPECT_EQ(Status::OK, returnStatus); - returnStatus = mDescramblerBase->setMediaCasSession(sessionId); - EXPECT_TRUE(returnStatus.isOk()); - EXPECT_EQ(Status::OK, returnStatus); + if (mDescramblerBase != nullptr) { + returnStatus = mDescramblerBase->setMediaCasSession(sessionId); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); - returnStatus = mDescramblerBase->setMediaCasSession(streamSessionId); - EXPECT_TRUE(returnStatus.isOk()); - EXPECT_EQ(Status::OK, returnStatus); + 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,29 +538,31 @@ TEST_P(MediaCasHidlTest, TestClearKeyApisWithSession) { EXPECT_TRUE(returnStatus.isOk()); EXPECT_EQ(Status::OK, returnStatus); - EXPECT_FALSE(mDescramblerBase->requiresSecureDecoderComponent("video/avc")); + if (mDescramblerBase != nullptr) { + EXPECT_FALSE(mDescramblerBase->requiresSecureDecoderComponent("video/avc")); - sp<IDescrambler> descrambler; - descrambler = IDescrambler::castFrom(mDescramblerBase); - ASSERT_NE(descrambler, nullptr); + sp<IDescrambler> descrambler; + descrambler = IDescrambler::castFrom(mDescramblerBase); + ASSERT_NE(descrambler, nullptr); - Status descrambleStatus = Status::OK; - sp<IMemory> dataMemory; + Status descrambleStatus = Status::OK; + sp<IMemory> dataMemory; - ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &dataMemory)); - EXPECT_EQ(Status::OK, descrambleStatus); + ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &dataMemory)); + EXPECT_EQ(Status::OK, descrambleStatus); - ASSERT_NE(nullptr, dataMemory.get()); - uint8_t* opBuffer = static_cast<uint8_t*>(static_cast<void*>(dataMemory->unsecurePointer())); + ASSERT_NE(nullptr, dataMemory.get()); + 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)); - EXPECT_EQ(0, compareResult); + int compareResult = + 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 = mDescramblerBase->release(); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); + } returnStatus = mMediaCas->release(); EXPECT_TRUE(returnStatus.isOk()); @@ -549,6 +571,7 @@ TEST_P(MediaCasHidlTest, TestClearKeyApisWithSession) { } // anonymous namespace +GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(MediaCasHidlTest); INSTANTIATE_TEST_SUITE_P( PerInstance, MediaCasHidlTest, testing::ValuesIn(android::hardware::getAllHalInstanceNames(IMediaCasService::descriptor)), diff --git a/cas/1.2/default/Android.bp b/cas/1.2/default/Android.bp index f4d68ed675..38561fd3e7 100644 --- a/cas/1.2/default/Android.bp +++ b/cas/1.2/default/Android.bp @@ -21,6 +21,8 @@ cc_defaults { "TypeConvert.cpp", ], + compile_multilib: "prefer32", + shared_libs: [ "android.hardware.cas@1.0", "android.hardware.cas@1.1", diff --git a/cas/1.2/default/FactoryLoader.h b/cas/1.2/default/FactoryLoader.h index 7403f86ac9..a374b31891 100644 --- a/cas/1.2/default/FactoryLoader.h +++ b/cas/1.2/default/FactoryLoader.h @@ -85,7 +85,11 @@ bool FactoryLoader<T>::findFactoryForScheme(int32_t CA_system_id, sp<SharedLibra } // no luck, have to search +#ifdef __LP64__ + String8 dirPath("/vendor/lib64/mediacas"); +#else String8 dirPath("/vendor/lib/mediacas"); +#endif DIR* pDir = opendir(dirPath.string()); if (pDir == NULL) { @@ -118,7 +122,11 @@ bool FactoryLoader<T>::enumeratePlugins(vector<HidlCasPluginDescriptor>* results results->clear(); +#ifdef __LP64__ + String8 dirPath("/vendor/lib64/mediacas"); +#else String8 dirPath("/vendor/lib/mediacas"); +#endif DIR* pDir = opendir(dirPath.string()); if (pDir == NULL) { diff --git a/cas/1.2/vts/functional/VtsHalCasV1_2TargetTest.cpp b/cas/1.2/vts/functional/VtsHalCasV1_2TargetTest.cpp index 58e0f2e0a8..0d75f5b812 100644 --- a/cas/1.2/vts/functional/VtsHalCasV1_2TargetTest.cpp +++ b/cas/1.2/vts/functional/VtsHalCasV1_2TargetTest.cpp @@ -335,12 +335,15 @@ class MediaCasHidlTest : public testing::TestWithParam<std::string> { ::testing::AssertionResult MediaCasHidlTest::createCasPlugin(int32_t caSystemId) { auto status = mService->isSystemIdSupported(caSystemId); + bool skipDescrambler = false; if (!status.isOk() || !status) { return ::testing::AssertionFailure(); } status = mService->isDescramblerSupported(caSystemId); if (!status.isOk() || !status) { - return ::testing::AssertionFailure(); + ALOGI("Skip Descrambler test since it's not required in cas@1.2."); + mDescramblerBase = nullptr; + skipDescrambler = true; } mCasListener = new MediaCasListener(); @@ -353,10 +356,15 @@ class MediaCasHidlTest : public testing::TestWithParam<std::string> { return ::testing::AssertionFailure(); } + if (skipDescrambler) { + return ::testing::AssertionSuccess(); + } + auto descramblerStatus = mService->createDescrambler(caSystemId); if (!descramblerStatus.isOk()) { return ::testing::AssertionFailure(); } + mDescramblerBase = descramblerStatus; return ::testing::AssertionResult(mDescramblerBase != nullptr); } @@ -512,14 +520,15 @@ TEST_P(MediaCasHidlTest, TestClearKeyApisWithSession) { EXPECT_TRUE(returnStatus.isOk()); EXPECT_EQ(Status::OK, returnStatus); - returnStatus = mDescramblerBase->setMediaCasSession(sessionId); - EXPECT_TRUE(returnStatus.isOk()); - EXPECT_EQ(Status::OK, returnStatus); - - returnStatus = mDescramblerBase->setMediaCasSession(streamSessionId); - EXPECT_TRUE(returnStatus.isOk()); - EXPECT_EQ(Status::OK, returnStatus); + if (mDescramblerBase != nullptr) { + returnStatus = mDescramblerBase->setMediaCasSession(sessionId); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); + 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,29 +575,31 @@ TEST_P(MediaCasHidlTest, TestClearKeyApisWithSession) { EXPECT_TRUE(returnStatus.isOk()); EXPECT_EQ(Status::OK, returnStatus); - EXPECT_FALSE(mDescramblerBase->requiresSecureDecoderComponent("video/avc")); + if (mDescramblerBase != nullptr) { + EXPECT_FALSE(mDescramblerBase->requiresSecureDecoderComponent("video/avc")); - sp<IDescrambler> descrambler; - descrambler = IDescrambler::castFrom(mDescramblerBase); - ASSERT_NE(descrambler, nullptr); + sp<IDescrambler> descrambler; + descrambler = IDescrambler::castFrom(mDescramblerBase); + ASSERT_NE(descrambler, nullptr); - Status descrambleStatus = Status::OK; - sp<IMemory> dataMemory; + Status descrambleStatus = Status::OK; + sp<IMemory> dataMemory; - ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &dataMemory)); - EXPECT_EQ(Status::OK, descrambleStatus); + ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &dataMemory)); + EXPECT_EQ(Status::OK, descrambleStatus); - ASSERT_NE(nullptr, dataMemory.get()); - uint8_t* opBuffer = static_cast<uint8_t*>(static_cast<void*>(dataMemory->unsecurePointer())); + ASSERT_NE(nullptr, dataMemory.get()); + 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)); - EXPECT_EQ(0, compareResult); + int compareResult = + 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 = mDescramblerBase->release(); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); + } returnStatus = mMediaCas->release(); EXPECT_TRUE(returnStatus.isOk()); @@ -597,6 +608,7 @@ TEST_P(MediaCasHidlTest, TestClearKeyApisWithSession) { } // anonymous namespace +GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(MediaCasHidlTest); INSTANTIATE_TEST_SUITE_P( PerInstance, MediaCasHidlTest, testing::ValuesIn(android::hardware::getAllHalInstanceNames(IMediaCasService::descriptor)), |