diff options
author | JackLivio <jack@livio.io> | 2018-08-05 12:16:38 -0400 |
---|---|---|
committer | JackLivio <jack@livio.io> | 2018-08-05 12:16:38 -0400 |
commit | 048d29f42ca4a1b18c70eea7e5222f45d7d92639 (patch) | |
tree | 3ba5273a98b497fce7cfa4117dc7f2a7f4ae925e | |
parent | 4a5afcf8cac695c88635f4bf791f03fa8bc98bc0 (diff) | |
download | sdl_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.h | 2 | ||||
-rw-r--r-- | src/components/smart_objects/include/smart_objects/enum_schema_item.h | 82 |
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 |