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 <bradleyb@fuzziesquirrel.com>
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
@@ -16,6 +16,10 @@
 {
 
 };
+template <> struct GetFormatType<bool>
+{
+    static constexpr auto format = "%d";
+};
 template <> struct GetFormatType<char>
 {
     static constexpr auto format = "=%hhd";
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 @@
         const char* message;
 };
 
+/** @struct Display
+ *  @brief Convert strings to const char*.
+ */
+namespace detail
+{
+template <typename T> struct Display
+{
+    static auto op(T&& value)
+    {
+        return std::forward<T>(value);
+    }
+};
+
+template <> struct Display<std::string>
+{
+    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 @@
             phosphor::logging::log<Severity>(
                 message,
                 phosphor::logging::entry(
-                    pathMeta + GetFormat<decltype(pathMeta)>::format,
-                    path),
+                    (pathMeta + GetFormat<decltype(pathMeta)>::format).c_str(),
+                    path.c_str()),
                 phosphor::logging::entry(
-                    propertyMeta + GetFormat<T>::format,
-                    any_ns::any_cast<T>(value)));
+                    (propertyMeta + GetFormat<T>::format).c_str(),
+                    detail::Display<T>::op(any_ns::any_cast<T>(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 @@
     '''Decorate an argument with a literal operator.'''
 
     integer_types = [
-        'int8',
         'int16',
         'int32',
         'int64',
-        'uint8',
         'uint16',
         'uint32',
         'uint64'
@@ -122,6 +120,8 @@
 
         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 @@
     '''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 @@
             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 @@
         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<CountCondition<${c.datatype}>>(
 ${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)};})\