]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#3278] addressed review
authorRazvan Becheriu <razvan@isc.org>
Tue, 26 Mar 2024 17:27:27 +0000 (19:27 +0200)
committerThomas Markwalder <tmark@isc.org>
Tue, 26 Mar 2024 19:33:28 +0000 (19:33 +0000)
14 files changed:
doc/sphinx/arm/hooks-perfmon.rst
src/hooks/dhcp/perfmon/alarm.h
src/hooks/dhcp/perfmon/libloadtests/load_unload_unittests.cc
src/hooks/dhcp/perfmon/monitored_duration.cc
src/hooks/dhcp/perfmon/monitored_duration.h
src/hooks/dhcp/perfmon/perfmon_config.cc
src/hooks/dhcp/perfmon/perfmon_config.h
src/hooks/dhcp/perfmon/perfmon_mgr.cc
src/hooks/dhcp/perfmon/perfmon_mgr.h
src/hooks/dhcp/perfmon/tests/alarm_parser_unittests.cc
src/hooks/dhcp/perfmon/tests/duration_key_parser_unittests.cc
src/hooks/dhcp/perfmon/tests/monitored_duration_store_unittests.cc
src/hooks/dhcp/perfmon/tests/perfmon_config_unittests.cc
src/hooks/dhcp/perfmon/tests/perfmon_mgr_unittests.cc

index d668e8c18660b1c6fe3b377d48daa3068dc50ed4..b5207cc4bcca4fb88a4d61f9adf73165e4df724f 100644 (file)
@@ -127,22 +127,22 @@ An example of the anticipated configuration is shown below:
         {
             "library": "lib/kea/hooks/libdhcp_perfmon.so",
             "parameters": {
-                "enable-monitoring" : true,
-                "interval-width-secs" : 5,
-                "stats-mgr-reporting" : true,
-                "alarm-report-secs" : 600,
+                "enable-monitoring": true,
+                "interval-width-secs": 5,
+                "stats-mgr-reporting": true,
+                "alarm-report-secs": 600,
                 "alarms": [
                 {
                     "duration-key": {
-                        "query-type" : "DHCPDISCOVER",
-                        "response-type" : "DHCPOFFER",
-                        "start-event" : "process-started",
-                        "stop-event" : "process-completed",
-                        "subnet-id" : 0
+                        "query-type": "DHCPDISCOVER",
+                        "response-type": "DHCPOFFER",
+                        "start-event": "process-started",
+                        "stop-event": "process-completed",
+                        "subnet-id": 0
                     },
-                    "enable-alarm" : true,
-                    "high-water-ms" : 500,
-                    "low-water-ms" : 25
+                    "enable-alarm": true,
+                    "high-water-ms": 500,
+                    "low-water-ms": 25
                 }]
             }
         }]
index 00005572ea91a94533eacb0e7138b04990d5c4b9..883431d91ac299c6fd2d1b0dfce5d51973c00073 100644 (file)
@@ -35,8 +35,8 @@ public:
     /// @param stop_event_label label of the end event
     /// @param subnet_id SubnetID of the selected subnet
     /// @param low_water threshold below which the average duration must fall to clear the alarm
-    /// @param high_water threshold above which the average duration must rise to trigger the alarm.
-    /// @param enabled true sets state to CLEAR, otherwise DISABLED, defaults to true.
+    /// @param high_water threshold above which the average duration must rise to trigger the alarm
+    /// @param enabled true sets state to CLEAR, otherwise DISABLED, defaults to true
     Alarm(uint16_t family, uint8_t query_type, uint8_t response_type,
           const std::string& start_event_label, const std::string& stop_event_label,
           dhcp::SubnetID subnet_id,
@@ -46,8 +46,8 @@ public:
     ///
     /// @param key composite key that identifies the alarm
     /// @param low_water threshold below which the average duration must fall to clear the alarm
-    /// @param high_water threshold above which the average duration must rise to trigger the alarm.
-    /// @param enabled true sets state to CLEAR, otherwise DISABLED, defaults to true.
+    /// @param high_water threshold above which the average duration must rise to trigger the alarm
+    /// @param enabled true sets state to CLEAR, otherwise DISABLED, defaults to true
     Alarm(const DurationKey& key, const Duration& low_water, const Duration& high_water, bool enabled = true);
 
     /// @brief Destructor
index 92792d26a6ded5ed623449cbd6f987e7000e2a77..e2996d245e1d8c76eb1cd79157e98cdd07986e85 100644 (file)
@@ -47,21 +47,21 @@ public:
     virtual isc::data::ElementPtr validConfigParams() {
         std::string valid_config =
             R"({
-                    "enable-monitoring" : true,
-                    "interval-width-secs" : 5,
-                    "stats-mgr-reporting"  : true,
-                    "alarm-report-secs" : 600,
+                    "enable-monitoring": true,
+                    "interval-width-secs": 5,
+                    "stats-mgr-reporting": true,
+                    "alarm-report-secs": 600,
                     "alarms": [{
                             "duration-key": {
-                                "query-type" : "*",
-                                "response-type" : "*",
-                                "start-event" : "socket-received",
-                                "stop-event" : "buffer-read",
-                                "subnet-id" : 70
+                                "query-type": "*",
+                                "response-type": "*",
+                                "start-event": "socket-received",
+                                "stop-event": "buffer-read",
+                                "subnet-id": 70
                                 },
-                            "enable-alarm" : true,
-                            "high-water-ms" : 500,
-                            "low-water-ms" : 25
+                            "enable-alarm": true,
+                            "high-water-ms": 500,
+                            "low-water-ms": 25
                         }]
                 })";
 
index d010db106dcd3cc650e792de24d35789cd463e84..906f6d7d3902d3488d2ba617854c84cf03626ded 100644 (file)
@@ -169,7 +169,7 @@ std::string
 DurationKey::getLabel() const {
     std::ostringstream oss;
     oss << getMessageTypeLabel(family_, query_type_)
-       << "-"
+        << "-"
         << getMessageTypeLabel(family_, response_type_)
         << "." << start_event_label_ << "-" << stop_event_label_
         << "." << subnet_id_;
index 1ab40bef63c50d3e5d80edf1d390fc08cfc3082e..83a0db6d95be482bc8502753fb6315f52ee98999 100644 (file)
@@ -189,7 +189,7 @@ public:
     }
 
     /// @brief Get a label for a family-specific message type (e.g.
-    ///  "DHCPDISCOVER", "SOLICIT")
+    /// "DHCPDISCOVER", "SOLICIT")
     ///
     /// @param family Protocol family of the key (AF_INET or AF_INET6)
     /// @param msg_type numeric message type to translate
index 4fd4187160d0e4f1eaca0aefd27bbf3793bef7bc..99ab61c1d4a904866b64f45a0c15c68f469c1ff0 100644 (file)
@@ -22,11 +22,11 @@ namespace perfmon {
 const data::SimpleKeywords
 DurationKeyParser::CONFIG_KEYWORDS =
 {
-    { "query-type",        Element::string },
-    { "response-type",     Element::string },
-    { "start-event",       Element::string },
-    { "stop-event",        Element::string },
-    { "subnet-id",         Element::integer }
+    {"query-type",        Element::string},
+    {"response-type",     Element::string},
+    {"start-event",       Element::string},
+    {"stop-event",        Element::string},
+    {"subnet-id",         Element::integer}
 };
 
 uint16_t
@@ -63,56 +63,58 @@ DurationKeyParser::getMessageNameType4(const std::string& name) {
 uint16_t
 DurationKeyParser::getMessageNameType6(const std::string& name) {
     static std::map<std::string, uint16_t> name_type_map = {
-           {"",                    DHCPV6_NOTYPE},
-           {"*",                   DHCPV6_NOTYPE},
-               {"SOLICIT",                         DHCPV6_SOLICIT},
-               {"ADVERTISE",                   DHCPV6_ADVERTISE},
-               {"REQUEST",                         DHCPV6_REQUEST},
-               {"CONFIRM",                         DHCPV6_CONFIRM},
-               {"RENEW",                           DHCPV6_RENEW},
-               {"REBIND",                          DHCPV6_REBIND},
-               {"REPLY",                           DHCPV6_REPLY},
-           {"RELEASE",                     DHCPV6_RELEASE},
-               {"DECLINE",                         DHCPV6_DECLINE},
-               {"RECONFIGURE",                 DHCPV6_RECONFIGURE},
-               {"INFORMATION_REQUEST", DHCPV6_INFORMATION_REQUEST},
-               {"RELAY_FORW",                  DHCPV6_RELAY_FORW},
-               {"RELAY_REPL",                  DHCPV6_RELAY_REPL},
-               {"LEASEQUERY",                  DHCPV6_LEASEQUERY},
-               {"LEASEQUERY_REPLY",    DHCPV6_LEASEQUERY_REPLY},
-               {"LEASEQUERY_DONE",             DHCPV6_LEASEQUERY_DONE},
-               {"LEASEQUERY_DATA",             DHCPV6_LEASEQUERY_DATA},
-               {"RECONFIGURE_REQUEST", DHCPV6_RECONFIGURE_REQUEST},
-               {"RECONFIGURE_REPLY",   DHCPV6_RECONFIGURE_REPLY},
-               {"DHCPV4_QUERY",                DHCPV6_DHCPV4_QUERY},
-               {"DHCPV4_RESPONSE",             DHCPV6_DHCPV4_RESPONSE},
-               {"ACTIVELEASEQUERY",    DHCPV6_ACTIVELEASEQUERY},
-               {"STARTTLS",                    DHCPV6_STARTTLS},
-               {"BNDUPD",                          DHCPV6_BNDUPD},
-               {"BNDREPLY",                    DHCPV6_BNDREPLY},
-               {"POOLREQ",                         DHCPV6_POOLREQ},
-               {"POOLRESP",                    DHCPV6_POOLRESP},
-               {"UPDREQ",                          DHCPV6_UPDREQ},
-               {"UPDREQALL",                   DHCPV6_UPDREQALL},
-               {"UPDDONE",                         DHCPV6_UPDDONE},
-               {"CONNECT",                         DHCPV6_CONNECT},
-               {"CONNECTREPLY",                DHCPV6_CONNECTREPLY},
-               {"DISCONNECT",                  DHCPV6_DISCONNECT},
-               {"STATE",                           DHCPV6_STATE},
-               {"CONTACT",                     DHCPV6_CONTACT}
+        {"",                        DHCPV6_NOTYPE},
+        {"*",                       DHCPV6_NOTYPE},
+        {"SOLICIT",                 DHCPV6_SOLICIT},
+        {"ADVERTISE",               DHCPV6_ADVERTISE},
+        {"REQUEST",                 DHCPV6_REQUEST},
+        {"CONFIRM",                 DHCPV6_CONFIRM},
+        {"RENEW",                   DHCPV6_RENEW},
+        {"REBIND",                  DHCPV6_REBIND},
+        {"REPLY",                   DHCPV6_REPLY},
+        {"RELEASE",                 DHCPV6_RELEASE},
+        {"DECLINE",                 DHCPV6_DECLINE},
+        {"RECONFIGURE",             DHCPV6_RECONFIGURE},
+        {"INFORMATION_REQUEST",     DHCPV6_INFORMATION_REQUEST},
+        {"RELAY_FORW",              DHCPV6_RELAY_FORW},
+        {"RELAY_REPL",              DHCPV6_RELAY_REPL},
+        {"LEASEQUERY",              DHCPV6_LEASEQUERY},
+        {"LEASEQUERY_REPLY",        DHCPV6_LEASEQUERY_REPLY},
+        {"LEASEQUERY_DONE",         DHCPV6_LEASEQUERY_DONE},
+        {"LEASEQUERY_DATA",         DHCPV6_LEASEQUERY_DATA},
+        {"RECONFIGURE_REQUEST",     DHCPV6_RECONFIGURE_REQUEST},
+        {"RECONFIGURE_REPLY",       DHCPV6_RECONFIGURE_REPLY},
+        {"DHCPV4_QUERY",            DHCPV6_DHCPV4_QUERY},
+        {"DHCPV4_RESPONSE",         DHCPV6_DHCPV4_RESPONSE},
+        {"ACTIVELEASEQUERY",        DHCPV6_ACTIVELEASEQUERY},
+        {"STARTTLS",                DHCPV6_STARTTLS},
+        {"BNDUPD",                  DHCPV6_BNDUPD},
+        {"BNDREPLY",                DHCPV6_BNDREPLY},
+        {"POOLREQ",                 DHCPV6_POOLREQ},
+        {"POOLRESP",                DHCPV6_POOLRESP},
+        {"UPDREQ",                  DHCPV6_UPDREQ},
+        {"UPDREQALL",               DHCPV6_UPDREQALL},
+        {"UPDDONE",                 DHCPV6_UPDDONE},
+        {"CONNECT",                 DHCPV6_CONNECT},
+        {"CONNECTREPLY",            DHCPV6_CONNECTREPLY},
+        {"DISCONNECT",              DHCPV6_DISCONNECT},
+        {"STATE",                   DHCPV6_STATE},
+        {"CONTACT",                 DHCPV6_CONTACT}
     };
 
     try {
         const auto& found = name_type_map.at(name);
-        return(found);
+        return (found);
     } catch (const std::out_of_range& ex) {
         isc_throw(BadValue, "'" << name << "' is not a valid DHCPV6 message type");
     }
 }
 
 uint16_t
-DurationKeyParser::getMessageType(data::ConstElementPtr config, uint16_t family,
-                               const std::string param_name, bool required /*= true */) {
+DurationKeyParser::getMessageType(data::ConstElementPtr config,
+                                  uint16_t family,
+                                  const std::string& param_name,
+                                  bool required /*= true */) {
     // Parse members.
     uint16_t msg_type = 0;
     ConstElementPtr elem = config->get(param_name);
@@ -255,11 +257,11 @@ AlarmParser::parse(data::ConstElementPtr config, uint16_t family) {
 const data::SimpleKeywords
 PerfMonConfig::CONFIG_KEYWORDS =
 {
-    { "enable-monitoring",      Element::boolean },
-    { "interval-width-secs",    Element::integer },
-    { "stats-mgr-reporting",    Element::boolean },
-    { "alarm-report-secs",      Element::integer},
-    { "alarms",                 Element::list}
+    {"enable-monitoring",      Element::boolean},
+    {"interval-width-secs",    Element::integer},
+    {"stats-mgr-reporting",    Element::boolean},
+    {"alarm-report-secs",      Element::integer},
+    {"alarms",                 Element::list}
 };
 
 PerfMonConfig::PerfMonConfig(uint16_t family)
index c004d3d92cb293f0c02dda83ddc8fdf9b7f24a26..cc03616a8bd9ed8e3b56fb35b7cf50236dfe4f43 100644 (file)
@@ -22,22 +22,22 @@ namespace perfmon {
 ///    {
 ///        "library": "lib/kea/hooks/libdhcp_perf_mon.so",
 ///        "parameters": {
-///            "enable-monitoring" : true,
-///            "interval-width-secs" : 5,
-///            "stats-mgr-reporting" : true,
-///            "alarm-report-secs" : 600,
+///            "enable-monitoring": true,
+///            "interval-width-secs": 5,
+///            "stats-mgr-reporting": true,
+///            "alarm-report-secs": 600,
 ///            "alarms": [
 ///            {
 ///                "duration-key": {
-///                    "query-type" : "DHCPDISCOVER",
-///                    "response-type" : "DHCPOFFER",
-///                    "start-event" : "process-started",
-///                    "stop-event" : "process-completed",
-///                    "subnet-id" : 0
+///                    "query-type": "DHCPDISCOVER",
+///                    "response-type": "DHCPOFFER",
+///                    "start-event": "process-started",
+///                    "stop-event": "process-completed",
+///                    "subnet-id": 0
 ///                },
-///                "enable-alarm" : true,
-///                "high-water-ms" : 500,
-///                "low-water-ms" : 25
+///                "enable-alarm": true,
+///                "high-water-ms": 500,
+///                "low-water-ms": 25
 ///            },
 ///            ..
 ///            }]
@@ -45,7 +45,7 @@ namespace perfmon {
 ///    }
 /// @endcode
 
-/// @brief Parses configuration parameters for a single DurationKey
+/// @brief Parses configuration parameters for a single DurationKey.
 ///
 /// DurationKey is used to identify both MonitoredDurations and
 /// Alarms, thus they could be use to define either in configuration
@@ -57,38 +57,39 @@ public:
     /// @brief List of valid parameters and expected types.
     static const data::SimpleKeywords CONFIG_KEYWORDS;
 
-    /// @brief Constructor
+    /// @brief Constructor.
     explicit DurationKeyParser() = default;
 
-    /// @brief Destructor
-     ~DurationKeyParser() = default;
+    /// @brief Destructor.
+    ~DurationKeyParser() = default;
 
-    /// @brief Convert a configuration parameter to family-specific message type
+    /// @brief Convert a configuration parameter to family-specific message type.
     ///
     /// @param config element map containing the duration key parameters.
-    /// @param family protocol family AF_INET or AF_INET6
-    /// @param param_name configuration parameter name
+    /// @param family protocol family AF_INET or AF_INET6.
+    /// @param param_name configuration parameter name.
     /// @param required if true then function will throw if the parameter does
     /// not exist in the configuration. Defaults to true.
     ///
     /// @return numeric message type, returns DHCP_NOTYPE if name is empty.
     /// @throw DhcpConfigError if parameter type or value is not valid, or when
-    /// requrred is true and the parameter is not in the map.
+    /// required is true and the parameter is not in the map.
     static uint16_t getMessageType(data::ConstElementPtr config,
-                                   uint16_t family, const std::string param_name,
+                                   uint16_t family,
+                                   const std::string& param_name,
                                    bool required = true);
 
-    /// @brief Convert string message name to DHCP message type
+    /// @brief Convert string message name to DHCP message type.
     ///
-    /// @param name upper-case message name (e.g "DHCPDISCOVER", "DHCPOFFER")
+    /// @param name upper-case message name (e.g "DHCPDISCOVER", "DHCPOFFER").
     ///
     /// @return numeric message type, returns DHCP_NOTYPE if name is empty.
     /// @throw BadValue if the message name is unknown.
     static uint16_t getMessageNameType4(const std::string& name);
 
-    /// @brief Convert string message name to DHCP6 message type
+    /// @brief Convert string message name to DHCP6 message type.
     ///
-    /// @param name upper-case message name (e.g "DHCPV6_SOLICIT", "DHCV6_REPLY")
+    /// @param name upper-case message name (e.g "DHCPV6_SOLICIT", "DHCV6_REPLY").
     ///
     /// @return numeric message type, returns DHCPV6_NOTYPE if name is empty.
     /// @throw BadValue if the message name is unknown.
@@ -97,7 +98,7 @@ public:
     /// @brief Convert a map of Elements into a DurationKey.
     ///
     /// @param config element map containing the duration key parameters.
-    /// @param family protocol family AF_INET or AF_INET6
+    /// @param family protocol family AF_INET or AF_INET6.
     static DurationKeyPtr parse(data::ConstElementPtr config, uint16_t family);
 
     /// @brief Convert a DurationKey into a map of Elements.
@@ -108,22 +109,22 @@ public:
     static data::ElementPtr toElement(DurationKeyPtr key);
 };
 
-/// @brief Parses configuration parameters for a single Alarm
+/// @brief Parses configuration parameters for a single Alarm.
 class AlarmParser {
 public:
     /// @brief List of valid parameters and expected types.
     static const data::SimpleKeywords CONFIG_KEYWORDS;
 
-    /// @brief Constructor
+    /// @brief Constructor.
     explicit AlarmParser();
 
-    /// @brief Destructor
+    /// @brief Destructor.
     ~AlarmParser() = default;
 
     /// @brief
     ///
     /// @param config element map containing the alarm parameters.
-    /// @param family protocol family AF_INET or AF_INET6
+    /// @param family protocol family AF_INET or AF_INET6.
     static AlarmPtr parse(data::ConstElementPtr config, uint16_t family);
 };
 
@@ -137,15 +138,15 @@ public:
     /// @brief List of valid parameter defaults.
     static const data::SimpleDefaults SIMPLE_DEFAULTS;
 
-    /// @brief Constructor
+    /// @brief Constructor.
     explicit PerfMonConfig(uint16_t family);
 
-    /// @brief Destructor
+    /// @brief Destructor.
     virtual ~PerfMonConfig() = default;
 
-    /// @brief Extracts member values from an Element::map
+    /// @brief Extracts member values from an Element::map.
     ///
-    /// @param config map of configuration parameters
+    /// @param config map of configuration parameters.
     ///
     /// @throw DhcpConfigError if invalid values are detected.
     void parse(data::ConstElementPtr config);
@@ -153,80 +154,80 @@ public:
     /// @brief Re-creates the AlarmStore and populates it by parsing a
     /// list of alarm elements.
     ///
-    /// @param config list of alarm configuration elements
+    /// @param config list of alarm configuration elements.
     ///
     /// @throw DhcpConfigError if a parsing error occurs or
     /// there are duplicate alarm keys.
     void parseAlarms(data::ConstElementPtr config);
 
-    /// @brief Fetches the value of enable-monitoring
+    /// @brief Fetches the value of enable-monitoring.
     ///
-    /// @return boolean value of enable-monitoring
+    /// @return boolean value of enable-monitoring.
     bool getEnableMonitoring() const {
         return (enable_monitoring_);
-    };
+    }
 
-    /// @brief Sets the value of enable-monitoring
+    /// @brief Sets the value of enable-monitoring.
     ///
-    /// @param value new value for enable-monitoring
+    /// @param value new value for enable-monitoring.
     void setEnableMonitoring(bool value) {
         enable_monitoring_ = value;
     }
 
-    /// @brief Fetches the value of interval-width-secs
+    /// @brief Fetches the value of interval-width-secs.
     ///
-    /// @return integer value of interval-width-secs
+    /// @return integer value of interval-width-secs.
     uint32_t getIntervalWidthSecs() const {
         return (interval_width_secs_);
     }
 
-    /// @brief Sets the value of interval-width-secs
+    /// @brief Sets the value of interval-width-secs.
     ///
-    /// @param value new value for interval-width-secs
+    /// @param value new value for interval-width-secs.
     void setIntervalWidthSecs(uint32_t value) {
         interval_width_secs_ = value;
     }
 
-    /// @brief Fetches the value of stats-mgr-reporting
+    /// @brief Fetches the value of stats-mgr-reporting.
     ///
-    /// @return boolean value of stats-mgr-reporting
+    /// @return boolean value of stats-mgr-reporting.
     bool getStatsMgrReporting() const {
         return (stats_mgr_reporting_);
     };
 
-    /// @brief Sets the value of stats-mgr-reporting
+    /// @brief Sets the value of stats-mgr-reporting.
     ///
-    /// @param value new value for stats-mgr-reporting
+    /// @param value new value for stats-mgr-reporting.
     void setStatsMgrReporting(bool value) {
         stats_mgr_reporting_ = value;
     }
 
-    /// @brief Fetches the value of alarm-report-secs
+    /// @brief Fetches the value of alarm-report-secs.
     ///
-    /// @return integer value of alarm-report-secs
+    /// @return integer value of alarm-report-secs.
     uint32_t getAlarmReportSecs() const {
         return (alarm_report_secs_);
     }
 
-    /// @brief Sets the value of alarm-report-secs
+    /// @brief Sets the value of alarm-report-secs.
     ///
-    /// @param value new value for alarm-report-secs
+    /// @param value new value for alarm-report-secs.
     void setAlarmReportSecs(uint32_t value) {
         alarm_report_secs_ = value;
     }
 
-    /// @brief Get protocol family
+    /// @brief Get protocol family.
     ///
-    /// @return uint16_t containing the family (AF_INET or AF_INET6)
+    /// @return uint16_t containing the family (AF_INET or AF_INET6).
     uint16_t getFamily() {
         return (family_);
     }
 
-    /// @brief Get the alarm store
+    /// @brief Get the alarm store.
     ///
-    /// @return pointer to the alarm store
+    /// @return pointer to the alarm store.
     AlarmStorePtr getAlarmStore() {
-        return alarm_store_;
+        return (alarm_store_);
     }
 
 protected:
@@ -247,7 +248,7 @@ protected:
     /// Defaults to true.
     bool stats_mgr_reporting_;
 
-    /// @brief Nubmer of seconds between reports of a raised alarm.
+    /// @brief Number of seconds between reports of a raised alarm.
     /// Defaults to 300.  A value of zero disables alarms.
     uint32_t alarm_report_secs_;
 
index 09f1ffbf0f4f9462e0558d1df89d9ca79cd85968..d24a548368bd6e017acbb6b781e7863636b2493d 100644 (file)
@@ -25,7 +25,7 @@ PerfMonMgr::PerfMonMgr(uint16_t family_)
     duration_store_.reset(new MonitoredDurationStore(family_, interval_duration_));
 }
 
-void PerfMonMgr::configure(const ConstElementPtr & params) {
+void PerfMonMgr::configure(const ConstElementPtr& params) {
     if (!params) {
         // User wants passive logging only.
         setEnableMonitoring(false);
index 3164fb8f1d9fc587c3f5aec51f299ede3ed466d7..db73f2a2d13c0f2ff54f6db292ec7ec4a39ee746 100644 (file)
@@ -25,12 +25,12 @@ namespace perfmon {
 /// PerfMonConfig.
 class PerfMonMgr : public PerfMonConfig {
 public:
-    /// @brief Constructor
+    /// @brief Constructor.
     ///
     /// @param family Protocol family AF_INET or AF_INET6.
     explicit PerfMonMgr(uint16_t family);
 
-    /// @brief Destructor
+    /// @brief Destructor.
     virtual ~PerfMonMgr() = default;
 
     /// @brief Parses the hook library 'parameters' element.
@@ -38,18 +38,18 @@ public:
     /// @param params map of configuration parameters to parse.
     void configure(const isc::data::ConstElementPtr& params);
 
-    /// @brief Processes the event stack of a query packet
+    /// @brief Processes the event stack of a query packet.
     ///
     /// @todo DETAILS TO FOLLOW
     ///
-    /// @param query query packet whose stack is to be processed
-    /// @param response response packet generated for the query
-    /// @param subnet_id id of the selected subnet
+    /// @param query query packet whose stack is to be processed.
+    /// @param response response packet generated for the query.
+    /// @param subnet_id id of the selected subnet.
     void processPktEventStack(isc::dhcp::PktPtr query,
                               isc::dhcp::PktPtr response,
                               const isc::dhcp::SubnetID& subnet_id);
 
-    /// @brief Adds a duration sample to a MonitoredDuration
+    /// @brief Adds a duration sample to a MonitoredDuration.
     ///
     /// The MonitoredDuration identified by the given key is fetched from
     /// the store and updated with the sample. If the update returns the
@@ -58,28 +58,28 @@ public:
     /// If the check returns the alarm, then the alarm has undergone a
     /// reportable event and is passed to reporting.
     ///
-    /// @param key identifies the duration to update
+    /// @param key identifies the duration to update.
     /// @param sample amount of time that elapsed between the two events
-    /// identified in the key
+    /// identified in the key.
     void addDurationSample(DurationKeyPtr key, const Duration& sample);
 
-    /// @brief Emits an entry to StatsMgr for a given duration
+    /// @brief Emits an entry to StatsMgr for a given duration.
     ///
     /// Calculates the average duration for the reportable interval and
     /// reports the value to StatsMgr if stat-mgr-reporting is true.
     ///
-    /// @param duration duration to report
+    /// @param duration duration to report.
     ///
     /// @return Always returns the average duration for reportable interval.
     Duration reportToStatsMgr(MonitoredDurationPtr duration);
 
-    /// @brief Emits a report for a given alarm
+    /// @brief Emits a report for a given alarm.
     ///
     /// Emits a WARN log if the alarm state is TRIGGERED or an
     /// INFO log if it is CLEARED. This may expand in the future to
-    /// accomodate additional reporting mechanisms.
+    /// accommodate additional reporting mechanisms.
     ///
-    /// @param alarm Alarm to report
+    /// @param alarm Alarm to report.
     /// @param average Duration average which caused the state transition.
     void reportAlarm(AlarmPtr alarm, const Duration& average);
 
@@ -102,7 +102,7 @@ public:
     ///
     /// @return interval-width-secs as a Duration.
     Duration getIntervalDuration() {
-        return  (interval_duration_);
+        return (interval_duration_);
     }
 
     /// @brief Get the alarm report interval.
@@ -112,9 +112,9 @@ public:
         return (alarm_report_interval_);
     }
 
-    /// @brief Get the duration  store
+    /// @brief Get the duration store.
     ///
-    /// @return pointer to the duration store
+    /// @return pointer to the duration store.
     MonitoredDurationStorePtr getDurationStore() {
         return (duration_store_);
     }
@@ -136,9 +136,9 @@ private:
     /// timer but nothing more until traffic resumes.
     ///
     /// @brief Tracks whether or not the server is processing DHCP packets.
-    ///dhcp::NetworkStatePtr network_state_;
+    // dhcp::NetworkStatePtr network_state_;
 
-    /// @brief IOService instance used to the timer.
+    /// @brief IOService instance used by the timer.
     asiolink::IOServicePtr io_service_;
 
     /// @brief Timer which tracks the next duration due to report.
index a775672d6a32d4fff51ea796d828a266fb4ae9c4..dfc0959973a0f195338351fda11d3e21681ed557 100644 (file)
@@ -24,19 +24,19 @@ using namespace boost::posix_time;
 namespace {
 
 // These tests excerise AlarmParser which, with the help of DurationKeyParser
-// (tested rigourously elsewhere), parses a map of paramters as shown below:
+// (tested rigorously elsewhere), parses a map of parameters as shown below:
 //
 // {
 //      "duration-key": {
-//          "query-type" : "DHCPDISCOVER",
-//          "response-type" : "DHCPOFFER",
-//          "start-event" : "process-started",
-//          "stop-event" : "process-completed",
-//          "subnet-id" : 70
+//          "query-type": "DHCPDISCOVER",
+//          "response-type": "DHCPOFFER",
+//          "start-event": "process-started",
+//          "stop-event": "process-completed",
+//          "subnet-id": 70
 //       },
-//       "enable-alarm" : true,
-//       "high-water-ms" : 500,
-//       "low-water-ms" : 25,
+//       "enable-alarm": true,
+//       "high-water-ms": 500,
+//       "low-water-ms": 25,
 // }
 
 /// @brief Describes a valid test scenario.
@@ -55,8 +55,8 @@ struct InvalidScenario {
     std::string exp_message_;       // Expected error text
 };
 
-/// @brief Base class test fixture for testing  AlarmParser.
-class AlarmParserTest: public ::testing::Test {
+/// @brief Base class test fixture for testing AlarmParser.
+class AlarmParserTest : public ::testing::Test {
 public:
     /// @brief Constructor.
     explicit AlarmParserTest(uint16_t family) : family_(family) {
@@ -80,9 +80,9 @@ public:
                 // All parameters
                 __LINE__,
                 R"(
-                    "enable-alarm" : true,
-                    "high-water-ms" : 500,
-                    "low-water-ms" : 25
+                    "enable-alarm": true,
+                    "high-water-ms": 500,
+                    "low-water-ms": 25
                 )",
                 Alarm::CLEAR, 500, 25
             },
@@ -90,18 +90,18 @@ public:
                 // No enable-alarm, should default to CLEAR state.
                 __LINE__,
                 R"(
-                    "high-water-ms" : 500,
-                    "low-water-ms" : 25
+                    "high-water-ms": 500,
+                    "low-water-ms": 25
                 )",
                 Alarm::CLEAR, 500, 25
             },
             {
-                // State should be DISALBED when enable-alarm is false
+                // State should be DISABLED when enable-alarm is false
                 __LINE__,
                 R"(
-                    "enable-alarm" : false,
-                    "high-water-ms" : 500,
-                    "low-water-ms" : 25
+                    "enable-alarm": false,
+                    "high-water-ms": 500,
+                    "low-water-ms": 25
                 )",
                 Alarm::DISABLED, 500, 25
             }
@@ -145,9 +145,9 @@ public:
                 // Spurious parameter
                 __LINE__,
                 R"(
-                    "enable-alarm" : true,
-                    "high-water-ms" : 500,
-                    "low-water-ms" : 25,
+                    "enable-alarm": true,
+                    "high-water-ms": 500,
+                    "low-water-ms": 25,
                     "bogus": true
                 )",
                 "spurious 'bogus' parameter"
@@ -156,9 +156,9 @@ public:
                 // Invalid type enable-alarm
                 __LINE__,
                 R"(
-                    "enable-alarm" : "bogus",
-                    "high-water-ms" : 500,
-                    "low-water-ms" : 25,
+                    "enable-alarm": "bogus",
+                    "high-water-ms": 500,
+                    "low-water-ms": 25,
                     "bogus": true
                 )",
                 "'enable-alarm' parameter is not a boolean"
@@ -167,8 +167,8 @@ public:
                 // Missing high-water-ms
                 __LINE__,
                 R"(
-                    "enable-alarm" : true,
-                    "low-water-ms" : 25
+                    "enable-alarm": true,
+                    "low-water-ms": 25
                 )",
                 "'high-water-ms' parameter is required"
             },
@@ -176,9 +176,9 @@ public:
                 // Invalid type for high-water-ms
                 __LINE__,
                 R"(
-                    "enable-alarm" : true,
-                    "high-water-ms" : "bogus",
-                    "low-water-ms" : 25
+                    "enable-alarm": true,
+                    "high-water-ms": "bogus",
+                    "low-water-ms": 25
                 )",
                 "'high-water-ms' parameter is not an integer"
             },
@@ -186,8 +186,8 @@ public:
                 // Missing low-water-ms
                 __LINE__,
                 R"(
-                    "enable-alarm" : true,
-                    "high-water-ms" : 500
+                    "enable-alarm": true,
+                    "high-water-ms": 500
                 )",
                 "'low-water-ms' parameter is required"
             },
@@ -195,9 +195,9 @@ public:
                 // Invalid type for low-water-ms
                 __LINE__,
                 R"(
-                    "enable-alarm" : true,
-                    "high-water-ms" : 500,
-                    "low-water-ms" : "bogus"
+                    "enable-alarm": true,
+                    "high-water-ms": 500,
+                    "low-water-ms": "bogus"
                 )",
                 "'low-water-ms' parameter is not an integer"
             },
@@ -205,9 +205,9 @@ public:
                 // Invalid threshold combination
                 __LINE__,
                 R"(
-                    "enable-alarm" : true,
-                    "high-water-ms" : 25,
-                    "low-water-ms" : 500
+                    "enable-alarm": true,
+                    "high-water-ms": 25,
+                    "low-water-ms": 500
                 )",
                 "'low-water-ms': 500, must be less than 'high-water-ms': 25"
             },
@@ -218,7 +218,7 @@ public:
 
     /// @brief Runs a list of invalid configurations through AlarmParser::parse().
     ///
-    /// @param list of valid scenarios to run
+    /// @param list of valid scenarios to run.
     /// @param add_key When true, scenario json will be prepended with valid, family-specific
     /// duration-key element prior to parsing.
     void testInvalidScenarios(std::list<InvalidScenario>& scenarios,
@@ -249,13 +249,13 @@ public:
     DurationKeyPtr expected_key_;
 };
 
-/// @brief Test fixture for testing AlarmParser for DHCP(v4).
+/// @brief Test fixture for testing AlarmParser for DHCPV4.
 class AlarmParserTest4: public AlarmParserTest {
 public:
     /// @brief Constructor.
     explicit AlarmParserTest4() : AlarmParserTest(AF_INET) {
         expected_key_.reset(new DurationKey(family_, DHCPDISCOVER, DHCPOFFER,
-                                           "start_here", "stop_there", 33));
+                                            "start_here", "stop_there", 33));
     }
 
     /// @brief Destructor.
@@ -319,7 +319,7 @@ public:
     }
 };
 
-TEST_F(AlarmParserTest4, validScenarios4) {
+TEST_F(AlarmParserTest4, validScenarios) {
     testValidScenarios();
 }
 
@@ -335,9 +335,9 @@ TEST_F(AlarmParserTest4, invalidDurationKey) {
             // Missing duration-key element
             __LINE__,
             R"({
-                "enable-alarm" : true,
-                "high-water-ms" : 500,
-                "low-water-ms" : 25
+                "enable-alarm": true,
+                "high-water-ms": 500,
+                "low-water-ms": 25
             })",
             "'duration-key' parameter is required"
         },
@@ -346,9 +346,9 @@ TEST_F(AlarmParserTest4, invalidDurationKey) {
             __LINE__,
             R"({
                 "duration-key": "not-a-map",
-                "enable-alarm" : true,
-                "high-water-ms" : 500,
-                "low-water-ms" : 25
+                "enable-alarm": true,
+                "high-water-ms": 500,
+                "low-water-ms": 25
             })",
             "'duration-key' parameter is not a map"
         },
@@ -359,12 +359,12 @@ TEST_F(AlarmParserTest4, invalidDurationKey) {
                 "duration-key": {
                     "query-type": "REQUEST",
                     "response-type": "REPLY",
-                    "start-event" : "start-here",
-                    "stop-event" : "stop-here"
+                    "start-event": "start-here",
+                    "stop-event": "stop-here"
                 },
-                "enable-alarm" : true,
-                "high-water-ms" : 500,
-                "low-water-ms" : 25
+                "enable-alarm": true,
+                "high-water-ms": 500,
+                "low-water-ms": 25
             })",
             "'query-type' parameter is invalid, 'REQUEST' is not a valid DHCP message type"
         },
@@ -389,9 +389,9 @@ TEST_F(AlarmParserTest6, invalidDurationKey) {
             // Missing duration-key element
             __LINE__,
             R"({
-                "enable-alarm" : true,
-                "high-water-ms" : 500,
-                "low-water-ms" : 25
+                "enable-alarm": true,
+                "high-water-ms": 500,
+                "low-water-ms": 25
             })",
             "'duration-key' parameter is required"
         },
@@ -400,9 +400,9 @@ TEST_F(AlarmParserTest6, invalidDurationKey) {
             __LINE__,
             R"({
                     "duration-key": "not-a-map",
-                    "enable-alarm" : true,
-                    "high-water-ms" : 500,
-                    "low-water-ms" : 25
+                    "enable-alarm": true,
+                    "high-water-ms": 500,
+                    "low-water-ms": 25
             })",
             "'duration-key' parameter is not a map"
         },
@@ -413,12 +413,12 @@ TEST_F(AlarmParserTest6, invalidDurationKey) {
                 "duration-key": {
                     "query-type": "DHCPDISCOVER",
                     "response-type": "DHCPOFFER",
-                    "start-event" : "start-here",
-                    "stop-event" : "stop-here"
+                    "start-event": "start-here",
+                    "stop-event": "stop-here"
                 },
-                "enable-alarm" : true,
-                "high-water-ms" : 500,
-                "low-water-ms" : 25
+                "enable-alarm": true,
+                "high-water-ms": 500,
+                "low-water-ms": 25
             })",
             "'query-type' parameter is invalid, 'DHCPDISCOVER' is not a valid DHCPV6 message type"
         },
index 9abe417dabc0a43fb7ebcf9eceed18cac1a44012..e7b644561262bc49e4925b74df7119a95d3ea008 100644 (file)
@@ -23,13 +23,13 @@ using namespace isc::perfmon;
 namespace {
 
 // These tests excerise DurationKeyParser which parses a map of
-// paramters as shown below:
+// parameters as shown below:
 //  "duration-key": {
-//      "query-type" : "DHCPDISCOVER",
-//      "response-type" : "DHCPOFFER",
-//      "start-event" : "process-started",
-//      "stop-event" : "process-completed",
-//      "subnet-id" : 70
+//      "query-type": "DHCPDISCOVER",
+//      "response-type": "DHCPOFFER",
+//      "start-event": "process-started",
+//      "stop-event": "process-completed",
+//      "subnet-id": 70
 // }
 
 /// @brief Describes a valid test scenario.
@@ -51,7 +51,7 @@ struct InvalidScenario {
 };
 
 /// @brief Test fixture for testing DurationKeyParser.
-class DurationKeyParserTest: public ::testing::Test {
+class DurationKeyParserTest : public ::testing::Test {
 public:
     /// @brief Constructor.
     DurationKeyParserTest() = default;
@@ -61,8 +61,8 @@ public:
 
     /// @brief Runs a list of valid configurations through parsing.
     ///
-    /// @param list of valid scenarios to run
-    /// @param family protocol family to use when parsing
+    /// @param list of valid scenarios to run.
+    /// @param family protocol family to use when parsing.
     void testValidScenarios(std::list<ValidScenario>& scenarios, uint16_t family) {
         // Iterate over the scenarios.
         for (auto const& scenario : scenarios) {
@@ -90,8 +90,8 @@ public:
 
     /// @brief Runs a list of invalid configurations through parsing.
     ///
-    /// @param list of valid scenarios to run
-    /// @param family protocol family to use when parsing
+    /// @param list of valid scenarios to run.
+    /// @param family protocol family to use when parsing.
     void testInvalidScenarios(std::list<InvalidScenario>& scenarios, uint16_t family) {
         // Iterate over the scenarios.
         for (auto const& scenario : scenarios) {
@@ -357,7 +357,7 @@ TEST_F(DurationKeyParserTest, invalidScenarios4) {
     testInvalidScenarios(scenarios,  AF_INET);
 }
 
-TEST_F(DurationKeyParserTest, parseValidScenarios6) {
+TEST_F(DurationKeyParserTest, validScenarios6) {
     // List of test scenarios to run.
     std::list<ValidScenario> scenarios = {
         {
index ae79933f8b7dda257c7445397a818338bd26ac73..f466e6fdb21b96aeabec466c8906496d649f0275 100644 (file)
@@ -110,7 +110,7 @@ public:
 
         int idx = monds.size() - 1;
         for (auto const& d : *durations) {
-            EXPECT_EQ(*d, *monds[idx]) << "failed on pass :" << idx;
+            EXPECT_EQ(*d, *monds[idx]) << "failed on pass" << idx;
             --idx;
         }
 
index cbad54d687d6c6eb8e2f9942cbe7046106dffa70..ea16a25156352b7a136a3461e7ed06f3862f5778 100644 (file)
@@ -83,7 +83,7 @@ public:
             bool exp_enable_monitoring_;        // Expected value for enable-monitoring
             uint32_t exp_interval_width_secs_;  // Expected value for interval-width-secs
             bool exp_stats_mgr_reporting_;      // Expected value for stats-mgr-reporting
-            uint32_t exp_alarm_report_secs_;     // Expected value for alarm-report-secs
+            uint32_t exp_alarm_report_secs_;    // Expected value for alarm-report-secs
         };
 
         // List of test scenarios to run.
@@ -97,25 +97,25 @@ public:
             {
                 // Only enable-monitoring",
                 __LINE__,
-                R"({ "enable-monitoring" : true })",
+                R"({ "enable-monitoring": true })",
                 true, 60, true, 300
             },
             {
                 // Only interval-width-secs",
                 __LINE__,
-                R"({ "interval-width-secs" : 3 })",
+                R"({ "interval-width-secs": 3 })",
                 false, 3, true, 300
             },
             {
                 // Only stats-mgr-reporting",
                 __LINE__,
-                R"({ "stats-mgr-reporting" : false })",
+                R"({ "stats-mgr-reporting": false })",
                 false, 60, false, 300
             },
             {
                 // Only alarm-report-secs",
                 __LINE__,
-                R"({ "alarm-report-secs" : 77 })",
+                R"({ "alarm-report-secs": 77 })",
                 false, 60, true, 77
             },
             {
@@ -123,10 +123,10 @@ public:
                 __LINE__,
                 R"(
                 {
-                    "enable-monitoring" : true,
-                    "interval-width-secs" : 2,
-                    "stats-mgr-reporting" : false,
-                    "alarm-report-secs" : 120
+                    "enable-monitoring": true,
+                    "interval-width-secs": 2,
+                    "stats-mgr-reporting": false,
+                    "alarm-report-secs": 120
                 })",
                 true, 2, false, 120
             },
@@ -154,156 +154,156 @@ public:
         }
     }
 
-       /// @brief Exercises PerfMonConfig parameter parsing with invalid configuration
-       /// permutations.  Duplicate alarms are tested elsewhere.
-       void testInvalidScenarios() {
-           // Describes a test scenario.
-           struct Scenario {
-               int line_;              // Scenario line number
-               string json_;           // JSON configuration to parse
-               string exp_message_;    // Expected exception message
-           };
-
-           // List of test scenarios to run.  Most scenario supply
-           // all valid parameters except one in error.  This allows
-           // us to verify that no values are changed if any are in error.
-           list<Scenario> scenarios = {
-               {
-                   // Unknown parameter
-                   __LINE__,
-                   R"(
-                   {
-                       "enable-monitoring" : false,
-                       "interval-width-secs" : 3,
-                       "stats-mgr-reporting" : false,
-                       "alarm-report-secs" : 90,
-                       "bogus" : false
-                   })",
-                   "spurious 'bogus' parameter"
-               },
-               {
-                   // Invalid type for enable-monitoring
-                   __LINE__,
-                   R"(
-                   {
-                       "enable-monitoring" : "not bool",
-                       "interval-width-secs" : 3,
-                       "stats-mgr-reporting" : false,
-                       "alarm-report-secs" : 90
-                   })",
-                   "'enable-monitoring' parameter is not a boolean"
-               },
-               {
-                   // Value of interval-width-secs is zero
-                   __LINE__,
-                   R"(
-                   {
-                       "enable-monitoring" : false,
-                       "interval-width-secs" : 0,
-                       "stats-mgr-reporting" : false,
-                       "alarm-report-secs" : 90
-                   })",
-                   "invalid interval-width-secs: '0', must be greater than 0"
-               },
-               {
-                   // Value of interval-width-secs less than zero
-                   __LINE__,
-                   R"(
-                   {
-                       "enable-monitoring" : false,
-                       "interval-width-secs" : -2,
-                       "stats-mgr-reporting" : false,
-                       "alarm-report-secs" : 90
-                   })",
-                   "invalid interval-width-secs: '-2', must be greater than 0"
-               },
-               {
-                   // Non-boolean type for stats-mgr-reporting
-                   __LINE__,
-                   R"(
-                   {
-                       "enable-monitoring" : false,
-                       "interval-width-secs" : 1,
-                       "stats-mgr-reporting" : "not bool",
-                       "alarm-report-secs" : 90
-                   })",
-                   "'stats-mgr-reporting' parameter is not a boolean"
-               },
-               {
-                   // Value of alarm-report-secs is zero
-                   __LINE__,
-                   R"(
-                   {
-                       "enable-monitoring" : false,
-                       "interval-width-secs" : 1,
-                       "stats-mgr-reporting" : false,
-                       "alarm-report-secs" : -3
-                   })",
-                   "invalid alarm-report-secs: '-3', cannot be less than 0"
-               },
-               {
-                   // Value of alarm-report-secs less than zero
-                   __LINE__,
-                   R"(
-                   {
-                       "enable-monitoring" : false,
-                       "interval-width-secs" : 1,
-                       "stats-mgr-reporting" : false,
-                       "alarm-report-secs" : -3
-                   })",
-                   "invalid alarm-report-secs: '-3', cannot be less than 0"
-               },
-               {
-                   // Value for alarms is not a list.
-                   __LINE__,
-                   R"(
-                   {
-                       "enable-monitoring" : false,
-                       "interval-width-secs" : 60,
-                       "stats-mgr-reporting" : false,
-                       "alarm-report-secs" : 90,
-                       "alarms": {}
-                   })",
-                   "'alarms' parameter is not a list"
-               },
-               {
-                   // Alarms list contains an invalid entry
-                   __LINE__,
-                   R"(
-                   {
-                       "enable-monitoring" : false,
-                       "interval-width-secs" : 60,
-                       "stats-mgr-reporting" : false,
-                       "alarm-report-secs" : 90,
-                       "alarms": [{ "bogus": "alarm" }]
-                   })",
-                   "cannot add Alarm to store: spurious 'bogus' parameter"
-               }
-           };
-
-           // Iterate over the scenarios.
-           PerfMonConfig default_config(family_);
-           for (auto const& scenario : scenarios) {
-               stringstream oss;
-               oss << "scenario at line: " << scenario.line_;
-               SCOPED_TRACE(oss.str());
-
-               // Convert JSON text to a map of parameters.
-               ConstElementPtr json_elements;
-               ASSERT_NO_THROW_LOG(json_elements = Element::fromJSON(scenario.json_));
-
-               // Parsing parameters should throw.
-               PerfMonConfig config(family_);
-               ASSERT_THROW_MSG(config.parse(json_elements), DhcpConfigError,
-                                scenario.exp_message_);
-
-               // Original values should be intact.
-               EXPECT_EQ(default_config.getEnableMonitoring(), config.getEnableMonitoring());
-               EXPECT_EQ(default_config.getIntervalWidthSecs(), config.getIntervalWidthSecs());
-               EXPECT_EQ(default_config.getStatsMgrReporting(), config.getStatsMgrReporting());
-               EXPECT_EQ(default_config.getAlarmReportSecs(), config.getAlarmReportSecs());
-           }
-       }
+    /// @brief Exercises PerfMonConfig parameter parsing with invalid configuration
+    /// permutations.  Duplicate alarms are tested elsewhere.
+    void testInvalidScenarios() {
+        // Describes a test scenario.
+        struct Scenario {
+            int line_;              // Scenario line number
+            string json_;           // JSON configuration to parse
+            string exp_message_;    // Expected exception message
+        };
+
+        // List of test scenarios to run.  Most scenario supply
+        // all valid parameters except one in error.  This allows
+        // us to verify that no values are changed if any are in error.
+        list<Scenario> scenarios = {
+            {
+                // Unknown parameter
+                __LINE__,
+                R"(
+                {
+                    "enable-monitoring": false,
+                    "interval-width-secs": 3,
+                    "stats-mgr-reporting": false,
+                    "alarm-report-secs": 90,
+                    "bogus": false
+                })",
+                "spurious 'bogus' parameter"
+            },
+            {
+                // Invalid type for enable-monitoring
+                __LINE__,
+                R"(
+                {
+                    "enable-monitoring": "not bool",
+                    "interval-width-secs": 3,
+                    "stats-mgr-reporting": false,
+                    "alarm-report-secs": 90
+                })",
+                "'enable-monitoring' parameter is not a boolean"
+            },
+            {
+                // Value of interval-width-secs is zero
+                __LINE__,
+                R"(
+                {
+                    "enable-monitoring": false,
+                    "interval-width-secs": 0,
+                    "stats-mgr-reporting": false,
+                    "alarm-report-secs": 90
+                })",
+                "invalid interval-width-secs: '0', must be greater than 0"
+            },
+            {
+                // Value of interval-width-secs less than zero
+                __LINE__,
+                R"(
+                {
+                    "enable-monitoring": false,
+                    "interval-width-secs": -2,
+                    "stats-mgr-reporting": false,
+                    "alarm-report-secs": 90
+                })",
+                "invalid interval-width-secs: '-2', must be greater than 0"
+            },
+            {
+                // Non-boolean type for stats-mgr-reporting
+                __LINE__,
+                R"(
+                {
+                    "enable-monitoring": false,
+                    "interval-width-secs": 1,
+                    "stats-mgr-reporting": "not bool",
+                    "alarm-report-secs": 90
+                })",
+                "'stats-mgr-reporting' parameter is not a boolean"
+            },
+            {
+                // Value of alarm-report-secs is zero
+                __LINE__,
+                R"(
+                {
+                    "enable-monitoring": false,
+                    "interval-width-secs": 1,
+                    "stats-mgr-reporting": false,
+                    "alarm-report-secs": -3
+                })",
+                "invalid alarm-report-secs: '-3', cannot be less than 0"
+            },
+            {
+                // Value of alarm-report-secs less than zero
+                __LINE__,
+                R"(
+                {
+                    "enable-monitoring": false,
+                    "interval-width-secs": 1,
+                    "stats-mgr-reporting": false,
+                    "alarm-report-secs": -3
+                })",
+                "invalid alarm-report-secs: '-3', cannot be less than 0"
+            },
+            {
+                // Value for alarms is not a list.
+                __LINE__,
+                R"(
+                {
+                    "enable-monitoring": false,
+                    "interval-width-secs": 60,
+                    "stats-mgr-reporting": false,
+                    "alarm-report-secs": 90,
+                    "alarms": {}
+                })",
+                "'alarms' parameter is not a list"
+            },
+            {
+                // Alarms list contains an invalid entry
+                __LINE__,
+                R"(
+                {
+                    "enable-monitoring": false,
+                    "interval-width-secs": 60,
+                    "stats-mgr-reporting": false,
+                    "alarm-report-secs": 90,
+                    "alarms": [{ "bogus": "alarm" }]
+                })",
+                "cannot add Alarm to store: spurious 'bogus' parameter"
+            }
+        };
+
+        // Iterate over the scenarios.
+        PerfMonConfig default_config(family_);
+        for (auto const& scenario : scenarios) {
+            stringstream oss;
+            oss << "scenario at line: " << scenario.line_;
+            SCOPED_TRACE(oss.str());
+
+            // Convert JSON text to a map of parameters.
+            ConstElementPtr json_elements;
+            ASSERT_NO_THROW_LOG(json_elements = Element::fromJSON(scenario.json_));
+
+            // Parsing parameters should throw.
+            PerfMonConfig config(family_);
+            ASSERT_THROW_MSG(config.parse(json_elements), DhcpConfigError,
+                             scenario.exp_message_);
+
+            // Original values should be intact.
+            EXPECT_EQ(default_config.getEnableMonitoring(), config.getEnableMonitoring());
+            EXPECT_EQ(default_config.getIntervalWidthSecs(), config.getIntervalWidthSecs());
+            EXPECT_EQ(default_config.getStatsMgrReporting(), config.getStatsMgrReporting());
+            EXPECT_EQ(default_config.getAlarmReportSecs(), config.getAlarmReportSecs());
+        }
+    }
 
     /// @brief Creates a valid configuration with a list of alarms.
     ///
@@ -311,29 +311,29 @@ public:
     /// in the list.
     ///
     /// @return JSON text for the configuration.
-       std::string makeConfigWithAlarms(std::vector<DurationKeyPtr> keys) {
+    std::string makeConfigWithAlarms(std::vector<DurationKeyPtr> keys) {
         // Create valid configuration test which includes an arbitrary number of
         // family-specific alarms from a set of DurationKeys.
         stringstream joss;
-           joss << R"(
-                   {
-                       "enable-monitoring" : false,
-                       "interval-width-secs" : 60,
-                       "stats-mgr-reporting" : false,
-                       "alarm-report-secs" : 90,
-                       "alarms": [
+        joss << R"(
+                {
+                    "enable-monitoring": false,
+                    "interval-width-secs": 60,
+                    "stats-mgr-reporting": false,
+                    "alarm-report-secs": 90,
+                    "alarms": [
                 )";
 
-        std::string comma="";
+        std::string comma = "";
         for (auto const& key : keys) {
             joss << comma << "\t{";
-               joss << R"("duration-key": )";
+            joss << R"("duration-key": )";
             auto key_elems = DurationKeyParser::toElement(key);
             key_elems->toJSON(joss);
             joss << R"(,
-                       "high-water-ms": 500,
-                       "low-water-ms": 25
-                       }
+                    "high-water-ms": 500,
+                    "low-water-ms": 25
+                    }
                 )";
 
             comma = ",";
@@ -344,18 +344,18 @@ public:
     }
 
     /// @brief Verifies a valid configuration that includes a list of Alarms.
-       void testValidAlarmsList() {
+    void testValidAlarmsList() {
         // Create valid configuration test which includes an arbitrary number of
         // family-specific alarms from a pre-defined set of unique DurationKeys.
         std::string json_text = makeConfigWithAlarms(keys_);
 
         // Convert JSON text to a map of parameters.
-           ConstElementPtr json_elements;
-           ASSERT_NO_THROW_LOG(json_elements = Element::fromJSON(json_text));
+        ConstElementPtr json_elements;
+        ASSERT_NO_THROW_LOG(json_elements = Element::fromJSON(json_text));
 
-           // Parsing parameters should throw.
-           PerfMonConfig config(family_);
-           ASSERT_NO_THROW_LOG(config.parse(json_elements));
+        // Parsing parameters should throw.
+        PerfMonConfig config(family_);
+        ASSERT_NO_THROW_LOG(config.parse(json_elements));
 
         // Get all should retrieve the alarms in ascending order.
         AlarmCollectionPtr alarms = config.getAlarmStore()->getAll();
@@ -363,13 +363,13 @@ public:
 
         int idx = 0;
         for (auto const& d : *alarms) {
-            EXPECT_EQ(*d, *keys_[idx]) << "failed on pass :" << idx;
+            EXPECT_EQ(*d, *keys_[idx]) << "failed on pass" << idx;
             ++idx;
         }
-       }
+    }
 
     /// @brief Verifies a valid configuration with a list duplicate Alarms.
-       void testDuplicateAlarms() {
+    void testDuplicateAlarms() {
         std::vector<DurationKeyPtr> duplicate_keys;
         duplicate_keys.push_back(keys_[0]);
         duplicate_keys.push_back(keys_[0]);
@@ -379,32 +379,32 @@ public:
         std::string json_text = makeConfigWithAlarms(duplicate_keys);
 
         // Convert JSON text to a map of parameters.
-           ConstElementPtr json_elements;
-           ASSERT_NO_THROW_LOG(json_elements = Element::fromJSON(json_text));
+        ConstElementPtr json_elements;
+        ASSERT_NO_THROW_LOG(json_elements = Element::fromJSON(json_text));
 
-           // Parsing parameters should throw.
-           PerfMonConfig config(family_);
+        // Parsing parameters should throw.
+        PerfMonConfig config(family_);
         if (family_ == AF_INET) {
-               ASSERT_THROW_MSG(config.parse(json_elements), DhcpConfigError,
+            ASSERT_THROW_MSG(config.parse(json_elements), DhcpConfigError,
                              "cannot add Alarm to store: AlarmStore::addAlarm:"
                              " alarm already exists for:"
                              " DHCPDISCOVER-DHCPOFFER.socket_received-buffer_read.0");
         } else {
-               ASSERT_THROW_MSG(config.parse(json_elements), DhcpConfigError,
+            ASSERT_THROW_MSG(config.parse(json_elements), DhcpConfigError,
                              "cannot add Alarm to store: AlarmStore::addAlarm:"
                              " alarm already exists for:"
                              " SOLICIT-REPLY.socket_received-buffer_read.0");
         }
-       }
+    }
 
-    /// @brief Protocol family AF_INET or AF_INET6
+    /// @brief Protocol family AF_INET or AF_INET6.
     uint16_t family_;
 
     /// @brief Collection of valid family-specific keys.
     std::vector<DurationKeyPtr> keys_;
 };
 
-/// @brief Test fixture for testing PerfMonConfig for DHCP(v4).
+/// @brief Test fixture for testing PerfMonConfig for DHCPV4.
 class PerfMonConfigTest4: public PerfMonConfigTest {
 public:
     /// @brief Constructor.
@@ -469,11 +469,11 @@ TEST_F(PerfMonConfigTest6, validAlarmsList) {
 }
 
 TEST_F(PerfMonConfigTest4, duplicateAlarms) {
-       testDuplicateAlarms();
+    testDuplicateAlarms();
 }
 
 TEST_F(PerfMonConfigTest6, duplicateAlarms) {
-       testDuplicateAlarms();
+    testDuplicateAlarms();
 }
 
 } // end of anonymous namespace
index 676b4e54e9f773c41fcb42f27b6698ce3aab1eda..30bd5af799e4bae3ab20d451182ce28c22c5b657 100644 (file)
@@ -82,21 +82,21 @@ public:
     void testValidConfig() {
         std::string valid_config =
             R"({
-                    "enable-monitoring" : false,
-                    "interval-width-secs" : 5,
-                    "stats-mgr-reporting"  : false,
-                    "alarm-report-secs" : 600,
+                    "enable-monitoring": false,
+                    "interval-width-secs": 5,
+                    "stats-mgr-reporting": false,
+                    "alarm-report-secs": 600,
                     "alarms": [{
                             "duration-key": {
-                                "query-type" : "",
-                                "response-type" : "",
-                                "start-event" : "process-started",
-                                "stop-event" : "process-completed",
-                                "subnet-id" : 70
+                                "query-type": "",
+                                "response-type": "",
+                                "start-event": "process-started",
+                                "stop-event": "process-completed",
+                                "subnet-id": 70
                                 },
-                            "enable-alarm" : true,
-                            "high-water-ms" : 500,
-                            "low-water-ms" : 25
+                            "enable-alarm": true,
+                            "high-water-ms": 500,
+                            "low-water-ms": 25
                         }]
                 })";
 
@@ -139,10 +139,10 @@ public:
     void testInvalidConfig() {
         std::string valid_config =
             R"({
-                    "enable-monitoring" : false,
-                    "interval-width-secs" : 5,
-                    "stats-mgr-reporting"  : false,
-                    "alarm-report-secs" : 600,
+                    "enable-monitoring": false,
+                    "interval-width-secs": 5,
+                    "stats-mgr-reporting": false,
+                    "alarm-report-secs": 600,
                     "alarms": "bogus"
                 })";
 
@@ -175,7 +175,7 @@ public:
     uint16_t family_;
 };
 
-/// @brief Test fixture for testing PerfMonConfig for DHCP(v4).
+/// @brief Test fixture for testing PerfMonConfig for DHCPV4.
 class PerfMonMgrTest4: public PerfMonMgrTest {
 public:
     /// @brief Constructor.