1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2010-2014 Intel Corporation 3 */ 4 5 #include <stdio.h> 6 #include <stdarg.h> 7 #include <stddef.h> 8 #include <errno.h> 9 #include <string.h> 10 11 #include <rte_string_fns.h> 12 13 #include "test.h" 14 15 #define LOG(...) do {\ 16 fprintf(stderr, "%s() ln %d: ", __func__, __LINE__); \ 17 fprintf(stderr, __VA_ARGS__); \ 18 } while(0) 19 20 #define DATA_BYTE 'a' 21 22 static int 23 test_rte_strsplit(void) 24 { 25 int i; 26 do { 27 /* ======================================================= 28 * split a mac address correct number of splits requested 29 * =======================================================*/ 30 char test_string[] = "54:65:76:87:98:90"; 31 char *splits[6]; 32 33 LOG("Source string: '%s', to split on ':'\n", test_string); 34 if (rte_strsplit(test_string, sizeof(test_string), 35 splits, 6, ':') != 6) { 36 LOG("Error splitting mac address\n"); 37 return -1; 38 } 39 for (i = 0; i < 6; i++) 40 LOG("Token %d = %s\n", i + 1, splits[i]); 41 } while (0); 42 43 44 do { 45 /* ======================================================= 46 * split on spaces smaller number of splits requested 47 * =======================================================*/ 48 char test_string[] = "54 65 76 87 98 90"; 49 char *splits[6]; 50 51 LOG("Source string: '%s', to split on ' '\n", test_string); 52 if (rte_strsplit(test_string, sizeof(test_string), 53 splits, 3, ' ') != 3) { 54 LOG("Error splitting mac address for max 2 splits\n"); 55 return -1; 56 } 57 for (i = 0; i < 3; i++) 58 LOG("Token %d = %s\n", i + 1, splits[i]); 59 } while (0); 60 61 do { 62 /* ======================================================= 63 * split on commas - more splits than commas requested 64 * =======================================================*/ 65 char test_string[] = "a,b,c,d"; 66 char *splits[6]; 67 68 LOG("Source string: '%s', to split on ','\n", test_string); 69 if (rte_strsplit(test_string, sizeof(test_string), 70 splits, 6, ',') != 4) { 71 LOG("Error splitting %s on ','\n", test_string); 72 return -1; 73 } 74 for (i = 0; i < 4; i++) 75 LOG("Token %d = %s\n", i + 1, splits[i]); 76 } while(0); 77 78 do { 79 /* ======================================================= 80 * Try splitting on non-existent character. 81 * =======================================================*/ 82 char test_string[] = "a,b,c,d"; 83 char *splits[6]; 84 85 LOG("Source string: '%s', to split on ' '\n", test_string); 86 if (rte_strsplit(test_string, sizeof(test_string), 87 splits, 6, ' ') != 1) { 88 LOG("Error splitting %s on ' '\n", test_string); 89 return -1; 90 } 91 LOG("String not split\n"); 92 } while(0); 93 94 do { 95 /* ======================================================= 96 * Invalid / edge case parameter checks 97 * =======================================================*/ 98 char test_string[] = "a,b,c,d"; 99 char *splits[6]; 100 101 if (rte_strsplit(NULL, 0, splits, 6, ',') >= 0 102 || errno != EINVAL){ 103 LOG("Error: rte_strsplit accepted NULL string parameter\n"); 104 return -1; 105 } 106 107 if (rte_strsplit(test_string, sizeof(test_string), NULL, 0, ',') >= 0 108 || errno != EINVAL){ 109 LOG("Error: rte_strsplit accepted NULL array parameter\n"); 110 return -1; 111 } 112 113 errno = 0; 114 if (rte_strsplit(test_string, 0, splits, 6, ',') != 0 || errno != 0) { 115 LOG("Error: rte_strsplit did not accept 0 length string\n"); 116 return -1; 117 } 118 119 if (rte_strsplit(test_string, sizeof(test_string), splits, 0, ',') != 0 120 || errno != 0) { 121 LOG("Error: rte_strsplit did not accept 0 length array\n"); 122 return -1; 123 } 124 125 LOG("Parameter test cases passed\n"); 126 } while(0); 127 128 LOG("%s - PASSED\n", __func__); 129 return 0; 130 } 131 132 static int 133 test_rte_strlcat(void) 134 { 135 /* only run actual unit tests if we have system-provided strlcat */ 136 #if defined(__BSD_VISIBLE) || defined(RTE_USE_LIBBSD) 137 #define BUF_LEN 32 138 const char dst[BUF_LEN] = "Test string"; 139 const char src[] = " appended"; 140 char bsd_dst[BUF_LEN]; 141 char rte_dst[BUF_LEN]; 142 size_t i, bsd_ret, rte_ret; 143 144 LOG("dst = '%s', strlen(dst) = %zu\n", dst, strlen(dst)); 145 LOG("src = '%s', strlen(src) = %zu\n", src, strlen(src)); 146 LOG("---\n"); 147 148 for (i = 0; i < BUF_LEN; i++) { 149 /* initialize destination buffers */ 150 memcpy(bsd_dst, dst, BUF_LEN); 151 memcpy(rte_dst, dst, BUF_LEN); 152 /* compare implementations */ 153 bsd_ret = strlcat(bsd_dst, src, i); 154 rte_ret = rte_strlcat(rte_dst, src, i); 155 if (bsd_ret != rte_ret) { 156 LOG("Incorrect retval for buf length = %zu\n", i); 157 LOG("BSD: '%zu', rte: '%zu'\n", bsd_ret, rte_ret); 158 return -1; 159 } 160 if (memcmp(bsd_dst, rte_dst, BUF_LEN) != 0) { 161 LOG("Resulting buffers don't match\n"); 162 LOG("BSD: '%s', rte: '%s'\n", bsd_dst, rte_dst); 163 return -1; 164 } 165 LOG("buffer size = %zu: dst = '%s', ret = %zu\n", 166 i, rte_dst, rte_ret); 167 } 168 LOG("Checked %zu combinations\n", i); 169 #undef BUF_LEN 170 #endif /* defined(__BSD_VISIBLE) || defined(RTE_USE_LIBBSD) */ 171 172 return 0; 173 } 174 175 static int 176 test_string_fns(void) 177 { 178 if (test_rte_strsplit() < 0) 179 return -1; 180 if (test_rte_strlcat() < 0) 181 return -1; 182 return 0; 183 } 184 185 REGISTER_FAST_TEST(string_autotest, true, true, test_string_fns); 186