From ec2ed2fb324d92573418afcc17365c83373023ec Mon Sep 17 00:00:00 2001 From: Brad Bishop Date: Wed, 31 May 2017 21:10:43 -0400 Subject: Fix bool and string templates/rendering Fix a number of bugs related to rendering and instantiation of string and bool templates. Change-Id: Ic75842b4016f4d96bf5850f9c4ad778d82e075ed Signed-off-by: Brad Bishop --- src/example/test.yaml | 408 +++++++++++++++++++++++++++++++++++++++++++ src/format.hpp | 4 + src/journal.hpp | 30 +++- src/pdmgen.py | 16 +- src/templates/count.mako.cpp | 2 +- 5 files changed, 452 insertions(+), 8 deletions(-) create mode 100644 src/example/test.yaml (limited to 'src') diff --git a/src/example/test.yaml b/src/example/test.yaml new file mode 100644 index 0000000..1ba22a4 --- /dev/null +++ b/src/example/test.yaml @@ -0,0 +1,408 @@ +# Test PDM configuration file. This file validates that all +# possible configuration file directives result in an application +# that builds. For an example with documentation please see +# example.yaml + +- name: test path group + class: group + group: path + members: + - meta: PATH + path: /xyz/openbmc_project/testing/inst1 + - meta: PATH + path: /xyz/openbmc_project/testing/inst2 + - meta: PATH + path: /xyz/openbmc_project/testing/inst3 + - meta: PATH + path: /xyz/openbmc_project/testing/inst4 + +- name: test byte property group + class: group + group: property + type: byte + members: + - interface: xyz.openbmc_project.byteIface + meta: PROPERTY + property: byteValue + +- name: test u16 property group + class: group + group: property + type: uint16 + members: + - interface: xyz.openbmc_project.U16Iface + meta: PROPERTY + property: u16Value + +- name: test u32 property group + class: group + group: property + type: uint32 + members: + - interface: xyz.openbmc_project.U32Iface + meta: PROPERTY + property: u32Value + +- name: test u64 property group + class: group + group: property + type: uint64 + members: + - interface: xyz.openbmc_project.U64Iface + meta: PROPERTY + property: u64Value + +- name: test s16 property group + class: group + group: property + type: int16 + members: + - interface: xyz.openbmc_project.S16Iface + meta: PROPERTY + property: s16Value + +- name: test s32 property group + class: group + group: property + type: int32 + members: + - interface: xyz.openbmc_project.S32Iface + meta: PROPERTY + property: s32Value + +- name: test s64 property group + class: group + group: property + type: int64 + members: + - interface: xyz.openbmc_project.S64Iface + meta: PROPERTY + property: s64Value + +- name: test string property group + class: group + group: property + type: string + members: + - interface: xyz.openbmc_project.StringIface + meta: PROPERTY + property: StringValue + +- name: test bool property group + class: group + group: property + type: boolean + members: + - interface: xyz.openbmc_project.BoolIface + meta: PROPERTY + property: BoolValue + +- name: test byte watch + class: watch + watch: property + paths: test path group + properties: test byte property group + +- name: test u16 watch + class: watch + watch: property + paths: test path group + properties: test u16 property group + +- name: test u32 watch + class: watch + watch: property + paths: test path group + properties: test u32 property group + +- name: test u64 watch + class: watch + watch: property + paths: test path group + properties: test u64 property group + +- name: test s16 watch + class: watch + watch: property + paths: test path group + properties: test s16 property group + +- name: test s32 watch + class: watch + watch: property + paths: test path group + properties: test s32 property group + +- name: test s64 watch + class: watch + watch: property + paths: test path group + properties: test s64 property group + +- name: test bool watch + class: watch + watch: property + paths: test path group + properties: test bool property group + +- name: test string watch + class: watch + watch: property + paths: test path group + properties: test string property group + +- name: test byte journal + class: callback + callback: journal + paths: test path group + properties: test byte property group + severity: DEBUG + message: Testing... + +- name: test u16 journal + class: callback + callback: journal + paths: test path group + properties: test u16 property group + severity: INFO + message: Testing... + +- name: test u32 journal + class: callback + callback: journal + paths: test path group + properties: test u32 property group + severity: NOTICE + message: Testing... + +- name: test u64 journal + class: callback + callback: journal + paths: test path group + properties: test u64 property group + severity: WARNING + message: Testing... + +- name: test s16 journal + class: callback + callback: journal + paths: test path group + properties: test s16 property group + severity: ERR + message: Testing... + +- name: test s32 journal + class: callback + callback: journal + paths: test path group + properties: test s32 property group + severity: CRIT + message: Testing... + +- name: test s64 journal + class: callback + callback: journal + paths: test path group + properties: test s64 property group + severity: ALERT + message: Testing... + +- name: test bool journal + class: callback + callback: journal + paths: test path group + properties: test bool property group + severity: EMERG + message: Testing... + +- name: test string journal + class: callback + callback: journal + paths: test path group + properties: test string property group + severity: INFO + message: Testing... + +- name: test method + class: callback + callback: method + service: org.test + path: /test + interface: org.test + method: Test + args: + - value: 123 + type: string + - value: false + type: boolean + - value: true + type: boolean + - value: 123 + type: byte + - value: 123 + type: uint16 + - value: 123 + type: uint32 + - value: 123 + type: uint64 + - value: 123 + type: int16 + - value: 123 + type: int32 + - value: 123 + type: int64 + +- name: test count lt + class: condition + condition: count + paths: test path group + properties: test byte property group + callback: test method + countop: '<' + countbound: 3 + op: '<' + bound: 115 + +- name: test count lte + class: condition + condition: count + paths: test path group + properties: test byte property group + callback: test method + defer: 1000us + countop: '<=' + countbound: 3 + op: '<=' + bound: 115 + +- name: test count gt + class: condition + condition: count + paths: test path group + properties: test byte property group + defer: 1000us + callback: test method + countop: '>' + countbound: 3 + op: '>' + bound: 115 + +- name: test count gte + class: condition + condition: count + paths: test path group + properties: test byte property group + defer: 1000us + callback: test method + countop: '>=' + countbound: 3 + op: '>=' + bound: 115 + +- name: test count eq + class: condition + condition: count + paths: test path group + properties: test byte property group + defer: 1000us + callback: test method + countop: '==' + countbound: 3 + op: '==' + bound: 115 + +- name: test count neq + class: condition + condition: count + paths: test path group + properties: test byte property group + defer: 1000us + callback: test method + countop: '!=' + countbound: 3 + op: '!=' + bound: 115 + +- name: test count u16 + class: condition + condition: count + paths: test path group + properties: test u16 property group + defer: 1000us + callback: test method + countop: '==' + countbound: 3 + op: '==' + bound: 115 + +- name: test count u32 + class: condition + condition: count + paths: test path group + properties: test u32 property group + defer: 1000us + callback: test method + countop: '==' + countbound: 3 + op: '==' + bound: 115 + +- name: test count u64 + class: condition + condition: count + paths: test path group + properties: test u64 property group + defer: 1000us + callback: test method + countop: '==' + countbound: 3 + op: '==' + bound: 115 + +- name: test count s16 + class: condition + condition: count + paths: test path group + properties: test s16 property group + defer: 1000us + callback: test method + countop: '==' + countbound: 3 + op: '==' + bound: 115 + +- name: test count s32 + class: condition + condition: count + paths: test path group + properties: test s32 property group + defer: 1000us + callback: test method + countop: '==' + countbound: 3 + op: '==' + bound: 115 + +- name: test count s64 + class: condition + condition: count + paths: test path group + properties: test s64 property group + defer: 1000us + callback: test method + countop: '==' + countbound: 3 + op: '==' + bound: 115 + +- name: test count bool + class: condition + condition: count + paths: test path group + properties: test bool property group + defer: 1000us + callback: test method + countop: '==' + countbound: 3 + op: '==' + bound: false diff --git a/src/format.hpp b/src/format.hpp index 9c8341c..f0b0c8e 100644 --- a/src/format.hpp +++ b/src/format.hpp @@ -15,6 +15,10 @@ namespace detail template struct GetFormatType { +}; +template <> struct GetFormatType +{ + static constexpr auto format = "%d"; }; template <> struct GetFormatType { diff --git a/src/journal.hpp b/src/journal.hpp index 4e47670..cc74451 100644 --- a/src/journal.hpp +++ b/src/journal.hpp @@ -46,6 +46,28 @@ class JournalBase : public IndexedCallback const char* message; }; +/** @struct Display + * @brief Convert strings to const char*. + */ +namespace detail +{ +template struct Display +{ + static auto op(T&& value) + { + return std::forward(value); + } +}; + +template <> struct Display +{ + static auto op(const std::string& value) + { + return value.c_str(); + } +}; +} // namespace detail + /** @class Journal * @brief C++ type specific logic for the journal callback. * @@ -77,11 +99,11 @@ class Journal : public JournalBase phosphor::logging::log( message, phosphor::logging::entry( - pathMeta + GetFormat::format, - path), + (pathMeta + GetFormat::format).c_str(), + path.c_str()), phosphor::logging::entry( - propertyMeta + GetFormat::format, - any_ns::any_cast(value))); + (propertyMeta + GetFormat::format).c_str(), + detail::Display::op(any_ns::any_cast(value)))); } }; diff --git a/src/pdmgen.py b/src/pdmgen.py index d878500..ac2b8e0 100755 --- a/src/pdmgen.py +++ b/src/pdmgen.py @@ -101,11 +101,9 @@ class Literal(object): '''Decorate an argument with a literal operator.''' integer_types = [ - 'int8', 'int16', 'int32', 'int64', - 'uint8', 'uint16', 'uint32', 'uint64' @@ -122,6 +120,8 @@ class Literal(object): if self.type in self.integer_types: return Cast('static', '{0}_t'.format(self.type))(arg) + elif self.type == 'byte': + return Cast('static', 'uint8_t'.format(self.type))(arg) if self.type == 'string': return '{0}s'.format(arg) @@ -396,9 +396,10 @@ class GroupOfProperties(ImplicitGroup): '''Property group config file directive.''' def __init__(self, *a, **kw): + self.type = kw.pop('type') self.datatype = sdbusplus.property.Property( name=kw.get('name'), - type=kw.pop('type')).cppTypeName + type=self.type).cppTypeName super(GroupOfProperties, self).__init__(**kw) @@ -507,6 +508,7 @@ class HasPropertyIndex(ConfigEntry): self.properties, config=self.configfile) self.datatype = objs['propertygroup'][self.properties].datatype + self.type = objs['propertygroup'][self.properties].type super(HasPropertyIndex, self).setup(objs) @@ -626,6 +628,14 @@ class CountCondition(Condition, Renderer): self.bound = kw.pop('bound') super(CountCondition, self).__init__(**kw) + def setup(self, objs): + '''Resolve type.''' + + super(CountCondition, self).setup(objs) + self.bound = TrivialArgument( + type=self.type, + value=self.bound) + def construct(self, loader, indent): return self.render( loader, diff --git a/src/templates/count.mako.cpp b/src/templates/count.mako.cpp index d348518..9ac9c3c 100644 --- a/src/templates/count.mako.cpp +++ b/src/templates/count.mako.cpp @@ -1,4 +1,4 @@ std::make_unique>( ${indent(1)}ConfigPropertyIndicies::get()[${c.instances}], ${indent(1)}[](const auto& item){return item ${c.countop} ${c.countbound};}, -${indent(1)}[](const auto& item){return item ${c.op} ${c.bound};})\ +${indent(1)}[](const auto& item){return item ${c.op} ${c.bound.argument(loader, indent=indent +1)};})\ -- cgit v1.2.1