summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJackLivio <jack@livio.io>2018-08-05 12:16:38 -0400
committerJackLivio <jack@livio.io>2018-08-05 12:16:38 -0400
commit048d29f42ca4a1b18c70eea7e5222f45d7d92639 (patch)
tree3ba5273a98b497fce7cfa4117dc7f2a7f4ae925e
parent4a5afcf8cac695c88635f4bf791f03fa8bc98bc0 (diff)
downloadsdl_core-048d29f42ca4a1b18c70eea7e5222f45d7d92639.tar.gz
Fixes in history logic for enums
Test case includes addition of play_pase for apps > 4.5.0, or the OK button being removed for apps >4.5.0
-rw-r--r--src/components/include/utils/semantic_version.h2
-rw-r--r--src/components/smart_objects/include/smart_objects/enum_schema_item.h82
2 files changed, 80 insertions, 4 deletions
diff --git a/src/components/include/utils/semantic_version.h b/src/components/include/utils/semantic_version.h
index 905f6b0c2e..3e536e550d 100644
--- a/src/components/include/utils/semantic_version.h
+++ b/src/components/include/utils/semantic_version.h
@@ -100,7 +100,7 @@ struct SemanticVersion {
}
}
- const std::string toString() {
+ const std::string toString() const{
std::string result = "";
result += std::to_string(major_version);
result += ".";
diff --git a/src/components/smart_objects/include/smart_objects/enum_schema_item.h b/src/components/smart_objects/include/smart_objects/enum_schema_item.h
index b0fd0ca418..45df7476e0 100644
--- a/src/components/smart_objects/include/smart_objects/enum_schema_item.h
+++ b/src/components/smart_objects/include/smart_objects/enum_schema_item.h
@@ -167,7 +167,7 @@ class TEnumSchemaItem : public CDefaultSchemaItem<EnumType> {
* @brief Set of allowed enumeration elements.
**/
const std::set<EnumType> mAllowedElements;
- const std::map<EnumType, std::vector<ElementSignature>> mElementSignatures;
+ std::map<EnumType, std::vector<ElementSignature>> mElementSignatures;
/**
* @brief Default value.
**/
@@ -318,7 +318,81 @@ Errors::eType TEnumSchemaItem<EnumType>::validate(
template <typename EnumType>
Errors::eType TEnumSchemaItem<EnumType>::validate(
const SmartObject& Object, rpc::ValidationReport* report__, const utils::SemanticVersion& MessageVersion) {
- return validate(Object, report__);
+ if (SmartType_Integer != Object.getType()) {
+ std::string validation_info;
+ if (SmartType_String == Object.getType()) {
+ validation_info = "Invalid enum value: " + Object.asString();
+ } else {
+ validation_info = "Incorrect type, expected: " +
+ SmartObject::typeToString(SmartType_Integer) +
+ " (enum), got: " +
+ SmartObject::typeToString(Object.getType());
+ }
+ report__->set_validation_info(validation_info);
+ return Errors::INVALID_VALUE;
+ }
+
+ auto elements_it = mAllowedElements.find(static_cast<EnumType>(Object.asInt()));
+
+ if (elements_it ==
+ mAllowedElements.end()) {
+ std::stringstream stream;
+ stream << "Invalid enum value: " << Object.asInt();
+ std::string validation_info = stream.str();
+ report__->set_validation_info(validation_info);
+ return Errors::OUT_OF_RANGE;
+ }
+
+ //Element exists in schema. Check if version is also valid.
+ if (MessageVersion.isValid()) {
+ EnumType value = *elements_it;
+ auto signatures_it = mElementSignatures.find(value);
+ if (signatures_it != mElementSignatures.end()) {
+ if ( ! signatures_it->second.empty()) {
+ for (uint i=0; i<signatures_it->second.size(); i++) {
+ ElementSignature signature = signatures_it->second[i];
+ // Check if signature matches message version
+ if (signature.mSince.is_initialized()) {
+ if (MessageVersion < signature.mSince.get()) {
+ //Msg version predates 'since' field, check next entry
+ continue;
+ } else {
+ if (signature.mUntil.is_initialized() && (MessageVersion >= signature.mUntil.get())) {
+ continue; //Msg version newer than `until` field
+ } else {
+ //Found correct version
+ if (signature.mRemoved) {
+ //Element was removed for this version
+ std::string validation_info = "Invalid enum value: " + Object.asString() + " removed for SyncMsgVersion " + MessageVersion.toString();
+ report__->set_validation_info(validation_info);
+ return Errors::INVALID_VALUE;
+ }
+ return Errors::OK; //Mobile msg version falls within specified version range and is not removed
+ }
+ }
+ } //end if signature.mSince.is_initialized()
+
+ if (signature.mUntil.is_initialized() && (MessageVersion >= signature.mUntil.get())) {
+ continue; //Msg version newer than `until` field, check next entry
+ } else {
+ //Found correct version
+ if (signature.mRemoved) {
+ //Element was removed for this version
+ std::string validation_info = "Enum value : " + Object.asString() + " removed for SyncMsgVersion " + MessageVersion.toString();
+ report__->set_validation_info(validation_info);
+ return Errors::INVALID_VALUE;
+ }
+ return Errors::OK; //Mobile msg version falls within specified version range and is not removed
+ }
+ } // End For Loop Version not found.
+ std::string validation_info = "Invalid enum value: " + Object.asString() + " for SyncMsgVersion " + MessageVersion.toString();
+ report__->set_validation_info(validation_info);
+ return Errors::INVALID_VALUE;
+ }
+ }
+ }
+
+ return Errors::OK;
}
template <typename EnumType>
@@ -366,7 +440,9 @@ TEnumSchemaItem<EnumType>::TEnumSchemaItem(
const std::map<EnumType, std::vector<ElementSignature>>& ElementSignatures)
: CDefaultSchemaItem<EnumType>(DefaultValue)
, mAllowedElements(AllowedElements)
- , mElementSignatures(mElementSignatures) {}
+ {
+ mElementSignatures = ElementSignatures;
+ }
} // namespace NsSmartObjects
} // namespace NsSmartDeviceLink