1
2
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
22static int
23test_rte_strsplit(void)
24{
25 int i;
26 do {
27
28
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
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
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
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
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
132static int
133test_rte_strlcat(void)
134{
135
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
150 memcpy(bsd_dst, dst, BUF_LEN);
151 memcpy(rte_dst, dst, BUF_LEN);
152
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
171
172 return 0;
173}
174
175static int
176test_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
185REGISTER_TEST_COMMAND(string_autotest, test_string_fns);
186