-
Notifications
You must be signed in to change notification settings - Fork 24
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
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 1a139ca
test(core): Accessibility module unit tests
AdityaKasar 415ff9b
test(core): Account module unit tests
AdityaKasar 2b448ef
test(core): Advertising module unit tests
AdityaKasar a4e6e04
test(core): Authentication module unit tests
AdityaKasar 0bb732c
test(core): Capabilities module unit tests
AdityaKasar 1cec81d
test(core): Device module unit tests
AdityaKasar 87b4622
test(core): Lifecycle module unit tests
AdityaKasar 9d8e743
test(core): Metrics module unit tests
AdityaKasar 9fb9be6
test(core): Parameters module unit tests
AdityaKasar 24e2020
test(core): Profile module unit tests
AdityaKasar 9436e4c
Merge branch 'next' into feature/native-core-sdk-unit-tests
ksentak a3a40bc
Correct unit tests that were not compiling correctly
ksentak faad7c0
test(core): Localization unit tests
ksentak a366a48
Native SDK events unit tests initial commit
parag-pv 1f0e075
Adding event tests for voiceGuidance and audioDescriptions
parag-pv 5c00111
test(core): Keyboard unit tests
ksentak 29f49c6
test(core): Discovery unit tests
ksentak 5081566
test(core): Update parameters.initialization
ksentak df3f041
test(core): Additional Lifecycle unit test
ksentak 8741ea4
Comment changes
parag-pv 518ab64
test(core): SecureStorage unit tests
ksentak 21bb70c
test(core): SecondScreen unit tests
ksentak dd5ecc4
Merge branch 'feature/native-core-sdk-unit-tests-part-ii' into featur…
ksentak File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
314
src/sdks/core/src/cpp/sdk/cpptest/unit/accessibilityTest.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()) | ||
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); | ||
} |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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: