/* * Copyright 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include #include "DemuxTests.h" #include "DescramblerTests.h" #include "DvrTests.h" #include "FrontendTests.h" #include "LnbTests.h" using android::sp; namespace { bool initConfiguration() { std::array variant; property_get("ro.vendor.vts_tuner_configuration_variant", variant.data(), ""); string variantString = variant.data(); string configFilePath = "/vendor/etc/tuner_vts_config_aidl_V1"; if (variantString.length() != 0) { configFilePath = configFilePath + "." + variantString; } configFilePath = configFilePath + ".xml"; TunerTestingConfigAidlReader1_0::setConfigFilePath(configFilePath); if (!TunerTestingConfigAidlReader1_0::checkConfigFileExists()) { return false; } initFrontendConfig(); initFilterConfig(); initDvrConfig(); initTimeFilterConfig(); initDescramblerConfig(); initLnbConfig(); initDiseqcMsgsConfig(); connectHardwaresToTestCases(); if (!validateConnections()) { ALOGW("[vts] failed to validate connections."); return false; } determineDataFlows(); return true; } static AssertionResult success() { return ::testing::AssertionSuccess(); } AssertionResult filterDataOutputTestBase(FilterTests& tests) { // Data Verify Module std::map>::iterator it; std::map> filterCallbacks = tests.getFilterCallbacks(); for (it = filterCallbacks.begin(); it != filterCallbacks.end(); it++) { it->second->testFilterDataOutput(); } return success(); } void clearIds() { lnbIds.clear(); diseqcMsgs.clear(); frontendIds.clear(); ipFilterIds.clear(); pcrFilterIds.clear(); recordDvrIds.clear(); timeFilterIds.clear(); descramblerIds.clear(); audioFilterIds.clear(); videoFilterIds.clear(); playbackDvrIds.clear(); recordFilterIds.clear(); sectionFilterIds.clear(); } enum class Dataflow_Context { LNBRECORD, RECORD, DESCRAMBLING, LNBDESCRAMBLING }; class TunerLnbAidlTest : public testing::TestWithParam { public: virtual void SetUp() override { if (AServiceManager_isDeclared(GetParam().c_str())) { ::ndk::SpAIBinder binder(AServiceManager_waitForService(GetParam().c_str())); mService = ITuner::fromBinder(binder); } else { mService = nullptr; } ASSERT_NE(mService, nullptr); ASSERT_TRUE(initConfiguration()); mLnbTests.setService(mService); } virtual void TearDown() override { clearIds(); mService = nullptr; } protected: static void description(const std::string& description) { RecordProperty("description", description); } std::shared_ptr mService; LnbTests mLnbTests; }; GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TunerLnbAidlTest); class TunerDemuxAidlTest : public testing::TestWithParam { public: virtual void SetUp() override { if (AServiceManager_isDeclared(GetParam().c_str())) { ::ndk::SpAIBinder binder(AServiceManager_waitForService(GetParam().c_str())); mService = ITuner::fromBinder(binder); } else { mService = nullptr; } ASSERT_NE(mService, nullptr); ASSERT_TRUE(initConfiguration()); mFrontendTests.setService(mService); mDemuxTests.setService(mService); mFilterTests.setService(mService); } virtual void TearDown() override { clearIds(); mService = nullptr; } protected: static void description(const std::string& description) { RecordProperty("description", description); } std::shared_ptr mService; FrontendTests mFrontendTests; DemuxTests mDemuxTests; FilterTests mFilterTests; }; GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TunerDemuxAidlTest); class TunerFilterAidlTest : public testing::TestWithParam { public: virtual void SetUp() override { if (AServiceManager_isDeclared(GetParam().c_str())) { ::ndk::SpAIBinder binder(AServiceManager_waitForService(GetParam().c_str())); mService = ITuner::fromBinder(binder); } else { mService = nullptr; } ASSERT_NE(mService, nullptr); ASSERT_TRUE(initConfiguration()); mFrontendTests.setService(mService); mDemuxTests.setService(mService); mFilterTests.setService(mService); } virtual void TearDown() override { clearIds(); mService = nullptr; } protected: static void description(const std::string& description) { RecordProperty("description", description); } void configSingleFilterInDemuxTest(FilterConfig filterConf, FrontendConfig frontendConf); void reconfigSingleFilterInDemuxTest(FilterConfig filterConf, FilterConfig filterReconf, FrontendConfig frontendConf); void testTimeFilter(TimeFilterConfig filterConf); void testDelayHint(const FilterConfig& filterConf); DemuxFilterType getLinkageFilterType(int bit) { DemuxFilterType type; type.mainType = static_cast(1 << bit); switch (type.mainType) { case DemuxFilterMainType::TS: type.subType.set( DemuxTsFilterType::UNDEFINED); break; case DemuxFilterMainType::MMTP: type.subType.set( DemuxMmtpFilterType::UNDEFINED); break; case DemuxFilterMainType::IP: type.subType.set( DemuxIpFilterType::UNDEFINED); break; case DemuxFilterMainType::TLV: type.subType.set( DemuxTlvFilterType::UNDEFINED); break; case DemuxFilterMainType::ALP: type.subType.set( DemuxAlpFilterType::UNDEFINED); break; default: break; } return type; } std::shared_ptr mService; FrontendTests mFrontendTests; DemuxTests mDemuxTests; FilterTests mFilterTests; }; GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TunerFilterAidlTest); class TunerPlaybackAidlTest : public testing::TestWithParam { public: virtual void SetUp() override { if (AServiceManager_isDeclared(GetParam().c_str())) { ::ndk::SpAIBinder binder(AServiceManager_waitForService(GetParam().c_str())); mService = ITuner::fromBinder(binder); } else { mService = nullptr; } ASSERT_NE(mService, nullptr); ASSERT_TRUE(initConfiguration()); mFrontendTests.setService(mService); mDemuxTests.setService(mService); mFilterTests.setService(mService); mDvrTests.setService(mService); } virtual void TearDown() override { clearIds(); mService = nullptr; } protected: static void description(const std::string& description) { RecordProperty("description", description); } std::shared_ptr mService; FrontendTests mFrontendTests; DemuxTests mDemuxTests; FilterTests mFilterTests; DvrTests mDvrTests; AssertionResult filterDataOutputTest(); void playbackSingleFilterTest(FilterConfig filterConf, DvrConfig dvrConf); void setStatusCheckIntervalHintTest(int64_t milliseconds, DvrConfig dvrConf); }; GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TunerPlaybackAidlTest); class TunerRecordAidlTest : public testing::TestWithParam { public: virtual void SetUp() override { if (AServiceManager_isDeclared(GetParam().c_str())) { ::ndk::SpAIBinder binder(AServiceManager_waitForService(GetParam().c_str())); mService = ITuner::fromBinder(binder); } else { mService = nullptr; } ASSERT_NE(mService, nullptr); ASSERT_TRUE(initConfiguration()); mFrontendTests.setService(mService); mDemuxTests.setService(mService); mFilterTests.setService(mService); mDvrTests.setService(mService); mLnbTests.setService(mService); } virtual void TearDown() override { clearIds(); mService = nullptr; } protected: static void description(const std::string& description) { RecordProperty("description", description); } void attachSingleFilterToRecordDvrTest(FilterConfig filterConf, FrontendConfig frontendConf, DvrConfig dvrConf); void recordSingleFilterTestWithLnb(FilterConfig filterConf, FrontendConfig frontendConf, DvrConfig dvrConf, LnbConfig lnbConf); void recordSingleFilterTest(FilterConfig filterConf, FrontendConfig frontendConf, DvrConfig dvrConf, Dataflow_Context context); void setStatusCheckIntervalHintTest(int64_t milliseconds, FrontendConfig frontendConf, DvrConfig dvrConf); std::shared_ptr mService; FrontendTests mFrontendTests; DemuxTests mDemuxTests; FilterTests mFilterTests; DvrTests mDvrTests; LnbTests mLnbTests; private: int32_t mLnbId = INVALID_LNB_ID; }; GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TunerRecordAidlTest); class TunerFrontendAidlTest : public testing::TestWithParam { public: virtual void SetUp() override { if (AServiceManager_isDeclared(GetParam().c_str())) { ::ndk::SpAIBinder binder(AServiceManager_waitForService(GetParam().c_str())); mService = ITuner::fromBinder(binder); } else { mService = nullptr; } ASSERT_NE(mService, nullptr); ASSERT_TRUE(initConfiguration()); mFrontendTests.setService(mService); } virtual void TearDown() override { clearIds(); mService = nullptr; } protected: static void description(const std::string& description) { RecordProperty("description", description); } std::shared_ptr mService; FrontendTests mFrontendTests; }; GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TunerFrontendAidlTest); class TunerBroadcastAidlTest : public testing::TestWithParam { public: virtual void SetUp() override { if (AServiceManager_isDeclared(GetParam().c_str())) { ::ndk::SpAIBinder binder(AServiceManager_waitForService(GetParam().c_str())); mService = ITuner::fromBinder(binder); } else { mService = nullptr; } ASSERT_NE(mService, nullptr); ASSERT_TRUE(initConfiguration()); mFrontendTests.setService(mService); mDemuxTests.setService(mService); mFilterTests.setService(mService); mLnbTests.setService(mService); mDvrTests.setService(mService); } virtual void TearDown() override { clearIds(); mService = nullptr; } protected: static void description(const std::string& description) { RecordProperty("description", description); } std::shared_ptr mService; FrontendTests mFrontendTests; DemuxTests mDemuxTests; FilterTests mFilterTests; LnbTests mLnbTests; DvrTests mDvrTests; AssertionResult filterDataOutputTest(); void broadcastSingleFilterTest(FilterConfig filterConf, FrontendConfig frontendConf); void broadcastSingleFilterTestWithLnb(FilterConfig filterConf, FrontendConfig frontendConf, LnbConfig lnbConf); void mediaFilterUsingSharedMemoryTest(FilterConfig filterConf, FrontendConfig frontendConf); private: int32_t mLnbId = INVALID_LNB_ID; }; GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TunerBroadcastAidlTest); class TunerDescramblerAidlTest : public testing::TestWithParam { public: virtual void SetUp() override { if (AServiceManager_isDeclared(GetParam().c_str())) { ::ndk::SpAIBinder binder(AServiceManager_waitForService(GetParam().c_str())); mService = ITuner::fromBinder(binder); } else { mService = nullptr; } ASSERT_NE(mService, 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); if (mCasServiceAidl != nullptr) { mDescramblerTests.setCasServiceAidl(mCasServiceAidl); } else { mDescramblerTests.setCasServiceHidl(mCasServiceHidl); } mLnbTests.setService(mService); } virtual void TearDown() override { clearIds(); mService = nullptr; } protected: static void description(const std::string& description) { RecordProperty("description", description); } void scrambledBroadcastTest(set mediaFilterConfs, FrontendConfig frontendConf, DescramblerConfig descConfig, Dataflow_Context context); void scrambledBroadcastTestWithLnb(set& mediaFilterConfs, FrontendConfig& frontendConf, DescramblerConfig& descConfig, LnbConfig& lnbConfig); AssertionResult filterDataOutputTest(); std::shared_ptr mService; sp mCasServiceHidl; std::shared_ptr mCasServiceAidl; FrontendTests mFrontendTests; DemuxTests mDemuxTests; FilterTests mFilterTests; DescramblerTests mDescramblerTests; DvrTests mDvrTests; LnbTests mLnbTests; private: int32_t mLnbId = INVALID_LNB_ID; }; GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TunerDescramblerAidlTest); } // namespace