summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Keeler <jacob.keeler@livioradio.com>2020-10-22 09:53:33 -0400
committerGitHub <noreply@github.com>2020-10-22 09:53:33 -0400
commit2f98cb81a2d3f3b47feddf11ccc80a2d5a92aaf5 (patch)
tree83853aadfa14d98828eaf553809f98f060d7fc03
parent0ee2d8871fde1eccb21ca24be27c59eef4cf85c8 (diff)
downloadsdl_core-2f98cb81a2d3f3b47feddf11ccc80a2d5a92aaf5.tar.gz
Add defvalue to policy table schema (#3530)
* Add defvalue to policy table schema
-rw-r--r--src/appMain/sdl_preloaded_pt.json8
-rw-r--r--src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_data_item_schema.cc30
-rw-r--r--src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/vehicle_data_item_schema_test.cc1
-rw-r--r--src/components/policy/policy_external/include/policy/policy_table/types.h7
-rw-r--r--src/components/policy/policy_external/src/policy_table/types.cc73
-rw-r--r--src/components/policy/policy_external/src/sql_pt_queries.cc4
-rw-r--r--src/components/policy/policy_external/src/sql_pt_representation.cc42
-rw-r--r--src/components/policy/policy_external/test/sql_pt_representation_test.cc1
-rw-r--r--src/components/policy/policy_regular/include/policy/policy_table/types.h7
-rw-r--r--src/components/policy/policy_regular/src/policy_table/types.cc73
-rw-r--r--src/components/policy/policy_regular/src/sql_pt_queries.cc4
-rw-r--r--src/components/policy/policy_regular/src/sql_pt_representation.cc42
-rw-r--r--src/components/policy/policy_regular/test/sql_pt_representation_test.cc1
-rw-r--r--src/components/policy/policy_regular/test/vehicle_data_item_type_test.cc13
-rw-r--r--src/components/rpc_base/include/rpc_base/rpc_base_json_inl.h2
15 files changed, 246 insertions, 62 deletions
diff --git a/src/appMain/sdl_preloaded_pt.json b/src/appMain/sdl_preloaded_pt.json
index a4dd100a43..eff433fd1e 100644
--- a/src/appMain/sdl_preloaded_pt.json
+++ b/src/appMain/sdl_preloaded_pt.json
@@ -4091,7 +4091,7 @@
"key": "OEM_REF_WND_LOC_LVL",
"type": "Integer",
"mandatory": false,
- "defvalue" : 0,
+ "defvalue" : "0",
"minvalue": -1,
"maxvalue": 100
},
@@ -4100,7 +4100,7 @@
"key": "OEM_REF_WND_LOC_COLSPN",
"type": "Integer",
"mandatory": false,
- "defvalue" : 1,
+ "defvalue" : "1",
"minvalue": 1,
"maxvalue": 100
},
@@ -4109,7 +4109,7 @@
"key": "OEM_REF_WND_LOC_ROWSPN",
"type": "Integer",
"mandatory": false,
- "defvalue" : 1,
+ "defvalue" : "1",
"minvalue": 1,
"maxvalue": 100
},
@@ -4118,7 +4118,7 @@
"key": "OEM_REF_WND_LOC_LVLSPN",
"type": "Integer",
"mandatory": false,
- "defvalue" : 1,
+ "defvalue" : "1",
"minvalue": 1,
"maxvalue": 100
}
diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_data_item_schema.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_data_item_schema.cc
index b4ae7aca45..dce0a41183 100644
--- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_data_item_schema.cc
+++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_data_item_schema.cc
@@ -117,16 +117,21 @@ smart_objects::ISchemaItemPtr VehicleDataItemSchema::GetPODTypeSchema(
using FloatItemParam = smart_objects::TSchemaItemParameter<double>;
using StringSchemaItem = smart_objects::CStringSchemaItem;
using StringItemParam = smart_objects::TSchemaItemParameter<size_t>;
+ using StringItemValueParam = smart_objects::TSchemaItemParameter<std::string>;
using BoolSchemaItem = smart_objects::CBoolSchemaItem;
using BoolItemParam = smart_objects::TSchemaItemParameter<bool>;
if (policy_item.type == policy_table::VehicleDataItem::kInteger) {
- return IntSchemaItem::create(policy_item.minvalue.is_initialized()
- ? IntItemParam(*policy_item.minvalue)
- : IntItemParam(),
- policy_item.maxvalue.is_initialized()
- ? IntItemParam(*policy_item.maxvalue)
- : IntItemParam());
+ return IntSchemaItem::create(
+ policy_item.minvalue.is_initialized()
+ ? IntItemParam(*policy_item.minvalue)
+ : IntItemParam(),
+ policy_item.maxvalue.is_initialized()
+ ? IntItemParam(*policy_item.maxvalue)
+ : IntItemParam(),
+ policy_item.defvalue.is_initialized()
+ ? IntItemParam(std::stol(*policy_item.defvalue))
+ : IntItemParam());
}
if (policy_item.type == policy_table::VehicleDataItem::kFloat ||
policy_item.type == policy_table::VehicleDataItem::kDouble) {
@@ -136,6 +141,9 @@ smart_objects::ISchemaItemPtr VehicleDataItemSchema::GetPODTypeSchema(
: FloatItemParam(),
policy_item.maxvalue.is_initialized()
? FloatItemParam(double(*policy_item.maxvalue))
+ : FloatItemParam(),
+ policy_item.defvalue.is_initialized()
+ ? FloatItemParam(std::stod(*policy_item.defvalue))
: FloatItemParam());
}
if (policy_item.type == policy_table::VehicleDataItem::kString) {
@@ -145,10 +153,16 @@ smart_objects::ISchemaItemPtr VehicleDataItemSchema::GetPODTypeSchema(
: 0),
policy_item.maxlength.is_initialized()
? StringItemParam(*policy_item.maxlength)
- : StringItemParam());
+ : StringItemParam(),
+ policy_item.defvalue.is_initialized()
+ ? StringItemValueParam(std::string(*policy_item.defvalue))
+ : StringItemValueParam());
}
if (policy_item.type == policy_table::VehicleDataItem::kBoolean) {
- return BoolSchemaItem::create(BoolItemParam(true));
+ return BoolSchemaItem::create(
+ policy_item.defvalue.is_initialized()
+ ? BoolItemParam(*policy_item.defvalue == "true")
+ : BoolItemParam());
}
std::string error_msg = std::string("Invalid POD type provided: ") +
diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/vehicle_data_item_schema_test.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/vehicle_data_item_schema_test.cc
index 2443310409..262fef39f6 100644
--- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/vehicle_data_item_schema_test.cc
+++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/vehicle_data_item_schema_test.cc
@@ -85,6 +85,7 @@ class VehicleDataItemSchemaTest : public ::testing::Test {
schema.params->mark_initialized();
schema.mandatory = true;
*schema.array = false;
+ *schema.defvalue = "10";
// default value bounds
*schema.minvalue = 10;
*schema.maxvalue = 100;
diff --git a/src/components/policy/policy_external/include/policy/policy_table/types.h b/src/components/policy/policy_external/include/policy/policy_table/types.h
index c95802f181..6b2f05d336 100644
--- a/src/components/policy/policy_external/include/policy/policy_table/types.h
+++ b/src/components/policy/policy_external/include/policy/policy_table/types.h
@@ -654,6 +654,7 @@ struct VehicleDataItem : CompositeType {
Optional<String<0, 255> > until;
Optional<Boolean> removed;
Optional<Boolean> deprecated;
+ Optional<String<0, UINT32_MAX> > defvalue;
Optional<Float<-INT32_MAX, INT32_MAX> > minvalue;
Optional<Float<-INT32_MAX, INT32_MAX> > maxvalue;
Optional<Integer<uint32_t, 0, UINT32_MAX> > minsize;
@@ -682,6 +683,12 @@ struct VehicleDataItem : CompositeType {
* @return true if type is valid.
*/
bool ValidateTypes() const;
+ /**
+ * @brief Validates default value of vehicle data item based
+ * on type, unable to validate enum values
+ * @return true if defvalue is valid.
+ */
+ bool ValidateDefault() const;
bool IsPrimitiveType() const;
bool ValidateNaming(std::string str) const;
diff --git a/src/components/policy/policy_external/src/policy_table/types.cc b/src/components/policy/policy_external/src/policy_table/types.cc
index 0194ac68a3..243cf98066 100644
--- a/src/components/policy/policy_external/src/policy_table/types.cc
+++ b/src/components/policy/policy_external/src/policy_table/types.cc
@@ -1,5 +1,8 @@
#include "policy/policy_table/types.h"
+
#include <algorithm>
+#include <regex>
+
#include "rpc_base/rpc_base_json_inl.h"
namespace rpc {
@@ -2216,6 +2219,7 @@ VehicleDataItem::VehicleDataItem(const VehicleDataItem& vehicle_data)
, until(vehicle_data.until)
, removed(vehicle_data.removed)
, deprecated(vehicle_data.deprecated)
+ , defvalue(vehicle_data.defvalue)
, minvalue(vehicle_data.minvalue)
, maxvalue(vehicle_data.maxvalue)
, minsize(vehicle_data.minsize)
@@ -2235,12 +2239,17 @@ VehicleDataItem::VehicleDataItem(const Json::Value* value__)
, until(impl::ValueMember(value__, "until"))
, removed(impl::ValueMember(value__, "removed"))
, deprecated(impl::ValueMember(value__, "deprecated"))
+ , defvalue(static_cast<Json::Value*>(nullptr))
, minvalue(impl::ValueMember(value__, "minvalue"))
, maxvalue(impl::ValueMember(value__, "maxvalue"))
, minsize(impl::ValueMember(value__, "minsize"))
, maxsize(impl::ValueMember(value__, "maxsize"))
, minlength(impl::ValueMember(value__, "minlength"))
- , maxlength(impl::ValueMember(value__, "maxlength")) {}
+ , maxlength(impl::ValueMember(value__, "maxlength")) {
+ if (value__->isMember("defvalue")) {
+ *defvalue = impl::ValueMember(value__, "defvalue")->asString();
+ }
+}
VehicleDataItem::~VehicleDataItem() {}
@@ -2266,6 +2275,7 @@ Json::Value VehicleDataItem::ToJsonValue() const {
impl::WriteJsonField("until", until, &ret);
impl::WriteJsonField("removed", removed, &ret);
impl::WriteJsonField("deprecated", deprecated, &ret);
+ impl::WriteJsonField("defvalue", defvalue, &ret);
impl::WriteJsonField("minvalue", minvalue, &ret);
impl::WriteJsonField("maxvalue", maxvalue, &ret);
impl::WriteJsonField("minsize", minsize, &ret);
@@ -2280,9 +2290,10 @@ bool VehicleDataItem::operator==(const VehicleDataItem& vd) {
mandatory == vd.mandatory && params == vd.params &&
array == vd.array && since == vd.since && until == vd.until &&
removed == vd.removed && deprecated == vd.deprecated &&
- minvalue == vd.minvalue && maxvalue == vd.maxvalue &&
- minsize == vd.minsize && maxsize == vd.maxsize &&
- minlength == vd.minlength && maxlength == vd.maxlength);
+ defvalue == vd.defvalue && minvalue == vd.minvalue &&
+ maxvalue == vd.maxvalue && minsize == vd.minsize &&
+ maxsize == vd.maxsize && minlength == vd.minlength &&
+ maxlength == vd.maxlength);
}
bool VehicleDataItem::is_valid() const {
@@ -2316,6 +2327,9 @@ bool VehicleDataItem::is_valid() const {
if (!deprecated.is_valid()) {
return false;
}
+ if (!(defvalue.is_valid() && ValidateDefault())) {
+ return false;
+ }
if (!minvalue.is_valid()) {
return false;
}
@@ -2372,6 +2386,9 @@ bool VehicleDataItem::struct_not_empty() const {
if (!deprecated.is_initialized()) {
return false;
}
+ if (!defvalue.is_initialized()) {
+ return false;
+ }
if (!minvalue.is_initialized()) {
return false;
}
@@ -2442,6 +2459,13 @@ void VehicleDataItem::ReportErrors(rpc::ValidationReport* report__) const {
if (!deprecated.is_valid()) {
deprecated.ReportErrors(&report__->ReportSubobject("deprecated"));
}
+ if (!defvalue.is_valid()) {
+ defvalue.ReportErrors(&report__->ReportSubobject("defvalue"));
+ }
+ if (!ValidateDefault()) {
+ report__->set_validation_info("Invalid default value: " +
+ std::string(*defvalue));
+ }
if (!minvalue.is_valid()) {
minvalue.ReportErrors(&report__->ReportSubobject("minvalue"));
}
@@ -2474,6 +2498,7 @@ void VehicleDataItem::SetPolicyTableType(PolicyTableType pt_type) {
until.SetPolicyTableType(pt_type);
removed.SetPolicyTableType(pt_type);
deprecated.SetPolicyTableType(pt_type);
+ defvalue.SetPolicyTableType(pt_type);
minvalue.SetPolicyTableType(pt_type);
maxvalue.SetPolicyTableType(pt_type);
minsize.SetPolicyTableType(pt_type);
@@ -2509,6 +2534,46 @@ bool VehicleDataItem::ValidateNaming(std::string str) const {
!contains_spec_chars(str);
}
+bool VehicleDataItem::ValidateDefault() const {
+ if (!defvalue.is_initialized()) {
+ return true;
+ }
+ std::string value = std::string(*defvalue);
+ bool valid = false;
+ if (VehicleDataItem::kInteger == std::string(type)) {
+ // Match int
+ std::regex pattern("^-?\\d+$");
+ bool type_matches = std::regex_match(value, pattern);
+ if (type_matches) {
+ size_t int_value = std::stol(value);
+ valid = (!minvalue.is_initialized() || int_value >= *minvalue) &&
+ (!maxvalue.is_initialized() || int_value <= *maxvalue);
+ }
+ } else if (VehicleDataItem::kFloat == std::string(type) ||
+ VehicleDataItem::kDouble == std::string(type)) {
+ // Match double
+ std::regex pattern("^-?\\d+(\\.\\d+)?$");
+ bool type_matches = std::regex_match(value, pattern);
+ if (type_matches) {
+ double dbl_value = std::stod(value);
+ valid = (!minvalue.is_initialized() || dbl_value >= *minvalue) &&
+ (!maxvalue.is_initialized() || dbl_value <= *maxvalue);
+ }
+ } else if (VehicleDataItem::kString == std::string(type)) {
+ size_t length = value.length();
+ valid = (!minsize.is_initialized() || length >= *minsize) &&
+ (!maxsize.is_initialized() || length <= *maxsize);
+ } else if (VehicleDataItem::kBoolean == std::string(type)) {
+ valid = ("false" == value || "true" == value);
+ } else if (VehicleDataItem::kStruct != std::string(type) &&
+ !IsPrimitiveType()) {
+ // Enum values cannot be validated here
+ valid = true;
+ }
+
+ return valid;
+}
+
bool VehicleDataItem::ValidateTypes() const {
if (VehicleDataItem::kStruct == std::string(type)) {
return params.is_initialized() && !(params->empty()) && params.is_valid();
diff --git a/src/components/policy/policy_external/src/sql_pt_queries.cc b/src/components/policy/policy_external/src/sql_pt_queries.cc
index 95c82b6ea6..9e69d2cef8 100644
--- a/src/components/policy/policy_external/src/sql_pt_queries.cc
+++ b/src/components/policy/policy_external/src/sql_pt_queries.cc
@@ -480,6 +480,7 @@ const std::string kCreateSchema =
" `until` VARCHAR(45), "
" `removed` BOOL, "
" `deprecated` BOOL, "
+ " `defvalue` VARCHAR(65535), "
" `minvalue` INTEGER, "
" `maxvalue` INTEGER, "
" `minsize` INTEGER, "
@@ -759,13 +760,14 @@ const std::string kInsertVehicleDataItem =
" `until`, "
" `removed`, "
" `deprecated`, "
+ " `defvalue`, "
" `minvalue`, "
" `maxvalue`, "
" `minsize`, "
" `maxsize`, "
" `minlength`, "
" `maxlength`) "
- "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ";
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ";
const std::string kInsertVehicleDataItemParams =
"INSERT INTO `vehicle_data_item_parameters` ("
diff --git a/src/components/policy/policy_external/src/sql_pt_representation.cc b/src/components/policy/policy_external/src/sql_pt_representation.cc
index fc9ebd96a9..33db994a84 100644
--- a/src/components/policy/policy_external/src/sql_pt_representation.cc
+++ b/src/components/policy/policy_external/src/sql_pt_representation.cc
@@ -1711,22 +1711,25 @@ policy_table::VehicleDataItem SQLPTRepresentation::PopulateVDIFromQuery(
*result.deprecated = query.GetBoolean(8);
}
if (!query.IsNull(9)) {
- *result.minvalue = query.GetInteger(9);
+ *result.defvalue = query.GetString(9);
}
if (!query.IsNull(10)) {
- *result.maxvalue = query.GetInteger(10);
+ *result.minvalue = query.GetInteger(10);
}
if (!query.IsNull(11)) {
- *result.minsize = query.GetUInteger(11);
+ *result.maxvalue = query.GetInteger(11);
}
if (!query.IsNull(12)) {
- *result.maxsize = query.GetUInteger(12);
+ *result.minsize = query.GetUInteger(12);
}
if (!query.IsNull(13)) {
- *result.minlength = query.GetUInteger(13);
+ *result.maxsize = query.GetUInteger(13);
}
if (!query.IsNull(14)) {
- *result.maxlength = query.GetUInteger(14);
+ *result.minlength = query.GetUInteger(14);
+ }
+ if (!query.IsNull(15)) {
+ *result.maxlength = query.GetUInteger(15);
}
result.params->mark_initialized();
@@ -2630,24 +2633,27 @@ bool SQLPTRepresentation::InsertVehicleDataItem(
vehicle_data_item.deprecated.is_initialized()
? query.Bind(8, *vehicle_data_item.deprecated)
: query.Bind(8);
- vehicle_data_item.minvalue.is_initialized()
- ? query.Bind(9, *vehicle_data_item.minvalue)
+ vehicle_data_item.defvalue.is_initialized()
+ ? query.Bind(9, *vehicle_data_item.defvalue)
: query.Bind(9);
- vehicle_data_item.maxvalue.is_initialized()
- ? query.Bind(10, *vehicle_data_item.maxvalue)
+ vehicle_data_item.minvalue.is_initialized()
+ ? query.Bind(10, *vehicle_data_item.minvalue)
: query.Bind(10);
- vehicle_data_item.minsize.is_initialized()
- ? query.Bind(11, static_cast<int64_t>(*vehicle_data_item.minsize))
+ vehicle_data_item.maxvalue.is_initialized()
+ ? query.Bind(11, *vehicle_data_item.maxvalue)
: query.Bind(11);
- vehicle_data_item.maxsize.is_initialized()
- ? query.Bind(12, static_cast<int64_t>(*vehicle_data_item.maxsize))
+ vehicle_data_item.minsize.is_initialized()
+ ? query.Bind(12, static_cast<int64_t>(*vehicle_data_item.minsize))
: query.Bind(12);
- vehicle_data_item.minlength.is_initialized()
- ? query.Bind(13, static_cast<int64_t>(*vehicle_data_item.minlength))
+ vehicle_data_item.maxsize.is_initialized()
+ ? query.Bind(13, static_cast<int64_t>(*vehicle_data_item.maxsize))
: query.Bind(13);
- vehicle_data_item.maxlength.is_initialized()
- ? query.Bind(14, static_cast<int64_t>(*vehicle_data_item.maxlength))
+ vehicle_data_item.minlength.is_initialized()
+ ? query.Bind(14, static_cast<int64_t>(*vehicle_data_item.minlength))
: query.Bind(14);
+ vehicle_data_item.maxlength.is_initialized()
+ ? query.Bind(15, static_cast<int64_t>(*vehicle_data_item.maxlength))
+ : query.Bind(15);
if (!query.Exec() || !query.Reset()) {
SDL_LOG_ERROR("Failed to insert vehicle data item: "
diff --git a/src/components/policy/policy_external/test/sql_pt_representation_test.cc b/src/components/policy/policy_external/test/sql_pt_representation_test.cc
index 5495ef65b0..224c663c52 100644
--- a/src/components/policy/policy_external/test/sql_pt_representation_test.cc
+++ b/src/components/policy/policy_external/test/sql_pt_representation_test.cc
@@ -408,6 +408,7 @@ TEST_F(SQLPTRepresentationTest, VehicleDataItem_Store_Complete_Item) {
*message.until = "5.0";
*message.removed = false;
*message.deprecated = false;
+ *message.defvalue = "0";
*message.minvalue = 0;
*message.maxvalue = 255;
*message.minsize = 0;
diff --git a/src/components/policy/policy_regular/include/policy/policy_table/types.h b/src/components/policy/policy_regular/include/policy/policy_table/types.h
index 38d49bcc7c..673f17e32b 100644
--- a/src/components/policy/policy_regular/include/policy/policy_table/types.h
+++ b/src/components/policy/policy_regular/include/policy/policy_table/types.h
@@ -551,6 +551,7 @@ struct VehicleDataItem : CompositeType {
Optional<String<0, 255> > until;
Optional<Boolean> removed;
Optional<Boolean> deprecated;
+ Optional<String<0, UINT32_MAX> > defvalue;
Optional<Float<-INT32_MAX, INT32_MAX> > minvalue;
Optional<Float<-INT32_MAX, INT32_MAX> > maxvalue;
Optional<Integer<uint32_t, 0, UINT32_MAX> > minsize;
@@ -579,6 +580,12 @@ struct VehicleDataItem : CompositeType {
* @return true if type is valid.
*/
bool ValidateTypes() const;
+ /**
+ * @brief Validates default value of vehicle data item based
+ * on type, unable to validate enum values
+ * @return true if defvalue is valid.
+ */
+ bool ValidateDefault() const;
bool IsPrimitiveType() const;
bool ValidateNaming(std::string str) const;
diff --git a/src/components/policy/policy_regular/src/policy_table/types.cc b/src/components/policy/policy_regular/src/policy_table/types.cc
index 017a7e75cb..d3473bb2a7 100644
--- a/src/components/policy/policy_regular/src/policy_table/types.cc
+++ b/src/components/policy/policy_regular/src/policy_table/types.cc
@@ -1,5 +1,8 @@
// This file is generated, do not edit
#include "policy/policy_table/types.h"
+
+#include <regex>
+
#include "rpc_base/rpc_base_json_inl.h"
namespace rpc {
@@ -1676,6 +1679,7 @@ VehicleDataItem::VehicleDataItem(const VehicleDataItem& vehicle_data)
, until(vehicle_data.until)
, removed(vehicle_data.removed)
, deprecated(vehicle_data.deprecated)
+ , defvalue(vehicle_data.defvalue)
, minvalue(vehicle_data.minvalue)
, maxvalue(vehicle_data.maxvalue)
, minsize(vehicle_data.minsize)
@@ -1695,12 +1699,17 @@ VehicleDataItem::VehicleDataItem(const Json::Value* value__)
, until(impl::ValueMember(value__, "until"))
, removed(impl::ValueMember(value__, "removed"))
, deprecated(impl::ValueMember(value__, "deprecated"))
+ , defvalue(static_cast<Json::Value*>(nullptr))
, minvalue(impl::ValueMember(value__, "minvalue"))
, maxvalue(impl::ValueMember(value__, "maxvalue"))
, minsize(impl::ValueMember(value__, "minsize"))
, maxsize(impl::ValueMember(value__, "maxsize"))
, minlength(impl::ValueMember(value__, "minlength"))
- , maxlength(impl::ValueMember(value__, "maxlength")) {}
+ , maxlength(impl::ValueMember(value__, "maxlength")) {
+ if (value__->isMember("defvalue")) {
+ *defvalue = impl::ValueMember(value__, "defvalue")->asString();
+ }
+}
VehicleDataItem::~VehicleDataItem() {}
@@ -1726,6 +1735,7 @@ Json::Value VehicleDataItem::ToJsonValue() const {
impl::WriteJsonField("until", until, &ret);
impl::WriteJsonField("removed", removed, &ret);
impl::WriteJsonField("deprecated", deprecated, &ret);
+ impl::WriteJsonField("defvalue", defvalue, &ret);
impl::WriteJsonField("minvalue", minvalue, &ret);
impl::WriteJsonField("maxvalue", maxvalue, &ret);
impl::WriteJsonField("minsize", minsize, &ret);
@@ -1740,9 +1750,10 @@ bool VehicleDataItem::operator==(const VehicleDataItem& vd) {
mandatory == vd.mandatory && params == vd.params &&
array == vd.array && since == vd.since && until == vd.until &&
removed == vd.removed && deprecated == vd.deprecated &&
- minvalue == vd.minvalue && maxvalue == vd.maxvalue &&
- minsize == vd.minsize && maxsize == vd.maxsize &&
- minlength == vd.minlength && maxlength == vd.maxlength);
+ defvalue == vd.defvalue && minvalue == vd.minvalue &&
+ maxvalue == vd.maxvalue && minsize == vd.minsize &&
+ maxsize == vd.maxsize && minlength == vd.minlength &&
+ maxlength == vd.maxlength);
}
bool VehicleDataItem::is_valid() const {
@@ -1776,6 +1787,9 @@ bool VehicleDataItem::is_valid() const {
if (!deprecated.is_valid()) {
return false;
}
+ if (!(defvalue.is_valid() && ValidateDefault())) {
+ return false;
+ }
if (!minvalue.is_valid()) {
return false;
}
@@ -1832,6 +1846,9 @@ bool VehicleDataItem::struct_not_empty() const {
if (!deprecated.is_initialized()) {
return false;
}
+ if (!defvalue.is_initialized()) {
+ return false;
+ }
if (!minvalue.is_initialized()) {
return false;
}
@@ -1901,6 +1918,13 @@ void VehicleDataItem::ReportErrors(rpc::ValidationReport* report__) const {
if (!deprecated.is_valid()) {
deprecated.ReportErrors(&report__->ReportSubobject("deprecated"));
}
+ if (!defvalue.is_valid()) {
+ defvalue.ReportErrors(&report__->ReportSubobject("defvalue"));
+ }
+ if (!ValidateDefault()) {
+ report__->set_validation_info("Invalid default value: " +
+ std::string(*defvalue));
+ }
if (!minvalue.is_valid()) {
minvalue.ReportErrors(&report__->ReportSubobject("minvalue"));
}
@@ -1933,6 +1957,7 @@ void VehicleDataItem::SetPolicyTableType(PolicyTableType pt_type) {
until.SetPolicyTableType(pt_type);
removed.SetPolicyTableType(pt_type);
deprecated.SetPolicyTableType(pt_type);
+ defvalue.SetPolicyTableType(pt_type);
minvalue.SetPolicyTableType(pt_type);
maxvalue.SetPolicyTableType(pt_type);
minsize.SetPolicyTableType(pt_type);
@@ -1976,6 +2001,46 @@ bool VehicleDataItem::ValidateTypes() const {
return (!(params.is_initialized()) || params->empty());
}
+bool VehicleDataItem::ValidateDefault() const {
+ if (!defvalue.is_initialized()) {
+ return true;
+ }
+ std::string value = std::string(*defvalue);
+ bool valid = false;
+ if (VehicleDataItem::kInteger == std::string(type)) {
+ // Match int
+ std::regex pattern("^-?\\d+$");
+ bool type_matches = std::regex_match(value, pattern);
+ if (type_matches) {
+ size_t int_value = std::stol(value);
+ valid = (!minvalue.is_initialized() || int_value >= *minvalue) &&
+ (!maxvalue.is_initialized() || int_value <= *maxvalue);
+ }
+ } else if (VehicleDataItem::kFloat == std::string(type) ||
+ VehicleDataItem::kDouble == std::string(type)) {
+ // Match double
+ std::regex pattern("^-?\\d+(\\.\\d+)?$");
+ bool type_matches = std::regex_match(value, pattern);
+ if (type_matches) {
+ double dbl_value = std::stod(value);
+ valid = (!minvalue.is_initialized() || dbl_value >= *minvalue) &&
+ (!maxvalue.is_initialized() || dbl_value <= *maxvalue);
+ }
+ } else if (VehicleDataItem::kString == std::string(type)) {
+ size_t length = value.length();
+ valid = (!minsize.is_initialized() || length >= *minsize) &&
+ (!maxsize.is_initialized() || length <= *maxsize);
+ } else if (VehicleDataItem::kBoolean == std::string(type)) {
+ valid = ("false" == value || "true" == value);
+ } else if (VehicleDataItem::kStruct != std::string(type) &&
+ !IsPrimitiveType()) {
+ // Enum values cannot be validated here
+ valid = true;
+ }
+
+ return valid;
+}
+
bool VehicleDataItem::IsPrimitiveType() const {
return helpers::in_range(kPODTypes, std::string(type));
}
diff --git a/src/components/policy/policy_regular/src/sql_pt_queries.cc b/src/components/policy/policy_regular/src/sql_pt_queries.cc
index 4910ee32e9..cf9167406f 100644
--- a/src/components/policy/policy_regular/src/sql_pt_queries.cc
+++ b/src/components/policy/policy_regular/src/sql_pt_queries.cc
@@ -448,6 +448,7 @@ const std::string kCreateSchema =
" `until` VARCHAR(45), "
" `removed` BOOL, "
" `deprecated` BOOL, "
+ " `defvalue` VARCHAR(65535), "
" `minvalue` INTEGER, "
" `maxvalue` INTEGER, "
" `minsize` INTEGER, "
@@ -721,13 +722,14 @@ const std::string kInsertVehicleDataItem =
" `until`, "
" `removed`, "
" `deprecated`, "
+ " `defvalue`, "
" `minvalue`, "
" `maxvalue`, "
" `minsize`, "
" `maxsize`, "
" `minlength`, "
" `maxlength`) "
- "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ";
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ";
const std::string kInsertVehicleDataItemParams =
"INSERT INTO `vehicle_data_item_parameters` ("
diff --git a/src/components/policy/policy_regular/src/sql_pt_representation.cc b/src/components/policy/policy_regular/src/sql_pt_representation.cc
index bf578aebe5..09f9c28116 100644
--- a/src/components/policy/policy_regular/src/sql_pt_representation.cc
+++ b/src/components/policy/policy_regular/src/sql_pt_representation.cc
@@ -2625,22 +2625,25 @@ policy_table::VehicleDataItem SQLPTRepresentation::PopulateVDIFromQuery(
*result.deprecated = query.GetBoolean(8);
}
if (!query.IsNull(9)) {
- *result.minvalue = query.GetInteger(9);
+ *result.defvalue = query.GetString(9);
}
if (!query.IsNull(10)) {
- *result.maxvalue = query.GetInteger(10);
+ *result.minvalue = query.GetInteger(10);
}
if (!query.IsNull(11)) {
- *result.minsize = query.GetUInteger(11);
+ *result.maxvalue = query.GetInteger(11);
}
if (!query.IsNull(12)) {
- *result.maxsize = query.GetUInteger(12);
+ *result.minsize = query.GetUInteger(12);
}
if (!query.IsNull(13)) {
- *result.minlength = query.GetUInteger(13);
+ *result.maxsize = query.GetUInteger(13);
}
if (!query.IsNull(14)) {
- *result.maxlength = query.GetUInteger(14);
+ *result.minlength = query.GetUInteger(14);
+ }
+ if (!query.IsNull(15)) {
+ *result.maxlength = query.GetUInteger(15);
}
result.params->mark_initialized();
@@ -2688,24 +2691,27 @@ bool SQLPTRepresentation::InsertVehicleDataItem(
vehicle_data_item.deprecated.is_initialized()
? query.Bind(8, *vehicle_data_item.deprecated)
: query.Bind(8);
- vehicle_data_item.minvalue.is_initialized()
- ? query.Bind(9, *vehicle_data_item.minvalue)
+ vehicle_data_item.defvalue.is_initialized()
+ ? query.Bind(9, *vehicle_data_item.defvalue)
: query.Bind(9);
- vehicle_data_item.maxvalue.is_initialized()
- ? query.Bind(10, *vehicle_data_item.maxvalue)
+ vehicle_data_item.minvalue.is_initialized()
+ ? query.Bind(10, *vehicle_data_item.minvalue)
: query.Bind(10);
- vehicle_data_item.minsize.is_initialized()
- ? query.Bind(11, static_cast<int64_t>(*vehicle_data_item.minsize))
+ vehicle_data_item.maxvalue.is_initialized()
+ ? query.Bind(11, *vehicle_data_item.maxvalue)
: query.Bind(11);
- vehicle_data_item.maxsize.is_initialized()
- ? query.Bind(12, static_cast<int64_t>(*vehicle_data_item.maxsize))
+ vehicle_data_item.minsize.is_initialized()
+ ? query.Bind(12, static_cast<int64_t>(*vehicle_data_item.minsize))
: query.Bind(12);
- vehicle_data_item.minlength.is_initialized()
- ? query.Bind(13, static_cast<int64_t>(*vehicle_data_item.minlength))
+ vehicle_data_item.maxsize.is_initialized()
+ ? query.Bind(13, static_cast<int64_t>(*vehicle_data_item.maxsize))
: query.Bind(13);
- vehicle_data_item.maxlength.is_initialized()
- ? query.Bind(14, static_cast<int64_t>(*vehicle_data_item.maxlength))
+ vehicle_data_item.minlength.is_initialized()
+ ? query.Bind(14, static_cast<int64_t>(*vehicle_data_item.minlength))
: query.Bind(14);
+ vehicle_data_item.maxlength.is_initialized()
+ ? query.Bind(15, static_cast<int64_t>(*vehicle_data_item.maxlength))
+ : query.Bind(15);
if (!query.Exec() || !query.Reset()) {
SDL_LOG_ERROR("Failed to insert vehicle data item: "
diff --git a/src/components/policy/policy_regular/test/sql_pt_representation_test.cc b/src/components/policy/policy_regular/test/sql_pt_representation_test.cc
index 880e9ca4f9..f4efa811b6 100644
--- a/src/components/policy/policy_regular/test/sql_pt_representation_test.cc
+++ b/src/components/policy/policy_regular/test/sql_pt_representation_test.cc
@@ -466,6 +466,7 @@ TEST_F(SQLPTRepresentationTest, VehicleDataItem_Store_Complete_Item) {
*message.until = "5.0";
*message.removed = false;
*message.deprecated = false;
+ *message.defvalue = "0";
*message.minvalue = 0;
*message.maxvalue = 255;
*message.minsize = 0;
diff --git a/src/components/policy/policy_regular/test/vehicle_data_item_type_test.cc b/src/components/policy/policy_regular/test/vehicle_data_item_type_test.cc
index ec728a69ae..6431ed7394 100644
--- a/src/components/policy/policy_regular/test/vehicle_data_item_type_test.cc
+++ b/src/components/policy/policy_regular/test/vehicle_data_item_type_test.cc
@@ -123,6 +123,7 @@ class VehicleDataItemTypeTest : public ::testing::Test {
str.AddField("until", "5.0");
str.AddField("removed", true);
str.AddField("deprecated", true);
+ str.AddField("defvalue", "TestStringVal");
str.AddField("minvalue", 1);
str.AddField("maxvalue", 2);
str.AddField("minsize", 10);
@@ -171,6 +172,7 @@ TEST_F(VehicleDataItemTypeTest, CheckConvertFromJsonToVehicleDataItem_Success) {
EXPECT_TRUE((std::string)*vdi.until == "5.0");
EXPECT_TRUE(*vdi.removed == true);
EXPECT_TRUE(*vdi.deprecated == true);
+ EXPECT_TRUE(*vdi.defvalue == "TestStringVal");
EXPECT_TRUE(*vdi.minvalue == 1);
EXPECT_TRUE(*vdi.maxvalue == 2);
EXPECT_TRUE(*vdi.minsize == 10);
@@ -201,6 +203,7 @@ TEST_F(VehicleDataItemTypeTest, CheckIsValid_Struct_Success) {
VehicleDataItem vdi(&json_);
vdi.type = "Struct";
+ vdi.defvalue = rpc::Optional<rpc::String<0, UINT32_MAX> >();
EXPECT_TRUE(vdi.is_valid());
}
@@ -211,6 +214,7 @@ TEST_F(VehicleDataItemTypeTest, CheckIsValid_Struct_EmptyParams_Failed) {
VehicleDataItem vdi(&json_);
vdi.type = "Struct";
+ vdi.defvalue = rpc::Optional<rpc::String<0, UINT32_MAX> >();
EXPECT_FALSE(vdi.is_valid());
}
@@ -220,16 +224,19 @@ TEST_F(VehicleDataItemTypeTest, CheckIsValid_PODTypes_Success) {
VehicleDataItem vdi(&json_);
- vdi.type = "Integer";
+ vdi.type = "String";
EXPECT_TRUE(vdi.is_valid());
- vdi.type = "Float";
+ vdi.type = "Integer";
+ *vdi.defvalue = "1";
EXPECT_TRUE(vdi.is_valid());
- vdi.type = "String";
+ vdi.type = "Float";
+ *vdi.defvalue = "1.1";
EXPECT_TRUE(vdi.is_valid());
vdi.type = "Boolean";
+ *vdi.defvalue = "true";
EXPECT_TRUE(vdi.is_valid());
}
diff --git a/src/components/rpc_base/include/rpc_base/rpc_base_json_inl.h b/src/components/rpc_base/include/rpc_base/rpc_base_json_inl.h
index 80e11994f1..9d2fb81b49 100644
--- a/src/components/rpc_base/include/rpc_base/rpc_base_json_inl.h
+++ b/src/components/rpc_base/include/rpc_base/rpc_base_json_inl.h
@@ -94,7 +94,7 @@ inline const Json::Value* ValueMember(const Json::Value* value,
if (value && value->isObject() && value->isMember(member_name)) {
return &(*value)[member_name];
}
- return NULL;
+ return nullptr;
}
template <class T>