diff --git a/.github/workflows/L1-tests.yml b/.github/workflows/L1-tests.yml index a29210657..168cec11f 100755 --- a/.github/workflows/L1-tests.yml +++ b/.github/workflows/L1-tests.yml @@ -39,7 +39,6 @@ jobs: with: path: | build/Thunder - build/ThunderInterfaces build/ThunderTools install !install/etc/WPEFramework/plugins @@ -56,8 +55,7 @@ jobs: !install/usr/lib/pkgconfig/gtest.pc !install/usr/lib/pkgconfig/gtest_main.pc !install/usr/lib/wpeframework/plugins - key: ${{ runner.os }}-${{ env.THUNDER_REF }}-${{ env.INTERFACES_REF }}-3 - + key: ${{ runner.os }}-${{ env.THUNDER_REF }}-${{ env.INTERFACES_REF }}-4 - name: Set up Python uses: actions/setup-python@v4 with: @@ -127,16 +125,27 @@ jobs: && cmake --install build/Thunder + - name: Checkout rdkservices + uses: actions/checkout@v3 + with: + path: rdkservices + - name: Checkout ThunderInterfaces - if: steps.cache.outputs.cache-hit != 'true' uses: actions/checkout@v3 with: repository: rdkcentral/ThunderInterfaces path: ThunderInterfaces ref: ${{env.INTERFACES_REF}} + - name: Apply patches ThunderInterfaces + run: > + cd "${{github.workspace}}/ThunderInterfaces" + && + git apply "${{github.workspace}}/rdkservices/Tests/L1Tests/patches/0001-Add-IAnalytics-interface-R2.patch" + && + cd .. + - name: Build ThunderInterfaces - if: steps.cache.outputs.cache-hit != 'true' run: > cmake -S "${{github.workspace}}/ThunderInterfaces" @@ -149,10 +158,6 @@ jobs: && cmake --install build/ThunderInterfaces - - name: Checkout rdkservices - uses: actions/checkout@v3 - with: - path: rdkservices - name: Generate external headers # Empty headers to mute errors @@ -291,6 +296,8 @@ jobs: -DPLUGIN_TEXTTOSPEECH=ON -DPLUGIN_SYSTEMAUDIOPLAYER=ON -DPLUGIN_MIRACAST=ON + -DPLUGIN_ANALYTICS=ON + -DPLUGIN_ANALYTICS_SIFT_BACKEND=ON -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} && cmake --build build/rdkservices -j8 diff --git a/Analytics/Analytics.json b/Analytics/Analytics.json index e070ef466..4afc8ea17 100644 --- a/Analytics/Analytics.json +++ b/Analytics/Analytics.json @@ -99,6 +99,31 @@ "result": { "$ref": "#/common/result" } + }, + "setSessionId" : { + "summary": "Set the session ID for the analytics events", + "params": { + "type":"object", + "properties": { + "sessionId":{ + "summary": "Session ID", + "type": "string", + "example": "1234567890" + } + }, + "required": [ + "sessionId" + ] + }, + "result": { + "$ref": "#/common/result" + } + }, + "setTimeReady" : { + "summary": "Let the analytics plugin know that the system time is ready and valid", + "result": { + "$ref": "#/common/result" + } } } } diff --git a/Analytics/AnalyticsJsonRpc.cpp b/Analytics/AnalyticsJsonRpc.cpp index b3238482c..f5139ec1e 100644 --- a/Analytics/AnalyticsJsonRpc.cpp +++ b/Analytics/AnalyticsJsonRpc.cpp @@ -78,16 +78,19 @@ namespace Plugin { uint64_t uptimeTimestamp = (parameters.HasLabel("uptimeTimestamp"))? parameters["uptimeTimestamp"].Number() : 0; string eventPayload = parameters["eventPayload"].String(); - result = mAnalytics->SendEvent(eventName, - eventVersion, - eventSource, - eventSourceVersion, - cetListIterator, - epochTimestamp, - uptimeTimestamp, - eventPayload); + if (mAnalytics != nullptr) { + result = mAnalytics->SendEvent(eventName, + eventVersion, + eventSource, + eventSourceVersion, + cetListIterator, + epochTimestamp, + uptimeTimestamp, + eventPayload); + } + cetListIterator->Release(); - returnResponse(result); + returnResponse(result == Core::ERROR_NONE); } // Method: setSessionId - Set the session ID @@ -104,9 +107,11 @@ namespace Plugin { string sessionId = parameters["sessionId"].String(); - result = mAnalytics->SetSessionId(sessionId); + if (mAnalytics != nullptr) { + result = mAnalytics->SetSessionId(sessionId); + } - returnResponse(result); + returnResponse(result == Core::ERROR_NONE); } // Method: setTimeReady - Set the time ready @@ -119,9 +124,11 @@ namespace Plugin { uint32_t result = Core::ERROR_NONE; - result = mAnalytics->SetTimeReady(); + if (mAnalytics != nullptr) { + result = mAnalytics->SetTimeReady(); + } - returnResponse(result); + returnResponse(result == Core::ERROR_NONE); } } diff --git a/Analytics/CMakeLists.txt b/Analytics/CMakeLists.txt index cb6f149f3..247f6200d 100644 --- a/Analytics/CMakeLists.txt +++ b/Analytics/CMakeLists.txt @@ -55,6 +55,10 @@ set(PLUGIN_ANALYTICS_SIFT_URL "" CACHE STRING "Sift URL") message("Setup ${MODULE_NAME} v${MODULE_VERSION}") find_package(${NAMESPACE}Plugins REQUIRED) +find_package(${NAMESPACE}Definitions REQUIRED) +find_package(CompileSettingsDebug CONFIG REQUIRED) +find_package(DS) +find_package(IARMBus) add_library(${MODULE_NAME} SHARED Analytics.cpp @@ -74,18 +78,14 @@ set_target_properties(${MODULE_NAME} PROPERTIES target_compile_definitions(${MODULE_NAME} PRIVATE MODULE_NAME=Plugin_${PLUGIN_NAME}) -find_package(DS) -if (DS_FOUND) - find_package(IARMBus) - add_definitions(-DDS_FOUND) - target_include_directories(${MODULE_NAME} PRIVATE ${IARMBUS_INCLUDE_DIRS}) - target_include_directories(${MODULE_NAME} PRIVATE ${DS_INCLUDE_DIRS}) - target_include_directories(${MODULE_NAME} PRIVATE ../helpers) - target_link_libraries(${MODULE_NAME} PRIVATE ${NAMESPACE}Plugins::${NAMESPACE}Plugins ${IARMBUS_LIBRARIES} ${OEMHAL_LIBRARIES} - -lpthread -lglib-2.0 -ldbus-1 ${IARMBUS_LIBRARIES} ${MODULE_NAME}Backends) -else (DS_FOUND) - target_link_libraries(${MODULE_NAME} PRIVATE ${NAMESPACE}Plugins::${NAMESPACE}Plugins) -endif(DS_FOUND) +target_link_libraries(${MODULE_NAME} + PRIVATE + CompileSettingsDebug::CompileSettingsDebug + ${NAMESPACE}Plugins::${NAMESPACE}Plugins + ${NAMESPACE}Definitions::${NAMESPACE}Definitions + ${DS_LIBRARIES} + ${IARMBUS_LIBRARIES} + ${MODULE_NAME}Backends) install(TARGETS ${MODULE_NAME} DESTINATION lib/${STORAGE_DIRECTORY}/plugins) diff --git a/Tests/L1Tests/CMakeLists.txt b/Tests/L1Tests/CMakeLists.txt index 8f34225f9..9d503372c 100755 --- a/Tests/L1Tests/CMakeLists.txt +++ b/Tests/L1Tests/CMakeLists.txt @@ -102,6 +102,7 @@ include_directories(../../LocationSync ../../Miracast/MiracastService/P2P ../../Miracast/MiracastPlayer ../../Miracast/MiracastPlayer/RTSP + ../../Analytics ) link_directories(../../LocationSync ../../SecurityAgent @@ -141,6 +142,7 @@ link_directories(../../LocationSync ../../TextToSpeech ../../SystemAudioPlayer ../../Miracast + ../../Analytics ) target_link_libraries(${PROJECT_NAME} @@ -185,6 +187,7 @@ target_link_libraries(${PROJECT_NAME} ${NAMESPACE}SystemAudioPlayer ${NAMESPACE}MiracastService ${NAMESPACE}MiracastPlayer + ${NAMESPACE}Analytics ) target_include_directories(${PROJECT_NAME} diff --git a/Tests/L1Tests/patches/0001-Add-IAnalytics-interface-R2.patch b/Tests/L1Tests/patches/0001-Add-IAnalytics-interface-R2.patch new file mode 100644 index 000000000..8045170a3 --- /dev/null +++ b/Tests/L1Tests/patches/0001-Add-IAnalytics-interface-R2.patch @@ -0,0 +1,59 @@ +From 9a2398b7bc356f341e25c414e45b6919df135d58 Mon Sep 17 00:00:00 2001 +From: Adrian Muzyka +Date: Thu, 19 Sep 2024 12:34:27 +0200 +Subject: [PATCH] Add IAnalytics interface R2 + +--- + interfaces/IAnalytics.h | 27 +++++++++++++++++++++++++++ + interfaces/Ids.h | 1 + + 2 files changed, 28 insertions(+) + create mode 100644 interfaces/IAnalytics.h + +diff --git a/interfaces/IAnalytics.h b/interfaces/IAnalytics.h +new file mode 100644 +index 0000000..19f5a3a +--- /dev/null ++++ b/interfaces/IAnalytics.h +@@ -0,0 +1,27 @@ ++#pragma once ++ ++#include "Module.h" ++ ++// @stubgen:include ++ ++namespace WPEFramework { ++namespace Exchange { ++ ++ struct EXTERNAL IAnalytics : virtual public Core::IUnknown { ++ enum { ID = ID_ANALYTICS }; ++ ++ virtual ~IAnalytics() override = default; ++ ++ virtual uint32_t SendEvent(const string& eventName /* @in */, ++ const string& eventVersion /* @in */, ++ const string& eventSource /* @in */, ++ const string& eventSourceVersion /* @in */, ++ RPC::IStringIterator* const& cetList /* @in */, ++ const uint64_t& epochTimestamp /* @in */, ++ const uint64_t& uptimeTimestamp /* @in */, ++ const string& eventPayload /* @in */ ) = 0; ++ virtual uint32_t SetSessionId(const string& id /* @in */) = 0; ++ virtual uint32_t SetTimeReady() = 0; ++ }; ++} ++} +diff --git a/interfaces/Ids.h b/interfaces/Ids.h +index 7ef9a42..fa5c1dd 100644 +--- a/interfaces/Ids.h ++++ b/interfaces/Ids.h +@@ -288,6 +288,7 @@ namespace Exchange { + ID_DTV_TRANSPORT, + ID_TEXT_TO_SPEECH, + ID_TEXT_TO_SPEECH_NOTIFICATION, ++ ID_ANALYTICS, + + }; + } +-- +2.25.1 + diff --git a/Tests/L1Tests/tests/test_Analytics.cpp b/Tests/L1Tests/tests/test_Analytics.cpp new file mode 100644 index 000000000..92a96fbc3 --- /dev/null +++ b/Tests/L1Tests/tests/test_Analytics.cpp @@ -0,0 +1,49 @@ +#include + +#include "Analytics.h" + +using namespace WPEFramework; + +class AnalyticsTest : public ::testing::Test { +protected: + Core::ProxyType plugin; + Core::JSONRPC::Handler& handler; + Core::JSONRPC::Connection connection; + string response; + + AnalyticsTest() + : plugin(Core::ProxyType::Create()) + , handler(*(plugin)) + , connection(1, 0) + { + } + virtual ~AnalyticsTest() = default; +}; + +TEST_F(AnalyticsTest, RegisteredMethods) +{ + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("sendEvent"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("setSessionId"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("setTimeReady"))); +} + +TEST_F(AnalyticsTest, sendEvent) +{ + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("sendEvent"), _T("{\"eventName\":\"tile_impression\", \"eventVersion\":\"1\", \"eventSource\":\"ImmerseUI\", \"eventSourceVersion\":\"1.2\", \"cetList\":[\"cet1\",\"cet2\",\"cet3\"], \"eventPayload\": { \"event_trigger\": \"user_key_select\"}}"), response)); + EXPECT_EQ(response, string("{\"success\":true}")); +} + +TEST_F(AnalyticsTest, setSessionId) +{ + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("setSessionId"), _T("{\"sessionId\":\"123456789\"}"), response)); + EXPECT_EQ(response, string("{\"success\":true}")); +} + +TEST_F(AnalyticsTest, setTimeReady) +{ + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("setTimeReady"), _T("{}"), response)); + EXPECT_EQ(response, string("{\"success\":true}")); +} + + + diff --git a/l1tests.cmake b/l1tests.cmake index 7107208df..3352bbb66 100755 --- a/l1tests.cmake +++ b/l1tests.cmake @@ -216,3 +216,5 @@ set(PLUGIN_MAINTENANCEMANAGER ON) set(PLUGIN_PACKAGER ON) set(DS_FOUND ON) set(PLUGIN_SYSTEMAUDIOPLAYER ON) +set(PLUGIN_ANALYTICS ON) +set(PLUGIN_ANALYTICS_SIFT_BACKEND ON)