1bd78cf69SLouise Kilheeney /* SPDX-License-Identifier: BSD-3-Clause 2bd78cf69SLouise Kilheeney * Copyright 2020 Intel Corporation 3bd78cf69SLouise Kilheeney */ 4bd78cf69SLouise Kilheeney 5*c9ba6aa3SBruce Richardson #ifdef RTE_EXEC_ENV_WINDOWS 6*c9ba6aa3SBruce Richardson #include "test.h" 7*c9ba6aa3SBruce Richardson 8*c9ba6aa3SBruce Richardson static int 9*c9ba6aa3SBruce Richardson telemetry_data_autotest(void) 10*c9ba6aa3SBruce Richardson { 11*c9ba6aa3SBruce Richardson return TEST_SKIPPED; 12*c9ba6aa3SBruce Richardson } 13*c9ba6aa3SBruce Richardson 14*c9ba6aa3SBruce Richardson #else 15*c9ba6aa3SBruce Richardson 16bd78cf69SLouise Kilheeney #include <string.h> 17bd78cf69SLouise Kilheeney #include <sys/socket.h> 18bd78cf69SLouise Kilheeney #include <sys/un.h> 19bd78cf69SLouise Kilheeney #include <unistd.h> 20bd78cf69SLouise Kilheeney #include <limits.h> 21bd78cf69SLouise Kilheeney 22bd78cf69SLouise Kilheeney #include <rte_eal.h> 23bd78cf69SLouise Kilheeney #include <rte_common.h> 24bd78cf69SLouise Kilheeney #include <rte_telemetry.h> 25bd78cf69SLouise Kilheeney #include <rte_string_fns.h> 26bd78cf69SLouise Kilheeney 27bd78cf69SLouise Kilheeney #include "test.h" 28bd78cf69SLouise Kilheeney #include "telemetry_data.h" 29bd78cf69SLouise Kilheeney 30bd78cf69SLouise Kilheeney #define TELEMETRY_VERSION "v2" 31bd78cf69SLouise Kilheeney #define REQUEST_CMD "/test" 32bd78cf69SLouise Kilheeney #define BUF_SIZE 1024 331306df2cSBruce Richardson #define CHECK_OUTPUT(exp) check_output(__func__, "{\"" REQUEST_CMD "\":" exp "}") 341306df2cSBruce Richardson 351306df2cSBruce Richardson /* 361306df2cSBruce Richardson * Runs a series of test cases, checking the output of telemetry for various different types of 371306df2cSBruce Richardson * responses. On init, a single connection to DPDK telemetry is made, and a single telemetry 381306df2cSBruce Richardson * callback "/test" is registered. That callback always returns the value of the static global 391306df2cSBruce Richardson * variable "response_data", so each test case builds up that structure, and then calls the 401306df2cSBruce Richardson * "check_output" function to ensure the response received over the socket for "/test" matches 411306df2cSBruce Richardson * that expected for the response_data value populated. 421306df2cSBruce Richardson * 431306df2cSBruce Richardson * NOTE: 441306df2cSBruce Richardson * - each test case function in this file should be added to the "test_cases" array in 451306df2cSBruce Richardson * test_telemetry_data function at the bottom of the file. 461306df2cSBruce Richardson * - each test case function should populate the "response_data" global variable (below) 471306df2cSBruce Richardson * with the appropriate values which would be returned from a simulated telemetry function. 481306df2cSBruce Richardson * Then the test case function should have "return CHECK_OUTPUT(<expected_data>);" as it's 491306df2cSBruce Richardson * last line. The test infrastructure will then validate that the output when returning 501306df2cSBruce Richardson * "response_data" structure matches that in "<expected_data>". 511306df2cSBruce Richardson * - the response_data structure will be zeroed on entry to each test function, so each function 521306df2cSBruce Richardson * can begin with a call to "rte_tel_data_string/start_array/start_dict" as so desired. 531306df2cSBruce Richardson * - the expected_output for each function can be just the actual json data from the 541306df2cSBruce Richardson * "response_data" value. The CHECK_OUTPUT macro will include the appropriate "{\"/test\": ... }" 551306df2cSBruce Richardson * structure around the json output. 561306df2cSBruce Richardson * 571306df2cSBruce Richardson * See test_simple_string(), or test_case_array_int() for a basic examples of test cases. 581306df2cSBruce Richardson */ 591306df2cSBruce Richardson 60bd78cf69SLouise Kilheeney 61bd78cf69SLouise Kilheeney static struct rte_tel_data response_data; 62bd78cf69SLouise Kilheeney static int sock; 63bd78cf69SLouise Kilheeney 641306df2cSBruce Richardson 65bd78cf69SLouise Kilheeney /* 66bd78cf69SLouise Kilheeney * This function is the callback registered with Telemetry to be used when 67bd78cf69SLouise Kilheeney * the /test command is requested. This callback returns the global data built 68bd78cf69SLouise Kilheeney * up by the individual test cases. 69bd78cf69SLouise Kilheeney */ 70bd78cf69SLouise Kilheeney static int 711306df2cSBruce Richardson telemetry_test_cb(const char *cmd __rte_unused, const char *params __rte_unused, 72bd78cf69SLouise Kilheeney struct rte_tel_data *d) 73bd78cf69SLouise Kilheeney { 74bd78cf69SLouise Kilheeney *d = response_data; 75bd78cf69SLouise Kilheeney return 0; 76bd78cf69SLouise Kilheeney } 77bd78cf69SLouise Kilheeney 78bd78cf69SLouise Kilheeney /* 79bd78cf69SLouise Kilheeney * This function is called by each test case function. It communicates with 80bd78cf69SLouise Kilheeney * the telemetry socket by requesting the /test command, and reading the 81bd78cf69SLouise Kilheeney * response. The expected response is passed in by the test case function, 82bd78cf69SLouise Kilheeney * and is compared to the actual response received from Telemetry. 83bd78cf69SLouise Kilheeney */ 84bd78cf69SLouise Kilheeney static int 851306df2cSBruce Richardson check_output(const char *func_name, const char *expected) 86bd78cf69SLouise Kilheeney { 87bd78cf69SLouise Kilheeney int bytes; 88bd78cf69SLouise Kilheeney char buf[BUF_SIZE * 16]; 89bd78cf69SLouise Kilheeney if (write(sock, REQUEST_CMD, strlen(REQUEST_CMD)) < 0) { 90bd78cf69SLouise Kilheeney printf("%s: Error with socket write - %s\n", __func__, 91bd78cf69SLouise Kilheeney strerror(errno)); 92bd78cf69SLouise Kilheeney return -1; 93bd78cf69SLouise Kilheeney } 94bd78cf69SLouise Kilheeney bytes = read(sock, buf, sizeof(buf) - 1); 95bd78cf69SLouise Kilheeney if (bytes < 0) { 96bd78cf69SLouise Kilheeney printf("%s: Error with socket read - %s\n", __func__, 97bd78cf69SLouise Kilheeney strerror(errno)); 98bd78cf69SLouise Kilheeney return -1; 99bd78cf69SLouise Kilheeney } 100bd78cf69SLouise Kilheeney buf[bytes] = '\0'; 101bd78cf69SLouise Kilheeney printf("%s: buf = '%s', expected = '%s'\n", func_name, buf, expected); 102bd78cf69SLouise Kilheeney return strncmp(expected, buf, sizeof(buf)); 103bd78cf69SLouise Kilheeney } 104bd78cf69SLouise Kilheeney 105bd78cf69SLouise Kilheeney static int 1060f3d92f3SBruce Richardson test_null_return(void) 1070f3d92f3SBruce Richardson { 1080f3d92f3SBruce Richardson return CHECK_OUTPUT("null"); 1090f3d92f3SBruce Richardson } 1100f3d92f3SBruce Richardson 1110f3d92f3SBruce Richardson static int 1121306df2cSBruce Richardson test_simple_string(void) 1131306df2cSBruce Richardson { 1141306df2cSBruce Richardson rte_tel_data_string(&response_data, "Simple string"); 1151306df2cSBruce Richardson 1161306df2cSBruce Richardson return CHECK_OUTPUT("\"Simple string\""); 1171306df2cSBruce Richardson } 1181306df2cSBruce Richardson 1191306df2cSBruce Richardson static int 120bd78cf69SLouise Kilheeney test_dict_with_array_int_values(void) 121bd78cf69SLouise Kilheeney { 122bd78cf69SLouise Kilheeney int i; 123bd78cf69SLouise Kilheeney 124bd78cf69SLouise Kilheeney struct rte_tel_data *child_data = rte_tel_data_alloc(); 125bd78cf69SLouise Kilheeney rte_tel_data_start_array(child_data, RTE_TEL_INT_VAL); 126bd78cf69SLouise Kilheeney 127bd78cf69SLouise Kilheeney struct rte_tel_data *child_data2 = rte_tel_data_alloc(); 128bd78cf69SLouise Kilheeney rte_tel_data_start_array(child_data2, RTE_TEL_INT_VAL); 129bd78cf69SLouise Kilheeney 130bd78cf69SLouise Kilheeney rte_tel_data_start_dict(&response_data); 131bd78cf69SLouise Kilheeney 132bd78cf69SLouise Kilheeney for (i = 0; i < 5; i++) { 133bd78cf69SLouise Kilheeney rte_tel_data_add_array_int(child_data, i); 134bd78cf69SLouise Kilheeney rte_tel_data_add_array_int(child_data2, i); 135bd78cf69SLouise Kilheeney } 136bd78cf69SLouise Kilheeney 137bd78cf69SLouise Kilheeney rte_tel_data_add_dict_container(&response_data, "dict_0", 138bd78cf69SLouise Kilheeney child_data, 0); 139bd78cf69SLouise Kilheeney rte_tel_data_add_dict_container(&response_data, "dict_1", 140bd78cf69SLouise Kilheeney child_data2, 0); 141bd78cf69SLouise Kilheeney 1421306df2cSBruce Richardson return CHECK_OUTPUT("{\"dict_0\":[0,1,2,3,4],\"dict_1\":[0,1,2,3,4]}"); 143bd78cf69SLouise Kilheeney } 144bd78cf69SLouise Kilheeney 145bd78cf69SLouise Kilheeney static int 146bd78cf69SLouise Kilheeney test_array_with_array_int_values(void) 147bd78cf69SLouise Kilheeney { 148bd78cf69SLouise Kilheeney int i; 149bd78cf69SLouise Kilheeney 150bd78cf69SLouise Kilheeney struct rte_tel_data *child_data = rte_tel_data_alloc(); 151bd78cf69SLouise Kilheeney rte_tel_data_start_array(child_data, RTE_TEL_INT_VAL); 152bd78cf69SLouise Kilheeney 153bd78cf69SLouise Kilheeney struct rte_tel_data *child_data2 = rte_tel_data_alloc(); 154bd78cf69SLouise Kilheeney rte_tel_data_start_array(child_data2, RTE_TEL_INT_VAL); 155bd78cf69SLouise Kilheeney 156bd78cf69SLouise Kilheeney rte_tel_data_start_array(&response_data, RTE_TEL_CONTAINER); 157bd78cf69SLouise Kilheeney 158bd78cf69SLouise Kilheeney for (i = 0; i < 5; i++) { 159bd78cf69SLouise Kilheeney rte_tel_data_add_array_int(child_data, i); 160bd78cf69SLouise Kilheeney rte_tel_data_add_array_int(child_data2, i); 161bd78cf69SLouise Kilheeney } 162bd78cf69SLouise Kilheeney rte_tel_data_add_array_container(&response_data, child_data, 0); 163bd78cf69SLouise Kilheeney rte_tel_data_add_array_container(&response_data, child_data2, 0); 164bd78cf69SLouise Kilheeney 1651306df2cSBruce Richardson return CHECK_OUTPUT("[[0,1,2,3,4],[0,1,2,3,4]]"); 166bd78cf69SLouise Kilheeney } 167bd78cf69SLouise Kilheeney 168bd78cf69SLouise Kilheeney static int 169bd78cf69SLouise Kilheeney test_case_array_int(void) 170bd78cf69SLouise Kilheeney { 171bd78cf69SLouise Kilheeney int i; 1721306df2cSBruce Richardson 173bd78cf69SLouise Kilheeney rte_tel_data_start_array(&response_data, RTE_TEL_INT_VAL); 174bd78cf69SLouise Kilheeney for (i = 0; i < 5; i++) 175bd78cf69SLouise Kilheeney rte_tel_data_add_array_int(&response_data, i); 1761306df2cSBruce Richardson return CHECK_OUTPUT("[0,1,2,3,4]"); 177bd78cf69SLouise Kilheeney } 178bd78cf69SLouise Kilheeney 179bd78cf69SLouise Kilheeney static int 180bd78cf69SLouise Kilheeney test_case_add_dict_int(void) 181bd78cf69SLouise Kilheeney { 182bd78cf69SLouise Kilheeney int i = 0; 183bd78cf69SLouise Kilheeney char name_of_value[8]; 184bd78cf69SLouise Kilheeney 185bd78cf69SLouise Kilheeney rte_tel_data_start_dict(&response_data); 186bd78cf69SLouise Kilheeney 187bd78cf69SLouise Kilheeney for (i = 0; i < 5; i++) { 188bd78cf69SLouise Kilheeney sprintf(name_of_value, "dict_%d", i); 189bd78cf69SLouise Kilheeney rte_tel_data_add_dict_int(&response_data, name_of_value, i); 190bd78cf69SLouise Kilheeney } 191bd78cf69SLouise Kilheeney 1921306df2cSBruce Richardson return CHECK_OUTPUT("{\"dict_0\":0,\"dict_1\":1,\"dict_2\":2,\"dict_3\":3,\"dict_4\":4}"); 193bd78cf69SLouise Kilheeney } 194bd78cf69SLouise Kilheeney 195bd78cf69SLouise Kilheeney static int 196bd78cf69SLouise Kilheeney test_case_array_string(void) 197bd78cf69SLouise Kilheeney { 198bd78cf69SLouise Kilheeney rte_tel_data_start_array(&response_data, RTE_TEL_STRING_VAL); 199bd78cf69SLouise Kilheeney rte_tel_data_add_array_string(&response_data, "aaaa"); 200bd78cf69SLouise Kilheeney rte_tel_data_add_array_string(&response_data, "bbbb"); 201bd78cf69SLouise Kilheeney rte_tel_data_add_array_string(&response_data, "cccc"); 202bd78cf69SLouise Kilheeney rte_tel_data_add_array_string(&response_data, "dddd"); 203bd78cf69SLouise Kilheeney rte_tel_data_add_array_string(&response_data, "eeee"); 204bd78cf69SLouise Kilheeney 2051306df2cSBruce Richardson return CHECK_OUTPUT("[\"aaaa\",\"bbbb\",\"cccc\",\"dddd\",\"eeee\"]"); 206bd78cf69SLouise Kilheeney } 207bd78cf69SLouise Kilheeney 208bd78cf69SLouise Kilheeney static int 209bd78cf69SLouise Kilheeney test_case_add_dict_string(void) 210bd78cf69SLouise Kilheeney { 211bd78cf69SLouise Kilheeney rte_tel_data_start_dict(&response_data); 212bd78cf69SLouise Kilheeney 213bd78cf69SLouise Kilheeney rte_tel_data_add_dict_string(&response_data, "dict_0", "aaaa"); 214bd78cf69SLouise Kilheeney rte_tel_data_add_dict_string(&response_data, "dict_1", "bbbb"); 215bd78cf69SLouise Kilheeney rte_tel_data_add_dict_string(&response_data, "dict_2", "cccc"); 216bd78cf69SLouise Kilheeney rte_tel_data_add_dict_string(&response_data, "dict_3", "dddd"); 217bd78cf69SLouise Kilheeney 2181306df2cSBruce Richardson return CHECK_OUTPUT("{\"dict_0\":\"aaaa\",\"dict_1\":\"bbbb\",\"dict_2\":\"cccc\",\"dict_3\":\"dddd\"}"); 219bd78cf69SLouise Kilheeney } 220bd78cf69SLouise Kilheeney 22182c33481SHuisong Li static int 22282c33481SHuisong Li test_case_add_dict_uint_hex_padding(void) 22382c33481SHuisong Li { 22482c33481SHuisong Li rte_tel_data_start_dict(&response_data); 22582c33481SHuisong Li 22682c33481SHuisong Li rte_tel_data_add_dict_uint_hex(&response_data, "dict_0", 22782c33481SHuisong Li (uint8_t)0x8, 8); 22882c33481SHuisong Li rte_tel_data_add_dict_uint_hex(&response_data, "dict_1", 22982c33481SHuisong Li (uint16_t)0x88, 16); 23082c33481SHuisong Li rte_tel_data_add_dict_uint_hex(&response_data, "dict_2", 23182c33481SHuisong Li (uint32_t)0x888, 32); 23282c33481SHuisong Li rte_tel_data_add_dict_uint_hex(&response_data, "dict_3", 23382c33481SHuisong Li (uint64_t)0x8888, 64); 23482c33481SHuisong Li 23582c33481SHuisong Li return CHECK_OUTPUT("{\"dict_0\":\"0x08\",\"dict_1\":\"0x0088\",\"dict_2\":\"0x00000888\",\"dict_3\":\"0x0000000000008888\"}"); 23682c33481SHuisong Li } 23782c33481SHuisong Li 23882c33481SHuisong Li static int 23982c33481SHuisong Li test_case_add_dict_uint_hex_nopadding(void) 24082c33481SHuisong Li { 24182c33481SHuisong Li rte_tel_data_start_dict(&response_data); 24282c33481SHuisong Li 24382c33481SHuisong Li rte_tel_data_add_dict_uint_hex(&response_data, "dict_0", 24482c33481SHuisong Li (uint8_t)0x8, 0); 24582c33481SHuisong Li rte_tel_data_add_dict_uint_hex(&response_data, "dict_1", 24682c33481SHuisong Li (uint16_t)0x88, 0); 24782c33481SHuisong Li rte_tel_data_add_dict_uint_hex(&response_data, "dict_2", 24882c33481SHuisong Li (uint32_t)0x888, 0); 24982c33481SHuisong Li rte_tel_data_add_dict_uint_hex(&response_data, "dict_3", 25082c33481SHuisong Li (uint64_t)0x8888, 0); 25182c33481SHuisong Li 25282c33481SHuisong Li return CHECK_OUTPUT("{\"dict_0\":\"0x8\",\"dict_1\":\"0x88\",\"dict_2\":\"0x888\",\"dict_3\":\"0x8888\"}"); 25382c33481SHuisong Li } 254bd78cf69SLouise Kilheeney 255bd78cf69SLouise Kilheeney static int 256bd78cf69SLouise Kilheeney test_dict_with_array_string_values(void) 257bd78cf69SLouise Kilheeney { 258bd78cf69SLouise Kilheeney struct rte_tel_data *child_data = rte_tel_data_alloc(); 259bd78cf69SLouise Kilheeney rte_tel_data_start_array(child_data, RTE_TEL_STRING_VAL); 260bd78cf69SLouise Kilheeney 261bd78cf69SLouise Kilheeney struct rte_tel_data *child_data2 = rte_tel_data_alloc(); 262bd78cf69SLouise Kilheeney rte_tel_data_start_array(child_data2, RTE_TEL_STRING_VAL); 263bd78cf69SLouise Kilheeney 264bd78cf69SLouise Kilheeney rte_tel_data_start_dict(&response_data); 265bd78cf69SLouise Kilheeney 266bd78cf69SLouise Kilheeney rte_tel_data_add_array_string(child_data, "aaaa"); 267bd78cf69SLouise Kilheeney rte_tel_data_add_array_string(child_data2, "bbbb"); 268bd78cf69SLouise Kilheeney 269bd78cf69SLouise Kilheeney rte_tel_data_add_dict_container(&response_data, "dict_0", 270bd78cf69SLouise Kilheeney child_data, 0); 271bd78cf69SLouise Kilheeney rte_tel_data_add_dict_container(&response_data, "dict_1", 272bd78cf69SLouise Kilheeney child_data2, 0); 273bd78cf69SLouise Kilheeney 2741306df2cSBruce Richardson return CHECK_OUTPUT("{\"dict_0\":[\"aaaa\"],\"dict_1\":[\"bbbb\"]}"); 275bd78cf69SLouise Kilheeney } 276bd78cf69SLouise Kilheeney 277bd78cf69SLouise Kilheeney static int 27882c33481SHuisong Li test_dict_with_array_uint_hex_values_padding(void) 27982c33481SHuisong Li { 28082c33481SHuisong Li struct rte_tel_data *child_data = rte_tel_data_alloc(); 28182c33481SHuisong Li rte_tel_data_start_array(child_data, RTE_TEL_STRING_VAL); 28282c33481SHuisong Li 28382c33481SHuisong Li struct rte_tel_data *child_data2 = rte_tel_data_alloc(); 28482c33481SHuisong Li rte_tel_data_start_array(child_data2, RTE_TEL_STRING_VAL); 28582c33481SHuisong Li 28682c33481SHuisong Li rte_tel_data_start_dict(&response_data); 28782c33481SHuisong Li 28882c33481SHuisong Li rte_tel_data_add_array_uint_hex(child_data, (uint32_t)0x888, 32); 28982c33481SHuisong Li rte_tel_data_add_array_uint_hex(child_data2, (uint64_t)0x8888, 64); 29082c33481SHuisong Li 29182c33481SHuisong Li rte_tel_data_add_dict_container(&response_data, "dict_0", 29282c33481SHuisong Li child_data, 0); 29382c33481SHuisong Li rte_tel_data_add_dict_container(&response_data, "dict_1", 29482c33481SHuisong Li child_data2, 0); 29582c33481SHuisong Li 29682c33481SHuisong Li return CHECK_OUTPUT("{\"dict_0\":[\"0x00000888\"],\"dict_1\":[\"0x0000000000008888\"]}"); 29782c33481SHuisong Li } 29882c33481SHuisong Li 29982c33481SHuisong Li static int 30082c33481SHuisong Li test_dict_with_array_uint_hex_values_nopadding(void) 30182c33481SHuisong Li { 30282c33481SHuisong Li struct rte_tel_data *child_data = rte_tel_data_alloc(); 30382c33481SHuisong Li rte_tel_data_start_array(child_data, RTE_TEL_STRING_VAL); 30482c33481SHuisong Li 30582c33481SHuisong Li struct rte_tel_data *child_data2 = rte_tel_data_alloc(); 30682c33481SHuisong Li rte_tel_data_start_array(child_data2, RTE_TEL_STRING_VAL); 30782c33481SHuisong Li 30882c33481SHuisong Li rte_tel_data_start_dict(&response_data); 30982c33481SHuisong Li 31082c33481SHuisong Li rte_tel_data_add_array_uint_hex(child_data, (uint32_t)0x888, 0); 31182c33481SHuisong Li rte_tel_data_add_array_uint_hex(child_data2, (uint64_t)0x8888, 0); 31282c33481SHuisong Li 31382c33481SHuisong Li rte_tel_data_add_dict_container(&response_data, "dict_0", 31482c33481SHuisong Li child_data, 0); 31582c33481SHuisong Li rte_tel_data_add_dict_container(&response_data, "dict_1", 31682c33481SHuisong Li child_data2, 0); 31782c33481SHuisong Li 31882c33481SHuisong Li return CHECK_OUTPUT("{\"dict_0\":[\"0x888\"],\"dict_1\":[\"0x8888\"]}"); 31982c33481SHuisong Li } 32082c33481SHuisong Li 32182c33481SHuisong Li static int 322d2671e64SRadu Nicolau test_dict_with_dict_values(void) 323d2671e64SRadu Nicolau { 324d2671e64SRadu Nicolau struct rte_tel_data *dict_of_dicts = rte_tel_data_alloc(); 325d2671e64SRadu Nicolau rte_tel_data_start_dict(dict_of_dicts); 326d2671e64SRadu Nicolau 327d2671e64SRadu Nicolau struct rte_tel_data *child_data = rte_tel_data_alloc(); 328d2671e64SRadu Nicolau rte_tel_data_start_array(child_data, RTE_TEL_STRING_VAL); 329d2671e64SRadu Nicolau 330d2671e64SRadu Nicolau struct rte_tel_data *child_data2 = rte_tel_data_alloc(); 331d2671e64SRadu Nicolau rte_tel_data_start_array(child_data2, RTE_TEL_STRING_VAL); 332d2671e64SRadu Nicolau 333d2671e64SRadu Nicolau rte_tel_data_start_dict(&response_data); 334d2671e64SRadu Nicolau 335d2671e64SRadu Nicolau rte_tel_data_add_array_string(child_data, "aaaa"); 336d2671e64SRadu Nicolau rte_tel_data_add_array_string(child_data2, "bbbb"); 337d2671e64SRadu Nicolau rte_tel_data_add_dict_container(dict_of_dicts, "dict_0", 338d2671e64SRadu Nicolau child_data, 0); 339d2671e64SRadu Nicolau rte_tel_data_add_dict_container(dict_of_dicts, "dict_1", 340d2671e64SRadu Nicolau child_data2, 0); 341d2671e64SRadu Nicolau rte_tel_data_add_dict_container(&response_data, "dict_of_dicts", 342d2671e64SRadu Nicolau dict_of_dicts, 0); 343d2671e64SRadu Nicolau 3441306df2cSBruce Richardson return CHECK_OUTPUT("{\"dict_of_dicts\":{\"dict_0\":[\"aaaa\"],\"dict_1\":[\"bbbb\"]}}"); 345d2671e64SRadu Nicolau } 346d2671e64SRadu Nicolau 347d2671e64SRadu Nicolau static int 348bd78cf69SLouise Kilheeney test_array_with_array_string_values(void) 349bd78cf69SLouise Kilheeney { 350bd78cf69SLouise Kilheeney struct rte_tel_data *child_data = rte_tel_data_alloc(); 351bd78cf69SLouise Kilheeney rte_tel_data_start_array(child_data, RTE_TEL_STRING_VAL); 352bd78cf69SLouise Kilheeney 353bd78cf69SLouise Kilheeney struct rte_tel_data *child_data2 = rte_tel_data_alloc(); 354bd78cf69SLouise Kilheeney rte_tel_data_start_array(child_data2, RTE_TEL_STRING_VAL); 355bd78cf69SLouise Kilheeney 356bd78cf69SLouise Kilheeney rte_tel_data_start_array(&response_data, RTE_TEL_CONTAINER); 357bd78cf69SLouise Kilheeney 358bd78cf69SLouise Kilheeney rte_tel_data_add_array_string(child_data, "aaaa"); 359bd78cf69SLouise Kilheeney rte_tel_data_add_array_string(child_data2, "bbbb"); 360bd78cf69SLouise Kilheeney 361bd78cf69SLouise Kilheeney rte_tel_data_add_array_container(&response_data, child_data, 0); 362bd78cf69SLouise Kilheeney rte_tel_data_add_array_container(&response_data, child_data2, 0); 363bd78cf69SLouise Kilheeney 3641306df2cSBruce Richardson return CHECK_OUTPUT("[[\"aaaa\"],[\"bbbb\"]]"); 365bd78cf69SLouise Kilheeney } 366bd78cf69SLouise Kilheeney 367bd78cf69SLouise Kilheeney static int 36882c33481SHuisong Li test_array_with_array_uint_hex_values_padding(void) 36982c33481SHuisong Li { 37082c33481SHuisong Li struct rte_tel_data *child_data = rte_tel_data_alloc(); 37182c33481SHuisong Li rte_tel_data_start_array(child_data, RTE_TEL_STRING_VAL); 37282c33481SHuisong Li 37382c33481SHuisong Li struct rte_tel_data *child_data2 = rte_tel_data_alloc(); 37482c33481SHuisong Li rte_tel_data_start_array(child_data2, RTE_TEL_STRING_VAL); 37582c33481SHuisong Li 37682c33481SHuisong Li rte_tel_data_start_array(&response_data, RTE_TEL_CONTAINER); 37782c33481SHuisong Li 37882c33481SHuisong Li rte_tel_data_add_array_uint_hex(child_data, (uint32_t)0x888, 32); 37982c33481SHuisong Li rte_tel_data_add_array_uint_hex(child_data2, (uint64_t)0x8888, 64); 38082c33481SHuisong Li 38182c33481SHuisong Li rte_tel_data_add_array_container(&response_data, child_data, 0); 38282c33481SHuisong Li rte_tel_data_add_array_container(&response_data, child_data2, 0); 38382c33481SHuisong Li 38482c33481SHuisong Li return CHECK_OUTPUT("[[\"0x00000888\"],[\"0x0000000000008888\"]]"); 38582c33481SHuisong Li } 38682c33481SHuisong Li 38782c33481SHuisong Li 38882c33481SHuisong Li static int 38982c33481SHuisong Li test_array_with_array_uint_hex_values_nopadding(void) 39082c33481SHuisong Li { 39182c33481SHuisong Li struct rte_tel_data *child_data = rte_tel_data_alloc(); 39282c33481SHuisong Li rte_tel_data_start_array(child_data, RTE_TEL_STRING_VAL); 39382c33481SHuisong Li 39482c33481SHuisong Li struct rte_tel_data *child_data2 = rte_tel_data_alloc(); 39582c33481SHuisong Li rte_tel_data_start_array(child_data2, RTE_TEL_STRING_VAL); 39682c33481SHuisong Li 39782c33481SHuisong Li rte_tel_data_start_array(&response_data, RTE_TEL_CONTAINER); 39882c33481SHuisong Li 39982c33481SHuisong Li rte_tel_data_add_array_uint_hex(child_data, (uint32_t)0x888, 0); 40082c33481SHuisong Li rte_tel_data_add_array_uint_hex(child_data2, (uint64_t)0x8888, 0); 40182c33481SHuisong Li 40282c33481SHuisong Li rte_tel_data_add_array_container(&response_data, child_data, 0); 40382c33481SHuisong Li rte_tel_data_add_array_container(&response_data, child_data2, 0); 40482c33481SHuisong Li 40582c33481SHuisong Li return CHECK_OUTPUT("[[\"0x888\"],[\"0x8888\"]]"); 40682c33481SHuisong Li } 40782c33481SHuisong Li 40882c33481SHuisong Li static int 409bd78cf69SLouise Kilheeney test_case_array_u64(void) 410bd78cf69SLouise Kilheeney { 411bd78cf69SLouise Kilheeney int i; 4121306df2cSBruce Richardson 4132d2c55e4SBruce Richardson rte_tel_data_start_array(&response_data, RTE_TEL_UINT_VAL); 414bd78cf69SLouise Kilheeney for (i = 0; i < 5; i++) 415af0785a2SBruce Richardson rte_tel_data_add_array_uint(&response_data, i); 4161306df2cSBruce Richardson return CHECK_OUTPUT("[0,1,2,3,4]"); 417bd78cf69SLouise Kilheeney } 418bd78cf69SLouise Kilheeney 419bd78cf69SLouise Kilheeney static int 42082c33481SHuisong Li test_case_array_uint_hex_padding(void) 42182c33481SHuisong Li { 42282c33481SHuisong Li rte_tel_data_start_array(&response_data, RTE_TEL_STRING_VAL); 42382c33481SHuisong Li rte_tel_data_add_array_uint_hex(&response_data, (uint8_t)0x8, 8); 42482c33481SHuisong Li rte_tel_data_add_array_uint_hex(&response_data, (uint16_t)0x88, 16); 42582c33481SHuisong Li rte_tel_data_add_array_uint_hex(&response_data, (uint32_t)0x888, 32); 42682c33481SHuisong Li rte_tel_data_add_array_uint_hex(&response_data, (uint64_t)0x8888, 64); 42782c33481SHuisong Li 42882c33481SHuisong Li return CHECK_OUTPUT("[\"0x08\",\"0x0088\",\"0x00000888\",\"0x0000000000008888\"]"); 42982c33481SHuisong Li } 43082c33481SHuisong Li 43182c33481SHuisong Li static int 43282c33481SHuisong Li test_case_array_uint_hex_nopadding(void) 43382c33481SHuisong Li { 43482c33481SHuisong Li rte_tel_data_start_array(&response_data, RTE_TEL_STRING_VAL); 43582c33481SHuisong Li rte_tel_data_add_array_uint_hex(&response_data, (uint8_t)0x8, 0); 43682c33481SHuisong Li rte_tel_data_add_array_uint_hex(&response_data, (uint16_t)0x88, 0); 43782c33481SHuisong Li rte_tel_data_add_array_uint_hex(&response_data, (uint32_t)0x888, 0); 43882c33481SHuisong Li rte_tel_data_add_array_uint_hex(&response_data, (uint64_t)0x8888, 0); 43982c33481SHuisong Li 44082c33481SHuisong Li return CHECK_OUTPUT("[\"0x8\",\"0x88\",\"0x888\",\"0x8888\"]"); 44182c33481SHuisong Li } 44282c33481SHuisong Li 44382c33481SHuisong Li static int 444bd78cf69SLouise Kilheeney test_case_add_dict_u64(void) 445bd78cf69SLouise Kilheeney { 446bd78cf69SLouise Kilheeney int i = 0; 447bd78cf69SLouise Kilheeney char name_of_value[8]; 448bd78cf69SLouise Kilheeney 449bd78cf69SLouise Kilheeney rte_tel_data_start_dict(&response_data); 450bd78cf69SLouise Kilheeney 451bd78cf69SLouise Kilheeney for (i = 0; i < 5; i++) { 452bd78cf69SLouise Kilheeney sprintf(name_of_value, "dict_%d", i); 453af0785a2SBruce Richardson rte_tel_data_add_dict_uint(&response_data, name_of_value, i); 454bd78cf69SLouise Kilheeney } 4551306df2cSBruce Richardson return CHECK_OUTPUT("{\"dict_0\":0,\"dict_1\":1,\"dict_2\":2,\"dict_3\":3,\"dict_4\":4}"); 456bd78cf69SLouise Kilheeney } 457bd78cf69SLouise Kilheeney 458bd78cf69SLouise Kilheeney static int 459bd78cf69SLouise Kilheeney test_dict_with_array_u64_values(void) 460bd78cf69SLouise Kilheeney { 461bd78cf69SLouise Kilheeney int i; 462bd78cf69SLouise Kilheeney 463bd78cf69SLouise Kilheeney struct rte_tel_data *child_data = rte_tel_data_alloc(); 4642d2c55e4SBruce Richardson rte_tel_data_start_array(child_data, RTE_TEL_UINT_VAL); 465bd78cf69SLouise Kilheeney 466bd78cf69SLouise Kilheeney struct rte_tel_data *child_data2 = rte_tel_data_alloc(); 4672d2c55e4SBruce Richardson rte_tel_data_start_array(child_data2, RTE_TEL_UINT_VAL); 468bd78cf69SLouise Kilheeney 469bd78cf69SLouise Kilheeney rte_tel_data_start_dict(&response_data); 470bd78cf69SLouise Kilheeney 471bd78cf69SLouise Kilheeney for (i = 0; i < 10; i++) { 472af0785a2SBruce Richardson rte_tel_data_add_array_uint(child_data, i); 473af0785a2SBruce Richardson rte_tel_data_add_array_uint(child_data2, i); 474bd78cf69SLouise Kilheeney } 475bd78cf69SLouise Kilheeney 476bd78cf69SLouise Kilheeney rte_tel_data_add_dict_container(&response_data, "dict_0", 477bd78cf69SLouise Kilheeney child_data, 0); 478bd78cf69SLouise Kilheeney rte_tel_data_add_dict_container(&response_data, "dict_1", 479bd78cf69SLouise Kilheeney child_data2, 0); 480bd78cf69SLouise Kilheeney 4811306df2cSBruce Richardson return CHECK_OUTPUT("{\"dict_0\":[0,1,2,3,4,5,6,7,8,9],\"dict_1\":[0,1,2,3,4,5,6,7,8,9]}"); 482bd78cf69SLouise Kilheeney } 483bd78cf69SLouise Kilheeney 484bd78cf69SLouise Kilheeney static int 485bd78cf69SLouise Kilheeney test_array_with_array_u64_values(void) 486bd78cf69SLouise Kilheeney { 487bd78cf69SLouise Kilheeney int i; 488bd78cf69SLouise Kilheeney 489bd78cf69SLouise Kilheeney struct rte_tel_data *child_data = rte_tel_data_alloc(); 4902d2c55e4SBruce Richardson rte_tel_data_start_array(child_data, RTE_TEL_UINT_VAL); 491bd78cf69SLouise Kilheeney 492bd78cf69SLouise Kilheeney struct rte_tel_data *child_data2 = rte_tel_data_alloc(); 4932d2c55e4SBruce Richardson rte_tel_data_start_array(child_data2, RTE_TEL_UINT_VAL); 494bd78cf69SLouise Kilheeney 495bd78cf69SLouise Kilheeney rte_tel_data_start_array(&response_data, RTE_TEL_CONTAINER); 496bd78cf69SLouise Kilheeney 497bd78cf69SLouise Kilheeney for (i = 0; i < 5; i++) { 498af0785a2SBruce Richardson rte_tel_data_add_array_uint(child_data, i); 499af0785a2SBruce Richardson rte_tel_data_add_array_uint(child_data2, i); 500bd78cf69SLouise Kilheeney } 501bd78cf69SLouise Kilheeney rte_tel_data_add_array_container(&response_data, child_data, 0); 502bd78cf69SLouise Kilheeney rte_tel_data_add_array_container(&response_data, child_data2, 0); 503bd78cf69SLouise Kilheeney 5041306df2cSBruce Richardson return CHECK_OUTPUT("[[0,1,2,3,4],[0,1,2,3,4]]"); 505bd78cf69SLouise Kilheeney } 506bd78cf69SLouise Kilheeney 507bd78cf69SLouise Kilheeney static int 508d0049f7aSBruce Richardson test_string_char_escaping(void) 509d0049f7aSBruce Richardson { 510d0049f7aSBruce Richardson rte_tel_data_string(&response_data, "hello,\nworld\n"); 511d0049f7aSBruce Richardson return CHECK_OUTPUT("\"hello,\\nworld\\n\""); 512d0049f7aSBruce Richardson } 513d0049f7aSBruce Richardson 514d0049f7aSBruce Richardson static int 515d0049f7aSBruce Richardson test_array_char_escaping(void) 516d0049f7aSBruce Richardson { 517d0049f7aSBruce Richardson rte_tel_data_start_array(&response_data, RTE_TEL_STRING_VAL); 518d0049f7aSBruce Richardson rte_tel_data_add_array_string(&response_data, "\\escape\r"); 519d0049f7aSBruce Richardson rte_tel_data_add_array_string(&response_data, "characters\n"); 520d0049f7aSBruce Richardson return CHECK_OUTPUT("[\"\\\\escape\\r\",\"characters\\n\"]"); 521d0049f7aSBruce Richardson } 522d0049f7aSBruce Richardson 523d0049f7aSBruce Richardson static int 524d0049f7aSBruce Richardson test_dict_char_escaping(void) 525d0049f7aSBruce Richardson { 526d0049f7aSBruce Richardson rte_tel_data_start_dict(&response_data); 527d0049f7aSBruce Richardson rte_tel_data_add_dict_string(&response_data, "name", "escaped\n\tvalue"); 528d0049f7aSBruce Richardson return CHECK_OUTPUT("{\"name\":\"escaped\\n\\tvalue\"}"); 529d0049f7aSBruce Richardson } 530d0049f7aSBruce Richardson 531d0049f7aSBruce Richardson static int 532bd78cf69SLouise Kilheeney connect_to_socket(void) 533bd78cf69SLouise Kilheeney { 534bd78cf69SLouise Kilheeney char buf[BUF_SIZE]; 535bd78cf69SLouise Kilheeney int sock, bytes; 536bd78cf69SLouise Kilheeney struct sockaddr_un telem_addr; 537bd78cf69SLouise Kilheeney 538bd78cf69SLouise Kilheeney sock = socket(AF_UNIX, SOCK_SEQPACKET, 0); 539bd78cf69SLouise Kilheeney if (sock < 0) { 540bd78cf69SLouise Kilheeney printf("\n%s: Error creating socket: %s\n", __func__, 541bd78cf69SLouise Kilheeney strerror(errno)); 542bd78cf69SLouise Kilheeney return -1; 543bd78cf69SLouise Kilheeney } 544bd78cf69SLouise Kilheeney telem_addr.sun_family = AF_UNIX; 545bd78cf69SLouise Kilheeney snprintf(telem_addr.sun_path, sizeof(telem_addr.sun_path), 546bd78cf69SLouise Kilheeney "%s/dpdk_telemetry.%s", rte_eal_get_runtime_dir(), 547bd78cf69SLouise Kilheeney TELEMETRY_VERSION); 548bd78cf69SLouise Kilheeney if (connect(sock, (struct sockaddr *) &telem_addr, 5498b4a23f1SCiara Power sizeof(telem_addr)) < 0) { 550bd78cf69SLouise Kilheeney printf("\n%s: Error connecting to socket: %s\n", __func__, 551bd78cf69SLouise Kilheeney strerror(errno)); 5528b4a23f1SCiara Power close(sock); 5538b4a23f1SCiara Power return -1; 5548b4a23f1SCiara Power } 555bd78cf69SLouise Kilheeney 556bd78cf69SLouise Kilheeney bytes = read(sock, buf, sizeof(buf) - 1); 557bd78cf69SLouise Kilheeney if (bytes < 0) { 558bd78cf69SLouise Kilheeney printf("%s: Error with socket read - %s\n", __func__, 559bd78cf69SLouise Kilheeney strerror(errno)); 56089ce9f09SCiara Power close(sock); 561bd78cf69SLouise Kilheeney return -1; 562bd78cf69SLouise Kilheeney } 563bd78cf69SLouise Kilheeney buf[bytes] = '\0'; 564bd78cf69SLouise Kilheeney printf("\n%s: %s\n", __func__, buf); 565bd78cf69SLouise Kilheeney return sock; 566bd78cf69SLouise Kilheeney } 567bd78cf69SLouise Kilheeney 568bd78cf69SLouise Kilheeney static int 5691306df2cSBruce Richardson telemetry_data_autotest(void) 570bd78cf69SLouise Kilheeney { 571bd78cf69SLouise Kilheeney typedef int (*test_case)(void); 572bd78cf69SLouise Kilheeney unsigned int i = 0; 573bd78cf69SLouise Kilheeney 574bd78cf69SLouise Kilheeney sock = connect_to_socket(); 575bd78cf69SLouise Kilheeney if (sock <= 0) 576bd78cf69SLouise Kilheeney return -1; 577bd78cf69SLouise Kilheeney 5781306df2cSBruce Richardson test_case test_cases[] = { 5790f3d92f3SBruce Richardson test_null_return, 5801306df2cSBruce Richardson test_simple_string, 5811306df2cSBruce Richardson test_case_array_string, 582bd78cf69SLouise Kilheeney test_case_array_int, test_case_array_u64, 58382c33481SHuisong Li test_case_array_uint_hex_padding, 58482c33481SHuisong Li test_case_array_uint_hex_nopadding, 585bd78cf69SLouise Kilheeney test_case_add_dict_int, test_case_add_dict_u64, 586bd78cf69SLouise Kilheeney test_case_add_dict_string, 58782c33481SHuisong Li test_case_add_dict_uint_hex_padding, 58882c33481SHuisong Li test_case_add_dict_uint_hex_nopadding, 589bd78cf69SLouise Kilheeney test_dict_with_array_int_values, 590bd78cf69SLouise Kilheeney test_dict_with_array_u64_values, 591bd78cf69SLouise Kilheeney test_dict_with_array_string_values, 59282c33481SHuisong Li test_dict_with_array_uint_hex_values_padding, 59382c33481SHuisong Li test_dict_with_array_uint_hex_values_nopadding, 594d2671e64SRadu Nicolau test_dict_with_dict_values, 595bd78cf69SLouise Kilheeney test_array_with_array_int_values, 596bd78cf69SLouise Kilheeney test_array_with_array_u64_values, 597d0049f7aSBruce Richardson test_array_with_array_string_values, 59882c33481SHuisong Li test_array_with_array_uint_hex_values_padding, 59982c33481SHuisong Li test_array_with_array_uint_hex_values_nopadding, 600d0049f7aSBruce Richardson test_string_char_escaping, 601d0049f7aSBruce Richardson test_array_char_escaping, 602d0049f7aSBruce Richardson test_dict_char_escaping, 603d0049f7aSBruce Richardson }; 604bd78cf69SLouise Kilheeney 6051306df2cSBruce Richardson rte_telemetry_register_cmd(REQUEST_CMD, telemetry_test_cb, "Test"); 606bd78cf69SLouise Kilheeney for (i = 0; i < RTE_DIM(test_cases); i++) { 6071306df2cSBruce Richardson memset(&response_data, 0, sizeof(response_data)); 608bd78cf69SLouise Kilheeney if (test_cases[i]() != 0) { 609bd78cf69SLouise Kilheeney close(sock); 610bd78cf69SLouise Kilheeney return -1; 611bd78cf69SLouise Kilheeney } 612bd78cf69SLouise Kilheeney } 613bd78cf69SLouise Kilheeney close(sock); 614bd78cf69SLouise Kilheeney return 0; 615bd78cf69SLouise Kilheeney } 616*c9ba6aa3SBruce Richardson #endif /* !RTE_EXEC_ENV_WINDOWS */ 617bd78cf69SLouise Kilheeney 6181306df2cSBruce Richardson REGISTER_TEST_COMMAND(telemetry_data_autotest, telemetry_data_autotest); 619