Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat: Native SDK Core Unit Tests (Part I, II, Events) #333

Merged
merged 24 commits into from
Oct 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
622d05a
test(core): Unit test setup
AdityaKasar Sep 23, 2024
1a139ca
test(core): Accessibility module unit tests
AdityaKasar Sep 23, 2024
415ff9b
test(core): Account module unit tests
AdityaKasar Sep 23, 2024
2b448ef
test(core): Advertising module unit tests
AdityaKasar Sep 23, 2024
a4e6e04
test(core): Authentication module unit tests
AdityaKasar Sep 23, 2024
0bb732c
test(core): Capabilities module unit tests
AdityaKasar Sep 23, 2024
1cec81d
test(core): Device module unit tests
AdityaKasar Sep 23, 2024
87b4622
test(core): Lifecycle module unit tests
AdityaKasar Sep 23, 2024
9d8e743
test(core): Metrics module unit tests
AdityaKasar Sep 23, 2024
9fb9be6
test(core): Parameters module unit tests
AdityaKasar Sep 23, 2024
24e2020
test(core): Profile module unit tests
AdityaKasar Sep 23, 2024
9436e4c
Merge branch 'next' into feature/native-core-sdk-unit-tests
ksentak Sep 27, 2024
a3a40bc
Correct unit tests that were not compiling correctly
ksentak Sep 30, 2024
faad7c0
test(core): Localization unit tests
ksentak Oct 2, 2024
a366a48
Native SDK events unit tests initial commit
parag-pv Oct 2, 2024
1f0e075
Adding event tests for voiceGuidance and audioDescriptions
parag-pv Oct 3, 2024
5c00111
test(core): Keyboard unit tests
ksentak Oct 3, 2024
29f49c6
test(core): Discovery unit tests
ksentak Oct 3, 2024
5081566
test(core): Update parameters.initialization
ksentak Oct 3, 2024
df3f041
test(core): Additional Lifecycle unit test
ksentak Oct 3, 2024
8741ea4
Comment changes
parag-pv Oct 3, 2024
518ab64
test(core): SecureStorage unit tests
ksentak Oct 3, 2024
21bb70c
test(core): SecondScreen unit tests
ksentak Oct 3, 2024
dd5ecc4
Merge branch 'feature/native-core-sdk-unit-tests-part-ii' into featur…
ksentak Oct 4, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 34 additions & 5 deletions src/sdks/core/src/cpp/sdk/cpptest/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,6 @@ endif ()

find_package(WPEFramework CONFIG REQUIRED)
find_package(${NAMESPACE}Core CONFIG REQUIRED)
find_package(Firebolt CONFIG REQUIRED)
find_package(${FIREBOLT_NAMESPACE}SDK CONFIG REQUIRED)

set(TESTAPP TestFireboltCore)

Expand All @@ -52,13 +50,13 @@ target_link_libraries(${TESTAPP}
PRIVATE
${NAMESPACE}Core::${NAMESPACE}Core
${FIREBOLT_NAMESPACE}SDK::${FIREBOLT_NAMESPACE}SDK
nlohmann_json_schema_validator
gtest_main
)

target_include_directories(${TESTAPP}
PRIVATE
$<BUILD_INTERFACE:${FIREBOLT_PATH}/usr/include/${FIREBOLT_NAMESPACE}SDK>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SRC_DIR}/>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SRC_DIR}/../>
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include/>
)

if (POLYMORPHICS_REDUCER_METHODS)
Expand All @@ -79,3 +77,34 @@ add_custom_command(
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/${FIREBOLT_NAMESPACE}/usr/bin
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/${TESTAPP} ${CMAKE_BINARY_DIR}/${FIREBOLT_NAMESPACE}/usr/bin
)

if(ENABLE_UNIT_TESTS)
set(UNIT_TESTS_APP FireboltCoreUnitTests)

message("Setup ${UNIT_TESTS_APP}")

file(GLOB UNIT_TESTS "unit/*")

add_executable(${UNIT_TESTS_APP}
CoreSDKTest.cpp
Unit.cpp
${UNIT_TESTS}
)

link_directories(${CMAKE_SOURCE_DIR}/../../Thunder/install/usr/lib/)
target_link_libraries(${UNIT_TESTS_APP}
PRIVATE
${NAMESPACE}Core::${NAMESPACE}Core
${FIREBOLT_NAMESPACE}SDK::${FIREBOLT_NAMESPACE}SDK
nlohmann_json_schema_validator
gtest_main
)

target_include_directories(${UNIT_TESTS_APP}
PRIVATE
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include/>
)

include(GoogleTest)
gtest_discover_tests(${UNIT_TESTS_APP})
endif()
10 changes: 10 additions & 0 deletions src/sdks/core/src/cpp/sdk/cpptest/Unit.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#include "gtest/gtest.h"
#include "CoreSDKTest.h"

int main(int argc, char **argv)
{
std::string url = "ws://localhost:9998";
CoreSDKTest::CreateFireboltInstance(url);
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
314 changes: 314 additions & 0 deletions src/sdks/core/src/cpp/sdk/cpptest/unit/accessibilityTest.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,314 @@
#include "unit.h"

class AccessibilityTest : public ::testing::Test
{
protected:
JsonEngine *jsonEngine;
Firebolt::Error error = Firebolt::Error::None;

void SetUp() override
{
jsonEngine = new JsonEngine();
}

void TearDown() override
{
delete jsonEngine;
}

std::string fontFamilyToString(Firebolt::Accessibility::FontFamily fontFamily)
{
std::string str = "";
switch (fontFamily)
{
case Firebolt::Accessibility::FontFamily::MONOSPACED_SERIF:
str = "monospaced_serif";
break;
case Firebolt::Accessibility::FontFamily::PROPORTIONAL_SERIF:
str = "proportional_serif";
break;
case Firebolt::Accessibility::FontFamily::MONOSPACED_SANSERIF:
str = "monospaced_sanserif";
break;
case Firebolt::Accessibility::FontFamily::PROPORTIONAL_SANSERIF:
str = "proportional_sanserif";
break;
case Firebolt::Accessibility::FontFamily::SMALLCAPS:
str = "smallcaps";
break;
case Firebolt::Accessibility::FontFamily::CURSIVE:
str = "cursive";
break;
case Firebolt::Accessibility::FontFamily::CASUAL:
str = "casual";
break;
default:
str = "unknown";
}
return str;
}

std::string fontEdgeToString(Firebolt::Accessibility::FontEdge fontEdge)
{
std::string str = "";
switch (fontEdge)
{
case Firebolt::Accessibility::FontEdge::NONE:
str = "none";
break;
case Firebolt::Accessibility::FontEdge::RAISED:
str = "raised";
break;
case Firebolt::Accessibility::FontEdge::DEPRESSED:
str = "depressed";
break;
case Firebolt::Accessibility::FontEdge::UNIFORM:
str = "uniform";
break;
case Firebolt::Accessibility::FontEdge::DROP_SHADOW_LEFT:
str = "drop_shadow_left";
break;
case Firebolt::Accessibility::FontEdge::DROP_SHADOW_RIGHT:
str = "drop_shadow_right";
break;
default:
str = "unknown";
}
return str;
}
};

TEST_F(AccessibilityTest, ClosedCaptions)
{
nlohmann::json_abi_v3_11_3::json expectedValues = nlohmann::json::parse(jsonEngine->get_value("Accessibility.closedCaptions"));

Firebolt::Accessibility::ClosedCaptionsSettings closedCaptions = Firebolt::IFireboltAccessor::Instance().AccessibilityInterface().closedCaptions(&error);

EXPECT_EQ(error, Firebolt::Error::None) << "Failed to retrieve closedCaptions from Accessibility.closedCaptions() method";
EXPECT_EQ(closedCaptions.enabled, expectedValues["enabled"]);

if (closedCaptions.styles.has_value()) {
const auto& styles = closedCaptions.styles.value();

if (styles.backgroundColor.has_value())
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What if styles.background doesn't have a value? Will this pass or fail? Is there a way to enforce that if our example has "styles.backgroundColor" then the result should and fail if that's not the case? This applies to all other elements as well.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're correct that the current implementation does not explicitly enforce that styles.backgroundColor and other fields must exist in both the actual result and the expected values. If the actual result is missing a field while the expected values contain it, the test will simply skip the EXPECT_EQ comparison, which could potentially lead to false positives if the field was expected but not present.

We could maybe do something like this:

if (expectedValues["styles"].contains("backgroundColor")) {
    ASSERT_TRUE(styles.backgroundColor.has_value()) << "Expected backgroundColor, but it is missing";
    EXPECT_EQ(styles.backgroundColor.value(), expectedValues["styles"]["backgroundColor"]);
}

EXPECT_EQ(styles.backgroundColor.value(), expectedValues["styles"]["backgroundColor"]);

if (styles.backgroundOpacity.has_value())
EXPECT_EQ(styles.backgroundOpacity.value(), expectedValues["styles"]["backgroundOpacity"]);

if (styles.fontColor.has_value())
EXPECT_EQ(styles.fontColor.value(), expectedValues["styles"]["fontColor"]);

if (styles.fontEdge.has_value())
EXPECT_EQ(fontEdgeToString(styles.fontEdge.value()), expectedValues["styles"]["fontEdge"]);

if (styles.fontEdgeColor.has_value())
EXPECT_EQ(styles.fontEdgeColor.value(), expectedValues["styles"]["fontEdgeColor"]);

if (styles.fontFamily.has_value())
EXPECT_EQ(fontFamilyToString(styles.fontFamily.value()), expectedValues["styles"]["fontFamily"]);

if (styles.fontOpacity.has_value())
EXPECT_EQ(styles.fontOpacity.value(), expectedValues["styles"]["fontOpacity"]);

if (styles.fontSize.has_value())
EXPECT_EQ(styles.fontSize.value(), expectedValues["styles"]["fontSize"]);

if (styles.textAlign.has_value())
EXPECT_EQ(styles.textAlign.value(), expectedValues["styles"]["textAlign"]);

if (styles.textAlignVertical.has_value())
EXPECT_EQ(styles.textAlignVertical.value(), expectedValues["styles"]["textAlignVertical"]);

if (styles.windowColor.has_value())
EXPECT_EQ(styles.windowColor.value(), expectedValues["styles"]["windowColor"]);

if (styles.windowOpacity.has_value())
EXPECT_EQ(styles.windowOpacity.value(), expectedValues["styles"]["windowOpacity"]);
}

EXPECT_EQ(closedCaptions.preferredLanguages.value()[0], expectedValues["preferredLanguages"][0]);
EXPECT_EQ(closedCaptions.preferredLanguages.value()[1], expectedValues["preferredLanguages"][1]);
}

TEST_F(AccessibilityTest, ClosedCaptionsSettings)
{
nlohmann::json_abi_v3_11_3::json expectedValues = nlohmann::json::parse(jsonEngine->get_value("Accessibility.closedCaptionsSettings"));

Firebolt::Accessibility::ClosedCaptionsSettings closedCaptionSettings = Firebolt::IFireboltAccessor::Instance().AccessibilityInterface().closedCaptionsSettings(&error);

EXPECT_EQ(error, Firebolt::Error::None) << "Failed to retrieve closedCaptionSettings from Accessibility.closedCaptionSettings() method";
EXPECT_EQ(closedCaptionSettings.enabled, expectedValues["enabled"]);

if (closedCaptionSettings.styles.has_value()) {
const auto& styles = closedCaptionSettings.styles.value();

if (styles.backgroundColor.has_value())
EXPECT_EQ(styles.backgroundColor.value(), expectedValues["styles"]["backgroundColor"]);

if (styles.backgroundOpacity.has_value())
EXPECT_EQ(styles.backgroundOpacity.value(), expectedValues["styles"]["backgroundOpacity"]);

if (styles.fontColor.has_value())
EXPECT_EQ(styles.fontColor.value(), expectedValues["styles"]["fontColor"]);

if (styles.fontEdge.has_value())
EXPECT_EQ(fontEdgeToString(styles.fontEdge.value()), expectedValues["styles"]["fontEdge"]);

if (styles.fontEdgeColor.has_value())
EXPECT_EQ(styles.fontEdgeColor.value(), expectedValues["styles"]["fontEdgeColor"]);

if (styles.fontFamily.has_value())
EXPECT_EQ(fontFamilyToString(styles.fontFamily.value()), expectedValues["styles"]["fontFamily"]);

if (styles.fontOpacity.has_value())
EXPECT_EQ(styles.fontOpacity.value(), expectedValues["styles"]["fontOpacity"]);

if (styles.fontSize.has_value())
EXPECT_EQ(styles.fontSize.value(), expectedValues["styles"]["fontSize"]);

if (styles.textAlign.has_value())
EXPECT_EQ(styles.textAlign.value(), expectedValues["styles"]["textAlign"]);

if (styles.textAlignVertical.has_value())
EXPECT_EQ(styles.textAlignVertical.value(), expectedValues["styles"]["textAlignVertical"]);

if (styles.windowColor.has_value())
EXPECT_EQ(styles.windowColor.value(), expectedValues["styles"]["windowColor"]);

if (styles.windowOpacity.has_value())
EXPECT_EQ(styles.windowOpacity.value(), expectedValues["styles"]["windowOpacity"]);
}

EXPECT_EQ(closedCaptionSettings.preferredLanguages.value()[0], expectedValues["preferredLanguages"][0]);
EXPECT_EQ(closedCaptionSettings.preferredLanguages.value()[1], expectedValues["preferredLanguages"][1]);
}

TEST_F(AccessibilityTest, VoiceGuidance)
{
nlohmann::json_abi_v3_11_3::json expectedValues = nlohmann::json::parse(jsonEngine->get_value("Accessibility.voiceGuidance"));

auto voiceGuidance = Firebolt::IFireboltAccessor::Instance().AccessibilityInterface().voiceGuidance(&error);

EXPECT_EQ(error, Firebolt::Error::None) << "Failed to retrieve voiceGuidance from Accessibility.voiceGuidance() method";

EXPECT_EQ(voiceGuidance.enabled, expectedValues["enabled"]);
EXPECT_EQ(voiceGuidance.speed, expectedValues["speed"]);
}

TEST_F(AccessibilityTest, VoiceGuidanceSettings)
{
nlohmann::json_abi_v3_11_3::json expectedValues = nlohmann::json::parse(jsonEngine->get_value("Accessibility.voiceGuidanceSettings"));

auto voiceGuidanceSettings = Firebolt::IFireboltAccessor::Instance().AccessibilityInterface().voiceGuidanceSettings(&error);

EXPECT_EQ(error, Firebolt::Error::None) << "Failed to retrieve voiceGuidanceSettings from Accessibility.voiceGuidanceSettings() method";

EXPECT_EQ(voiceGuidanceSettings.enabled, expectedValues["enabled"]);
EXPECT_EQ(voiceGuidanceSettings.speed, expectedValues["speed"]);
}

TEST_F(AccessibilityTest, AudioDescriptionSettings)
{
nlohmann::json_abi_v3_11_3::json expectedValues = nlohmann::json::parse(jsonEngine->get_value("Accessibility.audioDescriptionSettings"));

auto audioDescriptionSettings = Firebolt::IFireboltAccessor::Instance().AccessibilityInterface().audioDescriptionSettings(&error);

EXPECT_EQ(error, Firebolt::Error::None) << "Failed to retrieve audioDescriptionSettings from Accessibility.audioDescriptionSettings() method";

EXPECT_EQ(audioDescriptionSettings.enabled, expectedValues["enabled"]);
}

struct ClosedCaptionsChange : public Firebolt::Accessibility::IAccessibility::IOnClosedCaptionsSettingsChangedNotification {
void onClosedCaptionsSettingsChanged(const Firebolt::Accessibility::ClosedCaptionsSettings&) override;
};

// Below function is for when the event trigger via setter is done
Firebolt::Accessibility::ClosedCaptionsSettings newSettings;
void ClosedCaptionsChange::onClosedCaptionsSettingsChanged(const Firebolt::Accessibility::ClosedCaptionsSettings& closedCaptionsSettings)
{
std::cout << "ClosedCaptionsSettingsChanged event fired" << std::endl;
newSettings = closedCaptionsSettings;
}

TEST_F(AccessibilityTest, subscribeOnClosedCaptionsSettingsChanged)
{
Firebolt::Error error = Firebolt::Error::None;
ClosedCaptionsChange closedCaptionsChange;
Firebolt::IFireboltAccessor::Instance().AccessibilityInterface().subscribe(closedCaptionsChange, &error);
std::cout << " error: " << static_cast<int>(error) << std::endl;
EXPECT_EQ(error, Firebolt::Error::None);
/* Since there is no return value for event subscription, error would be the only validation for now.
Returning a mock event response from open rpc and validating it against expected values from open rpc might not be of value.
This comment is applicable to all event unit tests.
*/
}

TEST_F(AccessibilityTest, unsubscribeOnClosedCaptionsSettingsChanged)
{
Firebolt::Error error = Firebolt::Error::None;
ClosedCaptionsChange closedCaptionsChange;
Firebolt::IFireboltAccessor::Instance().AccessibilityInterface().unsubscribe(closedCaptionsChange, &error);
std::cout << " error: " << static_cast<int>(error) << std::endl;
EXPECT_EQ(error, Firebolt::Error::None);
}

struct VoiceGuidanceSettings : public Firebolt::Accessibility::IAccessibility::IOnVoiceGuidanceSettingsChangedNotification {
void onVoiceGuidanceSettingsChanged(const Firebolt::Accessibility::VoiceGuidanceSettings&) override;
};

// Below function is for when the event trigger via setter is done
Firebolt::Accessibility::VoiceGuidanceSettings newVoiceGuidanceSettings;
void VoiceGuidanceSettings::onVoiceGuidanceSettingsChanged(const Firebolt::Accessibility::VoiceGuidanceSettings& voiceGuidanceSettings)
{
std::cout << "VoiceGuidanceSettingsChanged event fired" << std::endl;
newVoiceGuidanceSettings = voiceGuidanceSettings;
}

TEST_F(AccessibilityTest, subscribeOnVoiceGuidanceSettingsChanged)
{
Firebolt::Error error = Firebolt::Error::None;
VoiceGuidanceSettings voiceGuidanceSettings;
Firebolt::IFireboltAccessor::Instance().AccessibilityInterface().subscribe(voiceGuidanceSettings, &error);
std::cout << " error: " << static_cast<int>(error) << std::endl;
EXPECT_EQ(error, Firebolt::Error::None);
}

TEST_F(AccessibilityTest, unsubscribeOnVoiceGuidanceSettingsChanged)
{
Firebolt::Error error = Firebolt::Error::None;
VoiceGuidanceSettings voiceGuidanceSettings;
Firebolt::IFireboltAccessor::Instance().AccessibilityInterface().unsubscribe(voiceGuidanceSettings, &error);
std::cout << " error: " << static_cast<int>(error) << std::endl;
EXPECT_EQ(error, Firebolt::Error::None);
}

struct AudioDescriptionSettings : public Firebolt::Accessibility::IAccessibility::IOnAudioDescriptionSettingsChangedNotification {
void onAudioDescriptionSettingsChanged(const Firebolt::Accessibility::AudioDescriptionSettings&) override;
};

// Below function is for when the event trigger via setter is done
Firebolt::Accessibility::AudioDescriptionSettings newAudioDescriptionSettings;
void AudioDescriptionSettings::onAudioDescriptionSettingsChanged(const Firebolt::Accessibility::AudioDescriptionSettings& audioDescriptionSettings)
{
std::cout << "AudioDescriptionSettingsChanged event fired" << std::endl;
newAudioDescriptionSettings = audioDescriptionSettings;
}

TEST_F(AccessibilityTest, subscribeOnAudioDescriptionSettingsChanged)
{
Firebolt::Error error = Firebolt::Error::None;
AudioDescriptionSettings audioDescriptionSettings;
Firebolt::IFireboltAccessor::Instance().AccessibilityInterface().subscribe(audioDescriptionSettings, &error);
std::cout << " error: " << static_cast<int>(error) << std::endl;
EXPECT_EQ(error, Firebolt::Error::None);
}

TEST_F(AccessibilityTest, unsubscribeOnAudioDescriptionSettingsChanged)
{
Firebolt::Error error = Firebolt::Error::None;
AudioDescriptionSettings audioDescriptionSettings;
Firebolt::IFireboltAccessor::Instance().AccessibilityInterface().unsubscribe(audioDescriptionSettings, &error);
std::cout << " error: " << static_cast<int>(error) << std::endl;
EXPECT_EQ(error, Firebolt::Error::None);
}
Loading
Loading