From 3426556541256f93d2cba65df3b9c8d1d1772861 Mon Sep 17 00:00:00 2001 From: platania Date: Thu, 16 Feb 2017 11:20:22 -0500 Subject: Initial OpenECOMP Demo commit Change-Id: Ibf8696196a7ac2c84ac8aa7cde1982c9c89fb64d Signed-off-by: platania --- vnfs/VES/code/evel_unit/evel_unit.c | 3453 +++++++++++++++++++++++++++++++++++ 1 file changed, 3453 insertions(+) create mode 100644 vnfs/VES/code/evel_unit/evel_unit.c (limited to 'vnfs/VES/code/evel_unit') diff --git a/vnfs/VES/code/evel_unit/evel_unit.c b/vnfs/VES/code/evel_unit/evel_unit.c new file mode 100644 index 00000000..8d843703 --- /dev/null +++ b/vnfs/VES/code/evel_unit/evel_unit.c @@ -0,0 +1,3453 @@ +/**************************************************************************//** + * @file + * Unit tests for JSON encoding and throttling. + * + * This software is intended to show the essential elements of the library's + * use. + * + * License + * ------- + * + * Copyright(c) <2016>, AT&T Intellectual Property. All other rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: This product includes software + * developed by the AT&T. + * 4. Neither the name of AT&T nor the names of its contributors may be used to + * endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY AT&T INTELLECTUAL PROPERTY ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AT&T INTELLECTUAL PROPERTY BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +#include +#include +#include +#include +#include + +#include "evel.h" +#include "evel_internal.h" +#include "evel_throttle.h" +#include "metadata.h" + +typedef enum { + SERVICE_NONE, + SERVICE_CODEC, + SERVICE_TRANSCODING, + SERVICE_RTCP, + SERVICE_EOC_VQM, + SERVICE_MARKER +} SERVICE_TEST; + +/*****************************************************************************/ +/* Local prototypes. */ +/*****************************************************************************/ +static void test_encode_heartbeat(); +static void test_encode_header_overrides(); +static void test_encode_fault(); +static void test_encode_fault_with_escaping(); +static void test_encode_measurement(); +static void test_encode_mobile_mand(); +static void test_encode_mobile_opts(); +static void test_encode_other(); +static void test_encode_report(); +static void test_encode_service(); +static void test_encode_service_subset(const SERVICE_TEST service_test); +static void test_encode_signaling(); +static void test_encode_state_change(); +static void test_encode_syslog(); +static void test_json_response_junk(); +static void test_json_provide_throttle_state(); +static void test_json_measurement_interval(); +static void test_json_throttle_spec_field(); +static void test_json_throttle_spec_nv_pair(); +static void test_json_throttle_spec_two_domains(); +static void test_json_throttle_spec_bad_command_type(); +static void test_encode_fault_throttled(); +static void test_encode_measurement_throttled(); +static void test_encode_mobile_throttled(); +static void test_encode_other_throttled(); +static void test_encode_report_throttled(); +static void test_encode_service_throttled(); +static void test_encode_signaling_throttled(); +static void test_encode_state_change_throttled(); +static void test_encode_syslog_throttled(); +static void compare_strings(char * expected, + char * actual, + int max_size, + char * description); + +/**************************************************************************//** + * Main function. + * + * Runs all unit test cases, and fails hard on the first failure. + * + * @param[in] argc Argument count. + * @param[in] argv Argument vector - for usage see usage_text. + *****************************************************************************/ +int main(int argc, char ** argv) +{ + assert(argc >= 0); + assert(argv != NULL); + + /***************************************************************************/ + /* Fix our timezone to UTC. */ + /***************************************************************************/ + putenv("TZ=UTC"); + + /***************************************************************************/ + /* Initialize metadata. */ + /***************************************************************************/ + openstack_metadata_initialize(); + + /***************************************************************************/ + /* Minimal initialisation to exercise the encoders. */ + /***************************************************************************/ + functional_role = "UNIT TEST"; + log_initialize(EVEL_LOG_DEBUG, "EVEL"); + + /***************************************************************************/ + /* Test each encoder. */ + /***************************************************************************/ + test_encode_heartbeat(); + test_encode_header_overrides(); + test_encode_fault(); + test_encode_measurement(); + test_encode_mobile_mand(); + test_encode_mobile_opts(); + test_encode_other(); + test_encode_report(); + test_encode_service(); + test_encode_signaling(); + test_encode_state_change(); + test_encode_syslog(); + + /***************************************************************************/ + /* Test JSON Throttle. */ + /***************************************************************************/ + test_json_response_junk(); + test_json_provide_throttle_state(); + test_json_measurement_interval(); + test_json_throttle_spec_field(); + test_json_throttle_spec_nv_pair(); + test_json_throttle_spec_two_domains(); + test_json_throttle_spec_bad_command_type(); + + /***************************************************************************/ + /* Test each encoder with throttling applied. */ + /***************************************************************************/ + test_encode_fault_throttled(); + test_encode_measurement_throttled(); + test_encode_mobile_throttled(); + test_encode_other_throttled(); + test_encode_report_throttled(); + test_encode_service_throttled(); + test_encode_signaling_throttled(); + test_encode_state_change_throttled(); + test_encode_syslog_throttled(); + + /***************************************************************************/ + /* Test character escaping. */ + /***************************************************************************/ + test_encode_fault_with_escaping(); + + printf ("\nAll Tests Passed\n"); + + return 0; +} + +/*****************************************************************************/ +/* We link with this gettimeofday so that we get a fixed result */ +/*****************************************************************************/ +int gettimeofday(struct timeval *tv, + struct timezone *tz __attribute__((unused))) +{ + tv->tv_sec = 1; + tv->tv_usec = 2; + return 0; +} + +void test_encode_heartbeat() +{ + char * expected = + "{\"event\": {" + "\"commonEventHeader\": {" + "\"domain\": \"heartbeat\", " + "\"eventId\": \"121\", " + "\"functionalRole\": \"UNIT TEST\", " + "\"lastEpochMicrosec\": 1000002, " + "\"priority\": \"Normal\", " + "\"reportingEntityName\": \"Dummy VM name - No Metadata available\", " + "\"sequence\": 121, " + "\"sourceName\": \"Dummy VM name - No Metadata available\", " + "\"startEpochMicrosec\": 1000002, " + "\"version\": 1.2, " + "\"eventType\": \"Autonomous heartbeat\", " + "\"reportingEntityId\": \"Dummy VM UUID - No Metadata available\", " + "\"sourceId\": \"Dummy VM UUID - No Metadata available\"" + "}}}"; + + size_t json_size = 0; + char json_body[EVEL_MAX_JSON_BODY]; + + /***************************************************************************/ + /* Test the VM name/uuid once. */ + /***************************************************************************/ + evel_set_next_event_sequence(121); + + EVENT_HEADER * heartbeat = evel_new_heartbeat(); + assert(heartbeat != NULL); + + json_size = evel_json_encode_event( + json_body, EVEL_MAX_JSON_BODY, (EVENT_HEADER *) heartbeat); + compare_strings(expected, json_body, EVEL_MAX_JSON_BODY, "Heartbeat"); + assert((json_size == strlen(json_body)) && "Bad size returned"); + + evel_free_event(heartbeat); +} + +void test_encode_header_overrides() +{ + char * expected = + "{\"event\": {" + "\"commonEventHeader\": {" + "\"domain\": \"heartbeat\", " + "\"eventId\": \"121\", " + "\"functionalRole\": \"UNIT TEST\", " + "\"lastEpochMicrosec\": 1000, " + "\"priority\": \"Normal\", " + "\"reportingEntityName\": \"entity_name_override\", " + "\"sequence\": 121, " + "\"sourceName\": \"Dummy VM name - No Metadata available\", " + "\"startEpochMicrosec\": 1001, " + "\"version\": 1.2, " + "\"eventType\": \"Autonomous heartbeat\", " + "\"reportingEntityId\": \"entity_id_override\", " + "\"sourceId\": \"Dummy VM UUID - No Metadata available\"" + "}}}"; + + size_t json_size = 0; + char json_body[EVEL_MAX_JSON_BODY]; + + /***************************************************************************/ + /* Test the VM name/uuid once. */ + /***************************************************************************/ + evel_set_next_event_sequence(121); + + EVENT_HEADER * heartbeat = evel_new_heartbeat(); + assert(heartbeat != NULL); + + evel_start_epoch_set(heartbeat, 1001); + evel_last_epoch_set(heartbeat, 1000); + evel_reporting_entity_name_set(heartbeat, "entity_name_override"); + evel_reporting_entity_id_set(heartbeat, "entity_id_override"); + + json_size = evel_json_encode_event( + json_body, EVEL_MAX_JSON_BODY, (EVENT_HEADER *) heartbeat); + compare_strings(expected, json_body, EVEL_MAX_JSON_BODY, "Heartbeat"); + assert((json_size == strlen(json_body)) && "Bad size returned"); + + evel_free_event(heartbeat); +} + +void test_encode_fault() +{ + char * expected = + "{\"event\": {" + "\"commonEventHeader\": {" + "\"domain\": \"fault\", " + "\"eventId\": \"122\", " + "\"functionalRole\": \"UNIT TEST\", " + "\"lastEpochMicrosec\": 1000002, " + "\"priority\": \"Normal\", " + "\"reportingEntityName\": \"Dummy VM name - No Metadata available\", " + "\"sequence\": 122, " + "\"sourceName\": \"Dummy VM name - No Metadata available\", " + "\"startEpochMicrosec\": 1000002, " + "\"version\": 1.2, " + "\"eventType\": \"Bad things happen...\", " + "\"reportingEntityId\": \"Dummy VM UUID - No Metadata available\", " + "\"sourceId\": \"Dummy VM UUID - No Metadata available\"" + "}, " + "\"faultFields\": {" + "\"alarmCondition\": \"My alarm condition\", " + "\"eventSeverity\": \"MAJOR\", " + "\"eventSourceType\": \"other\", " + "\"specificProblem\": \"It broke very badly\", " + "\"vfStatus\": \"Active\", " + "\"faultFieldsVersion\": 1.1, " + "\"alarmAdditionalInformation\": [" + "{\"name\": \"name1\", " + "\"value\": \"value1\"}, " + "{\"name\": \"name2\", " + "\"value\": \"value2\"}], " + "\"alarmInterfaceA\": \"My Interface Card\"" + "}}}"; + + size_t json_size = 0; + char json_body[EVEL_MAX_JSON_BODY]; + evel_set_next_event_sequence(122); + EVENT_FAULT * fault = evel_new_fault("My alarm condition", + "It broke very badly", + EVEL_PRIORITY_NORMAL, + EVEL_SEVERITY_MAJOR); + assert(fault != NULL); + evel_fault_type_set(fault, "Bad things happen..."); + evel_fault_interface_set(fault, "My Interface Card"); + evel_fault_addl_info_add(fault, "name1", "value1"); + evel_fault_addl_info_add(fault, "name2", "value2"); + + json_size = evel_json_encode_event( + json_body, EVEL_MAX_JSON_BODY, (EVENT_HEADER *) fault); + compare_strings(expected, json_body, EVEL_MAX_JSON_BODY, "Fault"); + assert((json_size == strlen(json_body)) && "Bad size returned"); + + evel_free_event(fault); +} + +void test_encode_measurement() +{ + char * expected = + "{\"event\": " + "{\"commonEventHeader\": {" + "\"domain\": \"measurementsForVfScaling\", " + "\"eventId\": \"123\", " + "\"functionalRole\": \"UNIT TEST\", " + "\"lastEpochMicrosec\": 3000, " + "\"priority\": \"Normal\", " + "\"reportingEntityName\": \"entity_name\", " + "\"sequence\": 123, " + "\"sourceName\": \"Dummy VM name - No Metadata available\", " + "\"startEpochMicrosec\": 2000, " + "\"version\": 1.2, " + "\"eventType\": \"Perf management...\", " + "\"reportingEntityId\": \"entity_id\", " + "\"sourceId\": \"Dummy VM UUID - No Metadata available\"" + "}, " + "\"measurementsForVfScalingFields\": " + "{" + "\"measurementInterval\": 5.500000, " + "\"concurrentSessions\": 1, " + "\"configuredEntities\": 2, " + "\"cpuUsageArray\": [" + "{\"cpuIdentifier\": \"cpu1\", " + "\"percentUsage\": 11.110000}, " + "{\"cpuIdentifier\": \"cpu2\", " + "\"percentUsage\": 22.220000}], " + "\"filesystemUsageArray\": [" + "{\"blockConfigured\": 100.110000, " + "\"blockIops\": 33, " + "\"blockUsed\": 100.220000, " + "\"ephemeralConfigured\": 100.110000, " + "\"ephemeralIops\": 44, " + "\"ephemeralUsed\": 200.220000, " + "\"filesystemName\": \"00-11-22\"}, " + "{\"blockConfigured\": 300.110000, " + "\"blockIops\": 55, " + "\"blockUsed\": 300.220000, " + "\"ephemeralConfigured\": 300.110000, " + "\"ephemeralIops\": 66, " + "\"ephemeralUsed\": 400.220000, " + "\"filesystemName\": \"33-44-55\"}], " + "\"latencyDistribution\": [" + "{\"countsInTheBucket\": 20}, " + "{\"lowEndOfLatencyBucket\": 10.000000, " + "\"highEndOfLatencyBucket\": 20.000000, " + "\"countsInTheBucket\": 30}], " + "\"meanRequestLatency\": 4.400000, " + "\"memoryConfigured\": 6.600000, " + "\"memoryUsed\": 3.300000, " + "\"requestRate\": 7, " + "\"vNicUsageArray\": [" + "{" + "\"bytesIn\": 3, " + "\"bytesOut\": 4, " + "\"packetsIn\": 100, " + "\"packetsOut\": 200, " + "\"vNicIdentifier\": \"eth0\"" + "}, " + "{" + "\"bytesIn\": 13, " + "\"bytesOut\": 14, " + "\"packetsIn\": 110, " + "\"packetsOut\": 240, " + "\"vNicIdentifier\": \"eth1\", " + "\"broadcastPacketsIn\": 11, " + "\"broadcastPacketsOut\": 12, " + "\"multicastPacketsIn\": 15, " + "\"multicastPacketsOut\": 16, " + "\"unicastPacketsIn\": 17, " + "\"unicastPacketsOut\": 18" + "}" + "], " + "\"aggregateCpuUsage\": 8.800000, " + "\"numberOfMediaPortsInUse\": 1234, " + "\"vnfcScalingMetric\": 1234.567800, " + "\"errors\": {" + "\"receiveDiscards\": 1, " + "\"receiveErrors\": 0, " + "\"transmitDiscards\": 2, " + "\"transmitErrors\": 1}, " + "\"featureUsageArray\": [" + "{\"featureIdentifier\": \"FeatureA\", " + "\"featureUtilization\": 123}, " + "{\"featureIdentifier\": \"FeatureB\", " + "\"featureUtilization\": 567}], " + "\"codecUsageArray\": [" + "{\"codecIdentifier\": \"G711a\", " + "\"numberInUse\": 91}, " + "{\"codecIdentifier\": \"G729ab\", " + "\"numberInUse\": 92}], " + "\"additionalMeasurements\": [" + "{\"name\": \"Group1\", " + "\"measurements\": [" + "{\"name\": \"Name1\", " + "\"value\": \"Value1\"}]}, " + "{\"name\": \"Group2\", " + "\"measurements\": [" + "{\"name\": \"Name1\", " + "\"value\": \"Value1\"}, " + "{\"name\": \"Name2\", " + "\"value\": \"Value2\"}]}], " + "\"measurementsForVfScalingVersion\": 1.1}}}"; + + size_t json_size = 0; + char json_body[EVEL_MAX_JSON_BODY]; + EVENT_MEASUREMENT * measurement = NULL; + MEASUREMENT_LATENCY_BUCKET * bucket = NULL; + MEASUREMENT_VNIC_USE * vnic_use = NULL; + + /***************************************************************************/ + /* Measurement. */ + /***************************************************************************/ + evel_set_next_event_sequence(123); + measurement = evel_new_measurement(5.5); + assert(measurement != NULL); + evel_measurement_type_set(measurement, "Perf management..."); + evel_measurement_conc_sess_set(measurement, 1); + evel_measurement_cfg_ents_set(measurement, 2); + evel_measurement_mean_req_lat_set(measurement, 4.4); + evel_measurement_mem_cfg_set(measurement, 6.6); + evel_measurement_mem_used_set(measurement, 3.3); + evel_measurement_request_rate_set(measurement, 7); + evel_measurement_agg_cpu_use_set(measurement, 8.8); + evel_measurement_cpu_use_add(measurement, "cpu1", 11.11); + evel_measurement_cpu_use_add(measurement, "cpu2", 22.22); + evel_measurement_fsys_use_add(measurement,"00-11-22",100.11, 100.22, 33, + 200.11, 200.22, 44); + evel_measurement_fsys_use_add(measurement,"33-44-55",300.11, 300.22, 55, + 400.11, 400.22, 66); + evel_start_epoch_set(&measurement->header, 2000); + evel_last_epoch_set(&measurement->header, 3000); + evel_reporting_entity_name_set(&measurement->header, "entity_name"); + evel_reporting_entity_id_set(&measurement->header, "entity_id"); + + /***************************************************************************/ + /* Latency Bucket with no optional parameters. */ + /***************************************************************************/ + bucket = evel_new_meas_latency_bucket(20); + evel_meas_latency_bucket_add(measurement, bucket); + + /***************************************************************************/ + /* Latency Bucket with all optional parameters. */ + /***************************************************************************/ + bucket = evel_new_meas_latency_bucket(30); + evel_meas_latency_bucket_low_end_set(bucket, 10.0); + evel_meas_latency_bucket_high_end_set(bucket, 20.0); + evel_meas_latency_bucket_add(measurement, bucket); + + /***************************************************************************/ + /* vNIC Use with no optional parameters. */ + /***************************************************************************/ + vnic_use = evel_new_measurement_vnic_use("eth0", 100, 200, 3, 4); + evel_meas_vnic_use_add(measurement, vnic_use); + + /***************************************************************************/ + /* vNIC Use with all optional parameters. */ + /***************************************************************************/ + vnic_use = evel_new_measurement_vnic_use("eth1", 110, 240, 13, 14); + evel_vnic_use_bcast_pkt_in_set(vnic_use, 11); + evel_vnic_use_bcast_pkt_out_set(vnic_use, 12); + evel_vnic_use_mcast_pkt_in_set(vnic_use, 15); + evel_vnic_use_mcast_pkt_out_set(vnic_use, 16); + evel_vnic_use_ucast_pkt_in_set(vnic_use, 17); + evel_vnic_use_ucast_pkt_out_set(vnic_use, 18); + evel_meas_vnic_use_add(measurement, vnic_use); + + evel_measurement_errors_set(measurement, 1, 0, 2, 1); + + evel_measurement_feature_use_add(measurement, "FeatureA", 123); + evel_measurement_feature_use_add(measurement, "FeatureB", 567); + + evel_measurement_codec_use_add(measurement, "G711a", 91); + evel_measurement_codec_use_add(measurement, "G729ab", 92); + + evel_measurement_media_port_use_set(measurement, 1234); + + evel_measurement_vnfc_scaling_metric_set(measurement, 1234.5678); + + evel_measurement_custom_measurement_add(measurement, + "Group1", "Name1", "Value1"); + evel_measurement_custom_measurement_add(measurement, + "Group2", "Name1", "Value1"); + evel_measurement_custom_measurement_add(measurement, + "Group2", "Name2", "Value2"); + + json_size = evel_json_encode_event( + json_body, EVEL_MAX_JSON_BODY, (EVENT_HEADER *) measurement); + compare_strings(expected, json_body, EVEL_MAX_JSON_BODY, "Measurement"); + assert((json_size == strlen(json_body)) && "Bad size returned"); + + evel_free_event(measurement); +} + +void test_encode_mobile_mand() +{ + char * expected = + "{\"event\": " + "{\"commonEventHeader\": {" + "\"domain\": \"mobileFlow\", " + "\"eventId\": \"1241\", " + "\"functionalRole\": \"UNIT TEST\", " + "\"lastEpochMicrosec\": 1000002, " + "\"priority\": \"Normal\", " + "\"reportingEntityName\": \"Dummy VM name - No Metadata available\", " + "\"sequence\": 1241, " + "\"sourceName\": \"Dummy VM name - No Metadata available\", " + "\"startEpochMicrosec\": 1000002, " + "\"version\": 1.2, " + "\"reportingEntityId\": \"Dummy VM UUID - No Metadata available\", " + "\"sourceId\": \"Dummy VM UUID - No Metadata available\"" + "}, " + "\"mobileFlowFields\": {" + "\"flowDirection\": \"Outbound\", " + "\"gtpPerFlowMetrics\": {" + "\"avgBitErrorRate\": 12.300000, " + "\"avgPacketDelayVariation\": 3.120000, " + "\"avgPacketLatency\": 100, " + "\"avgReceiveThroughput\": 2100, " + "\"avgTransmitThroughput\": 500, " + "\"flowActivationEpoch\": 1470409421, " + "\"flowActivationMicrosec\": 987, " + "\"flowDeactivationEpoch\": 1470409431, " + "\"flowDeactivationMicrosec\": 11, " + "\"flowDeactivationTime\": \"Fri, 05 Aug 2016 15:03:51 +0000\", " + "\"flowStatus\": \"Working\", " + "\"maxPacketDelayVariation\": 87, " + "\"numActivationFailures\": 3, " + "\"numBitErrors\": 17, " + "\"numBytesReceived\": 123654, " + "\"numBytesTransmitted\": 4561, " + "\"numDroppedPackets\": 0, " + "\"numL7BytesReceived\": 12, " + "\"numL7BytesTransmitted\": 10, " + "\"numLostPackets\": 1, " + "\"numOutOfOrderPackets\": 3, " + "\"numPacketErrors\": 7, " + "\"numPacketsReceivedExclRetrans\": 899, " + "\"numPacketsReceivedInclRetrans\": 901, " + "\"numPacketsTransmittedInclRetrans\": 302, " + "\"numRetries\": 6, " + "\"numTimeouts\": 2, " + "\"numTunneledL7BytesReceived\": 0, " + "\"roundTripTime\": 110, " + "\"timeToFirstByte\": 225" + "}, " + "\"ipProtocolType\": \"TCP\", " + "\"ipVersion\": \"IPv4\", " + "\"otherEndpointIpAddress\": \"2.3.4.1\", " + "\"otherEndpointPort\": 2341, " + "\"reportingEndpointIpAddr\": \"4.2.3.1\", " + "\"reportingEndpointPort\": 4321" + "}}}"; + + size_t json_size = 0; + char json_body[EVEL_MAX_JSON_BODY]; + MOBILE_GTP_PER_FLOW_METRICS * metrics = NULL; + EVENT_MOBILE_FLOW * mobile_flow = NULL; + + /***************************************************************************/ + /* Mobile. */ + /***************************************************************************/ + evel_set_next_event_sequence(1241); + + metrics = evel_new_mobile_gtp_flow_metrics(12.3, + 3.12, + 100, + 2100, + 500, + 1470409421, + 987, + 1470409431, + 11, + (time_t)1470409431, + "Working", + 87, + 3, + 17, + 123654, + 4561, + 0, + 12, + 10, + 1, + 3, + 7, + 899, + 901, + 302, + 6, + 2, + 0, + 110, + 225); + assert(metrics != NULL); + mobile_flow = evel_new_mobile_flow("Outbound", + metrics, + "TCP", + "IPv4", + "2.3.4.1", + 2341, + "4.2.3.1", + 4321); + assert(mobile_flow != NULL); + + json_size = evel_json_encode_event( + json_body, EVEL_MAX_JSON_BODY, (EVENT_HEADER *) mobile_flow); + compare_strings(expected, json_body, EVEL_MAX_JSON_BODY, "Mobile"); + assert((json_size == strlen(json_body)) && "Bad size returned"); + + evel_free_event(mobile_flow); +} + +void test_encode_mobile_opts() +{ + char * expected = + "{\"event\": " + "{\"commonEventHeader\": {" + "\"domain\": \"mobileFlow\", " + "\"eventId\": \"1242\", " + "\"functionalRole\": \"UNIT TEST\", " + "\"lastEpochMicrosec\": 1000002, " + "\"priority\": \"Normal\", " + "\"reportingEntityName\": \"Dummy VM name - No Metadata available\", " + "\"sequence\": 1242, " + "\"sourceName\": \"Dummy VM name - No Metadata available\", " + "\"startEpochMicrosec\": 1000002, " + "\"version\": 1.2, " + "\"eventType\": \"Mobile flow...\", " + "\"reportingEntityId\": \"Dummy VM UUID - No Metadata available\", " + "\"sourceId\": \"Dummy VM UUID - No Metadata available\"" + "}, " + "\"mobileFlowFields\": {" + "\"flowDirection\": \"Inbound\", " + "\"gtpPerFlowMetrics\": {" + "\"avgBitErrorRate\": 132.000100, " + "\"avgPacketDelayVariation\": 31.200000, " + "\"avgPacketLatency\": 101, " + "\"avgReceiveThroughput\": 2101, " + "\"avgTransmitThroughput\": 501, " + "\"flowActivationEpoch\": 1470409422, " + "\"flowActivationMicrosec\": 988, " + "\"flowDeactivationEpoch\": 1470409432, " + "\"flowDeactivationMicrosec\": 12, " + "\"flowDeactivationTime\": \"Fri, 05 Aug 2016 15:03:52 +0000\", " + "\"flowStatus\": \"Inactive\", " + "\"maxPacketDelayVariation\": 88, " + "\"numActivationFailures\": 4, " + "\"numBitErrors\": 18, " + "\"numBytesReceived\": 123655, " + "\"numBytesTransmitted\": 4562, " + "\"numDroppedPackets\": 1, " + "\"numL7BytesReceived\": 13, " + "\"numL7BytesTransmitted\": 11, " + "\"numLostPackets\": 2, " + "\"numOutOfOrderPackets\": 4, " + "\"numPacketErrors\": 8, " + "\"numPacketsReceivedExclRetrans\": 900, " + "\"numPacketsReceivedInclRetrans\": 902, " + "\"numPacketsTransmittedInclRetrans\": 303, " + "\"numRetries\": 7, " + "\"numTimeouts\": 3, " + "\"numTunneledL7BytesReceived\": 1, " + "\"roundTripTime\": 111, " + "\"timeToFirstByte\": 226, " + "\"ipTosCountList\": [" + "[\"1\", 13], " + "[\"4\", 99], " + "[\"17\", 1]], " + "\"ipTosList\": [\"1\", \"4\", \"17\"], " + "\"tcpFlagList\": [\"CWR\", \"URG\"], " + "\"tcpFlagCountList\": [[\"CWR\", 10], [\"URG\", 121]], " + "\"mobileQciCosList\": [\"conversational\", \"65\"], " + "\"mobileQciCosCountList\": [[\"conversational\", 11], [\"65\", 122]], " + "\"durConnectionFailedStatus\": 12, " + "\"durTunnelFailedStatus\": 13, " + "\"flowActivatedBy\": \"Remote\", " + "\"flowActivationTime\": \"Fri, 05 Aug 2016 15:03:43 +0000\", " + "\"flowDeactivatedBy\": \"Remote\", " + "\"gtpConnectionStatus\": \"Connected\", " + "\"gtpTunnelStatus\": \"Not tunneling\", " + "\"largePacketRtt\": 80, " + "\"largePacketThreshold\": 600.000000, " + "\"maxReceiveBitRate\": 1357924680, " + "\"maxTransmitBitRate\": 235711, " + "\"numGtpEchoFailures\": 1, " + "\"numGtpTunnelErrors\": 4, " + "\"numHttpErrors\": 2" + "}, " + "\"ipProtocolType\": \"UDP\", " + "\"ipVersion\": \"IPv6\", " + "\"otherEndpointIpAddress\": \"2.3.4.2\", " + "\"otherEndpointPort\": 2342, " + "\"reportingEndpointIpAddr\": \"4.2.3.2\", " + "\"reportingEndpointPort\": 4322, " + "\"applicationType\": \"Demo application\", " + "\"appProtocolType\": \"GSM\", " + "\"appProtocolVersion\": \"1\", " + "\"cid\": \"65535\", " + "\"connectionType\": \"S1-U\", " + "\"ecgi\": \"e65535\", " + "\"gtpProtocolType\": \"GTP-U\", " + "\"gtpVersion\": \"1\", " + "\"httpHeader\": \"http://www.something.com\", " + "\"imei\": \"209917614823\", " + "\"imsi\": \"355251/05/850925/8\", " + "\"lac\": \"1\", " + "\"mcc\": \"410\", " + "\"mnc\": \"04\", " + "\"msisdn\": \"6017123456789\", " + "\"otherFunctionalRole\": \"MME\", " + "\"rac\": \"514\", " + "\"radioAccessTechnology\": \"LTE\", " + "\"sac\": \"1\", " + "\"samplingAlgorithm\": 1, " + "\"tac\": \"2099\", " + "\"tunnelId\": \"Tunnel 1\", " + "\"vlanId\": \"15\"" + "}}}"; + + size_t json_size = 0; + char json_body[EVEL_MAX_JSON_BODY]; + MOBILE_GTP_PER_FLOW_METRICS * metrics = NULL; + EVENT_MOBILE_FLOW * mobile_flow = NULL; + + /***************************************************************************/ + /* Mobile. */ + /***************************************************************************/ + evel_set_next_event_sequence(1242); + + metrics = evel_new_mobile_gtp_flow_metrics(132.0001, + 31.2, + 101, + 2101, + 501, + 1470409422, + 988, + 1470409432, + 12, + (time_t)1470409432, + "Inactive", + 88, + 4, + 18, + 123655, + 4562, + 1, + 13, + 11, + 2, + 4, + 8, + 900, + 902, + 303, + 7, + 3, + 1, + 111, + 226); + assert(metrics != NULL); + + evel_mobile_gtp_metrics_dur_con_fail_set(metrics, 12); + evel_mobile_gtp_metrics_dur_tun_fail_set(metrics, 13); + evel_mobile_gtp_metrics_act_by_set(metrics, "Remote"); + evel_mobile_gtp_metrics_act_time_set(metrics, (time_t)1470409423); + evel_mobile_gtp_metrics_deact_by_set(metrics, "Remote"); + evel_mobile_gtp_metrics_con_status_set(metrics, "Connected"); + evel_mobile_gtp_metrics_tun_status_set(metrics, "Not tunneling"); + evel_mobile_gtp_metrics_iptos_set(metrics, 1, 13); + evel_mobile_gtp_metrics_iptos_set(metrics, 17, 1); + evel_mobile_gtp_metrics_iptos_set(metrics, 4, 99); + evel_mobile_gtp_metrics_large_pkt_rtt_set(metrics, 80); + evel_mobile_gtp_metrics_large_pkt_thresh_set(metrics, 600.0); + evel_mobile_gtp_metrics_max_rcv_bit_rate_set(metrics, 1357924680); + evel_mobile_gtp_metrics_max_trx_bit_rate_set(metrics, 235711); + evel_mobile_gtp_metrics_num_echo_fail_set(metrics, 1); + evel_mobile_gtp_metrics_num_tun_fail_set(metrics, 4); + evel_mobile_gtp_metrics_num_http_errors_set(metrics, 2); + evel_mobile_gtp_metrics_tcp_flag_count_add(metrics, EVEL_TCP_CWR, 10); + evel_mobile_gtp_metrics_tcp_flag_count_add(metrics, EVEL_TCP_URG, 121); + evel_mobile_gtp_metrics_qci_cos_count_add( + metrics, EVEL_QCI_COS_UMTS_CONVERSATIONAL, 11); + evel_mobile_gtp_metrics_qci_cos_count_add( + metrics, EVEL_QCI_COS_LTE_65, 122); + + mobile_flow = evel_new_mobile_flow("Inbound", + metrics, + "UDP", + "IPv6", + "2.3.4.2", + 2342, + "4.2.3.2", + 4322); + assert(mobile_flow != NULL); + + evel_mobile_flow_type_set(mobile_flow, "Mobile flow..."); + evel_mobile_flow_app_type_set(mobile_flow, "Demo application"); + evel_mobile_flow_app_prot_type_set(mobile_flow, "GSM"); + evel_mobile_flow_app_prot_ver_set(mobile_flow, "1"); + evel_mobile_flow_cid_set(mobile_flow, "65535"); + evel_mobile_flow_con_type_set(mobile_flow, "S1-U"); + evel_mobile_flow_ecgi_set(mobile_flow, "e65535"); + evel_mobile_flow_gtp_prot_type_set(mobile_flow, "GTP-U"); + evel_mobile_flow_gtp_prot_ver_set(mobile_flow, "1"); + evel_mobile_flow_http_header_set(mobile_flow, + "http://www.something.com"); + evel_mobile_flow_imei_set(mobile_flow, "209917614823"); + evel_mobile_flow_imsi_set(mobile_flow, "355251/05/850925/8"); + evel_mobile_flow_lac_set(mobile_flow, "1"); + evel_mobile_flow_mcc_set(mobile_flow, "410"); + evel_mobile_flow_mnc_set(mobile_flow, "04"); + evel_mobile_flow_msisdn_set(mobile_flow, "6017123456789"); + evel_mobile_flow_other_func_role_set(mobile_flow, "MME"); + evel_mobile_flow_rac_set(mobile_flow, "514"); + evel_mobile_flow_radio_acc_tech_set(mobile_flow, "LTE"); + evel_mobile_flow_sac_set(mobile_flow, "1"); + evel_mobile_flow_samp_alg_set(mobile_flow, 1); + evel_mobile_flow_tac_set(mobile_flow, "2099"); + evel_mobile_flow_tunnel_id_set(mobile_flow, "Tunnel 1"); + evel_mobile_flow_vlan_id_set(mobile_flow, "15"); + + json_size = evel_json_encode_event( + json_body, EVEL_MAX_JSON_BODY, (EVENT_HEADER *) mobile_flow); + compare_strings(expected, json_body, EVEL_MAX_JSON_BODY, "Mobile"); + assert((json_size == strlen(json_body)) && "Bad size returned"); + + evel_free_event(mobile_flow); +} + +void test_encode_report() +{ + char * expected = + "{\"event\": " + "{\"commonEventHeader\": {" + "\"domain\": \"measurementsForVfReporting\", " + "\"eventId\": \"125\", " + "\"functionalRole\": \"UNIT TEST\", " + "\"lastEpochMicrosec\": 1000002, " + "\"priority\": \"Normal\", " + "\"reportingEntityName\": \"Dummy VM name - No Metadata available\", " + "\"sequence\": 125, " + "\"sourceName\": \"Dummy VM name - No Metadata available\", " + "\"startEpochMicrosec\": 1000002, " + "\"version\": 1.2, " + "\"eventType\": \"Perf reporting...\", " + "\"reportingEntityId\": \"Dummy VM UUID - No Metadata available\", " + "\"sourceId\": \"Dummy VM UUID - No Metadata available\"" + "}, " + "\"measurementsForVfReportingFields\": " + "{\"measurementInterval\": 1.100000, " + "\"featureUsageArray\": [" + "{\"featureIdentifier\": \"FeatureA\", " + "\"featureUtilization\": 123}, " + "{\"featureIdentifier\": \"FeatureB\", " + "\"featureUtilization\": 567}], " + "\"additionalMeasurements\": [" + "{\"name\": \"Group1\", " + "\"measurements\": [" + "{\"name\": \"Name1\", " + "\"value\": \"Value1\"}]}, " + "{\"name\": \"Group2\", " + "\"measurements\": [" + "{\"name\": \"Name1\", " + "\"value\": \"Value1\"}, " + "{\"name\": \"Name2\", " + "\"value\": \"Value2\"}]}], " + "\"measurementFieldsVersion\": 1.1}}}"; + + size_t json_size = 0; + char json_body[EVEL_MAX_JSON_BODY]; + EVENT_REPORT * report = NULL; + + /***************************************************************************/ + /* Report. */ + /***************************************************************************/ + evel_set_next_event_sequence(125); + report = evel_new_report(1.1); + assert(report != NULL); + evel_report_type_set(report, "Perf reporting..."); + evel_report_feature_use_add(report, "FeatureA", 123); + evel_report_feature_use_add(report, "FeatureB", 567); + evel_report_custom_measurement_add(report, "Group1", "Name1", "Value1"); + evel_report_custom_measurement_add(report, "Group2", "Name1", "Value1"); + evel_report_custom_measurement_add(report, "Group2", "Name2", "Value2"); + + json_size = evel_json_encode_event( + json_body, EVEL_MAX_JSON_BODY, (EVENT_HEADER *) report); + compare_strings(expected, json_body, EVEL_MAX_JSON_BODY, "Report"); + assert((json_size == strlen(json_body)) && "Bad size returned"); + + evel_free_event(report); +} + +void test_encode_service() +{ + test_encode_service_subset(SERVICE_NONE); + test_encode_service_subset(SERVICE_CODEC); + test_encode_service_subset(SERVICE_TRANSCODING); + test_encode_service_subset(SERVICE_RTCP); + test_encode_service_subset(SERVICE_EOC_VQM); + test_encode_service_subset(SERVICE_MARKER); +} + +void test_encode_service_subset(const SERVICE_TEST service_test) +{ + char * expected_start = + "{\"event\": " + "{\"commonEventHeader\": {" + "\"domain\": \"serviceEvents\", " + "\"eventId\": \"2000\", " + "\"functionalRole\": \"UNIT TEST\", " + "\"lastEpochMicrosec\": 1000002, " + "\"priority\": \"Normal\", " + "\"reportingEntityName\": \"Dummy VM name - No Metadata available\", " + "\"sequence\": 2000, " + "\"sourceName\": \"Dummy VM name - No Metadata available\", " + "\"startEpochMicrosec\": 1000002, " + "\"version\": 1.2, " + "\"eventType\": \"Service Event\", " + "\"reportingEntityId\": \"Dummy VM UUID - No Metadata available\", " + "\"sourceId\": \"Dummy VM UUID - No Metadata available\"" + "}, " + "\"serviceEventsFields\": {" + "\"eventInstanceIdentifier\": " + "{" + "\"vendorId\": \"vendor_x_id\", " + "\"eventId\": \"vendor_x_event_id\", " + "\"productId\": \"vendor_x_product_id\", " + "\"subsystemId\": \"vendor_x_subsystem_id\", " + "\"eventFriendlyName\": \"vendor_x_frieldly_name\"" + "}, " + "\"serviceEventsFieldsVersion\": 1.1, " + "\"correlator\": \"vendor_x_correlator\", " + "\"additionalFields\": [" + "{\"name\": \"Name1\", \"value\": \"Value1\"}, " + "{\"name\": \"Name2\", \"value\": \"Value2\"}, " + "{\"name\": \"Name3\", \"value\": \"Value3\"}, " + "{\"name\": \"Name4\", \"value\": \"Value4\"}]"; + char * expected_codec = + ", " + "\"codecSelected\": {" + "\"codec\": \"PCMA\"" + "}"; + char * expected_transcoding = + ", " + "\"codecSelectedTranscoding\": {" + "\"calleeSideCodec\": \"PCMA\", " + "\"callerSideCodec\": \"G729A\"" + "}"; + char * expected_rtcp = + ", " + "\"midCallRtcp\": {" + "\"rtcpData\": \"some_rtcp_data\"" + "}"; + char * expected_eoc_vqm = + ", " + "\"endOfCallVqmSummaries\": {" + "\"adjacencyName\": \"vendor_x_adjacency\", " + "\"endpointDescription\": \"Caller\", " + "\"endpointJitter\": 66, " + "\"endpointRtpOctetsDiscarded\": 100, " + "\"endpointRtpOctetsReceived\": 200, " + "\"endpointRtpOctetsSent\": 300, " + "\"endpointRtpPacketsDiscarded\": 400, " + "\"endpointRtpPacketsReceived\": 500, " + "\"endpointRtpPacketsSent\": 600, " + "\"localJitter\": 99, " + "\"localRtpOctetsDiscarded\": 150, " + "\"localRtpOctetsReceived\": 250, " + "\"localRtpOctetsSent\": 350, " + "\"localRtpPacketsDiscarded\": 450, " + "\"localRtpPacketsReceived\": 550, " + "\"localRtpPacketsSent\": 650, " + "\"mosCqe\": 12.255000, " + "\"packetsLost\": 157, " + "\"packetLossPercent\": 0.232000, " + "\"rFactor\": 11, " + "\"roundTripDelay\": 15" + "}"; + char * expected_marker = + ", " + "\"marker\": {" + "\"phoneNumber\": \"0888888888\"" + "}"; + char * expected_end = + "}}}"; + + char * expected_middle = NULL; + switch (service_test) + { + case SERVICE_NONE: + expected_middle = ""; + break; + case SERVICE_CODEC: + expected_middle = expected_codec; + break; + case SERVICE_TRANSCODING: + expected_middle = expected_transcoding; + break; + case SERVICE_RTCP: + expected_middle = expected_rtcp; + break; + case SERVICE_EOC_VQM: + expected_middle = expected_eoc_vqm; + break; + case SERVICE_MARKER: + expected_middle = expected_marker; + break; + } + assert(expected_middle != NULL); + + int offset = 0; + char expected[EVEL_MAX_JSON_BODY]; + offset = snprintf(expected + offset, + EVEL_MAX_JSON_BODY - offset, + "%s%s%s", + expected_start, + expected_middle, + expected_end); + + size_t json_size = 0; + char json_body[EVEL_MAX_JSON_BODY]; + EVENT_SERVICE * event = NULL; + evel_set_next_event_sequence(2000); + event = evel_new_service("vendor_x_id", "vendor_x_event_id"); + assert(event != NULL); + evel_service_type_set(event, "Service Event"); + evel_service_product_id_set(event, "vendor_x_product_id"); + evel_service_subsystem_id_set(event, "vendor_x_subsystem_id"); + evel_service_friendly_name_set(event, "vendor_x_frieldly_name"); + evel_service_correlator_set(event, "vendor_x_correlator"); + + switch (service_test) + { + case SERVICE_NONE: + break; + case SERVICE_CODEC: + evel_service_codec_set(event, "PCMA"); + break; + case SERVICE_TRANSCODING: + evel_service_callee_codec_set(event, "PCMA"); + evel_service_caller_codec_set(event, "G729A"); + break; + case SERVICE_RTCP: + evel_service_rtcp_data_set(event, "some_rtcp_data"); + break; + case SERVICE_EOC_VQM: + evel_service_adjacency_name_set(event, "vendor_x_adjacency"); + evel_service_endpoint_desc_set(event, EVEL_SERVICE_ENDPOINT_CALLER); + evel_service_endpoint_jitter_set(event, 66); + evel_service_endpoint_rtp_oct_disc_set(event, 100); + evel_service_endpoint_rtp_oct_recv_set(event, 200); + evel_service_endpoint_rtp_oct_sent_set(event, 300); + evel_service_endpoint_rtp_pkt_disc_set(event, 400); + evel_service_endpoint_rtp_pkt_recv_set(event, 500); + evel_service_endpoint_rtp_pkt_sent_set(event, 600); + evel_service_local_jitter_set(event, 99); + evel_service_local_rtp_oct_disc_set(event, 150); + evel_service_local_rtp_oct_recv_set(event, 250); + evel_service_local_rtp_oct_sent_set(event, 350); + evel_service_local_rtp_pkt_disc_set(event, 450); + evel_service_local_rtp_pkt_recv_set(event, 550); + evel_service_local_rtp_pkt_sent_set(event, 650); + evel_service_mos_cqe_set(event, 12.255); + evel_service_packets_lost_set(event, 157); + evel_service_packet_loss_percent_set(event, 0.232); + evel_service_r_factor_set(event, 11); + evel_service_round_trip_delay_set(event, 15); + break; + case SERVICE_MARKER: + evel_service_phone_number_set(event, "0888888888"); + break; + } + + evel_service_addl_field_add(event, "Name1", "Value1"); + evel_service_addl_field_add(event, "Name2", "Value2"); + evel_service_addl_field_add(event, "Name3", "Value3"); + evel_service_addl_field_add(event, "Name4", "Value4"); + json_size = evel_json_encode_event( + json_body, EVEL_MAX_JSON_BODY, (EVENT_HEADER *) event); + compare_strings(expected, json_body, EVEL_MAX_JSON_BODY, "Service"); + assert((json_size == strlen(json_body)) && "Bad size returned"); + + evel_free_event(event); +} + +void test_encode_signaling() +{ + char * expected = + "{\"event\": " + "{\"commonEventHeader\": {" + "\"domain\": \"signaling\", " + "\"eventId\": \"2001\", " + "\"functionalRole\": \"UNIT TEST\", " + "\"lastEpochMicrosec\": 1000002, " + "\"priority\": \"Normal\", " + "\"reportingEntityName\": \"Dummy VM name - No Metadata available\", " + "\"sequence\": 2001, " + "\"sourceName\": \"Dummy VM name - No Metadata available\", " + "\"startEpochMicrosec\": 1000002, " + "\"version\": 1.2, " + "\"eventType\": \"Signaling\", " + "\"reportingEntityId\": \"Dummy VM UUID - No Metadata available\", " + "\"sourceId\": \"Dummy VM UUID - No Metadata available\"" + "}, " + "\"signalingFields\": {" + "\"eventInstanceIdentifier\": " + "{" + "\"vendorId\": \"vendor_x_id\", " + "\"eventId\": \"vendor_x_event_id\", " + "\"productId\": \"vendor_x_product_id\", " + "\"subsystemId\": \"vendor_x_subsystem_id\", " + "\"eventFriendlyName\": \"vendor_x_frieldly_name\"" + "}, " + "\"signalingFieldsVersion\": 1.1, " + "\"correlator\": \"vendor_x_correlator\", " + "\"localIpAddress\": \"1.0.3.1\", " + "\"localPort\": \"1031\", " + "\"remoteIpAddress\": \"5.3.3.0\", " + "\"remotePort\": \"5330\", " + "\"compressedSip\": \"compressed_sip\", " + "\"summarySip\": \"summary_sip\"" + "}}}"; + + size_t json_size = 0; + char json_body[EVEL_MAX_JSON_BODY]; + EVENT_SIGNALING * event = NULL; + evel_set_next_event_sequence(2001); + event = evel_new_signaling("vendor_x_id", "vendor_x_event_id"); + assert(event != NULL); + evel_signaling_type_set(event, "Signaling"); + evel_signaling_product_id_set(event, "vendor_x_product_id"); + evel_signaling_subsystem_id_set(event, "vendor_x_subsystem_id"); + evel_signaling_friendly_name_set(event, "vendor_x_frieldly_name"); + evel_signaling_correlator_set(event, "vendor_x_correlator"); + evel_signaling_local_ip_address_set(event, "1.0.3.1"); + evel_signaling_local_port_set(event, "1031"); + evel_signaling_remote_ip_address_set(event, "5.3.3.0"); + evel_signaling_remote_port_set(event, "5330"); + evel_signaling_compressed_sip_set(event, "compressed_sip"); + evel_signaling_summary_sip_set(event, "summary_sip"); + json_size = evel_json_encode_event( + json_body, EVEL_MAX_JSON_BODY, (EVENT_HEADER *) event); + compare_strings(expected, json_body, EVEL_MAX_JSON_BODY, "Signaling"); + assert((json_size == strlen(json_body)) && "Bad size returned"); + + evel_free_event(event); +} + +void test_encode_state_change() +{ + char * expected = + "{\"event\": " + "{\"commonEventHeader\": {" + "\"domain\": \"stateChange\", " + "\"eventId\": \"128\", " + "\"functionalRole\": \"UNIT TEST\", " + "\"lastEpochMicrosec\": 1000002, " + "\"priority\": \"Normal\", " + "\"reportingEntityName\": \"Dummy VM name - No Metadata available\", " + "\"sequence\": 128, " + "\"sourceName\": \"Dummy VM name - No Metadata available\", " + "\"startEpochMicrosec\": 1000002, " + "\"version\": 1.2, " + "\"eventType\": \"SC Type\", " + "\"reportingEntityId\": \"Dummy VM UUID - No Metadata available\", " + "\"sourceId\": \"Dummy VM UUID - No Metadata available\"" + "}, " + "\"stateChangeFields\": {" + "\"newState\": \"inService\", " + "\"oldState\": \"outOfService\", " + "\"stateInterface\": \"An Interface\", " + "\"additionalFields\": [" + "{\"name\": \"Name1\", " + "\"value\": \"Value1\"}, " + "{\"name\": \"Name2\", " + "\"value\": \"Value2\"}" + "], " + "\"stateChangeFieldsVersion\": 1.1" + "}}}"; + + size_t json_size = 0; + char json_body[EVEL_MAX_JSON_BODY]; + EVENT_STATE_CHANGE * state_change = NULL; + evel_set_next_event_sequence(128); + state_change = evel_new_state_change(EVEL_ENTITY_STATE_IN_SERVICE, + EVEL_ENTITY_STATE_OUT_OF_SERVICE, + "An Interface"); + assert(state_change != NULL); + evel_state_change_type_set(state_change, "SC Type"); + evel_state_change_addl_field_add(state_change, "Name1", "Value1"); + evel_state_change_addl_field_add(state_change, "Name2", "Value2"); + + json_size = evel_json_encode_event( + json_body, EVEL_MAX_JSON_BODY, (EVENT_HEADER *) state_change); + compare_strings(expected, json_body, EVEL_MAX_JSON_BODY, "StateChange"); + assert((json_size == strlen(json_body)) && "Bad size returned"); + + evel_free_event(state_change); +} + +void test_encode_syslog() +{ + char * expected = + "{\"event\": " + "{\"commonEventHeader\": {" + "\"domain\": \"syslog\", " + "\"eventId\": \"126\", " + "\"functionalRole\": \"UNIT TEST\", " + "\"lastEpochMicrosec\": 1000002, " + "\"priority\": \"Normal\", " + "\"reportingEntityName\": \"Dummy VM name - No Metadata available\", " + "\"sequence\": 126, " + "\"sourceName\": \"Dummy VM name - No Metadata available\", " + "\"startEpochMicrosec\": 1000002, " + "\"version\": 1.2, " + "\"eventType\": \"SL Type\", " + "\"reportingEntityId\": \"Dummy VM UUID - No Metadata available\", " + "\"sourceId\": \"Dummy VM UUID - No Metadata available\"" + "}, " + "\"syslogFields\": {" + "\"eventSourceType\": \"virtualNetworkFunction\", " + "\"syslogMsg\": \"SL Message\", " + "\"syslogTag\": \"SL Tag\", " + "\"syslogFieldsVersion\": 1.1, " + "\"eventSourceHost\": \"SL Host\", " + "\"syslogFacility\": 6, " + "\"syslogProc\": \"SL Proc\", " + "\"syslogProcId\": 2, " + "\"syslogSData\": \"SL SDATA\", " + "\"syslogVer\": 1" + "}}}"; + size_t json_size = 0; + char json_body[EVEL_MAX_JSON_BODY]; + EVENT_SYSLOG * syslog = NULL; + evel_set_next_event_sequence(126); + syslog = evel_new_syslog(EVEL_SOURCE_VIRTUAL_NETWORK_FUNCTION, + "SL Message", + "SL Tag"); + assert(syslog != NULL); + evel_syslog_type_set(syslog, "SL Type"); + evel_syslog_event_source_host_set(syslog, "SL Host"); + evel_syslog_facility_set(syslog, EVEL_SYSLOG_FACILITY_LINE_PRINTER); + evel_syslog_proc_set(syslog, "SL Proc"); + evel_syslog_proc_id_set(syslog, 2); + evel_syslog_version_set(syslog, 1); + evel_syslog_s_data_set(syslog, "SL SDATA"); + + json_size = evel_json_encode_event( + json_body, EVEL_MAX_JSON_BODY, (EVENT_HEADER *) syslog); + compare_strings(expected, json_body, EVEL_MAX_JSON_BODY, "Syslog"); + assert((json_size == strlen(json_body)) && "Bad size returned"); + + evel_free_event(syslog); +} + +void test_encode_other() +{ + char * expected = + "{\"event\": " + "{\"commonEventHeader\": {" + "\"domain\": \"other\", " + "\"eventId\": \"129\", " + "\"functionalRole\": \"UNIT TEST\", " + "\"lastEpochMicrosec\": 1000002, " + "\"priority\": \"Normal\", " + "\"reportingEntityName\": \"Dummy VM name - No Metadata available\", " + "\"sequence\": 129, " + "\"sourceName\": \"Dummy VM name - No Metadata available\", " + "\"startEpochMicrosec\": 1000002, " + "\"version\": 1.2, " + "\"eventType\": \"Other Type\", " + "\"reportingEntityId\": \"Dummy VM UUID - No Metadata available\", " + "\"sourceId\": \"Dummy VM UUID - No Metadata available\"" + "}, " + "\"otherFields\": [" + "{\"name\": \"Other field 1\", " + "\"value\": \"Other value 1\"}, " + "{\"name\": \"Other field 2\", " + "\"value\": \"Other value 2\"}" + "]" + "}}"; + + size_t json_size = 0; + char json_body[EVEL_MAX_JSON_BODY]; + EVENT_OTHER * other = NULL; + evel_set_next_event_sequence(129); + other = evel_new_other(); + assert(other != NULL); + evel_other_type_set(other, "Other Type"); + evel_other_field_add(other, + "Other field 1", + "Other value 1"); + evel_other_field_add(other, + "Other field 2", + "Other value 2"); + + json_size = evel_json_encode_event( + json_body, EVEL_MAX_JSON_BODY, (EVENT_HEADER *) other); + compare_strings(expected, json_body, EVEL_MAX_JSON_BODY, "Other"); + assert((json_size == strlen(json_body)) && "Bad size returned"); + + evel_free_event(other); +} + +void compare_strings(char * expected, + char * actual, + int max_size, + char * description) +{ + if (strncmp(expected, actual, max_size) != 0) + { + int diff = 0; + while (diff < max_size) + { + if (expected[diff] != actual[diff]) + { + break; + } + diff++; + } + + printf("Comparison Failure at Offset %d\n\n", diff); + printf("Expected:\n%s\n", expected); + printf("Actual:\n%s\n", actual); + printf("Description: %s\n", description); + assert(0); + } +} + +/**************************************************************************//** + * Copy a json string to a ::MEMORY_CHUNK for testing. + * + * @param chunk The memory chunk. + * @param string The json string. + *****************************************************************************/ +void copy_string_to_chunk(MEMORY_CHUNK * chunk, char * string) +{ + int mem_size; + + /***************************************************************************/ + /* Check preconditions. */ + /***************************************************************************/ + assert(chunk != NULL); + assert(string != NULL); + + mem_size = strlen(string) + 1; + chunk->memory = malloc(mem_size); + memcpy(chunk->memory, string, mem_size); + chunk->size = mem_size; +} + +/**************************************************************************//** + * Copy a json string to a ::MEMORY_CHUNK for testing. + * + * @param json The JSON string. + * @param post Memory chunk to post a response. + *****************************************************************************/ +void handle_json_response(char * json, MEMORY_CHUNK * post) +{ + MEMORY_CHUNK chunk; + post->memory = NULL; + post->size = 0; + copy_string_to_chunk(&chunk, json); + evel_handle_event_response(&chunk, post); + free(chunk.memory); +} + +/**************************************************************************//** + * Test that a non-"commandList" JSON buffer leaves the throttle state off. + *****************************************************************************/ +void test_json_response_junk() +{ + MEMORY_CHUNK post; + int domain; + char * json_junk = + "{" + "\"junk1\": [" + "\"1\", \"2\", \"3\"], " + "\"junk2\": [" + "\"1\", \"2\", \"3\"]" + "}"; + + evel_throttle_initialize(); + handle_json_response(json_junk, &post); + + /***************************************************************************/ + /* Check that all domains are not throttled. */ + /***************************************************************************/ + for (domain = EVEL_DOMAIN_FAULT; domain < EVEL_MAX_DOMAINS; domain++) + { + assert(evel_get_throttle_spec(domain) == NULL); + } + + /***************************************************************************/ + /* Check that we generated no post. */ + /***************************************************************************/ + assert(post.memory == NULL); + + evel_throttle_terminate(); +} + +char * json_command_list_provide = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"provideThrottlingState\"" + "}" + "}" + "]" + "}"; + +char * json_command_list_fault_clear = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"eventDomainThrottleSpecification\": {" + "\"eventDomain\": \"fault\"" + "}" + "}" + "}" + "]" + "}"; + +char * json_command_list_syslog_clear = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"eventDomainThrottleSpecification\": {" + "\"eventDomain\": \"syslog\"" + "}" + "}" + "}" + "]" + "}"; + +char * expected_throttle_state_normal = + "{" + "\"eventThrottlingState\": {" + "\"eventThrottlingMode\": \"normal\"}" + "}"; + +/**************************************************************************//** + * Test that we can return the default throttling state. + *****************************************************************************/ +void test_json_provide_throttle_state() +{ + MEMORY_CHUNK post; + int domain; + + char * expected_post = expected_throttle_state_normal; + + evel_throttle_initialize(); + handle_json_response(json_command_list_provide, &post); + + /***************************************************************************/ + /* Check that all domains are not throttled. */ + /***************************************************************************/ + for (domain = EVEL_DOMAIN_FAULT; domain < EVEL_MAX_DOMAINS; domain++) + { + assert(evel_get_throttle_spec(domain) == NULL); + } + + /***************************************************************************/ + /* Check that we generated a throttling specification post. */ + /***************************************************************************/ + assert(post.memory != NULL); + compare_strings(expected_post, post.memory, strlen(expected_post), + "Throttle State Normal"); + free(post.memory); + + evel_throttle_terminate(); +} + +/**************************************************************************//** + * Test the measurement interval handling and API. + *****************************************************************************/ +void test_json_measurement_interval() +{ + MEMORY_CHUNK post; + char * json_command_list_interval_only = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"measurementInterval\": 60" + "}" + "}" + "]" + "}"; + + char * json_command_list_interval_first = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"measurementInterval\": 30, " + "\"commandType\": \"measurementIntervalChange\"" + "}" + "}" + "]" + "}"; + + char * json_command_list_command_first = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"measurementIntervalChange\", " + "\"measurementInterval\": 60" + "}" + "}" + "]" + "}"; + + evel_throttle_initialize(); + assert(evel_get_measurement_interval() == EVEL_MEASUREMENT_INTERVAL_UKNOWN); + + /***************************************************************************/ + /* Check that we're not handling stuff when we shouldn't. */ + /***************************************************************************/ + handle_json_response(json_command_list_interval_only, &post); + assert(post.memory == NULL); + assert(evel_get_measurement_interval() == EVEL_MEASUREMENT_INTERVAL_UKNOWN); + + /***************************************************************************/ + /* Check that we're OK with the interval coming first. */ + /***************************************************************************/ + handle_json_response(json_command_list_interval_first, &post); + assert(post.memory == NULL); + assert(evel_get_measurement_interval() == 30); + + /***************************************************************************/ + /* Check that we're OK with the command type coming first. */ + /***************************************************************************/ + handle_json_response(json_command_list_command_first, &post); + assert(post.memory == NULL); + assert(evel_get_measurement_interval() == 60); + + evel_throttle_terminate(); +} + +/**************************************************************************//** + * Test a single domain, single field suppression. + *****************************************************************************/ +void test_json_throttle_spec_field() +{ + MEMORY_CHUNK post; + int domain; + + char * json_command_list_fault_single = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"eventDomainThrottleSpecification\": {" + "\"eventDomain\": \"fault\", " + "\"suppressedFieldNames\": [\"alarmInterfaceA\"]" + "}" + "}" + "}" + "]" + "}"; + + char * json_command_list_fault_double = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"eventDomainThrottleSpecification\": {" + "\"eventDomain\": \"fault\", " + "\"suppressedFieldNames\": [" + "\"alarmInterfaceA\", \"alarmAdditionalInformation\"]" + "}" + "}" + "}" + "]" + "}"; + + char * expected_post_fault_single = + "{" + "\"eventThrottlingState\": {" + "\"eventThrottlingMode\": \"throttled\", " + "\"eventDomainThrottleSpecificationList\": [" + "{" + "\"eventDomain\": \"fault\", " + "\"suppressedFieldNames\": [\"alarmInterfaceA\"]" + "}" + "]" + "}" + "}"; + + char * expected_post_fault_double = + "{" + "\"eventThrottlingState\": {" + "\"eventThrottlingMode\": \"throttled\", " + "\"eventDomainThrottleSpecificationList\": [" + "{" + "\"eventDomain\": \"fault\", " + "\"suppressedFieldNames\": [" + "\"alarmInterfaceA\", \"alarmAdditionalInformation\"]" + "}" + "]" + "}" + "}"; + + /***************************************************************************/ + /* Initialize and provide a specification with a single fault suppressed. */ + /***************************************************************************/ + evel_throttle_initialize(); + handle_json_response(json_command_list_fault_single, &post); + + /***************************************************************************/ + /* Check that the FAULT domain is throttled. */ + /***************************************************************************/ + assert(evel_get_throttle_spec(EVEL_DOMAIN_FAULT) != NULL); + for (domain = EVEL_DOMAIN_MEASUREMENT; domain < EVEL_MAX_DOMAINS; domain++) + { + if (domain != EVEL_DOMAIN_FAULT) + { + assert(evel_get_throttle_spec(domain) == NULL); + } + } + assert(post.memory == NULL); + + /***************************************************************************/ + /* Request and verify the throttling state. */ + /***************************************************************************/ + handle_json_response(json_command_list_provide, &post); + assert(post.memory != NULL); + compare_strings(expected_post_fault_single, + post.memory, + strlen(expected_post_fault_single), + "Fault - Single Field"); + free(post.memory); + post.memory = NULL; + + /***************************************************************************/ + /* Update a specification with two faults suppressed. */ + /***************************************************************************/ + handle_json_response(json_command_list_fault_double, &post); + + /***************************************************************************/ + /* Check that the FAULT domain is throttled. */ + /***************************************************************************/ + assert(evel_get_throttle_spec(EVEL_DOMAIN_FAULT) != NULL); + for (domain = EVEL_DOMAIN_MEASUREMENT; domain < EVEL_MAX_DOMAINS; domain++) + { + if (domain != EVEL_DOMAIN_FAULT) + { + assert(evel_get_throttle_spec(domain) == NULL); + } + } + assert(post.memory == NULL); + + /***************************************************************************/ + /* Request and verify the throttling state. */ + /***************************************************************************/ + handle_json_response(json_command_list_provide, &post); + assert(post.memory != NULL); + compare_strings(expected_post_fault_double, + post.memory, + strlen(expected_post_fault_double), + "Fault - Double Field"); + free(post.memory); + post.memory = NULL; + + /***************************************************************************/ + /* Now clear the FAULT domain. */ + /***************************************************************************/ + handle_json_response(json_command_list_fault_clear, &post); + for (domain = EVEL_DOMAIN_FAULT; domain < EVEL_MAX_DOMAINS; domain++) + { + assert(evel_get_throttle_spec(domain) == NULL); + } + + evel_throttle_terminate(); +} + +/**************************************************************************//** + * Test a single domain, nv_pair suppression. + *****************************************************************************/ +void test_json_throttle_spec_nv_pair() +{ + MEMORY_CHUNK post; + int domain; + + char * json_command_list_fault_pair_single = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"eventDomainThrottleSpecification\": {" + "\"eventDomain\": \"fault\", " + "\"suppressedNvPairsList\": [" + "{" + "\"nvPairFieldName\": \"alarmAdditionalInformation\", " + "\"suppressedNvPairNames\": [\"name1\"]" + "}" + "]" + "}" + "}" + "}" + "]" + "}"; + + char * json_command_list_fault_pair_double = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"eventDomainThrottleSpecification\": {" + "\"eventDomain\": \"fault\", " + "\"suppressedNvPairsList\": [" + "{" + "\"nvPairFieldName\": \"alarmAdditionalInformation\", " + "\"suppressedNvPairNames\": [\"name1\", \"name2\"]" + "}" + "]" + "}" + "}" + "}" + "]" + "}"; + + char * expected_post_fault_pair_single = + "{" + "\"eventThrottlingState\": {" + "\"eventThrottlingMode\": \"throttled\", " + "\"eventDomainThrottleSpecificationList\": [" + "{" + "\"eventDomain\": \"fault\", " + "\"suppressedNvPairsList\": [" + "{" + "\"nvPairFieldName\": \"alarmAdditionalInformation\", " + "\"suppressedNvPairNames\": [\"name1\"]" + "}" + "]" + "}" + "]" + "}" + "}"; + + char * expected_post_fault_pair_double = + "{" + "\"eventThrottlingState\": {" + "\"eventThrottlingMode\": \"throttled\", " + "\"eventDomainThrottleSpecificationList\": [" + "{" + "\"eventDomain\": \"fault\", " + "\"suppressedNvPairsList\": [" + "{" + "\"nvPairFieldName\": \"alarmAdditionalInformation\", " + "\"suppressedNvPairNames\": [\"name1\", \"name2\"]" + "}" + "]" + "}" + "]" + "}" + "}"; + + /***************************************************************************/ + /* Initialize and provide a specification with a single nvpair with a */ + /* single sub-field suppressed. */ + /***************************************************************************/ + evel_throttle_initialize(); + handle_json_response(json_command_list_fault_pair_single, &post); + + /***************************************************************************/ + /* Check that the FAULT domain is throttled. */ + /***************************************************************************/ + assert(evel_get_throttle_spec(EVEL_DOMAIN_FAULT) != NULL); + for (domain = EVEL_DOMAIN_MEASUREMENT; domain < EVEL_MAX_DOMAINS; domain++) + { + if (domain != EVEL_DOMAIN_FAULT) + { + assert(evel_get_throttle_spec(domain) == NULL); + } + } + assert(post.memory == NULL); + + /***************************************************************************/ + /* Request and verify the throttling state. */ + /***************************************************************************/ + handle_json_response(json_command_list_provide, &post); + assert(post.memory != NULL); + compare_strings(expected_post_fault_pair_single, + post.memory, + strlen(expected_post_fault_pair_single), + "Fault - Single Pair, Single Field"); + free(post.memory); + post.memory = NULL; + + /***************************************************************************/ + /* Update a specification with a single nvpair with two sub-fields */ + /* suppressed. */ + /***************************************************************************/ + handle_json_response(json_command_list_fault_pair_double, &post); + + /***************************************************************************/ + /* Check that the FAULT domain is throttled. */ + /***************************************************************************/ + assert(evel_get_throttle_spec(EVEL_DOMAIN_FAULT) != NULL); + for (domain = EVEL_DOMAIN_MEASUREMENT; domain < EVEL_MAX_DOMAINS; domain++) + { + if (domain != EVEL_DOMAIN_FAULT) + { + assert(evel_get_throttle_spec(domain) == NULL); + } + } + assert(post.memory == NULL); + + /***************************************************************************/ + /* Request and verify the throttling state. */ + /***************************************************************************/ + handle_json_response(json_command_list_provide, &post); + assert(post.memory != NULL); + compare_strings(expected_post_fault_pair_double, + post.memory, + strlen(expected_post_fault_pair_double), + "Fault - Double Field"); + free(post.memory); + post.memory = NULL; + + /***************************************************************************/ + /* Now clear the FAULT domain. */ + /***************************************************************************/ + handle_json_response(json_command_list_fault_clear, &post); + for (domain = EVEL_DOMAIN_FAULT; domain < EVEL_MAX_DOMAINS; domain++) + { + assert(evel_get_throttle_spec(domain) == NULL); + } + + evel_throttle_terminate(); +} + +/**************************************************************************//** + * Test two domains, nv_pair suppression. + *****************************************************************************/ +void test_json_throttle_spec_two_domains() +{ + MEMORY_CHUNK post; + int domain; + + char * json_command_list_two_domains = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"eventDomainThrottleSpecification\": {" + "\"eventDomain\": \"fault\", " + "\"suppressedFieldNames\": [\"alarmInterfaceA\"], " + "\"suppressedNvPairsList\": [" + "{" + "\"nvPairFieldName\": \"alarmAdditionalInformation\", " + "\"suppressedNvPairNames\": [\"name1\"]" + "}]}}}, " + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"eventDomainThrottleSpecification\": {" + "\"eventDomain\": \"syslog\", " + "\"suppressedFieldNames\": [\"syslogProcId\"], " + "\"suppressedNvPairsList\": [" + "{" + "\"nvPairFieldName\": \"additionalFields\", " + "\"suppressedNvPairNames\": [\"name1\"]" + "}]}}}" + "]" + "}"; + + char * expected_post_two_domains = + "{" + "\"eventThrottlingState\": {" + "\"eventThrottlingMode\": \"throttled\", " + "\"eventDomainThrottleSpecificationList\": [" + "{" + "\"eventDomain\": \"fault\", " + "\"suppressedFieldNames\": [\"alarmInterfaceA\"], " + "\"suppressedNvPairsList\": [" + "{" + "\"nvPairFieldName\": \"alarmAdditionalInformation\", " + "\"suppressedNvPairNames\": [\"name1\"]" + "}]}, " + "{" + "\"eventDomain\": \"syslog\", " + "\"suppressedFieldNames\": [\"syslogProcId\"], " + "\"suppressedNvPairsList\": [" + "{" + "\"nvPairFieldName\": \"additionalFields\", " + "\"suppressedNvPairNames\": [\"name1\"]" + "}]}" + "]" + "}" + "}"; + + /***************************************************************************/ + /* Initialize and provide a specification with a single nvpair with a */ + /* single sub-field suppressed. */ + /***************************************************************************/ + evel_throttle_initialize(); + handle_json_response(json_command_list_two_domains, &post); + + /***************************************************************************/ + /* Check that the FAULT and SYSLOG domains are throttled. */ + /***************************************************************************/ + assert(evel_get_throttle_spec(EVEL_DOMAIN_FAULT) != NULL); + assert(evel_get_throttle_spec(EVEL_DOMAIN_SYSLOG) != NULL); + for (domain = EVEL_DOMAIN_MEASUREMENT; domain < EVEL_MAX_DOMAINS; domain++) + { + if ((domain != EVEL_DOMAIN_FAULT) && (domain != EVEL_DOMAIN_SYSLOG)) + { + assert(evel_get_throttle_spec(domain) == NULL); + } + } + assert(post.memory == NULL); + + /***************************************************************************/ + /* Request and verify the throttling state. */ + /***************************************************************************/ + handle_json_response(json_command_list_provide, &post); + assert(post.memory != NULL); + compare_strings(expected_post_two_domains, + post.memory, + strlen(expected_post_two_domains), + "Fault - Two Domains"); + free(post.memory); + post.memory = NULL; + + /***************************************************************************/ + /* Now clear the FAULT and SYSLOG domains. */ + /***************************************************************************/ + handle_json_response(json_command_list_fault_clear, &post); + assert(evel_get_throttle_spec(EVEL_DOMAIN_FAULT) == NULL); + assert(evel_get_throttle_spec(EVEL_DOMAIN_SYSLOG) != NULL); + handle_json_response(json_command_list_syslog_clear, &post); + for (domain = EVEL_DOMAIN_FAULT; domain < EVEL_MAX_DOMAINS; domain++) + { + assert(evel_get_throttle_spec(domain) == NULL); + } + + evel_throttle_terminate(); +} + +/**************************************************************************//** + * Test bad command type. + *****************************************************************************/ +void test_json_throttle_spec_bad_command_type() +{ + MEMORY_CHUNK post; + int domain; + + /***************************************************************************/ + /* Search for "dodgy" in the JSON, and you will see the dodgy bits we're */ + /* handling in these tests. */ + /***************************************************************************/ + #define NUM_BAD_COMMANDS 8 + char * json_command_list_dodgy_command = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"dodgyCommand\", " + "\"eventDomainThrottleSpecification\": {" + "\"eventDomain\": \"fault\", " + "\"suppressedFieldNames\": [\"alarmInterfaceA\"], " + "\"suppressedNvPairsList\": [" + "{" + "\"nvPairFieldName\": \"alarmAdditionalInformation\", " + "\"suppressedNvPairNames\": [\"name1\"]" + "}]}}}" + "]" + "}"; + + char * json_command_list_dodgy_spec = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"dodgyEventDomainThrottleSpecification\": {" + "\"eventDomain\": \"fault\", " + "\"suppressedFieldNames\": [\"alarmInterfaceA\"], " + "\"suppressedNvPairsList\": [" + "{" + "\"nvPairFieldName\": \"alarmAdditionalInformation\", " + "\"suppressedNvPairNames\": [\"name1\"]" + "}]}}}" + "]" + "}"; + + char * json_command_list_dodgy_event_domain_key = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"eventDomainThrottleSpecification\": {" + "\"dodgyEventDomainKey\": \"fault\", " + "\"suppressedFieldNames\": [\"alarmInterfaceA\"], " + "\"suppressedNvPairsList\": [" + "{" + "\"nvPairFieldName\": \"alarmAdditionalInformation\", " + "\"suppressedNvPairNames\": [\"name1\"]" + "}]}}}" + "]" + "}"; + + char * json_command_list_dodgy_event_domain = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"eventDomainThrottleSpecification\": {" + "\"eventDomain\": \"dodgyEventDomain\", " + "\"suppressedFieldNames\": [\"alarmInterfaceA\"], " + "\"suppressedNvPairsList\": [" + "{" + "\"nvPairFieldName\": \"alarmAdditionalInformation\", " + "\"suppressedNvPairNames\": [\"name1\"]" + "}]}}}" + "]" + "}"; + + char * json_command_list_dodgy_field_names_key = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"eventDomainThrottleSpecification\": {" + "\"eventDomain\": \"fault\", " + "\"suppressedNvPairsList\": [" + "{" + "\"nvPairFieldName\": \"alarmAdditionalInformation\", " + "\"suppressedNvPairNames\": [\"name1\"]" + "}]}}}" + "]" + "}"; + + char * json_command_list_dodgy_pair_names_list_key = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"eventDomainThrottleSpecification\": {" + "\"eventDomain\": \"fault\", " + "\"suppressedFieldNames\": [\"alarmInterfaceA\"], " + "\"dodgySuppressedNvPairsListKey\": [" + "{" + "\"nvPairFieldName\": \"alarmAdditionalInformation\", " + "\"suppressedNvPairNames\": [\"name1\"]" + "}]}}}" + "]" + "}"; + + char * json_command_list_dodgy_pair_field_name_key = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"eventDomainThrottleSpecification\": {" + "\"eventDomain\": \"fault\", " + "\"suppressedFieldNames\": [\"alarmInterfaceA\"], " + "\"suppressedNvPairsList\": [" + "{" + "\"dodgyNvPairFieldNameKey\": \"alarmAdditionalInformation\", " + "\"suppressedNvPairNames\": [\"name1\"]" + "}]}}}" + "]" + "}"; + + char * json_command_list_dodgy_pair_names_key = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"eventDomainThrottleSpecification\": {" + "\"eventDomain\": \"fault\", " + "\"suppressedFieldNames\": [\"alarmInterfaceA\"], " + "\"suppressedNvPairsList\": [" + "{" + "\"nvPairFieldName\": \"alarmAdditionalInformation\", " + "\"dodgySuppressedNvPairNamesKey\": [\"name1\"]" + "}]}}}" + "]" + "}"; + + char * json_command_list_dodgy_depth = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"eventDomainThrottleSpecification\": {" + "\"eventDomain\": \"fault\", " + "\"suppressedFieldNames\": [\"alarmInterfaceA\"], " + "\"suppressedNvPairsList\": [" + "{" + "\"nvPairFieldName\": \"alarmAdditionalInformation\", " + "\"dodgySuppressedNvPairNamesKey\": " + "[\"name1\", [[[[[[[[]]]]]]]]]" + "}]}}}" + "]" + "}"; + + char * expected_throttle_state_dodgy_field_names_key = + "{" + "\"eventThrottlingState\": {" + "\"eventThrottlingMode\": \"throttled\", " + "\"eventDomainThrottleSpecificationList\": [" + "{" + "\"eventDomain\": \"fault\", " + "\"suppressedNvPairsList\": [" + "{" + "\"nvPairFieldName\": \"alarmAdditionalInformation\", " + "\"suppressedNvPairNames\": [\"name1\"]" + "}]}" + "]" + "}" + "}"; + + char * expected_throttle_state_dodgy_pair_names_list_key = + "{" + "\"eventThrottlingState\": {" + "\"eventThrottlingMode\": \"throttled\", " + "\"eventDomainThrottleSpecificationList\": [" + "{" + "\"eventDomain\": \"fault\", " + "\"suppressedFieldNames\": [\"alarmInterfaceA\"]" + "}" + "]" + "}" + "}"; + + char * expected_throttle_state_dodgy_pair_field_name_key = + "{" + "\"eventThrottlingState\": {" + "\"eventThrottlingMode\": \"throttled\", " + "\"eventDomainThrottleSpecificationList\": [" + "{" + "\"eventDomain\": \"fault\", " + "\"suppressedFieldNames\": [\"alarmInterfaceA\"]" + "}" + "]" + "}" + "}"; + + char * expected_throttle_state_dodgy_pair_names_key = + "{" + "\"eventThrottlingState\": {" + "\"eventThrottlingMode\": \"throttled\", " + "\"eventDomainThrottleSpecificationList\": [" + "{" + "\"eventDomain\": \"fault\", " + "\"suppressedFieldNames\": [\"alarmInterfaceA\"]" + "}" + "]" + "}" + "}"; + + char * json_command_lists[] = { + json_command_list_dodgy_command, + json_command_list_dodgy_spec, + json_command_list_dodgy_event_domain_key, + json_command_list_dodgy_event_domain, + json_command_list_dodgy_depth, + json_command_list_dodgy_field_names_key, + json_command_list_dodgy_pair_names_list_key, + json_command_list_dodgy_pair_field_name_key, + json_command_list_dodgy_pair_names_key + }; + + char * expected_posts[] = { + expected_throttle_state_normal, + expected_throttle_state_normal, + expected_throttle_state_normal, + expected_throttle_state_normal, + expected_throttle_state_normal, + expected_throttle_state_dodgy_field_names_key, + expected_throttle_state_dodgy_pair_names_list_key, + expected_throttle_state_dodgy_pair_field_name_key, + expected_throttle_state_dodgy_pair_names_key + }; + + const int num_commands = + sizeof(json_command_lists) / sizeof(json_command_lists[0]); + const int num_posts = + sizeof(expected_posts) / sizeof(expected_posts[0]); + assert(num_commands == num_posts); + + /***************************************************************************/ + /* Initialize and provide a specification with a single nvpair with a */ + /* single sub-field suppressed. */ + /***************************************************************************/ + evel_throttle_initialize(); + + int ii; + for (ii = 0; ii < num_commands; ii++) + { + EVEL_DEBUG("Testing commandList[%d] = %s\n", ii, json_command_lists[ii]); + handle_json_response(json_command_lists[ii], &post); + + /*************************************************************************/ + /* Check that throttling is in a normal state - because we ignored the */ + /* command / ..... */ + /*************************************************************************/ + for (domain = EVEL_DOMAIN_MEASUREMENT; domain < EVEL_MAX_DOMAINS; domain++) + { + assert(evel_get_throttle_spec(domain) == NULL); + } + if (expected_posts[ii] == expected_throttle_state_normal) + { + assert(evel_get_throttle_spec(EVEL_DOMAIN_FAULT) == NULL); + } + else + { + assert(evel_get_throttle_spec(EVEL_DOMAIN_FAULT) != NULL); + } + assert(post.memory == NULL); + + /*************************************************************************/ + /* Request and verify the throttling state. */ + /*************************************************************************/ + handle_json_response(json_command_list_provide, &post); + assert(post.memory != NULL); + compare_strings(expected_posts[ii], + post.memory, + strlen(expected_posts[ii]), + "Throttle State Normal"); + free(post.memory); + post.memory = NULL; + } + + evel_throttle_terminate(); +} + +void test_encode_fault_throttled() +{ + MEMORY_CHUNK post; + + /***************************************************************************/ + /* We also test suppression of the event header parameters here. */ + /***************************************************************************/ + char * json_command_list = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"eventDomainThrottleSpecification\": {" + "\"eventDomain\": \"fault\", " + "\"suppressedFieldNames\": [" + "\"alarmInterfaceA\", " + "\"eventType\", " + "\"reportingEntityId\", " + "\"sourceId\"], " + "\"suppressedNvPairsList\": [" + "{" + "\"nvPairFieldName\": \"alarmAdditionalInformation\", " + "\"suppressedNvPairNames\": [\"name3\", \"name4\"]" + "}]}}}" + "]" + "}"; + + char * expected = + "{\"event\": {" + "\"commonEventHeader\": {" + "\"domain\": \"fault\", " + "\"eventId\": \"122\", " + "\"functionalRole\": \"UNIT TEST\", " + "\"lastEpochMicrosec\": 1000002, " + "\"priority\": \"Normal\", " + "\"reportingEntityName\": \"Dummy VM name - No Metadata available\", " + "\"sequence\": 122, " + "\"sourceName\": \"Dummy VM name - No Metadata available\", " + "\"startEpochMicrosec\": 1000002, " + "\"version\": 1.2" + "}, " + "\"faultFields\": {" + "\"alarmCondition\": \"My alarm condition\", " + "\"eventSeverity\": \"MAJOR\", " + "\"eventSourceType\": \"other\", " + "\"specificProblem\": \"It broke very badly\", " + "\"vfStatus\": \"Active\", " + "\"faultFieldsVersion\": 1.1, " + "\"alarmAdditionalInformation\": [" + "{\"name\": \"name1\", " + "\"value\": \"value1\"}, " + "{\"name\": \"name2\", " + "\"value\": \"value2\"}]" + "}}}"; + + /***************************************************************************/ + /* Initialize and provide a specification with a single fault suppressed. */ + /***************************************************************************/ + evel_throttle_initialize(); + handle_json_response(json_command_list, &post); + + /***************************************************************************/ + /* Check that the domain is throttled. */ + /***************************************************************************/ + assert(evel_get_throttle_spec(EVEL_DOMAIN_FAULT) != NULL); + assert(post.memory == NULL); + + size_t json_size = 0; + char json_body[EVEL_MAX_JSON_BODY]; + evel_set_next_event_sequence(122); + EVENT_FAULT * fault = evel_new_fault("My alarm condition", + "It broke very badly", + EVEL_PRIORITY_NORMAL, + EVEL_SEVERITY_MAJOR); + assert(fault != NULL); + evel_fault_type_set(fault, "Bad things happen..."); + evel_fault_addl_info_add(fault, "name1", "value1"); + evel_fault_addl_info_add(fault, "name2", "value2"); + + /***************************************************************************/ + /* Suppressed fields. */ + /***************************************************************************/ + evel_fault_interface_set(fault, "My Interface Card"); + evel_fault_addl_info_add(fault, "name3", "value3"); + evel_fault_addl_info_add(fault, "name4", "value4"); + + json_size = evel_json_encode_event( + json_body, EVEL_MAX_JSON_BODY, (EVENT_HEADER *) fault); + compare_strings(expected, json_body, EVEL_MAX_JSON_BODY, "Fault"); + assert((json_size == strlen(json_body)) && "Bad size returned"); + + evel_free_event(fault); + evel_throttle_terminate(); +} + +void test_encode_measurement_throttled() +{ + MEMORY_CHUNK post; + + /***************************************************************************/ + /* We also test suppression of the event header parameters here. */ + /***************************************************************************/ + char * json_command_list = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"eventDomainThrottleSpecification\": {" + "\"eventDomain\": \"measurementsForVfScaling\", " + "\"suppressedFieldNames\": [" + "\"errors\", " + "\"vnfcScalingMetric\", " + "\"numberOfMediaPortsInUse\", " + "\"aggregateCpuUsage\", " + "\"requestRate\", " + "\"memoryUsed\", " + "\"memoryConfigured\", " + "\"meanRequestLatency\", " + "\"latencyDistribution\", " + "\"concurrentSessions\", " + "\"configuredEntities\", " + "\"eventType\", " + "\"reportingEntityId\", " + "\"sourceId\"], " + "\"suppressedNvPairsList\": [" + "{" + "\"nvPairFieldName\": \"cpuUsageArray\", " + "\"suppressedNvPairNames\": [\"cpu3\", \"cpu4\"]" + "}, " + "{" + "\"nvPairFieldName\": \"filesystemUsageArray\", " + "\"suppressedNvPairNames\": [\"00-11-22\", \"33-44-55\"]" + "}, " + "{" + "\"nvPairFieldName\": \"vNicUsageArray\", " + "\"suppressedNvPairNames\": [\"eth1\", \"eth0\"]" + "}, " + "{" + "\"nvPairFieldName\": \"featureUsageArray\", " + "\"suppressedNvPairNames\": [\"FeatureB\", \"FeatureC\"]" + "}," + "{" + "\"nvPairFieldName\": \"codecUsageArray\", " + "\"suppressedNvPairNames\": [\"G729ab\"]" + "}," + "{" + "\"nvPairFieldName\": \"additionalMeasurements\", " + "\"suppressedNvPairNames\": [\"Group2\"]" + "}" + "]}}}" + "]" + "}"; + + char * expected = + "{\"event\": " + "{\"commonEventHeader\": {" + "\"domain\": \"measurementsForVfScaling\", " + "\"eventId\": \"123\", " + "\"functionalRole\": \"UNIT TEST\", " + "\"lastEpochMicrosec\": 1000002, " + "\"priority\": \"Normal\", " + "\"reportingEntityName\": \"Dummy VM name - No Metadata available\", " + "\"sequence\": 123, " + "\"sourceName\": \"Dummy VM name - No Metadata available\", " + "\"startEpochMicrosec\": 1000002, " + "\"version\": 1.2" + "}, " + "\"measurementsForVfScalingFields\": " + "{" + "\"measurementInterval\": 5.500000, " + "\"cpuUsageArray\": [" + "{\"cpuIdentifier\": \"cpu1\", " + "\"percentUsage\": 11.110000}, " + "{\"cpuIdentifier\": \"cpu2\", " + "\"percentUsage\": 22.220000}], " + "\"filesystemUsageArray\": [" + "{\"blockConfigured\": 500.110000, " + "\"blockIops\": 77, " + "\"blockUsed\": 500.220000, " + "\"ephemeralConfigured\": 500.110000, " + "\"ephemeralIops\": 88, " + "\"ephemeralUsed\": 600.220000, " + "\"filesystemName\": \"66-77-88\"}], " + "\"featureUsageArray\": [" + "{\"featureIdentifier\": \"FeatureA\", " + "\"featureUtilization\": 123}], " + "\"codecUsageArray\": [" + "{\"codecIdentifier\": \"G711a\", " + "\"numberInUse\": 91}], " + "\"additionalMeasurements\": [" + "{\"name\": \"Group1\", " + "\"measurements\": [" + "{\"name\": \"Name1\", " + "\"value\": \"Value1\"}]}], " + "\"measurementsForVfScalingVersion\": 1.1}}}"; + + /***************************************************************************/ + /* Initialize and provide a specification with a single fault suppressed. */ + /***************************************************************************/ + evel_throttle_initialize(); + handle_json_response(json_command_list, &post); + + /***************************************************************************/ + /* Check that the domain is throttled. */ + /***************************************************************************/ + assert(evel_get_throttle_spec(EVEL_DOMAIN_MEASUREMENT) != NULL); + assert(post.memory == NULL); + + size_t json_size = 0; + char json_body[EVEL_MAX_JSON_BODY]; + evel_set_next_event_sequence(123); + EVENT_MEASUREMENT * measurement = evel_new_measurement(5.5); + MEASUREMENT_LATENCY_BUCKET * bucket = NULL; + MEASUREMENT_VNIC_USE * vnic_use = NULL; + assert(measurement != NULL); + + evel_measurement_type_set(measurement, "Perf management..."); + evel_measurement_conc_sess_set(measurement, 1); + evel_measurement_cfg_ents_set(measurement, 2); + evel_measurement_mean_req_lat_set(measurement, 4.4); + evel_measurement_mem_cfg_set(measurement, 6.6); + evel_measurement_mem_used_set(measurement, 3.3); + evel_measurement_request_rate_set(measurement, 7); + evel_measurement_agg_cpu_use_set(measurement, 8.8); + evel_measurement_cpu_use_add(measurement, "cpu1", 11.11); + evel_measurement_cpu_use_add(measurement, "cpu2", 22.22); + evel_measurement_cpu_use_add(measurement, "cpu3", 33.33); + evel_measurement_cpu_use_add(measurement, "cpu4", 44.44); + evel_measurement_fsys_use_add(measurement, "00-11-22", + 100.11, 100.22, 33, + 200.11, 200.22, 44); + evel_measurement_fsys_use_add(measurement, "33-44-55", + 300.11, 300.22, 55, + 400.11, 400.22, 66); + evel_measurement_fsys_use_add(measurement, "66-77-88", + 500.11, 500.22, 77, + 600.11, 600.22, 88); + + bucket = evel_new_meas_latency_bucket(20); + evel_meas_latency_bucket_add(measurement, bucket); + + bucket = evel_new_meas_latency_bucket(30); + evel_meas_latency_bucket_low_end_set(bucket, 10.0); + evel_meas_latency_bucket_high_end_set(bucket, 20.0); + evel_meas_latency_bucket_add(measurement, bucket); + + vnic_use = evel_new_measurement_vnic_use("eth0", 100, 200, 3, 4); + evel_vnic_use_bcast_pkt_in_set(vnic_use, 1); + evel_vnic_use_bcast_pkt_out_set(vnic_use, 2); + evel_vnic_use_mcast_pkt_in_set(vnic_use, 5); + evel_vnic_use_mcast_pkt_out_set(vnic_use, 6); + evel_vnic_use_ucast_pkt_in_set(vnic_use, 7); + evel_vnic_use_ucast_pkt_out_set(vnic_use, 8); + evel_meas_vnic_use_add(measurement, vnic_use); + + vnic_use = evel_new_measurement_vnic_use("eth1", 110, 240, 13, 14); + evel_vnic_use_bcast_pkt_in_set(vnic_use, 11); + evel_vnic_use_bcast_pkt_out_set(vnic_use, 12); + evel_vnic_use_mcast_pkt_in_set(vnic_use, 15); + evel_vnic_use_mcast_pkt_out_set(vnic_use, 16); + evel_vnic_use_ucast_pkt_in_set(vnic_use, 17); + evel_vnic_use_ucast_pkt_out_set(vnic_use, 18); + evel_meas_vnic_use_add(measurement, vnic_use); + + evel_measurement_errors_set(measurement, 1, 0, 2, 1); + evel_measurement_feature_use_add(measurement, "FeatureA", 123); + evel_measurement_feature_use_add(measurement, "FeatureB", 567); + evel_measurement_codec_use_add(measurement, "G711a", 91); + evel_measurement_codec_use_add(measurement, "G729ab", 92); + evel_measurement_media_port_use_set(measurement, 1234); + evel_measurement_vnfc_scaling_metric_set(measurement, 1234.5678); + evel_measurement_custom_measurement_add(measurement, + "Group1", "Name1", "Value1"); + evel_measurement_custom_measurement_add(measurement, + "Group2", "Name1", "Value1"); + evel_measurement_custom_measurement_add(measurement, + "Group2", "Name2", "Value2"); + + json_size = evel_json_encode_event( + json_body, EVEL_MAX_JSON_BODY, (EVENT_HEADER *) measurement); + compare_strings(expected, json_body, EVEL_MAX_JSON_BODY, "Measurement"); + assert((json_size == strlen(json_body)) && "Bad size returned"); + + evel_free_event(measurement); + evel_throttle_terminate(); +} + +void test_encode_mobile_throttled() +{ + MEMORY_CHUNK post; + + /***************************************************************************/ + /* We also test suppression of the event header parameters here. */ + /***************************************************************************/ + char * json_command_list = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"eventDomainThrottleSpecification\": {" + "\"eventDomain\": \"mobileFlow\", " + "\"suppressedFieldNames\": [" + "\"applicationType\", " + "\"appProtocolType\", " + "\"appProtocolVersion\", " + "\"cid\", " + "\"connectionType\", " + "\"ecgi\", " + "\"gtpProtocolType\", " + "\"gtpVersion\", " + "\"httpHeader\", " + "\"imei\", " + "\"imsi\", " + "\"lac\", " + "\"mcc\", " + "\"mnc\", " + "\"msisdn\", " + "\"otherFunctionalRole\", " + "\"rac\", " + "\"radioAccessTechnology\", " + "\"sac\", " + "\"samplingAlgorithm\", " + "\"tac\", " + "\"tunnelId\", " + "\"vlanId\", " + "\"eventType\", " + "\"reportingEntityId\", " + "\"sourceId\"], " + "\"suppressedNvPairsList\": [" + "]}}}" + "]" + "}"; + + char * expected = + "{\"event\": " + "{\"commonEventHeader\": {" + "\"domain\": \"mobileFlow\", " + "\"eventId\": \"1242\", " + "\"functionalRole\": \"UNIT TEST\", " + "\"lastEpochMicrosec\": 1000002, " + "\"priority\": \"Normal\", " + "\"reportingEntityName\": \"Dummy VM name - No Metadata available\", " + "\"sequence\": 1242, " + "\"sourceName\": \"Dummy VM name - No Metadata available\", " + "\"startEpochMicrosec\": 1000002, " + "\"version\": 1.2" + "}, " + "\"mobileFlowFields\": {" + "\"flowDirection\": \"Inbound\", " + "\"gtpPerFlowMetrics\": {" + "\"avgBitErrorRate\": 132.000100, " + "\"avgPacketDelayVariation\": 31.200000, " + "\"avgPacketLatency\": 101, " + "\"avgReceiveThroughput\": 2101, " + "\"avgTransmitThroughput\": 501, " + "\"flowActivationEpoch\": 1470409422, " + "\"flowActivationMicrosec\": 988, " + "\"flowDeactivationEpoch\": 1470409432, " + "\"flowDeactivationMicrosec\": 12, " + "\"flowDeactivationTime\": \"Fri, 05 Aug 2016 15:03:52 +0000\", " + "\"flowStatus\": \"Inactive\", " + "\"maxPacketDelayVariation\": 88, " + "\"numActivationFailures\": 4, " + "\"numBitErrors\": 18, " + "\"numBytesReceived\": 123655, " + "\"numBytesTransmitted\": 4562, " + "\"numDroppedPackets\": 1, " + "\"numL7BytesReceived\": 13, " + "\"numL7BytesTransmitted\": 11, " + "\"numLostPackets\": 2, " + "\"numOutOfOrderPackets\": 4, " + "\"numPacketErrors\": 8, " + "\"numPacketsReceivedExclRetrans\": 900, " + "\"numPacketsReceivedInclRetrans\": 902, " + "\"numPacketsTransmittedInclRetrans\": 303, " + "\"numRetries\": 7, " + "\"numTimeouts\": 3, " + "\"numTunneledL7BytesReceived\": 1, " + "\"roundTripTime\": 111, " + "\"timeToFirstByte\": 226, " + "\"ipTosCountList\": [" + "[\"1\", 13], " + "[\"4\", 99], " + "[\"17\", 1]], " + "\"ipTosList\": [\"1\", \"4\", \"17\"], " + "\"tcpFlagList\": [\"CWR\", \"URG\"], " + "\"tcpFlagCountList\": [[\"CWR\", 10], [\"URG\", 121]], " + "\"mobileQciCosList\": [\"conversational\", \"65\"], " + "\"mobileQciCosCountList\": [[\"conversational\", 11], [\"65\", 122]], " + "\"durConnectionFailedStatus\": 12, " + "\"durTunnelFailedStatus\": 13, " + "\"flowActivatedBy\": \"Remote\", " + "\"flowActivationTime\": \"Fri, 05 Aug 2016 15:03:43 +0000\", " + "\"flowDeactivatedBy\": \"Remote\", " + "\"gtpConnectionStatus\": \"Connected\", " + "\"gtpTunnelStatus\": \"Not tunneling\", " + "\"largePacketRtt\": 80, " + "\"largePacketThreshold\": 600.000000, " + "\"maxReceiveBitRate\": 1357924680, " + "\"maxTransmitBitRate\": 235711, " + "\"numGtpEchoFailures\": 1, " + "\"numGtpTunnelErrors\": 4, " + "\"numHttpErrors\": 2" + "}, " + "\"ipProtocolType\": \"UDP\", " + "\"ipVersion\": \"IPv6\", " + "\"otherEndpointIpAddress\": \"2.3.4.2\", " + "\"otherEndpointPort\": 2342, " + "\"reportingEndpointIpAddr\": \"4.2.3.2\", " + "\"reportingEndpointPort\": 4322" + "}}}"; + + /***************************************************************************/ + /* Initialize and provide a specification with a single fault suppressed. */ + /***************************************************************************/ + evel_throttle_initialize(); + handle_json_response(json_command_list, &post); + + /***************************************************************************/ + /* Check that the domain is throttled. */ + /***************************************************************************/ + assert(evel_get_throttle_spec(EVEL_DOMAIN_MOBILE_FLOW) != NULL); + assert(post.memory == NULL); + + size_t json_size = 0; + char json_body[EVEL_MAX_JSON_BODY]; + MOBILE_GTP_PER_FLOW_METRICS * metrics = NULL; + EVENT_MOBILE_FLOW * mobile_flow = NULL; + + /***************************************************************************/ + /* Mobile. */ + /***************************************************************************/ + evel_set_next_event_sequence(1242); + + metrics = evel_new_mobile_gtp_flow_metrics(132.0001, + 31.2, + 101, + 2101, + 501, + 1470409422, + 988, + 1470409432, + 12, + (time_t)1470409432, + "Inactive", + 88, + 4, + 18, + 123655, + 4562, + 1, + 13, + 11, + 2, + 4, + 8, + 900, + 902, + 303, + 7, + 3, + 1, + 111, + 226); + assert(metrics != NULL); + + evel_mobile_gtp_metrics_dur_con_fail_set(metrics, 12); + evel_mobile_gtp_metrics_dur_tun_fail_set(metrics, 13); + evel_mobile_gtp_metrics_act_by_set(metrics, "Remote"); + evel_mobile_gtp_metrics_act_time_set(metrics, (time_t)1470409423); + evel_mobile_gtp_metrics_deact_by_set(metrics, "Remote"); + evel_mobile_gtp_metrics_con_status_set(metrics, "Connected"); + evel_mobile_gtp_metrics_tun_status_set(metrics, "Not tunneling"); + evel_mobile_gtp_metrics_iptos_set(metrics, 1, 13); + evel_mobile_gtp_metrics_iptos_set(metrics, 17, 1); + evel_mobile_gtp_metrics_iptos_set(metrics, 4, 99); + evel_mobile_gtp_metrics_large_pkt_rtt_set(metrics, 80); + evel_mobile_gtp_metrics_large_pkt_thresh_set(metrics, 600.0); + evel_mobile_gtp_metrics_max_rcv_bit_rate_set(metrics, 1357924680); + evel_mobile_gtp_metrics_max_trx_bit_rate_set(metrics, 235711); + evel_mobile_gtp_metrics_num_echo_fail_set(metrics, 1); + evel_mobile_gtp_metrics_num_tun_fail_set(metrics, 4); + evel_mobile_gtp_metrics_num_http_errors_set(metrics, 2); + evel_mobile_gtp_metrics_tcp_flag_count_add(metrics, EVEL_TCP_CWR, 10); + evel_mobile_gtp_metrics_tcp_flag_count_add(metrics, EVEL_TCP_URG, 121); + evel_mobile_gtp_metrics_qci_cos_count_add( + metrics, EVEL_QCI_COS_UMTS_CONVERSATIONAL, 11); + evel_mobile_gtp_metrics_qci_cos_count_add( + metrics, EVEL_QCI_COS_LTE_65, 122); + + mobile_flow = evel_new_mobile_flow("Inbound", + metrics, + "UDP", + "IPv6", + "2.3.4.2", + 2342, + "4.2.3.2", + 4322); + assert(mobile_flow != NULL); + + evel_mobile_flow_type_set(mobile_flow, "Mobile flow..."); + evel_mobile_flow_app_type_set(mobile_flow, "Demo application"); + evel_mobile_flow_app_prot_type_set(mobile_flow, "GSM"); + evel_mobile_flow_app_prot_ver_set(mobile_flow, "1"); + evel_mobile_flow_cid_set(mobile_flow, "65535"); + evel_mobile_flow_con_type_set(mobile_flow, "S1-U"); + evel_mobile_flow_ecgi_set(mobile_flow, "e65535"); + evel_mobile_flow_gtp_prot_type_set(mobile_flow, "GTP-U"); + evel_mobile_flow_gtp_prot_ver_set(mobile_flow, "1"); + evel_mobile_flow_http_header_set(mobile_flow, + "http://www.something.com"); + evel_mobile_flow_imei_set(mobile_flow, "209917614823"); + evel_mobile_flow_imsi_set(mobile_flow, "355251/05/850925/8"); + evel_mobile_flow_lac_set(mobile_flow, "1"); + evel_mobile_flow_mcc_set(mobile_flow, "410"); + evel_mobile_flow_mnc_set(mobile_flow, "04"); + evel_mobile_flow_msisdn_set(mobile_flow, "6017123456789"); + evel_mobile_flow_other_func_role_set(mobile_flow, "MME"); + evel_mobile_flow_rac_set(mobile_flow, "514"); + evel_mobile_flow_radio_acc_tech_set(mobile_flow, "LTE"); + evel_mobile_flow_sac_set(mobile_flow, "1"); + evel_mobile_flow_samp_alg_set(mobile_flow, 1); + evel_mobile_flow_tac_set(mobile_flow, "2099"); + evel_mobile_flow_tunnel_id_set(mobile_flow, "Tunnel 1"); + evel_mobile_flow_vlan_id_set(mobile_flow, "15"); + + json_size = evel_json_encode_event( + json_body, EVEL_MAX_JSON_BODY, (EVENT_HEADER *) mobile_flow); + compare_strings(expected, json_body, EVEL_MAX_JSON_BODY, "Mobile"); + assert((json_size == strlen(json_body)) && "Bad size returned"); + + evel_free_event(mobile_flow); + evel_throttle_terminate(); +} + +void test_encode_other_throttled() +{ + MEMORY_CHUNK post; + + /***************************************************************************/ + /* We also test suppression of the event header parameters here. */ + /***************************************************************************/ + char * json_command_list = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"eventDomainThrottleSpecification\": {" + "\"eventDomain\": \"other\", " + "\"suppressedFieldNames\": [" + "\"eventType\", " + "\"reportingEntityId\", " + "\"sourceId\"], " + "\"suppressedNvPairsList\": [" + "]}}}" + "]" + "}"; + + char * expected = + "{\"event\": " + "{\"commonEventHeader\": {" + "\"domain\": \"other\", " + "\"eventId\": \"129\", " + "\"functionalRole\": \"UNIT TEST\", " + "\"lastEpochMicrosec\": 1000002, " + "\"priority\": \"Normal\", " + "\"reportingEntityName\": \"Dummy VM name - No Metadata available\", " + "\"sequence\": 129, " + "\"sourceName\": \"Dummy VM name - No Metadata available\", " + "\"startEpochMicrosec\": 1000002, " + "\"version\": 1.2" + "}, " + "\"otherFields\": [" + "{\"name\": \"Other field 1\", " + "\"value\": \"Other value 1\"}, " + "{\"name\": \"Other field 2\", " + "\"value\": \"Other value 2\"}" + "]" + "}}"; + + /***************************************************************************/ + /* Initialize and provide a specification with a single fault suppressed. */ + /***************************************************************************/ + evel_throttle_initialize(); + handle_json_response(json_command_list, &post); + + /***************************************************************************/ + /* Check that the domain is throttled. */ + /***************************************************************************/ + assert(evel_get_throttle_spec(EVEL_DOMAIN_OTHER) != NULL); + assert(post.memory == NULL); + + size_t json_size = 0; + char json_body[EVEL_MAX_JSON_BODY]; + EVENT_OTHER * other = NULL; + evel_set_next_event_sequence(129); + other = evel_new_other(); + assert(other != NULL); + evel_other_type_set(other, "Other Type"); + evel_other_field_add(other, + "Other field 1", + "Other value 1"); + evel_other_field_add(other, + "Other field 2", + "Other value 2"); + + json_size = evel_json_encode_event( + json_body, EVEL_MAX_JSON_BODY, (EVENT_HEADER *) other); + compare_strings(expected, json_body, EVEL_MAX_JSON_BODY, "Other"); + assert((json_size == strlen(json_body)) && "Bad size returned"); + + evel_free_event(other); + evel_throttle_terminate(); +} + +void test_encode_report_throttled() +{ + MEMORY_CHUNK post; + + /***************************************************************************/ + /* We also test suppression of the event header parameters here. */ + /***************************************************************************/ + char * json_command_list = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"eventDomainThrottleSpecification\": {" + "\"eventDomain\": \"report\", " + "\"suppressedFieldNames\": [" + "\"eventType\", " + "\"reportingEntityId\", " + "\"sourceId\"], " + "\"suppressedNvPairsList\": [" + "{" + "\"nvPairFieldName\": \"featureUsageArray\", " + "\"suppressedNvPairNames\": [\"FeatureB\", \"FeatureC\"]" + "}," + "{" + "\"nvPairFieldName\": \"additionalMeasurements\", " + "\"suppressedNvPairNames\": [\"Group2\"]" + "}" + "]}}}" + "]" + "}"; + + char * expected = + "{\"event\": " + "{\"commonEventHeader\": {" + "\"domain\": \"measurementsForVfReporting\", " + "\"eventId\": \"125\", " + "\"functionalRole\": \"UNIT TEST\", " + "\"lastEpochMicrosec\": 1000002, " + "\"priority\": \"Normal\", " + "\"reportingEntityName\": \"Dummy VM name - No Metadata available\", " + "\"sequence\": 125, " + "\"sourceName\": \"Dummy VM name - No Metadata available\", " + "\"startEpochMicrosec\": 1000002, " + "\"version\": 1.2" + "}, " + "\"measurementsForVfReportingFields\": " + "{\"measurementInterval\": 1.100000, " + "\"featureUsageArray\": [" + "{\"featureIdentifier\": \"FeatureA\", " + "\"featureUtilization\": 123}], " + "\"additionalMeasurements\": [" + "{\"name\": \"Group1\", " + "\"measurements\": [" + "{\"name\": \"Name1\", " + "\"value\": \"Value1\"}]}], " + "\"measurementFieldsVersion\": 1.1}}}"; + + /***************************************************************************/ + /* Initialize and provide a specification with a single fault suppressed. */ + /***************************************************************************/ + evel_throttle_initialize(); + handle_json_response(json_command_list, &post); + + /***************************************************************************/ + /* Check that the domain is throttled. */ + /***************************************************************************/ + assert(evel_get_throttle_spec(EVEL_DOMAIN_REPORT) != NULL); + assert(post.memory == NULL); + + size_t json_size = 0; + char json_body[EVEL_MAX_JSON_BODY]; + EVENT_REPORT * report = NULL; + + /***************************************************************************/ + /* Report. */ + /***************************************************************************/ + evel_set_next_event_sequence(125); + report = evel_new_report(1.1); + assert(report != NULL); + evel_report_type_set(report, "Perf reporting..."); + evel_report_feature_use_add(report, "FeatureA", 123); + evel_report_feature_use_add(report, "FeatureB", 567); + evel_report_custom_measurement_add(report, "Group1", "Name1", "Value1"); + evel_report_custom_measurement_add(report, "Group2", "Name1", "Value1"); + evel_report_custom_measurement_add(report, "Group2", "Name2", "Value2"); + + json_size = evel_json_encode_event( + json_body, EVEL_MAX_JSON_BODY, (EVENT_HEADER *) report); + compare_strings(expected, json_body, EVEL_MAX_JSON_BODY, "Report"); + assert((json_size == strlen(json_body)) && "Bad size returned"); + + evel_free_event(report); + evel_throttle_terminate(); +} + +void test_encode_service_throttled() +{ + MEMORY_CHUNK post; + + /***************************************************************************/ + /* We also test suppression of the event header parameters here. */ + /***************************************************************************/ + char * json_command_list = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"eventDomainThrottleSpecification\": {" + "\"eventDomain\": \"serviceEvents\", " + "\"suppressedFieldNames\": [" + "\"eventType\", " + "\"correlator\", " + "\"codecSelected\", " + "\"codecSelectedTranscoding\", " + "\"endOfCallVqmSummaries\", " + "\"midCallRtcp\", " + "\"marker\", " + "\"reportingEntityId\", " + "\"sourceId\"], " + "\"suppressedNvPairsList\": [" + "{" + "\"nvPairFieldName\": \"additionalFields\", " + "\"suppressedNvPairNames\": [\"Name1\", \"Name3\"]" + "}" + "]}}}" + "]" + "}"; + + char * expected = + "{\"event\": " + "{\"commonEventHeader\": {" + "\"domain\": \"serviceEvents\", " + "\"eventId\": \"2000\", " + "\"functionalRole\": \"UNIT TEST\", " + "\"lastEpochMicrosec\": 1000002, " + "\"priority\": \"Normal\", " + "\"reportingEntityName\": \"Dummy VM name - No Metadata available\", " + "\"sequence\": 2000, " + "\"sourceName\": \"Dummy VM name - No Metadata available\", " + "\"startEpochMicrosec\": 1000002, " + "\"version\": 1.2" + "}, " + "\"serviceEventsFields\": {" + "\"eventInstanceIdentifier\": " + "{" + "\"vendorId\": \"vendor_x_id\", " + "\"eventId\": \"vendor_x_event_id\", " + "\"productId\": \"vendor_x_product_id\", " + "\"subsystemId\": \"vendor_x_subsystem_id\", " + "\"eventFriendlyName\": \"vendor_x_frieldly_name\"" + "}, " + "\"serviceEventsFieldsVersion\": 1.1, " + "\"additionalFields\": [" + "{\"name\": \"Name2\", \"value\": \"Value2\"}, " + "{\"name\": \"Name4\", \"value\": \"Value4\"}]" + "}}}"; + + /***************************************************************************/ + /* Initialize and provide a specification with a single fault suppressed. */ + /***************************************************************************/ + evel_throttle_initialize(); + handle_json_response(json_command_list, &post); + + /***************************************************************************/ + /* Check that the domain is throttled. */ + /***************************************************************************/ + assert(evel_get_throttle_spec(EVEL_DOMAIN_SERVICE) != NULL); + assert(post.memory == NULL); + + size_t json_size = 0; + char json_body[EVEL_MAX_JSON_BODY]; + EVENT_SERVICE * event = NULL; + evel_set_next_event_sequence(2000); + event = evel_new_service("vendor_x_id", "vendor_x_event_id"); + assert(event != NULL); + evel_service_type_set(event, "Service Event"); + evel_service_product_id_set(event, "vendor_x_product_id"); + evel_service_subsystem_id_set(event, "vendor_x_subsystem_id"); + evel_service_friendly_name_set(event, "vendor_x_frieldly_name"); + evel_service_correlator_set(event, "vendor_x_correlator"); + evel_service_codec_set(event, "PCMA"); + evel_service_codec_set(event, "PCMA"); + evel_service_callee_codec_set(event, "PCMA"); + evel_service_caller_codec_set(event, "G729A"); + evel_service_rtcp_data_set(event, "some_rtcp_data"); + evel_service_adjacency_name_set(event, "vendor_x_adjacency"); + evel_service_endpoint_desc_set(event, EVEL_SERVICE_ENDPOINT_CALLER); + evel_service_endpoint_jitter_set(event, 66); + evel_service_endpoint_rtp_oct_disc_set(event, 100); + evel_service_endpoint_rtp_oct_recv_set(event, 200); + evel_service_endpoint_rtp_oct_sent_set(event, 300); + evel_service_endpoint_rtp_pkt_disc_set(event, 400); + evel_service_endpoint_rtp_pkt_recv_set(event, 500); + evel_service_endpoint_rtp_pkt_sent_set(event, 600); + evel_service_local_jitter_set(event, 99); + evel_service_local_rtp_oct_disc_set(event, 150); + evel_service_local_rtp_oct_recv_set(event, 250); + evel_service_local_rtp_oct_sent_set(event, 350); + evel_service_local_rtp_pkt_disc_set(event, 450); + evel_service_local_rtp_pkt_recv_set(event, 550); + evel_service_local_rtp_pkt_sent_set(event, 650); + evel_service_mos_cqe_set(event, 12.255); + evel_service_packets_lost_set(event, 157); + evel_service_packet_loss_percent_set(event, 0.232); + evel_service_r_factor_set(event, 11); + evel_service_round_trip_delay_set(event, 15); + evel_service_phone_number_set(event, "0888888888"); + evel_service_addl_field_add(event, "Name1", "Value1"); + evel_service_addl_field_add(event, "Name2", "Value2"); + evel_service_addl_field_add(event, "Name3", "Value3"); + evel_service_addl_field_add(event, "Name4", "Value4"); + json_size = evel_json_encode_event( + json_body, EVEL_MAX_JSON_BODY, (EVENT_HEADER *) event); + compare_strings(expected, json_body, EVEL_MAX_JSON_BODY, "Service"); + assert((json_size == strlen(json_body)) && "Bad size returned"); + + evel_free_event(event); + evel_throttle_terminate(); +} + +void test_encode_signaling_throttled() +{ + MEMORY_CHUNK post; + + /***************************************************************************/ + /* We also test suppression of the event header parameters here. */ + /***************************************************************************/ + char * json_command_list = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"eventDomainThrottleSpecification\": {" + "\"eventDomain\": \"signaling\", " + "\"suppressedFieldNames\": [" + "\"correlator\", " + "\"eventType\", " + "\"reportingEntityId\", " + "\"sourceId\", " + "\"localIpAddress\", " + "\"localPort\", " + "\"remoteIpAddress\", " + "\"remotePort\", " + "\"compressedSip\", " + "\"summarySip\"], " + "\"suppressedNvPairsList\": [" + "]}}}" + "]" + "}"; + + char * expected = + "{\"event\": " + "{\"commonEventHeader\": {" + "\"domain\": \"signaling\", " + "\"eventId\": \"2001\", " + "\"functionalRole\": \"UNIT TEST\", " + "\"lastEpochMicrosec\": 1000002, " + "\"priority\": \"Normal\", " + "\"reportingEntityName\": \"Dummy VM name - No Metadata available\", " + "\"sequence\": 2001, " + "\"sourceName\": \"Dummy VM name - No Metadata available\", " + "\"startEpochMicrosec\": 1000002, " + "\"version\": 1.2" + "}, " + "\"signalingFields\": {" + "\"eventInstanceIdentifier\": " + "{" + "\"vendorId\": \"vendor_x_id\", " + "\"eventId\": \"vendor_x_event_id\", " + "\"productId\": \"vendor_x_product_id\", " + "\"subsystemId\": \"vendor_x_subsystem_id\", " + "\"eventFriendlyName\": \"vendor_x_frieldly_name\"" + "}, " + "\"signalingFieldsVersion\": 1.1" + "}}}"; + + /***************************************************************************/ + /* Initialize and provide a specification with a single fault suppressed. */ + /***************************************************************************/ + evel_throttle_initialize(); + handle_json_response(json_command_list, &post); + + /***************************************************************************/ + /* Check that the domain is throttled. */ + /***************************************************************************/ + assert(evel_get_throttle_spec(EVEL_DOMAIN_SIGNALING) != NULL); + assert(post.memory == NULL); + + size_t json_size = 0; + char json_body[EVEL_MAX_JSON_BODY]; + EVENT_SIGNALING * event = NULL; + evel_set_next_event_sequence(2001); + event = evel_new_signaling("vendor_x_id", "vendor_x_event_id"); + assert(event != NULL); + evel_signaling_type_set(event, "Signaling"); + evel_signaling_product_id_set(event, "vendor_x_product_id"); + evel_signaling_subsystem_id_set(event, "vendor_x_subsystem_id"); + evel_signaling_friendly_name_set(event, "vendor_x_frieldly_name"); + evel_signaling_correlator_set(event, "vendor_x_correlator"); + evel_signaling_local_ip_address_set(event, "1.0.3.1"); + evel_signaling_local_port_set(event, "1031"); + evel_signaling_remote_ip_address_set(event, "5.3.3.0"); + evel_signaling_remote_port_set(event, "5330"); + evel_signaling_compressed_sip_set(event, "compressed_sip"); + evel_signaling_summary_sip_set(event, "summary_sip"); + json_size = evel_json_encode_event( + json_body, EVEL_MAX_JSON_BODY, (EVENT_HEADER *) event); + compare_strings(expected, json_body, EVEL_MAX_JSON_BODY, "Signaling"); + assert((json_size == strlen(json_body)) && "Bad size returned"); + + evel_free_event(event); + evel_throttle_terminate(); +} + +void test_encode_state_change_throttled() +{ + MEMORY_CHUNK post; + + /***************************************************************************/ + /* We also test suppression of the event header parameters here. */ + /***************************************************************************/ + char * json_command_list = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"eventDomainThrottleSpecification\": {" + "\"eventDomain\": \"stateChange\", " + "\"suppressedFieldNames\": [" + "\"eventType\", " + "\"reportingEntityId\", " + "\"sourceId\"], " + "\"suppressedNvPairsList\": [" + "{" + "\"nvPairFieldName\": \"additionalFields\", " + "\"suppressedNvPairNames\": [\"Name1\"]" + "}," + "]}}}" + "]" + "}"; + + char * expected = + "{\"event\": " + "{\"commonEventHeader\": {" + "\"domain\": \"stateChange\", " + "\"eventId\": \"128\", " + "\"functionalRole\": \"UNIT TEST\", " + "\"lastEpochMicrosec\": 1000002, " + "\"priority\": \"Normal\", " + "\"reportingEntityName\": \"Dummy VM name - No Metadata available\", " + "\"sequence\": 128, " + "\"sourceName\": \"Dummy VM name - No Metadata available\", " + "\"startEpochMicrosec\": 1000002, " + "\"version\": 1.2" + "}, " + "\"stateChangeFields\": {" + "\"newState\": \"inService\", " + "\"oldState\": \"outOfService\", " + "\"stateInterface\": \"An Interface\", " + "\"additionalFields\": [" + "{\"name\": \"Name2\", " + "\"value\": \"Value2\"}" + "], " + "\"stateChangeFieldsVersion\": 1.1" + "}}}"; + + /***************************************************************************/ + /* Initialize and provide a specification with a single fault suppressed. */ + /***************************************************************************/ + evel_throttle_initialize(); + handle_json_response(json_command_list, &post); + + /***************************************************************************/ + /* Check that the domain is throttled. */ + /***************************************************************************/ + assert(evel_get_throttle_spec(EVEL_DOMAIN_STATE_CHANGE) != NULL); + assert(post.memory == NULL); + + size_t json_size = 0; + char json_body[EVEL_MAX_JSON_BODY]; + EVENT_STATE_CHANGE * state_change = NULL; + evel_set_next_event_sequence(128); + state_change = evel_new_state_change(EVEL_ENTITY_STATE_IN_SERVICE, + EVEL_ENTITY_STATE_OUT_OF_SERVICE, + "An Interface"); + assert(state_change != NULL); + evel_state_change_type_set(state_change, "SC Type"); + evel_state_change_addl_field_add(state_change, "Name1", "Value1"); + evel_state_change_addl_field_add(state_change, "Name2", "Value2"); + + json_size = evel_json_encode_event( + json_body, EVEL_MAX_JSON_BODY, (EVENT_HEADER *) state_change); + compare_strings(expected, json_body, EVEL_MAX_JSON_BODY, "StateChange"); + assert((json_size == strlen(json_body)) && "Bad size returned"); + + evel_free_event(state_change); + evel_throttle_terminate(); +} + +void test_encode_syslog_throttled() +{ + MEMORY_CHUNK post; + + /***************************************************************************/ + /* We also test suppression of the event header parameters here. */ + /***************************************************************************/ + char * json_command_list = + "{" + "\"commandList\": [" + "{" + "\"command\": {" + "\"commandType\": \"throttlingSpecification\", " + "\"eventDomainThrottleSpecification\": {" + "\"eventDomain\": \"syslog\", " + "\"suppressedFieldNames\": [" + "\"eventSourceHost\", " + "\"syslogFacility\", " + "\"syslogProc\", " + "\"syslogProcId\", " + "\"syslogSData\", " + "\"syslogVer\", " + "\"eventType\", " + "\"reportingEntityId\", " + "\"sourceId\"], " + "\"suppressedNvPairsList\": [" + "{" + "\"nvPairFieldName\": \"additionalFields\", " + "\"suppressedNvPairNames\": [\"Name2\"]" + "}," + "]}}}" + "]" + "}"; + + char * expected = + "{\"event\": " + "{\"commonEventHeader\": {" + "\"domain\": \"syslog\", " + "\"eventId\": \"126\", " + "\"functionalRole\": \"UNIT TEST\", " + "\"lastEpochMicrosec\": 1000002, " + "\"priority\": \"Normal\", " + "\"reportingEntityName\": \"Dummy VM name - No Metadata available\", " + "\"sequence\": 126, " + "\"sourceName\": \"Dummy VM name - No Metadata available\", " + "\"startEpochMicrosec\": 1000002, " + "\"version\": 1.2" + "}, " + "\"syslogFields\": {" + "\"eventSourceType\": \"virtualNetworkFunction\", " + "\"syslogMsg\": \"SL Message\", " + "\"syslogTag\": \"SL Tag\", " + "\"syslogFieldsVersion\": 1.1, " + "\"additionalFields\": [" + "{\"name\": \"Name1\", " + "\"value\": \"Value1\"}" + "]" + "}}}"; + + /***************************************************************************/ + /* Initialize and provide a specification with a single fault suppressed. */ + /***************************************************************************/ + evel_throttle_initialize(); + handle_json_response(json_command_list, &post); + + /***************************************************************************/ + /* Check that the domain is throttled. */ + /***************************************************************************/ + assert(evel_get_throttle_spec(EVEL_DOMAIN_SYSLOG) != NULL); + assert(post.memory == NULL); + + size_t json_size = 0; + char json_body[EVEL_MAX_JSON_BODY]; + EVENT_SYSLOG * syslog = NULL; + evel_set_next_event_sequence(126); + syslog = evel_new_syslog(EVEL_SOURCE_VIRTUAL_NETWORK_FUNCTION, + "SL Message", + "SL Tag"); + assert(syslog != NULL); + evel_syslog_type_set(syslog, "SL Type"); + evel_syslog_event_source_host_set(syslog, "SL Host"); + evel_syslog_facility_set(syslog, EVEL_SYSLOG_FACILITY_LINE_PRINTER); + evel_syslog_proc_set(syslog, "SL Proc"); + evel_syslog_proc_id_set(syslog, 2); + evel_syslog_version_set(syslog, 1); + evel_syslog_s_data_set(syslog, "SL SDATA"); + evel_syslog_addl_field_add(syslog, "Name1", "Value1"); + evel_syslog_addl_field_add(syslog, "Name2", "Value2"); + + json_size = evel_json_encode_event( + json_body, EVEL_MAX_JSON_BODY, (EVENT_HEADER *) syslog); + compare_strings(expected, json_body, EVEL_MAX_JSON_BODY, "Syslog"); + assert((json_size == strlen(json_body)) && "Bad size returned"); + + evel_free_event(syslog); + evel_throttle_terminate(); +} + +void test_encode_fault_with_escaping() +{ + char * expected = + "{\"event\": {" + "\"commonEventHeader\": {" + "\"domain\": \"fault\", " + "\"eventId\": \"122\", " + "\"functionalRole\": \"UNIT TEST\", " + "\"lastEpochMicrosec\": 1000002, " + "\"priority\": \"Normal\", " + "\"reportingEntityName\": \"Dummy VM name - No Metadata available\", " + "\"sequence\": 122, " + "\"sourceName\": \"Dummy VM name - No Metadata available\", " + "\"startEpochMicrosec\": 1000002, " + "\"version\": 1.2, " + "\"eventType\": \"Bad things happen...\\\\\", " + "\"reportingEntityId\": \"Dummy VM UUID - No Metadata available\", " + "\"sourceId\": \"Dummy VM UUID - No Metadata available\"" + "}, " + "\"faultFields\": {" + "\"alarmCondition\": \"My alarm condition\", " + "\"eventSeverity\": \"MAJOR\", " + "\"eventSourceType\": \"other\", " + "\"specificProblem\": \"It broke \\\"very\\\" badly\", " + "\"vfStatus\": \"Active\", " + "\"faultFieldsVersion\": 1.1, " + "\"alarmAdditionalInformation\": [" + "{\"name\": \"name1\", " + "\"value\": \"value1\"}, " + "{\"name\": \"name2\", " + "\"value\": \"value2\"}], " + "\"alarmInterfaceA\": \"My Interface Card\"" + "}}}"; + + size_t json_size = 0; + char json_body[EVEL_MAX_JSON_BODY]; + evel_set_next_event_sequence(122); + EVENT_FAULT * fault = evel_new_fault("My alarm condition", + "It broke \"very\" badly", + EVEL_PRIORITY_NORMAL, + EVEL_SEVERITY_MAJOR); + assert(fault != NULL); + evel_fault_type_set(fault, "Bad things happen...\\"); + evel_fault_interface_set(fault, "My Interface Card"); + evel_fault_addl_info_add(fault, "name1", "value1"); + evel_fault_addl_info_add(fault, "name2", "value2"); + + json_size = evel_json_encode_event( + json_body, EVEL_MAX_JSON_BODY, (EVENT_HEADER *) fault); + compare_strings(expected, json_body, EVEL_MAX_JSON_BODY, "Fault"); + assert((json_size == strlen(json_body)) && "Bad size returned"); + + evel_free_event(fault); +} -- cgit 1.2.3-korg