diff --git a/AVOutput/AVOutputTV.cpp b/AVOutput/AVOutputTV.cpp index e95b81e7..3f0e8e59 100644 --- a/AVOutput/AVOutputTV.cpp +++ b/AVOutput/AVOutputTV.cpp @@ -2203,14 +2203,17 @@ namespace Plugin { uint32_t AVOutputTV::getSupportedDolbyVisionModes(const JsonObject& parameters, JsonObject& response) { LOGINFO("Entry\n"); - tvDolbyMode_t dvModes[tvMode_Max]; - tvDolbyMode_t *dvModesPtr = dvModes; // Pointer to statically allocated tvDolbyMode_t array + tvDolbyMode_t dvModes[tvMode_Max] = { tvDolbyMode_Invalid }; + tvDolbyMode_t *dvModesPtr[tvMode_Max] = { 0 }; unsigned short totalAvailable = 0; - + for (int i = 0; i < tvMode_Max; i++) + { + dvModesPtr[i] = &dvModes[i]; + } // Set an initial value to indicate the mode type dvModes[0] = tvDolbyMode_Dark; - tvError_t ret = GetTVSupportedDolbyVisionModes(&dvModesPtr, &totalAvailable); + tvError_t ret = GetTVSupportedDolbyVisionModes(dvModesPtr, &totalAvailable); if(ret != tvERROR_NONE) { returnResponse(false); } @@ -2423,9 +2426,14 @@ namespace Plugin { uint32_t AVOutputTV::getSupportedPictureModes(const JsonObject& parameters, JsonObject& response) { LOGINFO("Entry\n"); - pic_modes_t *pictureModes; + pic_modes_t pictureModes[PIC_MODES_SUPPORTED_MAX]; + pic_modes_t *pictureModesPtr[PIC_MODES_SUPPORTED_MAX]={0}; unsigned short totalAvailable = 0; - tvError_t ret = GetTVSupportedPictureModes(&pictureModes,&totalAvailable); + for (int i = 0; i < PIC_MODES_SUPPORTED_MAX; i++) + { + pictureModesPtr[i] = &pictureModes[i]; + } + tvError_t ret = GetTVSupportedPictureModes(pictureModesPtr,&totalAvailable); if(ret != tvERROR_NONE) { returnResponse(false); } diff --git a/AVOutput/AVOutputTV.h b/AVOutput/AVOutputTV.h index 5e493068..612aebf8 100644 --- a/AVOutput/AVOutputTV.h +++ b/AVOutput/AVOutputTV.h @@ -27,7 +27,6 @@ #include "tvTypes.h" #include "tvSettings.h" -#include "tvSettingsExtODM.h" #include #include "Module.h" #include "tvError.h" @@ -270,7 +269,6 @@ class AVOutputTV : public AVOutputBase { private: - tvContentFormatType_t getContentFormatIndex(tvVideoHDRFormat_t formatToConvert); int getPictureModeIndex(std::string pqmode); int getSourceIndex(std::string source); int getFormatIndex(std::string format); @@ -308,7 +306,6 @@ class AVOutputTV : public AVOutputBase { string convertSourceIndexToString(int source); string convertVideoFormatToString(int format); string convertPictureIndexToString(int pqmode); - tvContentFormatType_t convertFormatStringToTVContentFormat(const char *format); //std::string convertSourceIndexToString(int sourceIndex); //std::string convertVideoFormatToString( int formatIndex ); void convertUserScaleBacklightToDriverScale(int format,int * params); @@ -340,10 +337,8 @@ class AVOutputTV : public AVOutputBase { int getLocalparam( std::string forParam,paramIndex_t indexInfo,int & value,tvPQParameterIndex_t pqParamIndex,bool sync=false); tvDataComponentColor_t getComponentColorEnum(std::string colorName); - int getDolbyParams(tvContentFormatType_t format, std::string &s, std::string source = ""); tvError_t getParamsCaps(std::string param, capVectors_t &vecInfo); int GetPanelID(char *panelid); - int ConvertHDRFormatToContentFormat(tvhdr_type_t hdrFormat); int ReadCapablitiesFromConf(std::string param, capDetails_t& info); void getDimmingModeStringFromEnum(int value, std::string &toStore); void getColorTempStringFromEnum(int value, std::string &toStore); diff --git a/AVOutput/AVOutputTVHelper.cpp b/AVOutput/AVOutputTVHelper.cpp index cc401a7a..527569a9 100644 --- a/AVOutput/AVOutputTVHelper.cpp +++ b/AVOutput/AVOutputTVHelper.cpp @@ -32,36 +32,6 @@ static bool m_isDalsEnabled = false; namespace WPEFramework { namespace Plugin { - tvContentFormatType_t AVOutputTV::getContentFormatIndex(tvVideoHDRFormat_t formatToConvert) - { - /* default to SDR always*/ - tvContentFormatType_t ret = tvContentFormatType_NONE; - switch(formatToConvert) { - case tvVideoHDRFormat_HLG: - ret = tvContentFormatType_HLG; - break; - - case tvVideoHDRFormat_HDR10: - ret = tvContentFormatType_HDR10; - break; - - case tvVideoHDRFormat_HDR10PLUS: - ret = tvContentFormatType_HDR10PLUS; - break; - - case tvVideoHDRFormat_DV: - ret = tvContentFormatType_DOVI; - break; - - case tvVideoHDRFormat_SDR: - case tvVideoHDRFormat_NONE: - default: - ret = tvContentFormatType_SDR; - break; - } - return ret; - } - int AVOutputTV::getPictureModeIndex(std::string pqparam) { int index = -1; @@ -265,14 +235,19 @@ namespace Plugin { int AVOutputTV::getDolbyModeIndex(const char * dolbyMode) { int mode = 0; - tvDolbyMode_t dolbyModes[tvMode_Max]; - tvDolbyMode_t *dolbyModesPtr = dolbyModes; // Pointer to statically allocated tvDolbyMode_t array + tvDolbyMode_t dolbyModes[tvMode_Max] = { tvDolbyMode_Invalid }; + tvDolbyMode_t *dolbyModesPtr[tvMode_Max] = { 0 }; unsigned short totalAvailable = 0; + for (int i = 0; i < tvMode_Max; i++) + { + dolbyModesPtr[i] = &dolbyModes[i]; + } + // Set an initial value to indicate the mode type dolbyModes[0] = tvDolbyMode_Dark; - tvError_t ret = GetTVSupportedDolbyVisionModes(&dolbyModesPtr, &totalAvailable); + tvError_t ret = GetTVSupportedDolbyVisionModes(dolbyModesPtr, &totalAvailable); if (ret == tvERROR_NONE) { for (int count = 0; count < totalAvailable; count++) { if(strncasecmp(dolbyMode, getDolbyModeStringFromEnum(dolbyModes[count]).c_str(), strlen(dolbyMode))==0) { @@ -925,26 +900,6 @@ namespace Plugin { return ret; } - tvContentFormatType_t AVOutputTV::convertFormatStringToTVContentFormat(const char *format) - { - tvContentFormatType_t ret = tvContentFormatType_SDR; - - if( strncmp(format,"sdr",strlen(format)) == 0 || strncmp(format,"SDR",strlen(format)) == 0 ) { - ret = tvContentFormatType_SDR; - } - else if( strncmp(format,"hdr10",strlen(format)) == 0 || strncmp(format,"HDR10",strlen(format))==0 ) { - ret = tvContentFormatType_HDR10; - } - else if( strncmp(format,"hlg",strlen(format)) == 0 || strncmp(format,"HLG",strlen(format)) == 0 ) { - ret = tvContentFormatType_HLG; - } - else if( strncmp(format,"dolby",strlen(format)) == 0 || strncmp(format,"DOLBY",strlen(format)) == 0 ) { - ret=tvContentFormatType_DOVI; - } - - return ret; - } - tvError_t AVOutputTV::updateAVoutputTVParamToHAL(std::string forParam, paramIndex_t indexInfo, int value,bool setNotDelete) { tvError_t ret = tvERROR_NONE; @@ -1654,32 +1609,6 @@ namespace Plugin { return 0; } - int AVOutputTV::ConvertHDRFormatToContentFormat(tvhdr_type_t hdrFormat) - { - int ret=tvContentFormatType_SDR; - switch(hdrFormat) - { - case HDR_TYPE_SDR: - ret=tvContentFormatType_SDR; - break; - case HDR_TYPE_HDR10: - ret=tvContentFormatType_HDR10; - break; - case HDR_TYPE_HDR10PLUS: - ret=tvContentFormatType_HDR10PLUS; - break; - case HDR_TYPE_DOVI: - ret=tvContentFormatType_DOVI; - break; - case HDR_TYPE_HLG: - ret=tvContentFormatType_HLG; - break; - default: - break; - } - return ret; - } - void AVOutputTV::getDimmingModeStringFromEnum(int value, std::string &toStore) { const char *color_temp_string[] = { diff --git a/AVOutput/CHANGELOG.md b/AVOutput/CHANGELOG.md index a3afa122..e5f68a0f 100644 --- a/AVOutput/CHANGELOG.md +++ b/AVOutput/CHANGELOG.md @@ -14,6 +14,14 @@ All notable changes to this RDK Service will be documented in this file. * Changes in CHANGELOG should be updated when commits are added to the main or release branches. There should be one CHANGELOG entry per JIRA Ticket. This is not enforced on sprint branches since there could be multiple changes for the same JIRA ticket during development. +## [1.1.2] - 2025-07-01 +### Fixed +- Phase2 ODM + +## [1.1.1] - 2025-06-26 +### Fixed +- Fixed dimmingMode failures + ## [1.1.0] - 2025-03-14 ### Added - Add additional features on AVOutput diff --git a/CHANGELOG.md b/CHANGELOG.md index 83faa0b3..6d0c412b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,10 +4,18 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +#### [1.3.2](https://github.com/rdkcentral/entservices-inputoutput/compare/1.3.1...1.3.2) + +- RDKEMW-5510: Integrate the ODM Phase 2 middleware changes into RDKE [`#160`](https://github.com/rdkcentral/entservices-inputoutput/pull/160) +- Merge tag '1.3.1' into develop [`8083548`](https://github.com/rdkcentral/entservices-inputoutput/commit/808354842ca703cbcd49d04ee6ceeca5911d1653) + #### [1.3.1](https://github.com/rdkcentral/entservices-inputoutput/compare/1.3.0...1.3.1) +> 26 June 2025 + - RDKEMW-5512: Implement a fix for the SaveTVDimmingMode failure [`#157`](https://github.com/rdkcentral/entservices-inputoutput/pull/157) - RDKEMW-1015 - Update gtest [`#155`](https://github.com/rdkcentral/entservices-inputoutput/pull/155) +- 1.3.1 release changelog updates [`88527ce`](https://github.com/rdkcentral/entservices-inputoutput/commit/88527cedd22c2ca3d58c8b625ed9f90ba1128066) - Merge tag '1.3.0' into develop [`2499e0b`](https://github.com/rdkcentral/entservices-inputoutput/commit/2499e0b71c2fbb9e9a303a342fbc4965da5b52c9) #### [1.3.0](https://github.com/rdkcentral/entservices-inputoutput/compare/1.2.0...1.3.0) diff --git a/Tests/L1Tests/tests/test_AVInput.cpp b/Tests/L1Tests/tests/test_AVInput.cpp index a82e2d21..0d0be6bd 100644 --- a/Tests/L1Tests/tests/test_AVInput.cpp +++ b/Tests/L1Tests/tests/test_AVInput.cpp @@ -21,7 +21,12 @@ #include "AVInput.h" +#include "CompositeInputMock.h" +#include "FactoriesImplementation.h" #include "HdmiInputMock.h" +#include "HostMock.h" +#include "IarmBusMock.h" +#include "ServiceMock.h" #include "ThunderPortability.h" using namespace WPEFramework; @@ -46,13 +51,27 @@ class AVInputTest : public ::testing::Test { class AVInputDsTest : public AVInputTest { protected: - HdmiInputImplMock *p_hdmiInputImplMock = nullptr ; + HdmiInputImplMock* p_hdmiInputImplMock = nullptr; + CompositeInputImplMock* p_compositeInputImplMock = nullptr; + HostImplMock* p_HostImplMock = nullptr; + IARM_EventHandler_t dsAVGameFeatureStatusEventHandler; + IARM_EventHandler_t dsAVEventHandler; + IARM_EventHandler_t dsAVSignalStatusEventHandler; + IARM_EventHandler_t dsAVStatusEventHandler; + IARM_EventHandler_t dsAVVideoModeEventHandler; + IARM_EventHandler_t dsAviContentTypeEventHandler; AVInputDsTest() : AVInputTest() { p_hdmiInputImplMock = new NiceMock ; device::HdmiInput::setImpl(p_hdmiInputImplMock); + + p_compositeInputImplMock = new NiceMock; + device::CompositeInput::setImpl(p_compositeInputImplMock); + + p_HostImplMock = new NiceMock; + device::Host::setImpl(p_HostImplMock); } virtual ~AVInputDsTest() override { @@ -62,19 +81,1799 @@ class AVInputDsTest : public AVInputTest { delete p_hdmiInputImplMock; p_hdmiInputImplMock = nullptr; } + + device::CompositeInput::setImpl(nullptr); + if (p_compositeInputImplMock != nullptr) { + delete p_compositeInputImplMock; + p_compositeInputImplMock = nullptr; + } + + device::Host::setImpl(nullptr); + if (p_HostImplMock != nullptr) { + delete p_HostImplMock; + p_HostImplMock = nullptr; + } } }; -TEST_F(AVInputTest, RegisteredMethods) +class AVInputInit : public AVInputDsTest { +protected: + IarmBusImplMock* p_iarmBusImplMock = nullptr; + NiceMock factoriesImplementation; + PLUGINHOST_DISPATCHER* dispatcher; + NiceMock service; + Core::JSONRPC::Message message; + + AVInputInit() + : AVInputDsTest() + { + p_iarmBusImplMock = new NiceMock; + IarmBus::setImpl(p_iarmBusImplMock); + + ON_CALL(*p_iarmBusImplMock, IARM_Bus_RegisterEventHandler(::testing::_, ::testing::_, ::testing::_)) + .WillByDefault(::testing::Invoke( + [&](const char* ownerName, IARM_EventId_t eventId, IARM_EventHandler_t handler) { + if ((string(IARM_BUS_DSMGR_NAME) == string(ownerName)) && (eventId == IARM_BUS_DSMGR_EVENT_HDMI_IN_HOTPLUG)) { + EXPECT_TRUE(handler != nullptr); + dsAVEventHandler = handler; + } + if ((string(IARM_BUS_DSMGR_NAME) == string(ownerName)) && (eventId == IARM_BUS_DSMGR_EVENT_HDMI_IN_STATUS)) { + EXPECT_TRUE(handler != nullptr); + dsAVStatusEventHandler = handler; + } + if ((string(IARM_BUS_DSMGR_NAME) == string(ownerName)) && (eventId == IARM_BUS_DSMGR_EVENT_HDMI_IN_SIGNAL_STATUS)) { + EXPECT_TRUE(handler != nullptr); + dsAVSignalStatusEventHandler = handler; + } + if ((string(IARM_BUS_DSMGR_NAME) == string(ownerName)) && (eventId == IARM_BUS_DSMGR_EVENT_HDMI_IN_VIDEO_MODE_UPDATE)) { + EXPECT_TRUE(handler != nullptr); + dsAVVideoModeEventHandler = handler; + } + if ((string(IARM_BUS_DSMGR_NAME) == string(ownerName)) && (eventId == IARM_BUS_DSMGR_EVENT_HDMI_IN_ALLM_STATUS)) { + EXPECT_TRUE(handler != nullptr); + dsAVGameFeatureStatusEventHandler = handler; + } + if ((string(IARM_BUS_DSMGR_NAME) == string(ownerName)) && (eventId == IARM_BUS_DSMGR_EVENT_HDMI_IN_VRR_STATUS)) { + EXPECT_TRUE(handler != nullptr); + dsAVGameFeatureStatusEventHandler = handler; + } + if ((string(IARM_BUS_DSMGR_NAME) == string(ownerName)) && (eventId == IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_HOTPLUG)) { + EXPECT_TRUE(handler != nullptr); + dsAVEventHandler = handler; + } + if ((string(IARM_BUS_DSMGR_NAME) == string(ownerName)) && (eventId == IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_SIGNAL_STATUS)) { + EXPECT_TRUE(handler != nullptr); + dsAVSignalStatusEventHandler = handler; + } + if ((string(IARM_BUS_DSMGR_NAME) == string(ownerName)) && (eventId == IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_STATUS)) { + EXPECT_TRUE(handler != nullptr); + dsAVStatusEventHandler = handler; + } + if ((string(IARM_BUS_DSMGR_NAME) == string(ownerName)) && (eventId == IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_VIDEO_MODE_UPDATE)) { + EXPECT_TRUE(handler != nullptr); + dsAVVideoModeEventHandler = handler; + } + if ((string(IARM_BUS_DSMGR_NAME) == string(ownerName)) && (eventId == IARM_BUS_DSMGR_EVENT_HDMI_IN_AVI_CONTENT_TYPE)) { + EXPECT_TRUE(handler != nullptr); + dsAviContentTypeEventHandler = handler; + } + return IARM_RESULT_SUCCESS; + })); + EXPECT_EQ(string(""), plugin->Initialize(&service)); + + PluginHost::IFactories::Assign(&factoriesImplementation); + dispatcher = static_cast( + plugin->QueryInterface(PLUGINHOST_DISPATCHER_ID)); + dispatcher->Activate(&service); + } + + virtual ~AVInputInit() override + { + dispatcher->Deactivate(); + dispatcher->Release(); + PluginHost::IFactories::Assign(nullptr); + + plugin->Deinitialize(&service); + + IarmBus::setImpl(nullptr); + if (p_iarmBusImplMock != nullptr) { + delete p_iarmBusImplMock; + p_iarmBusImplMock = nullptr; + } + } +}; + +TEST_F(AVInputTest, RegisteredMethods) +{ + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("numberOfInputs"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("currentVideoMode"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("contentProtected"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("setEdid2AllmSupport"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("getEdid2AllmSupport"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("setVRRSupport"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("getVRRSupport"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("getVRRFrameRate"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("getInputDevices"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("writeEDID"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("readEDID"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("getRawSPD"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("getSPD"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("setEdidVersion"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("getEdidVersion"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("getHdmiVersion"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("setMixerLevels"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("startInput"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("stopInput"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("setVideoRectangle"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("getSupportedGameFeatures"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("getGameFeatureStatus"))); +} + +TEST_F(AVInputInit, getInputDevices) +{ + EXPECT_CALL(*p_hdmiInputImplMock, getNumberOfInputs()) + .WillOnce(::testing::Return(1)); + EXPECT_CALL(*p_compositeInputImplMock, getNumberOfInputs()) + .WillOnce(::testing::Return(1)); + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("getInputDevices"), _T("{}"), response)); + EXPECT_EQ(response, string("{\"devices\":[{\"id\":0,\"connected\":false,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\"},{\"id\":0,\"connected\":false,\"locator\":\"cvbsin:\\/\\/localhost\\/deviceid\\/0\"}],\"success\":true}")); +} + +TEST_F(AVInputInit, getInputDevices_HDMI) +{ + EXPECT_CALL(*p_hdmiInputImplMock, getNumberOfInputs()) + .WillOnce(::testing::Return(1)); + EXPECT_CALL(*p_hdmiInputImplMock, isPortConnected(::testing::_)) + .WillOnce(::testing::Return(true)); + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("getInputDevices"), _T("{\"typeOfInput\": \"HDMI\"}"), response)); + EXPECT_EQ(response, string("{\"devices\":[{\"id\":0,\"connected\":true,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\"}],\"success\":true}")); +} + +TEST_F(AVInputInit, getInputDevices_COMPOSITE) +{ + EXPECT_CALL(*p_compositeInputImplMock, getNumberOfInputs()) + .WillOnce(::testing::Return(1)); + EXPECT_CALL(*p_compositeInputImplMock, isPortConnected(::testing::_)) + .WillOnce(::testing::Return(true)); + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("getInputDevices"), _T("{\"typeOfInput\": \"COMPOSITE\"}"), response)); + EXPECT_EQ(response, string("{\"devices\":[{\"id\":0,\"connected\":true,\"locator\":\"cvbsin:\\/\\/localhost\\/deviceid\\/0\"}],\"success\":true}")); +} + +TEST_F(AVInputInit, getInputDevices_InvalidParameters) +{ + EXPECT_EQ(Core::ERROR_GENERAL, handler.Invoke(connection, _T("getInputDevices"), _T("{\"typeOfInput\": \"Test\"}"), response)); + EXPECT_EQ(response, string("")); +} + +TEST_F(AVInputInit, writeEDID) +{ + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("writeEDID"), _T("{\"portId\": \"1\",\"message\":\"Test\"}"), response)); + EXPECT_EQ(response, string("{\"success\":true}")); +} + +TEST_F(AVInputInit, writeEDID_InvalidParameters) +{ + EXPECT_EQ(Core::ERROR_GENERAL, handler.Invoke(connection, _T("writeEDID"), _T("{}"), response)); + EXPECT_EQ(response, string("")); +} + +TEST_F(AVInputInit, readEDID) +{ + EXPECT_CALL(*p_hdmiInputImplMock, getEDIDBytesInfo(::testing::_, ::testing::_)) + .WillOnce([](int port, std::vector& edid) { + EXPECT_EQ(port, 1); + edid = { 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; + }); + + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("readEDID"), _T("{\"portId\": \"1\"}"), response)); + EXPECT_EQ(response, string("{\"EDID\":\"AP\\/\\/\\/\\/\\/\\/\\/w==\",\"success\":true}")); +} + +TEST_F(AVInputInit, readEDIDFailure) +{ + EXPECT_CALL(*p_hdmiInputImplMock, getEDIDBytesInfo(::testing::_, ::testing::_)) + .WillOnce([](int port, std::vector& edid) { + edid = {}; + }); + + EXPECT_EQ(Core::ERROR_GENERAL, handler.Invoke(connection, _T("readEDID"), _T("{\"portId\": \"1\"}"), response)); + EXPECT_EQ(response, string("")); +} + +TEST_F(AVInputInit, readEDID_InvalidParameters) +{ + EXPECT_EQ(Core::ERROR_GENERAL, handler.Invoke(connection, _T("readEDID"), _T("{\"portId\": \"test\"}"), response)); + EXPECT_EQ(response, string("")); +} + +TEST_F(AVInputInit, getRawSPD) +{ + EXPECT_CALL(*p_hdmiInputImplMock, getHDMISPDInfo(::testing::_, ::testing::_)) + .WillOnce([](int port, std::vector& data) { + data = { 0x53, 0x50, 0x44, 0x00 }; + }); + + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("getRawSPD"), _T("{\"portId\": \"1\"}"), response)); + EXPECT_EQ(response, string("{\"HDMISPD\":\"U1BEAA\",\"success\":true}")); +} + +TEST_F(AVInputInit, getRawSPD_InvalidParameters) +{ + EXPECT_EQ(Core::ERROR_GENERAL, handler.Invoke(connection, _T("getRawSPD"), _T("{\"portId\": \"test\"}"), response)); + EXPECT_EQ(response, string("")); +} + +TEST_F(AVInputInit, getSPD) +{ + EXPECT_CALL(*p_hdmiInputImplMock, getHDMISPDInfo(::testing::_, ::testing::_)) + .WillOnce([](int port, std::vector& data) { + data = { 0x53, 0x50, 0x44, 0x00 }; + }); + + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("getSPD"), _T("{\"portId\": \"1\"}"), response)); + EXPECT_EQ(response, string("{\"HDMISPD\":\"Packet Type:53,Version:80,Length:68,vendor name:wn,product des:,source info:00\",\"success\":true}")); +} + +TEST_F(AVInputInit, getSPD_InvalidParameters) +{ + EXPECT_EQ(Core::ERROR_GENERAL, handler.Invoke(connection, _T("getSPD"), _T("{\"portId\": \"test\"}"), response)); + EXPECT_EQ(response, string("")); +} + +TEST_F(AVInputInit, setEdidVersion) +{ + EXPECT_CALL(*p_hdmiInputImplMock, setEdidVersion(::testing::_, ::testing::_)) + .WillOnce([](int port, int edidVersion) { + EXPECT_EQ(port, 1); + EXPECT_EQ(edidVersion, 0); + }); + + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("setEdidVersion"), _T("{\"portId\": \"1\", \"edidVersion\":\"HDMI1.4\"}"), response)); + EXPECT_EQ(response, string("{\"success\":true}")); +} + +TEST_F(AVInputInit, setEdidVersion_InvalidParameters) +{ + EXPECT_EQ(Core::ERROR_GENERAL, handler.Invoke(connection, _T("setEdidVersion"), _T("{\"portId\": \"test\", \"edidVersion\":\"test\"}"), response)); + EXPECT_EQ(response, string("")); +} + +TEST_F(AVInputInit, getEdidVersion1) +{ + EXPECT_CALL(*p_hdmiInputImplMock, getEdidVersion(::testing::_, ::testing::_)) + .WillOnce([](int port, int* edidVersion) { + EXPECT_EQ(port, 0); + *edidVersion = 0; + }); + + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("getEdidVersion"), _T("{\"portId\": \"0\"}"), response)); + EXPECT_EQ(response, string("{\"edidVersion\":\"HDMI1.4\",\"success\":true}")); +} + +TEST_F(AVInputInit, getEdidVersion2) +{ + EXPECT_CALL(*p_hdmiInputImplMock, getEdidVersion(::testing::_, ::testing::_)) + .WillOnce([](int port, int* edidVersion) { + EXPECT_EQ(port, 1); + *edidVersion = 1; + }); + + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("getEdidVersion"), _T("{\"portId\": \"1\"}"), response)); + EXPECT_EQ(response, string("{\"edidVersion\":\"HDMI2.0\",\"success\":true}")); +} + +TEST_F(AVInputInit, getEdidVersion_InvalidParameters) +{ + EXPECT_EQ(Core::ERROR_GENERAL, handler.Invoke(connection, _T("getEdidVersion"), _T("{\"portId\": \"test\"}}"), response)); + EXPECT_EQ(response, string("")); +} + +TEST_F(AVInputInit, getHdmiVersion) +{ + EXPECT_CALL(*p_hdmiInputImplMock, getHdmiVersion(::testing::_, ::testing::_)) + .WillOnce([](int port, dsHdmiMaxCapabilityVersion_t* capVersion) { + if (capVersion) { + *capVersion = HDMI_COMPATIBILITY_VERSION_21; + } + }); + + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("getHdmiVersion"), _T("{\"portId\": \"1\"}"), response)); + EXPECT_EQ(response, string("{\"HdmiCapabilityVersion\":\"2.1\",\"success\":true}")); +} + +TEST_F(AVInputInit, getHdmiVersion_InvalidParameters) +{ + EXPECT_EQ(Core::ERROR_GENERAL, handler.Invoke(connection, _T("getHdmiVersion"), _T("{\"portId\": \"test\"}"), response)); + EXPECT_EQ(response, string("")); +} + +TEST_F(AVInputInit, setMixerLevels) +{ + EXPECT_CALL(*p_HostImplMock, setAudioMixerLevels(dsAUDIO_INPUT_PRIMARY, ::testing::_)) + .WillOnce([](dsAudioInput_t input, int volume) { + EXPECT_EQ(input, dsAUDIO_INPUT_PRIMARY); + EXPECT_EQ(volume, 50); + }); + + EXPECT_CALL(*p_HostImplMock, setAudioMixerLevels(dsAUDIO_INPUT_SYSTEM, ::testing::_)) + .WillOnce([](dsAudioInput_t input, int volume) { + EXPECT_EQ(input, dsAUDIO_INPUT_SYSTEM); + EXPECT_EQ(volume, 30); + }); + + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("setMixerLevels"), _T("{\"primaryVolume\": 50 ,\"inputVolume\":30}"), response)); + EXPECT_EQ(response, string("{\"success\":true}")); +} + +TEST_F(AVInputInit, setMixerLevelsErrorCase) +{ + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("setMixerLevels"), _T("{\"primaryVolume\": 110 ,\"inputVolume\":110}"), response)); + EXPECT_EQ(response, string("{\"success\":true}")); +} + +TEST_F(AVInputInit, startInput_HDMI) +{ + EXPECT_CALL(*p_hdmiInputImplMock, selectPort(::testing::_, ::testing::_, ::testing::_, ::testing::_)) + .WillOnce([](int8_t Port, bool audioMix, int videoPlane, bool topMost) { + EXPECT_EQ(Port, 1); + EXPECT_EQ(audioMix, true); + EXPECT_EQ(videoPlane, 1); + EXPECT_EQ(topMost, true); + }); + + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("startInput"), _T("{\"portId\": 1 ,\"typeOfInput\":\"HDMI\", \"requestAudioMix\": true, \"plane\" : 1, \"topMost\" : true}"), response)); + EXPECT_EQ(response, string("{\"success\":true}")); +} + +TEST_F(AVInputInit, startInput_COMPOSITE) +{ + EXPECT_CALL(*p_compositeInputImplMock, selectPort(::testing::_)) + .WillOnce([](int8_t Port) { + EXPECT_EQ(Port, 2); + }); + + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("startInput"), _T("{\"portId\": 2 ,\"typeOfInput\":\"COMPOSITE\", \"requestAudioMix\": true, \"plane\" : 1, \"topMost\" : true}"), response)); + EXPECT_EQ(response, string("{\"success\":true}")); +} + +TEST_F(AVInputInit, startInput_InvalidParameters) +{ + EXPECT_EQ(Core::ERROR_GENERAL, handler.Invoke(connection, _T("startInput"), _T("{\"portId\": \"test\" ,\"typeOfInput\":\"HDMI\", \"requestAudioMix\": true, \"plane\" : 1, \"topMost\" : true}"), response)); + EXPECT_EQ(response, string("")); +} + +TEST_F(AVInputInit, stopInput_HDMI) +{ + EXPECT_CALL(*p_hdmiInputImplMock, selectPort(::testing::_, ::testing::_, ::testing::_, ::testing::_)) + .WillOnce([](int8_t Port, bool audioMix, int videoPlane, bool topMost) { + EXPECT_EQ(Port, -1); + }); + + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("stopInput"), _T("{\"typeOfInput\":\"HDMI\"}"), response)); + EXPECT_EQ(response, string("{\"success\":true}")); +} + +TEST_F(AVInputInit, stopInput_COMPOSITE) +{ + EXPECT_CALL(*p_compositeInputImplMock, selectPort(::testing::_)) + .WillOnce([](int8_t Port) { + EXPECT_EQ(Port, -1); + }); + + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("stopInput"), _T("{\"typeOfInput\":\"COMPOSITE\"}"), response)); + EXPECT_EQ(response, string("{\"success\":true}")); +} + +TEST_F(AVInputInit, stopInput_COMPOSITE_InvalidParameters) +{ + EXPECT_EQ(Core::ERROR_GENERAL, handler.Invoke(connection, _T("stopInput"), _T("{\"typeOfInput\":\"DP\"}"), response)); + EXPECT_EQ(response, string("")); +} + +TEST_F(AVInputInit, setVideoRectangle_HDMI) +{ + EXPECT_CALL(*p_hdmiInputImplMock, scaleVideo(::testing::_, ::testing::_, ::testing::_, ::testing::_)) + .WillOnce([](int32_t x, int32_t y, int32_t width, int32_t height) { + EXPECT_EQ(x, 0); + EXPECT_EQ(y, 0); + EXPECT_EQ(width, 3840); + EXPECT_EQ(height, 2160); + }); + + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("setVideoRectangle"), _T("{\"x\" : 0, \"y\" : 0, \"w\" : 3840, \"h\" : 2160 ,\"typeOfInput\":\"HDMI\"}"), response)); + EXPECT_EQ(response, string("{\"success\":true}")); +} + +TEST_F(AVInputInit, setVideoRectangle_COMPOSITE) +{ + EXPECT_CALL(*p_compositeInputImplMock, scaleVideo(::testing::_, ::testing::_, ::testing::_, ::testing::_)) + .WillOnce([](int32_t x, int32_t y, int32_t width, int32_t height) { + EXPECT_EQ(x, 0); + EXPECT_EQ(y, 0); + EXPECT_EQ(width, 720); + EXPECT_EQ(height, 480); + }); + + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("setVideoRectangle"), _T("{\"x\" : 0, \"y\" : 0, \"w\" : 720, \"h\" : 480 ,\"typeOfInput\":\"COMPOSITE\"}"), response)); + EXPECT_EQ(response, string("{\"success\":true}")); +} + +TEST_F(AVInputInit, setVideoRectangle_InvalidParameters) +{ + EXPECT_EQ(Core::ERROR_GENERAL, handler.Invoke(connection, _T("setVideoRectangle"), _T("{\"x\" : 0, \"y\" : 0, \"w\" : 720, \"h\" : 480 ,\"typeOfInput\":\"DP\"}"), response)); + EXPECT_EQ(response, string("")); +} + +TEST_F(AVInputInit, getSupportedGameFeatures) +{ + EXPECT_CALL(*p_hdmiInputImplMock, getSupportedGameFeatures(::testing::_)) + .WillOnce([](std::vector& featureList) { + featureList = { "ALLM", "VRR", "QMS" }; + }); + + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("getSupportedGameFeatures"), _T("{}"), response)); + EXPECT_EQ(response, string("{\"supportedGameFeatures\":[\"ALLM\",\"VRR\",\"QMS\"],\"success\":true}")); +} + +TEST_F(AVInputInit, getSupportedGameFeatures_ErrorCase) +{ + EXPECT_CALL(*p_hdmiInputImplMock, getSupportedGameFeatures(::testing::_)) + .WillOnce([](std::vector& featureList) { + featureList = {}; + }); + + EXPECT_EQ(Core::ERROR_GENERAL, handler.Invoke(connection, _T("getSupportedGameFeatures"), _T("{}"), response)); + EXPECT_EQ(response, string("")); +} + +TEST_F(AVInputInit, getGameFeatureStatus_ALLM) +{ + EXPECT_CALL(*p_hdmiInputImplMock, getHdmiALLMStatus(::testing::_, ::testing::_)) + .WillOnce([](int iHdmiPort, bool* allmStatus) { + EXPECT_EQ(iHdmiPort, 1); + *allmStatus = true; + }); + + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("getGameFeatureStatus"), _T("{\"portId\" : 1, \"gameFeature\" : \"ALLM\"}"), response)); + EXPECT_EQ(response, string("{\"mode\":true,\"success\":true}")); +} + +TEST_F(AVInputInit, getGameFeatureStatus_VRR_HDMI) +{ + EXPECT_CALL(*p_hdmiInputImplMock, getVRRStatus(::testing::_, ::testing::_)) + .WillOnce([](int iHdmiPort, dsHdmiInVrrStatus_t* vrrStatus) { + ASSERT_NE(vrrStatus, nullptr); + vrrStatus->vrrType = dsVRR_HDMI_VRR; + vrrStatus->vrrAmdfreesyncFramerate_Hz = 90.00; + }); + + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("getGameFeatureStatus"), _T("{\"portId\" : 1, \"gameFeature\" : \"VRR-HDMI\"}"), response)); + EXPECT_EQ(response, string("{\"mode\":true,\"success\":true}")); +} + +TEST_F(AVInputInit, getGameFeatureStatus_VRR_FREESYNC) +{ + EXPECT_CALL(*p_hdmiInputImplMock, getVRRStatus(::testing::_, ::testing::_)) + .WillOnce([](int iHdmiPort, dsHdmiInVrrStatus_t* vrrStatus) { + ASSERT_NE(vrrStatus, nullptr); + vrrStatus->vrrType = dsVRR_AMD_FREESYNC; + vrrStatus->vrrAmdfreesyncFramerate_Hz = 100.00; + }); + + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("getGameFeatureStatus"), _T("{\"portId\" : 1, \"gameFeature\" : \"VRR-FREESYNC\"}"), response)); + EXPECT_EQ(response, string("{\"mode\":true,\"success\":true}")); +} + +TEST_F(AVInputInit, getGameFeatureStatus_VRR_FREESYNC_PREMIUM) +{ + EXPECT_CALL(*p_hdmiInputImplMock, getVRRStatus(::testing::_, ::testing::_)) + .WillOnce([](int iHdmiPort, dsHdmiInVrrStatus_t* vrrStatus) { + ASSERT_NE(vrrStatus, nullptr); + vrrStatus->vrrType = dsVRR_AMD_FREESYNC_PREMIUM; + vrrStatus->vrrAmdfreesyncFramerate_Hz = 120.00; + }); + + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("getGameFeatureStatus"), _T("{\"portId\" : 1, \"gameFeature\" : \"VRR-FREESYNC-PREMIUM\"}"), response)); + EXPECT_EQ(response, string("{\"mode\":true,\"success\":true}")); +} + +TEST_F(AVInputInit, getGameFeatureStatus_VRR_FREESYNC_PREMIUM_PRO) +{ + EXPECT_CALL(*p_hdmiInputImplMock, getVRRStatus(::testing::_, ::testing::_)) + .WillOnce([](int iHdmiPort, dsHdmiInVrrStatus_t* vrrStatus) { + ASSERT_NE(vrrStatus, nullptr); + vrrStatus->vrrType = dsVRR_AMD_FREESYNC_PREMIUM_PRO; + vrrStatus->vrrAmdfreesyncFramerate_Hz = 144.00; + }); + + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("getGameFeatureStatus"), _T("{\"portId\" : 1, \"gameFeature\" : \"VRR-FREESYNC-PREMIUM-PRO\"}"), response)); + EXPECT_EQ(response, string("{\"mode\":true,\"success\":true}")); +} + +TEST_F(AVInputInit, getGameFeatureStatus_InvalidParameters) +{ + EXPECT_EQ(Core::ERROR_GENERAL, handler.Invoke(connection, _T("getGameFeatureStatus"), _T("{\"portId\" : \"test\", \"gameFeature\" : \"VRR-FREESYNC-PREMIUM-PRO\"}"), response)); + EXPECT_EQ(response, string("")); +} + +TEST_F(AVInputInit, onDevicesChangedHDMI) +{ + Core::Event onDevicesChanged(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.onDevicesChanged\",\"params\":{\"devices\":[]}}"); + + onDevicesChanged.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("onDevicesChanged"), _T("org.rdk.AVInput"), message); + + ASSERT_TRUE(dsAVEventHandler != nullptr); + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_connect.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_connect.isPortConnected = true; + dsAVEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_HOTPLUG, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, onDevicesChanged.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("onDevicesChanged"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, onDevicesChangedCOMPOSITE) +{ + Core::Event onDevicesChanged(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.onDevicesChanged\",\"params\":{\"devices\":[]}}"); + + onDevicesChanged.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("onDevicesChanged"), _T("org.rdk.AVInput"), message); + + ASSERT_TRUE(dsAVEventHandler != nullptr); + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.composite_in_connect.port = dsCOMPOSITE_IN_PORT_0; + eventData.data.composite_in_connect.isPortConnected = true; + dsAVEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_HOTPLUG, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, onDevicesChanged.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("onDevicesChanged"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, onSignalChangedStableHDMI) +{ + Core::Event onSignalChanged(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, + "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.onSignalChanged\",\"params\":{\"id\":0,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\",\"signalStatus\":\"stableSignal\"}}"); + + onSignalChanged.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("onSignalChanged"), _T("org.rdk.AVInput"), message); + + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_sig_status.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_sig_status.status = dsHDMI_IN_SIGNAL_STATUS_STABLE; + dsAVSignalStatusEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_SIGNAL_STATUS, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, onSignalChanged.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("onSignalChanged"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, onSignalChangedNoSignalHDMI) +{ + Core::Event onSignalChanged(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, + "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.onSignalChanged\",\"params\":{\"id\":0,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\",\"signalStatus\":\"noSignal\"}}"); + + onSignalChanged.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("onSignalChanged"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_sig_status.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_sig_status.status = dsHDMI_IN_SIGNAL_STATUS_NOSIGNAL; + dsAVSignalStatusEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_SIGNAL_STATUS, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, onSignalChanged.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("onSignalChanged"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, onSignalChangedUnstableHDMI) +{ + Core::Event onSignalChanged(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, + "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.onSignalChanged\",\"params\":{\"id\":0,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\",\"signalStatus\":\"unstableSignal\"}}"); + + onSignalChanged.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("onSignalChanged"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_sig_status.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_sig_status.status = dsHDMI_IN_SIGNAL_STATUS_UNSTABLE; + dsAVSignalStatusEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_SIGNAL_STATUS, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, onSignalChanged.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("onSignalChanged"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, onSignalChangedNotSupportedHDMI) +{ + Core::Event onSignalChanged(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.onSignalChanged\",\"params\":{\"id\":0,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\",\"signalStatus\":\"notSupportedSignal\"}}"); + + onSignalChanged.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("onSignalChanged"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_sig_status.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_sig_status.status = dsHDMI_IN_SIGNAL_STATUS_NOTSUPPORTED; + dsAVSignalStatusEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_SIGNAL_STATUS, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, onSignalChanged.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("onSignalChanged"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, onSignalChangedDefaultHDMI) +{ + Core::Event onSignalChanged(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.onSignalChanged\",\"params\":{\"id\":0,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\",\"signalStatus\":\"none\"}}"); + + onSignalChanged.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("onSignalChanged"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_sig_status.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_sig_status.status = dsHDMI_IN_SIGNAL_STATUS_MAX; + dsAVSignalStatusEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_SIGNAL_STATUS, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, onSignalChanged.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("onSignalChanged"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, onSignalChangedStableCOMPOSITE) +{ + Core::Event onSignalChanged(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.onSignalChanged\",\"params\":{\"id\":0,\"locator\":\"cvbsin:\\/\\/localhost\\/deviceid\\/0\",\"signalStatus\":\"stableSignal\"}}"); + + onSignalChanged.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("onSignalChanged"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.composite_in_sig_status.port = dsCOMPOSITE_IN_PORT_0; + eventData.data.composite_in_sig_status.status = dsCOMP_IN_SIGNAL_STATUS_STABLE; + dsAVSignalStatusEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_SIGNAL_STATUS, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, onSignalChanged.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("onSignalChanged"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, onSignalChangedNoSignalCOMPOSITE) +{ + Core::Event onSignalChanged(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.onSignalChanged\",\"params\":{\"id\":0,\"locator\":\"cvbsin:\\/\\/localhost\\/deviceid\\/0\",\"signalStatus\":\"noSignal\"}}"); + + onSignalChanged.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("onSignalChanged"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.composite_in_sig_status.port = dsCOMPOSITE_IN_PORT_0; + eventData.data.composite_in_sig_status.status = dsCOMP_IN_SIGNAL_STATUS_NOSIGNAL; + dsAVSignalStatusEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_SIGNAL_STATUS, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, onSignalChanged.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("onSignalChanged"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, onSignalChangedUnstableCOMPOSITE) +{ + Core::Event onSignalChanged(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.onSignalChanged\",\"params\":{\"id\":0,\"locator\":\"cvbsin:\\/\\/localhost\\/deviceid\\/0\",\"signalStatus\":\"unstableSignal\"}}"); + + onSignalChanged.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("onSignalChanged"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.composite_in_sig_status.port = dsCOMPOSITE_IN_PORT_0; + eventData.data.composite_in_sig_status.status = dsCOMP_IN_SIGNAL_STATUS_UNSTABLE; + dsAVSignalStatusEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_SIGNAL_STATUS, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, onSignalChanged.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("onSignalChanged"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, onSignalChangedNotSupportedCOMPOSITE) +{ + Core::Event onSignalChanged(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.onSignalChanged\",\"params\":{\"id\":0,\"locator\":\"cvbsin:\\/\\/localhost\\/deviceid\\/0\",\"signalStatus\":\"notSupportedSignal\"}}"); + + onSignalChanged.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("onSignalChanged"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.composite_in_sig_status.port = dsCOMPOSITE_IN_PORT_0; + eventData.data.composite_in_sig_status.status = dsCOMP_IN_SIGNAL_STATUS_NOTSUPPORTED; + dsAVSignalStatusEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_SIGNAL_STATUS, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, onSignalChanged.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("onSignalChanged"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, onSignalChangedDefaultCOMPOSITE) +{ + Core::Event onSignalChanged(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.onSignalChanged\",\"params\":{\"id\":0,\"locator\":\"cvbsin:\\/\\/localhost\\/deviceid\\/0\",\"signalStatus\":\"none\"}}"); + + onSignalChanged.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("onSignalChanged"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.composite_in_sig_status.port = dsCOMPOSITE_IN_PORT_0; + eventData.data.composite_in_sig_status.status = dsCOMP_IN_SIGNAL_STATUS_MAX; + dsAVSignalStatusEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_SIGNAL_STATUS, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, onSignalChanged.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("onSignalChanged"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, onInputStatusChangeOn_HDMI) +{ + Core::Event onInputStatusChanged(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.onInputStatusChanged\",\"params\":{\"id\":0,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\",\"status\":\"started\",\"plane\":1}}"); + + onInputStatusChanged.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("onInputStatusChanged"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("startInput"), _T("{\"portId\": \"0\" , \"typeOfInput\":\"HDMI\", \"requestAudioMix\": true, \"plane\" : 1, \"topMost\" : true}"), response)); + EXPECT_EQ(response, string("{\"success\":true}")); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_status.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_status.isPresented = true; + dsAVStatusEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_STATUS, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, onInputStatusChanged.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("onInputStatusChanged"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, onInputStatusChangeOff_HDMI) +{ + Core::Event onInputStatusChanged(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.onInputStatusChanged\",\"params\":{\"id\":0,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\",\"status\":\"stopped\",\"plane\":-1}}"); + + onInputStatusChanged.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("onInputStatusChanged"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("stopInput"), _T("{\"typeOfInput\":\"HDMI\"}"), response)); + EXPECT_EQ(response, string("{\"success\":true}")); + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_status.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_status.isPresented = false; + + dsAVStatusEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_STATUS, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, onInputStatusChanged.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("onInputStatusChanged"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, onInputStatusChangeOn_COMPOSITE) +{ + Core::Event onInputStatusChanged(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.onInputStatusChanged\",\"params\":{\"id\":0,\"locator\":\"cvbsin:\\/\\/localhost\\/deviceid\\/0\",\"status\":\"started\",\"plane\":1}}"); + + onInputStatusChanged.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("onInputStatusChanged"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("startInput"), _T("{\"portId\": \"0\" , \"typeOfInput\":\"COMPOSITE\", \"requestAudioMix\": true, \"plane\" : 1, \"topMost\" : true}"), response)); + EXPECT_EQ(response, string("{\"success\":true}")); + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.composite_in_status.port = dsCOMPOSITE_IN_PORT_0; + eventData.data.composite_in_status.isPresented = true; + dsAVStatusEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_STATUS, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, onInputStatusChanged.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("onInputStatusChanged"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, onInputStatusChangeOff_COMPOSITE) +{ + Core::Event onInputStatusChanged(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.onInputStatusChanged\",\"params\":{\"id\":0,\"locator\":\"cvbsin:\\/\\/localhost\\/deviceid\\/0\",\"status\":\"stopped\",\"plane\":-1}}"); + + onInputStatusChanged.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("onInputStatusChanged"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("stopInput"), _T("{\"typeOfInput\":\"COMPOSITE\"}"), response)); + EXPECT_EQ(response, string("{\"success\":true}")); + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.composite_in_status.port = dsCOMPOSITE_IN_PORT_0; + eventData.data.composite_in_status.isPresented = false; + dsAVStatusEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_STATUS, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, onInputStatusChanged.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("onInputStatusChanged"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, hdmiGameFeatureStatusUpdate) +{ + Core::Event gameFeatureStatusUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.gameFeatureStatusUpdate\",\"params\":{\"id\":0,\"gameFeature\":\"ALLM\",\"mode\":true}}"); + + gameFeatureStatusUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("gameFeatureStatusUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_allm_mode.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_allm_mode.allm_mode = true; + dsAVGameFeatureStatusEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_ALLM_STATUS, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, gameFeatureStatusUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("gameFeatureStatusUpdate"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, hdmiGameFeatureStatusUpdate_HDMI_VRR) +{ + Core::Event gameFeatureStatusUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.gameFeatureStatusUpdate\",\"params\":{\"id\":0,\"gameFeature\":\"VRR-HDMI\",\"mode\":true}}"); + + gameFeatureStatusUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("gameFeatureStatusUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_vrr_mode.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_vrr_mode.vrr_type = dsVRR_HDMI_VRR; + dsAVGameFeatureStatusEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_VRR_STATUS, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, gameFeatureStatusUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("gameFeatureStatusUpdate"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, hdmiGameFeatureStatusUpdate_AMD_FREESYNC) { - EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("numberOfInputs"))); - EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("currentVideoMode"))); - EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("contentProtected"))); - EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("setEdid2AllmSupport"))); - EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("getEdid2AllmSupport"))); - EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("setVRRSupport"))); - EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("getVRRSupport"))); - EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("getVRRFrameRate"))); + Core::Event gameFeatureStatusUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.gameFeatureStatusUpdate\",\"params\":{\"id\":0,\"gameFeature\":\"VRR-FREESYNC\",\"mode\":true}}"); + + gameFeatureStatusUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("gameFeatureStatusUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_vrr_mode.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_vrr_mode.vrr_type = dsVRR_AMD_FREESYNC; + dsAVGameFeatureStatusEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_VRR_STATUS, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, gameFeatureStatusUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("gameFeatureStatusUpdate"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, hdmiGameFeatureStatusUpdate_AMD_FREESYNC_PREMIUM) +{ + Core::Event gameFeatureStatusUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.gameFeatureStatusUpdate\",\"params\":{\"id\":0,\"gameFeature\":\"VRR-FREESYNC-PREMIUM\",\"mode\":true}}"); + + gameFeatureStatusUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("gameFeatureStatusUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_vrr_mode.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_vrr_mode.vrr_type = dsVRR_AMD_FREESYNC_PREMIUM; + dsAVGameFeatureStatusEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_VRR_STATUS, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, gameFeatureStatusUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("gameFeatureStatusUpdate"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, hdmiGameFeatureStatusUpdate_AMD_FREESYNC_PREMIUM_PRO) +{ + Core::Event gameFeatureStatusUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.gameFeatureStatusUpdate\",\"params\":{\"id\":0,\"gameFeature\":\"VRR-FREESYNC-PREMIUM-PRO\",\"mode\":true}}"); + + gameFeatureStatusUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("gameFeatureStatusUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_vrr_mode.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_vrr_mode.vrr_type = dsVRR_AMD_FREESYNC_PREMIUM_PRO; + dsAVGameFeatureStatusEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_VRR_STATUS, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, gameFeatureStatusUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("gameFeatureStatusUpdate"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, videoStreamInfoUpdate1_HDMI) +{ + Core::Event videoStreamInfoUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.videoStreamInfoUpdate\",\"params\":{\"id\":0,\"width\":1920,\"height\":1080,\"progressive\":false,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\",\"frameRateN\":60000,\"frameRateD\":1001}}"); + + videoStreamInfoUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_video_mode.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_video_mode.resolution.pixelResolution = dsVIDEO_PIXELRES_1920x1080; + eventData.data.hdmi_in_video_mode.resolution.interlaced = true; + eventData.data.hdmi_in_video_mode.resolution.frameRate = dsVIDEO_FRAMERATE_59dot94; + dsAVVideoModeEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_VIDEO_MODE_UPDATE, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, videoStreamInfoUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, videoStreamInfoUpdate2_HDMI) +{ + Core::Event videoStreamInfoUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.videoStreamInfoUpdate\",\"params\":{\"id\":0,\"width\":720,\"height\":480,\"progressive\":false,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\",\"frameRateN\":24000,\"frameRateD\":1000}}"); + + videoStreamInfoUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_video_mode.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_video_mode.resolution.pixelResolution = dsVIDEO_PIXELRES_720x480; + eventData.data.hdmi_in_video_mode.resolution.interlaced = true; + eventData.data.hdmi_in_video_mode.resolution.frameRate = dsVIDEO_FRAMERATE_24; + dsAVVideoModeEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_VIDEO_MODE_UPDATE, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, videoStreamInfoUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, videoStreamInfoUpdate3_HDMI) +{ + Core::Event videoStreamInfoUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.videoStreamInfoUpdate\",\"params\":{\"id\":0,\"width\":720,\"height\":576,\"progressive\":false,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\",\"frameRateN\":25000,\"frameRateD\":1000}}"); + + videoStreamInfoUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_video_mode.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_video_mode.resolution.pixelResolution = dsVIDEO_PIXELRES_720x576; + eventData.data.hdmi_in_video_mode.resolution.interlaced = true; + eventData.data.hdmi_in_video_mode.resolution.frameRate = dsVIDEO_FRAMERATE_25; + dsAVVideoModeEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_VIDEO_MODE_UPDATE, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, videoStreamInfoUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, videoStreamInfoUpdate4_HDMI) +{ + Core::Event videoStreamInfoUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.videoStreamInfoUpdate\",\"params\":{\"id\":0,\"width\":3840,\"height\":2160,\"progressive\":false,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\",\"frameRateN\":30000,\"frameRateD\":1000}}"); + + videoStreamInfoUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_video_mode.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_video_mode.resolution.pixelResolution = dsVIDEO_PIXELRES_3840x2160; + eventData.data.hdmi_in_video_mode.resolution.interlaced = true; + eventData.data.hdmi_in_video_mode.resolution.frameRate = dsVIDEO_FRAMERATE_30; + dsAVVideoModeEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_VIDEO_MODE_UPDATE, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, videoStreamInfoUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, videoStreamInfoUpdate5_HDMI) +{ + Core::Event videoStreamInfoUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.videoStreamInfoUpdate\",\"params\":{\"id\":0,\"width\":4096,\"height\":2160,\"progressive\":false,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\",\"frameRateN\":50000,\"frameRateD\":1000}}"); + + videoStreamInfoUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_video_mode.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_video_mode.resolution.pixelResolution = dsVIDEO_PIXELRES_4096x2160; + eventData.data.hdmi_in_video_mode.resolution.interlaced = true; + eventData.data.hdmi_in_video_mode.resolution.frameRate = dsVIDEO_FRAMERATE_50; + dsAVVideoModeEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_VIDEO_MODE_UPDATE, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, videoStreamInfoUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, videoStreamInfoUpdate6_HDMI) +{ + Core::Event videoStreamInfoUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, "{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.videoStreamInfoUpdate\",\"params\":{\"id\":0,\"width\":4096,\"height\":2160,\"progressive\":false,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\",\"frameRateN\":60000,\"frameRateD\":1000}}"); + + videoStreamInfoUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_video_mode.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_video_mode.resolution.pixelResolution = dsVIDEO_PIXELRES_4096x2160; + eventData.data.hdmi_in_video_mode.resolution.interlaced = true; + eventData.data.hdmi_in_video_mode.resolution.frameRate = dsVIDEO_FRAMERATE_60; + dsAVVideoModeEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_VIDEO_MODE_UPDATE, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, videoStreamInfoUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, videoStreamInfoUpdate7_HDMI) +{ + Core::Event videoStreamInfoUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text,"{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.videoStreamInfoUpdate\",\"params\":{\"id\":0,\"width\":4096,\"height\":2160,\"progressive\":false,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\",\"frameRateN\":24000,\"frameRateD\":1001}}"); + + videoStreamInfoUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_video_mode.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_video_mode.resolution.pixelResolution = dsVIDEO_PIXELRES_4096x2160; + eventData.data.hdmi_in_video_mode.resolution.interlaced = true; + eventData.data.hdmi_in_video_mode.resolution.frameRate = dsVIDEO_FRAMERATE_23dot98; + dsAVVideoModeEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_VIDEO_MODE_UPDATE, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, videoStreamInfoUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, videoStreamInfoUpdate8_HDMI) +{ + Core::Event videoStreamInfoUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text,"{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.videoStreamInfoUpdate\",\"params\":{\"id\":0,\"width\":4096,\"height\":2160,\"progressive\":false,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\",\"frameRateN\":30000,\"frameRateD\":1001}}"); + + videoStreamInfoUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_video_mode.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_video_mode.resolution.pixelResolution = dsVIDEO_PIXELRES_4096x2160; + eventData.data.hdmi_in_video_mode.resolution.interlaced = true; + eventData.data.hdmi_in_video_mode.resolution.frameRate = dsVIDEO_FRAMERATE_29dot97; + dsAVVideoModeEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_VIDEO_MODE_UPDATE, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, videoStreamInfoUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, videoStreamInfoUpdate9_HDMI) +{ + Core::Event videoStreamInfoUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text,"{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.videoStreamInfoUpdate\",\"params\":{\"id\":0,\"width\":1280,\"height\":720,\"progressive\":false,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\",\"frameRateN\":30000,\"frameRateD\":1001}}"); + + videoStreamInfoUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_video_mode.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_video_mode.resolution.pixelResolution = dsVIDEO_PIXELRES_1280x720; + eventData.data.hdmi_in_video_mode.resolution.interlaced = true; + eventData.data.hdmi_in_video_mode.resolution.frameRate = dsVIDEO_FRAMERATE_29dot97; + dsAVVideoModeEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_VIDEO_MODE_UPDATE, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, videoStreamInfoUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, videoStreamInfoUpdate10_HDMI) +{ + Core::Event videoStreamInfoUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text,"{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.videoStreamInfoUpdate\",\"params\":{\"id\":0,\"width\":1280,\"height\":720,\"progressive\":false,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\",\"frameRateN\":100000,\"frameRateD\":1000}}"); + + videoStreamInfoUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_video_mode.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_video_mode.resolution.pixelResolution = dsVIDEO_PIXELRES_1280x720; + eventData.data.hdmi_in_video_mode.resolution.interlaced = true; + eventData.data.hdmi_in_video_mode.resolution.frameRate = dsVIDEO_FRAMERATE_100; + dsAVVideoModeEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_VIDEO_MODE_UPDATE, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, videoStreamInfoUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, videoStreamInfoUpdate11_HDMI) +{ + Core::Event videoStreamInfoUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text,"{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.videoStreamInfoUpdate\",\"params\":{\"id\":0,\"width\":1280,\"height\":720,\"progressive\":false,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\",\"frameRateN\":120000,\"frameRateD\":1001}}"); + + videoStreamInfoUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_video_mode.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_video_mode.resolution.pixelResolution = dsVIDEO_PIXELRES_1280x720; + eventData.data.hdmi_in_video_mode.resolution.interlaced = true; + eventData.data.hdmi_in_video_mode.resolution.frameRate = dsVIDEO_FRAMERATE_119dot88; + dsAVVideoModeEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_VIDEO_MODE_UPDATE, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, videoStreamInfoUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, videoStreamInfoUpdate12_HDMI) +{ + Core::Event videoStreamInfoUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text,"{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.videoStreamInfoUpdate\",\"params\":{\"id\":0,\"width\":1280,\"height\":720,\"progressive\":false,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\",\"frameRateN\":120000,\"frameRateD\":1000}}"); + + videoStreamInfoUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_video_mode.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_video_mode.resolution.pixelResolution = dsVIDEO_PIXELRES_1280x720; + eventData.data.hdmi_in_video_mode.resolution.interlaced = true; + eventData.data.hdmi_in_video_mode.resolution.frameRate = dsVIDEO_FRAMERATE_120; + dsAVVideoModeEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_VIDEO_MODE_UPDATE, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, videoStreamInfoUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, videoStreamInfoUpdate13_HDMI) +{ + Core::Event videoStreamInfoUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text,"{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.videoStreamInfoUpdate\",\"params\":{\"id\":0,\"width\":1280,\"height\":720,\"progressive\":false,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\",\"frameRateN\":200000,\"frameRateD\":1000}}"); + + videoStreamInfoUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_video_mode.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_video_mode.resolution.pixelResolution = dsVIDEO_PIXELRES_1280x720; + eventData.data.hdmi_in_video_mode.resolution.interlaced = true; + eventData.data.hdmi_in_video_mode.resolution.frameRate = dsVIDEO_FRAMERATE_200; + dsAVVideoModeEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_VIDEO_MODE_UPDATE, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, videoStreamInfoUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, videoStreamInfoUpdate14_HDMI) +{ + Core::Event videoStreamInfoUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text,"{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.videoStreamInfoUpdate\",\"params\":{\"id\":0,\"width\":1280,\"height\":720,\"progressive\":false,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\",\"frameRateN\":240000,\"frameRateD\":1001}}"); + + videoStreamInfoUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_video_mode.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_video_mode.resolution.pixelResolution = dsVIDEO_PIXELRES_1280x720; + eventData.data.hdmi_in_video_mode.resolution.interlaced = true; + eventData.data.hdmi_in_video_mode.resolution.frameRate = dsVIDEO_FRAMERATE_239dot76; + dsAVVideoModeEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_VIDEO_MODE_UPDATE, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, videoStreamInfoUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, videoStreamInfoUpdate15_HDMI) +{ + Core::Event videoStreamInfoUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text,"{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.videoStreamInfoUpdate\",\"params\":{\"id\":0,\"width\":1280,\"height\":720,\"progressive\":false,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\",\"frameRateN\":240000,\"frameRateD\":100}}"); + + videoStreamInfoUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_video_mode.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_video_mode.resolution.pixelResolution = dsVIDEO_PIXELRES_1280x720; + eventData.data.hdmi_in_video_mode.resolution.interlaced = true; + eventData.data.hdmi_in_video_mode.resolution.frameRate = dsVIDEO_FRAMERATE_240; + dsAVVideoModeEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_VIDEO_MODE_UPDATE, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, videoStreamInfoUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, videoStreamInfoUpdateDefault_HDMI) +{ + Core::Event videoStreamInfoUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text,"{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.videoStreamInfoUpdate\",\"params\":{\"id\":0,\"width\":1920,\"height\":1080,\"progressive\":false,\"locator\":\"hdmiin:\\/\\/localhost\\/deviceid\\/0\",\"frameRateN\":60000,\"frameRateD\":1000}}"); + + videoStreamInfoUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_video_mode.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_video_mode.resolution.pixelResolution = dsVIDEO_PIXELRES_MAX; + eventData.data.hdmi_in_video_mode.resolution.interlaced = true; + eventData.data.hdmi_in_video_mode.resolution.frameRate = dsVIDEO_FRAMERATE_MAX; + dsAVVideoModeEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_VIDEO_MODE_UPDATE, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, videoStreamInfoUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); +} + + +TEST_F(AVInputInit, videoStreamInfoUpdate1_COMPOSITE) +{ + Core::Event videoStreamInfoUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text,"{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.videoStreamInfoUpdate\",\"params\":{\"id\":0,\"width\":720,\"height\":480,\"progressive\":false,\"locator\":\"cvbsin:\\/\\/localhost\\/deviceid\\/0\",\"frameRateN\":24000,\"frameRateD\":1000}}"); + + videoStreamInfoUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.composite_in_video_mode.port = dsCOMPOSITE_IN_PORT_0; + eventData.data.composite_in_video_mode.resolution.pixelResolution = dsVIDEO_PIXELRES_720x480; + eventData.data.composite_in_video_mode.resolution.frameRate = dsVIDEO_FRAMERATE_24; + dsAVVideoModeEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_VIDEO_MODE_UPDATE, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, videoStreamInfoUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); +} + + +TEST_F(AVInputInit, videoStreamInfoUpdate2_COMPOSITE) +{ + Core::Event videoStreamInfoUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text,"{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.videoStreamInfoUpdate\",\"params\":{\"id\":0,\"width\":720,\"height\":576,\"progressive\":false,\"locator\":\"cvbsin:\\/\\/localhost\\/deviceid\\/0\",\"frameRateN\":25000,\"frameRateD\":1000}}"); + + videoStreamInfoUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.composite_in_video_mode.port = dsCOMPOSITE_IN_PORT_0; + eventData.data.composite_in_video_mode.resolution.pixelResolution = dsVIDEO_PIXELRES_720x576; + eventData.data.composite_in_video_mode.resolution.frameRate = dsVIDEO_FRAMERATE_25; + dsAVVideoModeEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_VIDEO_MODE_UPDATE, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, videoStreamInfoUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, videoStreamInfoUpdateDefault_COMPOSITE) +{ + Core::Event videoStreamInfoUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text,"{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.videoStreamInfoUpdate\",\"params\":{\"id\":0,\"width\":720,\"height\":576,\"progressive\":false,\"locator\":\"cvbsin:\\/\\/localhost\\/deviceid\\/0\",\"frameRateN\":60000,\"frameRateD\":1000}}"); + + videoStreamInfoUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.composite_in_video_mode.port = dsCOMPOSITE_IN_PORT_0; + eventData.data.composite_in_video_mode.resolution.pixelResolution = dsVIDEO_PIXELRES_MAX; + eventData.data.composite_in_video_mode.resolution.frameRate = dsVIDEO_FRAMERATE_MAX; + dsAVVideoModeEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_VIDEO_MODE_UPDATE, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, videoStreamInfoUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("videoStreamInfoUpdate"), _T("org.rdk.AVInput"), message); +} + +TEST_F(AVInputInit, aviContentTypeUpdate_HDMI) +{ + Core::Event aviContentTypeUpdate(false, true); + + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text,"{\"jsonrpc\":\"2.0\",\"method\":\"org.rdk.AVInput.aviContentTypeUpdate\",\"params\":{\"id\":0,\"aviContentType\":0}}"); + + aviContentTypeUpdate.SetEvent(); + + return Core::ERROR_NONE; + })); + + EVENT_SUBSCRIBE(0, _T("aviContentTypeUpdate"), _T("org.rdk.AVInput"), message); + ASSERT_TRUE(dsAVSignalStatusEventHandler != nullptr); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.hdmi_in_content_type.port = dsHDMI_IN_PORT_0; + eventData.data.hdmi_in_content_type.aviContentType = dsAVICONTENT_TYPE_GRAPHICS; + dsAviContentTypeEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_AVI_CONTENT_TYPE, &eventData, 0); + + EXPECT_EQ(Core::ERROR_NONE, aviContentTypeUpdate.Lock()); + + EVENT_UNSUBSCRIBE(0, _T("aviContentTypeUpdate"), _T("org.rdk.AVInput"), message); } TEST_F(AVInputTest, contentProtected) @@ -107,6 +1906,11 @@ TEST_F(AVInputDsTest, getEdid2AllmSupport) EXPECT_EQ(response, string("{\"allmSupport\":true,\"success\":true}")); } +TEST_F(AVInputDsTest, getEdid2AllmSupport_ErrorCase) +{ + EXPECT_EQ(Core::ERROR_GENERAL, handler.Invoke(connection, _T("getEdid2AllmSupport"), _T("{\"portId\": \"test\",\"allmSupport\":true}"), response)); + EXPECT_EQ(response, string("")); +} TEST_F(AVInputDsTest, setEdid2AllmSupport) { @@ -114,21 +1918,44 @@ TEST_F(AVInputDsTest, setEdid2AllmSupport) EXPECT_EQ(response, string("{\"success\":true}")); } +TEST_F(AVInputDsTest, setEdid2AllmSupport_ErrorCase) +{ + EXPECT_EQ(Core::ERROR_GENERAL, handler.Invoke(connection, _T("setEdid2AllmSupport"), _T("{\"portId\": \"test\",\"allmSupport\":true}"), response)); + EXPECT_EQ(response, string("")); +} + TEST_F(AVInputDsTest, getVRRSupport) { EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("getVRRSupport"), _T("{\"portId\": \"0\",\"vrrSupport\":true}"), response)); EXPECT_EQ(response, string("{\"vrrSupport\":true,\"success\":true}")); } +TEST_F(AVInputDsTest, getVRRSupport_ErrorCase) +{ + EXPECT_EQ(Core::ERROR_GENERAL, handler.Invoke(connection, _T("getVRRSupport"), _T("{\"portId\": \"test\",\"vrrSupport\":true}"), response)); + EXPECT_EQ(response, string("")); +} + TEST_F(AVInputDsTest, setVRRSupport) { EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("setVRRSupport"), _T("{\"portId\": \"0\",\"vrrSupport\":true}"), response)); EXPECT_EQ(response, string("{\"success\":true}")); } +TEST_F(AVInputDsTest, setVRRSupport_ErrorCase) +{ + EXPECT_EQ(Core::ERROR_GENERAL, handler.Invoke(connection, _T("setVRRSupport"), _T("{\"portId\": \"test\",\"vrrSupport\":true}"), response)); + EXPECT_EQ(response, string("")); +} + TEST_F(AVInputDsTest, getVRRFrameRate) { EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("getVRRFrameRate"), _T("{\"portId\": \"0\"}"), response)); EXPECT_EQ(response, string("{\"currentVRRVideoFrameRate\":0,\"success\":true}")); } +TEST_F(AVInputDsTest, getVRRFrameRate_ErrorCase) +{ + EXPECT_EQ(Core::ERROR_GENERAL, handler.Invoke(connection, _T("getVRRFrameRate"), _T("{\"portId\": \"test\"}"), response)); + EXPECT_EQ(response, string("")); +}