From d4a66cb3d076a3dfeac3d2e9b0779fc3ccfa27a7 Mon Sep 17 00:00:00 2001 From: Yixiao Luo Date: Wed, 1 Feb 2023 18:39:51 -0800 Subject: [PATCH] Add CAS AIDL/HIDL support for Tuner Descrambler Tests Bug: 266968335 Test: VtsHalTvTunerTargetTest Change-Id: I55074360587735256c4f0efa8228d28f57b21592 Merged-In: I55074360587735256c4f0efa8228d28f57b21592 --- tv/tuner/aidl/vts/OWNERS | 2 + tv/tuner/aidl/vts/functional/Android.bp | 1 + .../aidl/vts/functional/DescramblerTests.cpp | 128 ++++++++++++------ .../aidl/vts/functional/DescramblerTests.h | 59 ++++++-- .../vts/functional/VtsHalTvTunerTargetTest.h | 24 +++- 5 files changed, 156 insertions(+), 58 deletions(-) diff --git a/tv/tuner/aidl/vts/OWNERS b/tv/tuner/aidl/vts/OWNERS index bf2b609f3e..5b33bf2a5d 100644 --- a/tv/tuner/aidl/vts/OWNERS +++ b/tv/tuner/aidl/vts/OWNERS @@ -1,3 +1,5 @@ +# Bug component: 136752 + hgchen@google.com shubang@google.com quxiangfang@google.com diff --git a/tv/tuner/aidl/vts/functional/Android.bp b/tv/tuner/aidl/vts/functional/Android.bp index e5fb1e6b22..5f042936fc 100644 --- a/tv/tuner/aidl/vts/functional/Android.bp +++ b/tv/tuner/aidl/vts/functional/Android.bp @@ -51,6 +51,7 @@ cc_test { "android.hardware.cas@1.0", "android.hardware.cas@1.1", "android.hardware.cas@1.2", + "android.hardware.cas-V1-ndk", "android.hardware.common-V2-ndk", "android.hardware.common.fmq-V1-ndk", "android.hardware.tv.tuner-V1-ndk", diff --git a/tv/tuner/aidl/vts/functional/DescramblerTests.cpp b/tv/tuner/aidl/vts/functional/DescramblerTests.cpp index 157fa0479e..f4855c2a5a 100644 --- a/tv/tuner/aidl/vts/functional/DescramblerTests.cpp +++ b/tv/tuner/aidl/vts/functional/DescramblerTests.cpp @@ -19,71 +19,115 @@ using namespace std; AssertionResult DescramblerTests::createCasPlugin(int32_t caSystemId) { - auto status = mMediaCasService->isSystemIdSupported(caSystemId); - if (!status.isOk() || !status) { - ALOGW("[vts] Failed to check isSystemIdSupported."); - return failure(); + mCasListener = ::ndk::SharedRefBase::make(); + + if (mMediaCasServiceAidl != nullptr) { + bool rst = false; + ScopedAStatus status = mMediaCasServiceAidl->isSystemIdSupported(caSystemId, &rst); + if (!status.isOk() || !rst) { + ALOGW("[vts] Failed to check isSystemIdSupported for AIDL service."); + return failure(); + } + status = mMediaCasServiceAidl->createPlugin(caSystemId, mCasListener, &mCasAidl); + if (!status.isOk()) { + ALOGW("[vts] Failed to createPlugin for AIDL service."); + return failure(); + } + } else { + auto status = mMediaCasServiceHidl->isSystemIdSupported(caSystemId); + if (!status.isOk() || !status) { + ALOGW("[vts] Failed to check isSystemIdSupported for HIDL service."); + return failure(); + } + auto pluginStatus = mMediaCasServiceHidl->createPluginExt( + caSystemId, sp(mCasListener.get())); + if (!pluginStatus.isOk()) { + ALOGW("[vts] Failed to createPluginExt for HIDL service."); + return failure(); + } + mCasHidl = ICasHidl::castFrom(pluginStatus); + if (mCasHidl == nullptr) { + ALOGW("[vts] Failed to get ICas for HIDL service."); + return failure(); + } } - mCasListener = new MediaCasListener(); - auto pluginStatus = mMediaCasService->createPluginExt(caSystemId, mCasListener); - if (!pluginStatus.isOk()) { - ALOGW("[vts] Failed to createPluginExt."); - return failure(); - } - mCas = ICas::castFrom(pluginStatus); - if (mCas == nullptr) { - ALOGW("[vts] Failed to get ICas."); - return failure(); - } return success(); } AssertionResult DescramblerTests::openCasSession(vector& sessionId, - vector& hidlPvtData) { - Status sessionStatus; - SessionIntent intent = SessionIntent::LIVE; - ScramblingMode mode = ScramblingMode::RESERVED; - auto returnVoid = - mCas->openSession_1_2(intent, mode, [&](Status status, const hidl_vec& id) { - sessionStatus = status; - sessionId = id; - }); - if (!returnVoid.isOk() || (sessionStatus != Status::OK)) { - ALOGW("[vts] Failed to open cas session."); - mCas->closeSession(sessionId); - return failure(); - } - - if (hidlPvtData.size() > 0) { - auto status = mCas->setSessionPrivateData(sessionId, hidlPvtData); - if (status != android::hardware::cas::V1_0::Status::OK) { - ALOGW("[vts] Failed to set session private data"); - mCas->closeSession(sessionId); + vector& pvtData) { + if (mMediaCasServiceAidl != nullptr) { + SessionIntentAidl intent = SessionIntentAidl::LIVE; + ScramblingModeAidl mode = ScramblingModeAidl::RESERVED; + std::vector sessionId; + ScopedAStatus status = mCasAidl->openSession(intent, mode, &sessionId); + if (!status.isOk()) { + ALOGW("[vts] Failed to open cas session for AIDL service."); + mCasAidl->closeSession(sessionId); return failure(); } + + if (pvtData.size() > 0) { + ScopedAStatus status = mCasAidl->setSessionPrivateData(sessionId, pvtData); + if (!status.isOk()) { + ALOGW("[vts] Failed to set session private data for AIDL service."); + mCasAidl->closeSession(sessionId); + return failure(); + } + } + } else { + Status sessionStatus; + SessionIntentHidl intent = SessionIntentHidl::LIVE; + ScramblingModeHidl mode = ScramblingModeHidl::RESERVED; + auto returnVoid = mCasHidl->openSession_1_2( + intent, mode, [&](Status status, const hidl_vec& id) { + sessionStatus = status; + sessionId = id; + }); + if (!returnVoid.isOk() || (sessionStatus != Status::OK)) { + ALOGW("[vts] Failed to open cas session for HIDL service."); + mCasHidl->closeSession(sessionId); + return failure(); + } + + if (pvtData.size() > 0) { + auto status = mCasHidl->setSessionPrivateData(sessionId, pvtData); + if (status != android::hardware::cas::V1_0::Status::OK) { + ALOGW("[vts] Failed to set session private data for HIDL service."); + mCasHidl->closeSession(sessionId); + return failure(); + } + } } return success(); } AssertionResult DescramblerTests::getKeyToken(int32_t caSystemId, string& provisonStr, - vector& hidlPvtData, - vector& token) { + vector& pvtData, vector& token) { if (createCasPlugin(caSystemId) != success()) { ALOGW("[vts] createCasPlugin failed."); return failure(); } if (provisonStr.size() > 0) { - auto returnStatus = mCas->provision(hidl_string(provisonStr)); - if (returnStatus != android::hardware::cas::V1_0::Status::OK) { - ALOGW("[vts] provision failed."); - return failure(); + if (mMediaCasServiceAidl != nullptr) { + ScopedAStatus status = mCasAidl->provision(provisonStr); + if (!status.isOk()) { + ALOGW("[vts] provision failed for AIDL service."); + return failure(); + } + } else { + auto returnStatus = mCasHidl->provision(hidl_string(provisonStr)); + if (returnStatus != android::hardware::cas::V1_0::Status::OK) { + ALOGW("[vts] provision failed for HIDL service."); + return failure(); + } } } - return openCasSession(token, hidlPvtData); + return openCasSession(token, pvtData); } AssertionResult DescramblerTests::openDescrambler(int32_t demuxId) { diff --git a/tv/tuner/aidl/vts/functional/DescramblerTests.h b/tv/tuner/aidl/vts/functional/DescramblerTests.h index f0b769141a..bab1a88f09 100644 --- a/tv/tuner/aidl/vts/functional/DescramblerTests.h +++ b/tv/tuner/aidl/vts/functional/DescramblerTests.h @@ -30,11 +30,17 @@ #include #include +#include +#include +#include +#include +#include #include #include #include #include +using ::aidl::android::hardware::cas::BnCasListener; using android::Condition; using android::Mutex; using android::sp; @@ -42,19 +48,26 @@ using android::hardware::hidl_string; using android::hardware::hidl_vec; using android::hardware::Return; using android::hardware::Void; -using android::hardware::cas::V1_2::ICas; -using android::hardware::cas::V1_2::ICasListener; -using android::hardware::cas::V1_2::IMediaCasService; -using android::hardware::cas::V1_2::ScramblingMode; -using android::hardware::cas::V1_2::SessionIntent; using android::hardware::cas::V1_2::Status; using android::hardware::cas::V1_2::StatusEvent; +using ICasAidl = ::aidl::android::hardware::cas::ICas; +using ICasHidl = android::hardware::cas::V1_2::ICas; +using ICasListenerHidl = android::hardware::cas::V1_2::ICasListener; +using IMediaCasServiceAidl = ::aidl::android::hardware::cas::IMediaCasService; +using IMediaCasServiceHidl = android::hardware::cas::V1_2::IMediaCasService; +using ScramblingModeAidl = ::aidl::android::hardware::cas::ScramblingMode; +using ScramblingModeHidl = android::hardware::cas::V1_2::ScramblingMode; +using SessionIntentAidl = ::aidl::android::hardware::cas::SessionIntent; +using SessionIntentHidl = android::hardware::cas::V1_2::SessionIntent; +using ::ndk::ScopedAStatus; using ::testing::AssertionResult; using namespace aidl::android::hardware::tv::tuner; -class MediaCasListener : public ICasListener { +const std::string MEDIA_CAS_AIDL_SERVICE_NAME = "android.hardware.cas.IMediaCasService/default"; + +class MediaCasListener : public ICasListenerHidl, public BnCasListener { public: virtual Return onEvent(int32_t /*event*/, int32_t /*arg*/, const hidl_vec& /*data*/) override { @@ -70,12 +83,33 @@ class MediaCasListener : public ICasListener { virtual Return onStatusUpdate(StatusEvent /*event*/, int32_t /*arg*/) override { return Void(); } + + ScopedAStatus onEvent(int32_t /*in_event*/, int32_t /*in_arg*/, + const std::vector& /*in_data*/) override { + return ScopedAStatus::ok(); + } + + ScopedAStatus onSessionEvent(const std::vector& /*in_sessionId*/, int32_t /*in_event*/, + int32_t /*in_arg*/, + const std::vector& /*in_data*/) override { + return ScopedAStatus::ok(); + } + + ScopedAStatus onStatusUpdate(::aidl::android::hardware::cas::StatusEvent /*in_event*/, + int32_t /*in_number*/) override { + return ScopedAStatus::ok(); + } }; class DescramblerTests { public: void setService(std::shared_ptr tuner) { mService = tuner; } - void setCasService(sp casService) { mMediaCasService = casService; } + void setCasServiceHidl(sp casService) { + mMediaCasServiceHidl = casService; + } + void setCasServiceAidl(std::shared_ptr casService) { + mMediaCasServiceAidl = casService; + } AssertionResult setKeyToken(std::vector& token); AssertionResult openDescrambler(int32_t demuxId); @@ -95,12 +129,13 @@ class DescramblerTests { std::shared_ptr mService; std::shared_ptr mDescrambler; - android::sp mCas; - android::sp mMediaCasService; - android::sp mCasListener; + std::shared_ptr mCasAidl; + android::sp mCasHidl; + std::shared_ptr mMediaCasServiceAidl; + android::sp mMediaCasServiceHidl; + std::shared_ptr mCasListener; private: - AssertionResult openCasSession(std::vector& sessionId, - std::vector& hidlPvtData); + AssertionResult openCasSession(std::vector& sessionId, std::vector& pvtData); AssertionResult createCasPlugin(int32_t caSystemId); }; diff --git a/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.h b/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.h index 7f80d90c82..73dc797b36 100644 --- a/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.h +++ b/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.h @@ -338,16 +338,31 @@ class TunerDescramblerAidlTest : public testing::TestWithParam { } else { mService = nullptr; } - mCasService = IMediaCasService::getService(); ASSERT_NE(mService, nullptr); - ASSERT_NE(mCasService, nullptr); + + // Get IMediaCasService. Try getting AIDL service first, if AIDL does not exist, try HIDL. + if (AServiceManager_isDeclared(MEDIA_CAS_AIDL_SERVICE_NAME.c_str())) { + ::ndk::SpAIBinder binder( + AServiceManager_waitForService(MEDIA_CAS_AIDL_SERVICE_NAME.c_str())); + mCasServiceAidl = IMediaCasServiceAidl::fromBinder(binder); + } else { + mCasServiceAidl = nullptr; + } + if (mCasServiceAidl == nullptr) { + mCasServiceHidl = IMediaCasServiceHidl::getService(); + } + ASSERT_TRUE(mCasServiceAidl != nullptr || mCasServiceHidl != nullptr); ASSERT_TRUE(initConfiguration()); mFrontendTests.setService(mService); mDemuxTests.setService(mService); mDvrTests.setService(mService); mDescramblerTests.setService(mService); - mDescramblerTests.setCasService(mCasService); + if (mCasServiceAidl != nullptr) { + mDescramblerTests.setCasServiceAidl(mCasServiceAidl); + } else { + mDescramblerTests.setCasServiceHidl(mCasServiceHidl); + } } protected: @@ -360,7 +375,8 @@ class TunerDescramblerAidlTest : public testing::TestWithParam { AssertionResult filterDataOutputTest(); std::shared_ptr mService; - android::sp mCasService; + sp mCasServiceHidl; + std::shared_ptr mCasServiceAidl; FrontendTests mFrontendTests; DemuxTests mDemuxTests; FilterTests mFilterTests;