1488570ebSJim Harris /* SPDX-License-Identifier: BSD-3-Clause
2a6dbe372Spaul luse * Copyright (C) 2017 Intel Corporation.
3d6e57b53SShuhei Matsumoto * Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES.
4e37b070aSDaniel Verkamp * All rights reserved.
5e37b070aSDaniel Verkamp */
6e37b070aSDaniel Verkamp
7e37b070aSDaniel Verkamp #include "spdk/stdinc.h"
8e37b070aSDaniel Verkamp
9ae431e31SKonrad Sztyber #include "spdk_internal/cunit.h"
10e37b070aSDaniel Verkamp
117ffe586aSJim Harris #include "util/string.c"
12e37b070aSDaniel Verkamp
13e37b070aSDaniel Verkamp static void
test_parse_ip_addr(void)14e37b070aSDaniel Verkamp test_parse_ip_addr(void)
15e37b070aSDaniel Verkamp {
16e37b070aSDaniel Verkamp int rc;
17e37b070aSDaniel Verkamp char *host;
18e37b070aSDaniel Verkamp char *port;
19e37b070aSDaniel Verkamp char ip[255];
20e37b070aSDaniel Verkamp
21e37b070aSDaniel Verkamp /* IPv4 */
22e37b070aSDaniel Verkamp snprintf(ip, 255, "%s", "192.168.0.1");
23e37b070aSDaniel Verkamp rc = spdk_parse_ip_addr(ip, &host, &port);
24e37b070aSDaniel Verkamp CU_ASSERT_EQUAL(rc, 0);
25e37b070aSDaniel Verkamp SPDK_CU_ASSERT_FATAL(host != NULL);
26e37b070aSDaniel Verkamp CU_ASSERT(strcmp(host, "192.168.0.1") == 0);
27e37b070aSDaniel Verkamp CU_ASSERT_EQUAL(strlen(host), 11);
28e37b070aSDaniel Verkamp CU_ASSERT_EQUAL(port, NULL);
29e37b070aSDaniel Verkamp
30e37b070aSDaniel Verkamp /* IPv4 with port */
31e37b070aSDaniel Verkamp snprintf(ip, 255, "%s", "123.456.789.0:5520");
32e37b070aSDaniel Verkamp rc = spdk_parse_ip_addr(ip, &host, &port);
33e37b070aSDaniel Verkamp CU_ASSERT_EQUAL(rc, 0);
34e37b070aSDaniel Verkamp SPDK_CU_ASSERT_FATAL(host != NULL);
35e37b070aSDaniel Verkamp CU_ASSERT(strcmp(host, "123.456.789.0") == 0);
36e37b070aSDaniel Verkamp CU_ASSERT_EQUAL(strlen(host), 13);
37e37b070aSDaniel Verkamp SPDK_CU_ASSERT_FATAL(port != NULL);
38e37b070aSDaniel Verkamp CU_ASSERT(strcmp(port, "5520") == 0);
39e37b070aSDaniel Verkamp CU_ASSERT_EQUAL(strlen(port), 4);
40e37b070aSDaniel Verkamp
41e37b070aSDaniel Verkamp /* IPv6 */
42e37b070aSDaniel Verkamp snprintf(ip, 255, "%s", "[2001:db8:85a3:8d3:1319:8a2e:370:7348]");
43e37b070aSDaniel Verkamp rc = spdk_parse_ip_addr(ip, &host, &port);
44e37b070aSDaniel Verkamp CU_ASSERT_EQUAL(rc, 0);
45e37b070aSDaniel Verkamp SPDK_CU_ASSERT_FATAL(host != NULL);
46e37b070aSDaniel Verkamp CU_ASSERT(strcmp(host, "2001:db8:85a3:8d3:1319:8a2e:370:7348") == 0);
47e37b070aSDaniel Verkamp CU_ASSERT_EQUAL(strlen(host), 36);
48e37b070aSDaniel Verkamp CU_ASSERT_EQUAL(port, NULL);
49e37b070aSDaniel Verkamp
50e37b070aSDaniel Verkamp /* IPv6 with port */
51e37b070aSDaniel Verkamp snprintf(ip, 255, "%s", "[2001:db8:85a3:8d3:1319:8a2e:370:7348]:443");
52e37b070aSDaniel Verkamp rc = spdk_parse_ip_addr(ip, &host, &port);
53e37b070aSDaniel Verkamp CU_ASSERT_EQUAL(rc, 0);
54e37b070aSDaniel Verkamp SPDK_CU_ASSERT_FATAL(host != NULL);
55e37b070aSDaniel Verkamp CU_ASSERT(strcmp(host, "2001:db8:85a3:8d3:1319:8a2e:370:7348") == 0);
56e37b070aSDaniel Verkamp CU_ASSERT_EQUAL(strlen(host), 36);
57e37b070aSDaniel Verkamp SPDK_CU_ASSERT_FATAL(port != NULL);
58e37b070aSDaniel Verkamp CU_ASSERT(strcmp(port, "443") == 0);
59e37b070aSDaniel Verkamp CU_ASSERT_EQUAL(strlen(port), 3);
60e37b070aSDaniel Verkamp
61e37b070aSDaniel Verkamp /* IPv6 dangling colon */
62e37b070aSDaniel Verkamp snprintf(ip, 255, "%s", "[2001:db8:85a3:8d3:1319:8a2e:370:7348]:");
63e37b070aSDaniel Verkamp rc = spdk_parse_ip_addr(ip, &host, &port);
64e37b070aSDaniel Verkamp CU_ASSERT_EQUAL(rc, 0);
65e37b070aSDaniel Verkamp SPDK_CU_ASSERT_FATAL(host != NULL);
66e37b070aSDaniel Verkamp CU_ASSERT(strcmp(host, "2001:db8:85a3:8d3:1319:8a2e:370:7348") == 0);
67e37b070aSDaniel Verkamp CU_ASSERT_EQUAL(strlen(host), 36);
68e37b070aSDaniel Verkamp CU_ASSERT_EQUAL(port, NULL);
69e37b070aSDaniel Verkamp }
70e37b070aSDaniel Verkamp
7116c362a8SDaniel Verkamp static void
test_str_chomp(void)7216c362a8SDaniel Verkamp test_str_chomp(void)
7316c362a8SDaniel Verkamp {
7416c362a8SDaniel Verkamp char s[1024];
7516c362a8SDaniel Verkamp
7616c362a8SDaniel Verkamp /* One \n newline */
7716c362a8SDaniel Verkamp snprintf(s, sizeof(s), "%s", "hello world\n");
7816c362a8SDaniel Verkamp CU_ASSERT(spdk_str_chomp(s) == 1);
7916c362a8SDaniel Verkamp CU_ASSERT(strcmp(s, "hello world") == 0);
8016c362a8SDaniel Verkamp
8116c362a8SDaniel Verkamp /* One \r\n newline */
8216c362a8SDaniel Verkamp snprintf(s, sizeof(s), "%s", "hello world\r\n");
8316c362a8SDaniel Verkamp CU_ASSERT(spdk_str_chomp(s) == 2);
8416c362a8SDaniel Verkamp CU_ASSERT(strcmp(s, "hello world") == 0);
8516c362a8SDaniel Verkamp
8616c362a8SDaniel Verkamp /* No newlines */
8716c362a8SDaniel Verkamp snprintf(s, sizeof(s), "%s", "hello world");
8816c362a8SDaniel Verkamp CU_ASSERT(spdk_str_chomp(s) == 0);
8916c362a8SDaniel Verkamp CU_ASSERT(strcmp(s, "hello world") == 0);
9016c362a8SDaniel Verkamp
9116c362a8SDaniel Verkamp /* Two newlines */
9216c362a8SDaniel Verkamp snprintf(s, sizeof(s), "%s", "hello world\n\n");
9316c362a8SDaniel Verkamp CU_ASSERT(spdk_str_chomp(s) == 2);
9416c362a8SDaniel Verkamp CU_ASSERT(strcmp(s, "hello world") == 0);
9516c362a8SDaniel Verkamp
9616c362a8SDaniel Verkamp /* Empty string */
9716c362a8SDaniel Verkamp snprintf(s, sizeof(s), "%s", "");
9816c362a8SDaniel Verkamp CU_ASSERT(spdk_str_chomp(s) == 0);
9916c362a8SDaniel Verkamp CU_ASSERT(strcmp(s, "") == 0);
10016c362a8SDaniel Verkamp
10116c362a8SDaniel Verkamp /* One-character string with only \n */
10216c362a8SDaniel Verkamp snprintf(s, sizeof(s), "%s", "\n");
10316c362a8SDaniel Verkamp CU_ASSERT(spdk_str_chomp(s) == 1);
10416c362a8SDaniel Verkamp CU_ASSERT(strcmp(s, "") == 0);
10516c362a8SDaniel Verkamp
10616c362a8SDaniel Verkamp /* One-character string without a newline */
10716c362a8SDaniel Verkamp snprintf(s, sizeof(s), "%s", "a");
10816c362a8SDaniel Verkamp CU_ASSERT(spdk_str_chomp(s) == 0);
10916c362a8SDaniel Verkamp CU_ASSERT(strcmp(s, "a") == 0);
11016c362a8SDaniel Verkamp }
11116c362a8SDaniel Verkamp
112ec6a1afbSDariusz Stojaczyk static void
test_parse_capacity(void)113ec6a1afbSDariusz Stojaczyk test_parse_capacity(void)
114ec6a1afbSDariusz Stojaczyk {
115ec6a1afbSDariusz Stojaczyk char str[128];
116ec6a1afbSDariusz Stojaczyk uint64_t cap;
117ec6a1afbSDariusz Stojaczyk int rc;
118c0297f9cSSeth Howell bool has_prefix = true;
119ec6a1afbSDariusz Stojaczyk
120ec6a1afbSDariusz Stojaczyk rc = spdk_parse_capacity("472", &cap, &has_prefix);
121ec6a1afbSDariusz Stojaczyk CU_ASSERT(rc == 0);
122ec6a1afbSDariusz Stojaczyk CU_ASSERT(cap == 472);
123ec6a1afbSDariusz Stojaczyk CU_ASSERT(has_prefix == false);
124ec6a1afbSDariusz Stojaczyk
12568b96260SSeth Howell snprintf(str, sizeof(str), "%"PRIu64, UINT64_MAX);
126ec6a1afbSDariusz Stojaczyk rc = spdk_parse_capacity(str, &cap, &has_prefix);
127ec6a1afbSDariusz Stojaczyk CU_ASSERT(rc == 0);
128ec6a1afbSDariusz Stojaczyk CU_ASSERT(cap == UINT64_MAX);
129ec6a1afbSDariusz Stojaczyk CU_ASSERT(has_prefix == false);
130ec6a1afbSDariusz Stojaczyk
131ec6a1afbSDariusz Stojaczyk rc = spdk_parse_capacity("12k", &cap, &has_prefix);
132ec6a1afbSDariusz Stojaczyk CU_ASSERT(rc == 0);
133ec6a1afbSDariusz Stojaczyk CU_ASSERT(cap == 12 * 1024);
134ec6a1afbSDariusz Stojaczyk CU_ASSERT(has_prefix == true);
135ec6a1afbSDariusz Stojaczyk
136ec6a1afbSDariusz Stojaczyk rc = spdk_parse_capacity("12K", &cap, &has_prefix);
137ec6a1afbSDariusz Stojaczyk CU_ASSERT(rc == 0);
138ec6a1afbSDariusz Stojaczyk CU_ASSERT(cap == 12 * 1024);
139ec6a1afbSDariusz Stojaczyk CU_ASSERT(has_prefix == true);
140ec6a1afbSDariusz Stojaczyk
141ec6a1afbSDariusz Stojaczyk rc = spdk_parse_capacity("12KB", &cap, &has_prefix);
142ec6a1afbSDariusz Stojaczyk CU_ASSERT(rc == 0);
143ec6a1afbSDariusz Stojaczyk CU_ASSERT(cap == 12 * 1024);
144ec6a1afbSDariusz Stojaczyk CU_ASSERT(has_prefix == true);
145ec6a1afbSDariusz Stojaczyk
146ec6a1afbSDariusz Stojaczyk rc = spdk_parse_capacity("100M", &cap, &has_prefix);
147ec6a1afbSDariusz Stojaczyk CU_ASSERT(rc == 0);
148ec6a1afbSDariusz Stojaczyk CU_ASSERT(cap == 100 * 1024 * 1024);
149ec6a1afbSDariusz Stojaczyk CU_ASSERT(has_prefix == true);
150ec6a1afbSDariusz Stojaczyk
151ec6a1afbSDariusz Stojaczyk rc = spdk_parse_capacity("128M", &cap, &has_prefix);
152ec6a1afbSDariusz Stojaczyk CU_ASSERT(rc == 0);
153ec6a1afbSDariusz Stojaczyk CU_ASSERT(cap == 128 * 1024 * 1024);
154ec6a1afbSDariusz Stojaczyk CU_ASSERT(has_prefix == true);
155ec6a1afbSDariusz Stojaczyk
156ec6a1afbSDariusz Stojaczyk rc = spdk_parse_capacity("4G", &cap, &has_prefix);
157ec6a1afbSDariusz Stojaczyk CU_ASSERT(rc == 0);
158ec6a1afbSDariusz Stojaczyk CU_ASSERT(cap == 4ULL * 1024 * 1024 * 1024);
159ec6a1afbSDariusz Stojaczyk CU_ASSERT(has_prefix == true);
160ec6a1afbSDariusz Stojaczyk
161ec6a1afbSDariusz Stojaczyk rc = spdk_parse_capacity("100M 512k", &cap, &has_prefix);
162ec6a1afbSDariusz Stojaczyk CU_ASSERT(rc == 0);
163ec6a1afbSDariusz Stojaczyk CU_ASSERT(cap == 100ULL * 1024 * 1024);
164ec6a1afbSDariusz Stojaczyk
165ec6a1afbSDariusz Stojaczyk rc = spdk_parse_capacity("12k8K", &cap, &has_prefix);
166ec6a1afbSDariusz Stojaczyk CU_ASSERT(rc == 0);
167ec6a1afbSDariusz Stojaczyk CU_ASSERT(cap == 12 * 1024);
168ec6a1afbSDariusz Stojaczyk CU_ASSERT(has_prefix == true);
169ec6a1afbSDariusz Stojaczyk
170ec6a1afbSDariusz Stojaczyk /* Non-number */
171ec6a1afbSDariusz Stojaczyk rc = spdk_parse_capacity("G", &cap, &has_prefix);
172ec6a1afbSDariusz Stojaczyk CU_ASSERT(rc != 0);
173ec6a1afbSDariusz Stojaczyk
174ec6a1afbSDariusz Stojaczyk rc = spdk_parse_capacity("darsto", &cap, &has_prefix);
175ec6a1afbSDariusz Stojaczyk CU_ASSERT(rc != 0);
176ec6a1afbSDariusz Stojaczyk }
177ec6a1afbSDariusz Stojaczyk
1788adbd909SShuhei Matsumoto static void
test_sprintf_append_realloc(void)1798adbd909SShuhei Matsumoto test_sprintf_append_realloc(void)
1808adbd909SShuhei Matsumoto {
1818adbd909SShuhei Matsumoto char *str1, *str2, *str3, *str4;
1828adbd909SShuhei Matsumoto
1838adbd909SShuhei Matsumoto /* Test basic functionality. */
1848adbd909SShuhei Matsumoto str1 = spdk_sprintf_alloc("hello world\ngood morning\n" \
1858adbd909SShuhei Matsumoto "good afternoon\ngood evening\n");
1868adbd909SShuhei Matsumoto SPDK_CU_ASSERT_FATAL(str1 != NULL);
1878adbd909SShuhei Matsumoto
1888adbd909SShuhei Matsumoto str2 = spdk_sprintf_append_realloc(NULL, "hello world\n");
1898adbd909SShuhei Matsumoto SPDK_CU_ASSERT_FATAL(str2);
1908adbd909SShuhei Matsumoto
1918adbd909SShuhei Matsumoto str2 = spdk_sprintf_append_realloc(str2, "good morning\n");
1928adbd909SShuhei Matsumoto SPDK_CU_ASSERT_FATAL(str2);
1938adbd909SShuhei Matsumoto
1948adbd909SShuhei Matsumoto str2 = spdk_sprintf_append_realloc(str2, "good afternoon\n");
1958adbd909SShuhei Matsumoto SPDK_CU_ASSERT_FATAL(str2);
1968adbd909SShuhei Matsumoto
1978adbd909SShuhei Matsumoto str2 = spdk_sprintf_append_realloc(str2, "good evening\n");
1988adbd909SShuhei Matsumoto SPDK_CU_ASSERT_FATAL(str2);
1998adbd909SShuhei Matsumoto
2008adbd909SShuhei Matsumoto CU_ASSERT(strcmp(str1, str2) == 0);
2018adbd909SShuhei Matsumoto
2028adbd909SShuhei Matsumoto free(str1);
2038adbd909SShuhei Matsumoto free(str2);
2048adbd909SShuhei Matsumoto
2058adbd909SShuhei Matsumoto /* Test doubling buffer size. */
2068adbd909SShuhei Matsumoto str3 = spdk_sprintf_append_realloc(NULL, "aaaaaaaaaa\n");
2078adbd909SShuhei Matsumoto str3 = spdk_sprintf_append_realloc(str3, "bbbbbbbbbb\n");
2088adbd909SShuhei Matsumoto str3 = spdk_sprintf_append_realloc(str3, "cccccccccc\n");
2098adbd909SShuhei Matsumoto
2108adbd909SShuhei Matsumoto str4 = malloc(33 + 1);
2118adbd909SShuhei Matsumoto memset(&str4[0], 'a', 10);
2128adbd909SShuhei Matsumoto str4[10] = '\n';
2138adbd909SShuhei Matsumoto memset(&str4[11], 'b', 10);
2148adbd909SShuhei Matsumoto str4[21] = '\n';
2158adbd909SShuhei Matsumoto memset(&str4[22], 'c', 10);
2168adbd909SShuhei Matsumoto str4[32] = '\n';
2178adbd909SShuhei Matsumoto str4[33] = 0;
2188adbd909SShuhei Matsumoto
2198adbd909SShuhei Matsumoto CU_ASSERT(strcmp(str3, str4) == 0);
2208adbd909SShuhei Matsumoto
2218adbd909SShuhei Matsumoto free(str3);
2228adbd909SShuhei Matsumoto free(str4);
2238adbd909SShuhei Matsumoto }
224240fdd7dSNick Connolly
225240fdd7dSNick Connolly static void
generate_string(char * str,size_t len,int64_t limit,int adjust)226240fdd7dSNick Connolly generate_string(char *str, size_t len, int64_t limit, int adjust)
227240fdd7dSNick Connolly {
228240fdd7dSNick Connolly /* There isn't a portable way of handling the arithmetic, so */
229240fdd7dSNick Connolly /* perform the calculation in two parts to avoid overflow */
230240fdd7dSNick Connolly int64_t hi = (limit / 10) + (adjust / 10);
231240fdd7dSNick Connolly int64_t lo = (limit % 10) + (adjust % 10);
232240fdd7dSNick Connolly
233240fdd7dSNick Connolly /* limit is large and adjust is small, so hi part will be */
234240fdd7dSNick Connolly /* non-zero even if there is a carry, but check it */
235240fdd7dSNick Connolly CU_ASSERT(hi < -1 || hi > 1);
236240fdd7dSNick Connolly
237240fdd7dSNick Connolly /* Correct a difference in sign */
238240fdd7dSNick Connolly if ((hi < 0) != (lo < 0) && lo != 0) {
239240fdd7dSNick Connolly lo += (hi < 0) ? -10 : 10;
240240fdd7dSNick Connolly hi += (hi < 0) ? 1 : -1;
241240fdd7dSNick Connolly }
242240fdd7dSNick Connolly
243240fdd7dSNick Connolly snprintf(str, len, "%" PRId64 "%01" PRId64, hi + (lo / 10),
244240fdd7dSNick Connolly (lo < 0) ? (-lo % 10) : (lo % 10));
245240fdd7dSNick Connolly }
246240fdd7dSNick Connolly
247b78e763cSShuhei Matsumoto static void
test_strtol(void)248b78e763cSShuhei Matsumoto test_strtol(void)
249b78e763cSShuhei Matsumoto {
250b78e763cSShuhei Matsumoto long int val;
251240fdd7dSNick Connolly char str[256];
252b78e763cSShuhei Matsumoto
253b78e763cSShuhei Matsumoto const char *val1 = "no_digits";
254b78e763cSShuhei Matsumoto /* digits + chars */
255b78e763cSShuhei Matsumoto const char *val8 = "10_is_ten";
256b78e763cSShuhei Matsumoto /* chars + digits */
257b78e763cSShuhei Matsumoto const char *val9 = "ten_is_10";
258b78e763cSShuhei Matsumoto /* all zeroes */
259b78e763cSShuhei Matsumoto const char *val10 = "00000000";
260b78e763cSShuhei Matsumoto /* leading minus sign, but not negative */
261b78e763cSShuhei Matsumoto const char *val11 = "-0";
262b78e763cSShuhei Matsumoto
263b78e763cSShuhei Matsumoto val = spdk_strtol(val1, 10);
264b78e763cSShuhei Matsumoto CU_ASSERT(val == -EINVAL);
265b78e763cSShuhei Matsumoto
266240fdd7dSNick Connolly /* LONG_MIN - 1 */
267240fdd7dSNick Connolly generate_string(str, sizeof(str), LONG_MIN, -1);
268240fdd7dSNick Connolly val = spdk_strtol(str, 10);
269b78e763cSShuhei Matsumoto CU_ASSERT(val == -ERANGE);
270b78e763cSShuhei Matsumoto
271240fdd7dSNick Connolly /* LONG_MIN */
272240fdd7dSNick Connolly generate_string(str, sizeof(str), LONG_MIN, 0);
273240fdd7dSNick Connolly val = spdk_strtol(str, 10);
274b78e763cSShuhei Matsumoto CU_ASSERT(val == -ERANGE);
275b78e763cSShuhei Matsumoto
276240fdd7dSNick Connolly /* LONG_MIN + 1 */
277240fdd7dSNick Connolly generate_string(str, sizeof(str), LONG_MIN, +1);
278240fdd7dSNick Connolly val = spdk_strtol(str, 10);
279b78e763cSShuhei Matsumoto CU_ASSERT(val == -ERANGE);
280b78e763cSShuhei Matsumoto
281240fdd7dSNick Connolly /* LONG_MAX - 1 */
282240fdd7dSNick Connolly generate_string(str, sizeof(str), LONG_MAX, -1);
283240fdd7dSNick Connolly val = spdk_strtol(str, 10);
284b78e763cSShuhei Matsumoto CU_ASSERT(val == LONG_MAX - 1);
285b78e763cSShuhei Matsumoto
286240fdd7dSNick Connolly /* LONG_MAX */
287240fdd7dSNick Connolly generate_string(str, sizeof(str), LONG_MAX, 0);
288240fdd7dSNick Connolly val = spdk_strtol(str, 10);
289b78e763cSShuhei Matsumoto CU_ASSERT(val == LONG_MAX);
290b78e763cSShuhei Matsumoto
291240fdd7dSNick Connolly /* LONG_MAX + 1 */
292240fdd7dSNick Connolly generate_string(str, sizeof(str), LONG_MAX, +1);
293240fdd7dSNick Connolly val = spdk_strtol(str, 10);
294b78e763cSShuhei Matsumoto CU_ASSERT(val == -ERANGE);
295b78e763cSShuhei Matsumoto
296b78e763cSShuhei Matsumoto val = spdk_strtol(val8, 10);
297b78e763cSShuhei Matsumoto CU_ASSERT(val == -EINVAL);
298b78e763cSShuhei Matsumoto
299b78e763cSShuhei Matsumoto val = spdk_strtol(val9, 10);
300b78e763cSShuhei Matsumoto CU_ASSERT(val == -EINVAL);
301b78e763cSShuhei Matsumoto
302b78e763cSShuhei Matsumoto val = spdk_strtol(val10, 10);
303b78e763cSShuhei Matsumoto CU_ASSERT(val == 0);
304b78e763cSShuhei Matsumoto
305b78e763cSShuhei Matsumoto /* Invalid base */
306b78e763cSShuhei Matsumoto val = spdk_strtol(val10, 1);
307b78e763cSShuhei Matsumoto CU_ASSERT(val == -EINVAL);
308b78e763cSShuhei Matsumoto
309b78e763cSShuhei Matsumoto val = spdk_strtol(val11, 10);
310b78e763cSShuhei Matsumoto CU_ASSERT(val == 0);
311b78e763cSShuhei Matsumoto }
312b78e763cSShuhei Matsumoto
313b78e763cSShuhei Matsumoto static void
test_strtoll(void)314b78e763cSShuhei Matsumoto test_strtoll(void)
315b78e763cSShuhei Matsumoto {
316b78e763cSShuhei Matsumoto long long int val;
317240fdd7dSNick Connolly char str[256];
318b78e763cSShuhei Matsumoto
319b78e763cSShuhei Matsumoto const char *val1 = "no_digits";
320b78e763cSShuhei Matsumoto /* digits + chars */
321b78e763cSShuhei Matsumoto const char *val8 = "10_is_ten";
322b78e763cSShuhei Matsumoto /* chars + digits */
323b78e763cSShuhei Matsumoto const char *val9 = "ten_is_10";
324b78e763cSShuhei Matsumoto /* all zeroes */
325b78e763cSShuhei Matsumoto const char *val10 = "00000000";
326b78e763cSShuhei Matsumoto /* leading minus sign, but not negative */
327b78e763cSShuhei Matsumoto const char *val11 = "-0";
328b78e763cSShuhei Matsumoto
329b78e763cSShuhei Matsumoto val = spdk_strtoll(val1, 10);
330b78e763cSShuhei Matsumoto CU_ASSERT(val == -EINVAL);
331b78e763cSShuhei Matsumoto
332240fdd7dSNick Connolly /* LLONG_MIN - 1 */
333240fdd7dSNick Connolly generate_string(str, sizeof(str), LLONG_MIN, -1);
334240fdd7dSNick Connolly val = spdk_strtoll(str, 10);
335b78e763cSShuhei Matsumoto CU_ASSERT(val == -ERANGE);
336b78e763cSShuhei Matsumoto
337240fdd7dSNick Connolly /* LLONG_MIN */
338240fdd7dSNick Connolly generate_string(str, sizeof(str), LLONG_MIN, 0);
339240fdd7dSNick Connolly val = spdk_strtoll(str, 10);
340b78e763cSShuhei Matsumoto CU_ASSERT(val == -ERANGE);
341b78e763cSShuhei Matsumoto
342240fdd7dSNick Connolly /* LLONG_MIN + 1 */
343240fdd7dSNick Connolly generate_string(str, sizeof(str), LLONG_MIN, +1);
344240fdd7dSNick Connolly val = spdk_strtoll(str, 10);
345b78e763cSShuhei Matsumoto CU_ASSERT(val == -ERANGE);
346b78e763cSShuhei Matsumoto
347240fdd7dSNick Connolly /* LLONG_MAX - 1 */
348240fdd7dSNick Connolly generate_string(str, sizeof(str), LLONG_MAX, -1);
349240fdd7dSNick Connolly val = spdk_strtoll(str, 10);
350b78e763cSShuhei Matsumoto CU_ASSERT(val == LLONG_MAX - 1);
351b78e763cSShuhei Matsumoto
352240fdd7dSNick Connolly /* LLONG_MAX */
353240fdd7dSNick Connolly generate_string(str, sizeof(str), LLONG_MAX, 0);
354240fdd7dSNick Connolly val = spdk_strtoll(str, 10);
355b78e763cSShuhei Matsumoto CU_ASSERT(val == LLONG_MAX);
356b78e763cSShuhei Matsumoto
357240fdd7dSNick Connolly /* LLONG_MAX + 1 */
358240fdd7dSNick Connolly generate_string(str, sizeof(str), LLONG_MAX, +1);
359240fdd7dSNick Connolly val = spdk_strtoll(str, 10);
360b78e763cSShuhei Matsumoto CU_ASSERT(val == -ERANGE);
361b78e763cSShuhei Matsumoto
362b78e763cSShuhei Matsumoto val = spdk_strtoll(val8, 10);
363b78e763cSShuhei Matsumoto CU_ASSERT(val == -EINVAL);
364b78e763cSShuhei Matsumoto
365b78e763cSShuhei Matsumoto val = spdk_strtoll(val9, 10);
366b78e763cSShuhei Matsumoto CU_ASSERT(val == -EINVAL);
367b78e763cSShuhei Matsumoto
368b78e763cSShuhei Matsumoto val = spdk_strtoll(val10, 10);
369b78e763cSShuhei Matsumoto CU_ASSERT(val == 0);
370b78e763cSShuhei Matsumoto
371b78e763cSShuhei Matsumoto /* Invalid base */
372b78e763cSShuhei Matsumoto val = spdk_strtoll(val10, 1);
373b78e763cSShuhei Matsumoto CU_ASSERT(val == -EINVAL);
374b78e763cSShuhei Matsumoto
375b78e763cSShuhei Matsumoto val = spdk_strtoll(val11, 10);
376b78e763cSShuhei Matsumoto CU_ASSERT(val == 0);
377b78e763cSShuhei Matsumoto }
3788adbd909SShuhei Matsumoto
3791139cb14SJohn Levon static void
test_strarray(void)3801139cb14SJohn Levon test_strarray(void)
3811139cb14SJohn Levon {
3821139cb14SJohn Levon char **r;
3831139cb14SJohn Levon char **r2;
3841139cb14SJohn Levon
3851139cb14SJohn Levon r = spdk_strarray_from_string("", ":");
3861139cb14SJohn Levon CU_ASSERT(strcmp(r[0], "") == 0);
3871139cb14SJohn Levon CU_ASSERT(r[1] == NULL);
3881139cb14SJohn Levon spdk_strarray_free(r);
3891139cb14SJohn Levon
3901139cb14SJohn Levon r = spdk_strarray_from_string(":", ":");
3911139cb14SJohn Levon CU_ASSERT(strcmp(r[0], "") == 0);
3921139cb14SJohn Levon CU_ASSERT(strcmp(r[1], "") == 0);
3931139cb14SJohn Levon CU_ASSERT(r[2] == NULL);
3941139cb14SJohn Levon spdk_strarray_free(r);
3951139cb14SJohn Levon
3961139cb14SJohn Levon r = spdk_strarray_from_string("a", ":");
3971139cb14SJohn Levon CU_ASSERT(strcmp(r[0], "a") == 0);
3981139cb14SJohn Levon CU_ASSERT(r[1] == NULL);
3991139cb14SJohn Levon spdk_strarray_free(r);
4001139cb14SJohn Levon
4011139cb14SJohn Levon r = spdk_strarray_from_string("ab:", ":");
4021139cb14SJohn Levon CU_ASSERT(strcmp(r[0], "ab") == 0);
4031139cb14SJohn Levon CU_ASSERT(strcmp(r[1], "") == 0);
4041139cb14SJohn Levon CU_ASSERT(r[2] == NULL);
4051139cb14SJohn Levon spdk_strarray_free(r);
4061139cb14SJohn Levon
4071139cb14SJohn Levon r = spdk_strarray_from_string(":ab", ":");
4081139cb14SJohn Levon CU_ASSERT(strcmp(r[0], "") == 0);
4091139cb14SJohn Levon CU_ASSERT(strcmp(r[1], "ab") == 0);
4101139cb14SJohn Levon CU_ASSERT(r[2] == NULL);
4111139cb14SJohn Levon spdk_strarray_free(r);
4121139cb14SJohn Levon
4131139cb14SJohn Levon r = spdk_strarray_from_string("ab:c", ":");
4141139cb14SJohn Levon CU_ASSERT(strcmp(r[0], "ab") == 0);
4151139cb14SJohn Levon CU_ASSERT(strcmp(r[1], "c") == 0);
4161139cb14SJohn Levon CU_ASSERT(r[2] == NULL);
4171139cb14SJohn Levon spdk_strarray_free(r);
4181139cb14SJohn Levon
4191139cb14SJohn Levon r = spdk_strarray_from_string(":ab.:c:", ":.");
4201139cb14SJohn Levon CU_ASSERT(strcmp(r[0], "") == 0);
4211139cb14SJohn Levon CU_ASSERT(strcmp(r[1], "ab") == 0);
4221139cb14SJohn Levon CU_ASSERT(strcmp(r[2], "") == 0);
4231139cb14SJohn Levon CU_ASSERT(strcmp(r[3], "c") == 0);
4241139cb14SJohn Levon CU_ASSERT(strcmp(r[4], "") == 0);
4251139cb14SJohn Levon CU_ASSERT(r[5] == NULL);
4261139cb14SJohn Levon spdk_strarray_free(r);
4271139cb14SJohn Levon
4281139cb14SJohn Levon r = spdk_strarray_from_string(":ab.:c:", ":.");
4291139cb14SJohn Levon r2 = spdk_strarray_dup((const char **)r);
4301139cb14SJohn Levon CU_ASSERT(strcmp(r2[0], "") == 0);
4311139cb14SJohn Levon CU_ASSERT(strcmp(r2[1], "ab") == 0);
4321139cb14SJohn Levon CU_ASSERT(strcmp(r2[2], "") == 0);
4331139cb14SJohn Levon CU_ASSERT(strcmp(r2[3], "c") == 0);
4341139cb14SJohn Levon CU_ASSERT(strcmp(r2[4], "") == 0);
4351139cb14SJohn Levon CU_ASSERT(r2[5] == NULL);
4361139cb14SJohn Levon spdk_strarray_free(r);
4371139cb14SJohn Levon spdk_strarray_free(r2);
4381139cb14SJohn Levon }
4391139cb14SJohn Levon
440d6e57b53SShuhei Matsumoto static void
test_strcpy_replace(void)441d6e57b53SShuhei Matsumoto test_strcpy_replace(void)
442d6e57b53SShuhei Matsumoto {
443d6e57b53SShuhei Matsumoto const char *original = "good morning, hello, thank you";
444d6e57b53SShuhei Matsumoto const char *search1 = "evening";
445d6e57b53SShuhei Matsumoto const char *replace1 = "unexpected";
446d6e57b53SShuhei Matsumoto const char *search2 = "morning";
447d6e57b53SShuhei Matsumoto const char *replace2 = "afternoon";
448d6e57b53SShuhei Matsumoto const char *expected2 = "good afternoon, hello, thank you";
449d6e57b53SShuhei Matsumoto const char *search3 = "morning";
450d6e57b53SShuhei Matsumoto const char *replace3 = "night";
451d6e57b53SShuhei Matsumoto const char *expected3 = "good night, hello, thank you";
452d6e57b53SShuhei Matsumoto const char *search4 = "hello";
453d6e57b53SShuhei Matsumoto const char *replace4 = "good bye";
454d6e57b53SShuhei Matsumoto const char *expected4 = "good morning, good bye, thank you";
455d6e57b53SShuhei Matsumoto const char *search5 = "thank you";
456d6e57b53SShuhei Matsumoto const char *replace5 = "you are welcome";
457d6e57b53SShuhei Matsumoto const char *expected5 = "good morning, hello, you are welcome";
458d6e57b53SShuhei Matsumoto const char *search6 = " ";
459d6e57b53SShuhei Matsumoto const char *replace6 = "-";
460d6e57b53SShuhei Matsumoto const char *expected6 = "good-morning,-hello,-thank-you";
461d6e57b53SShuhei Matsumoto const char *search7 = ",";
462d6e57b53SShuhei Matsumoto const char *replace7 = ".";
463d6e57b53SShuhei Matsumoto const char *expected7 = "good morning. hello. thank you";
464d6e57b53SShuhei Matsumoto char result[256];
465d6e57b53SShuhei Matsumoto int rc;
466d6e57b53SShuhei Matsumoto
467d6e57b53SShuhei Matsumoto rc = spdk_strcpy_replace(NULL, 0, NULL, NULL, NULL);
468d6e57b53SShuhei Matsumoto CU_ASSERT(rc == -EINVAL);
469d6e57b53SShuhei Matsumoto
470d6e57b53SShuhei Matsumoto rc = spdk_strcpy_replace(result, sizeof(result), original, search1, replace1);
471d6e57b53SShuhei Matsumoto CU_ASSERT(rc == 0);
472d6e57b53SShuhei Matsumoto CU_ASSERT(strcmp(result, original) == 0);
473d6e57b53SShuhei Matsumoto
474d6e57b53SShuhei Matsumoto rc = spdk_strcpy_replace(result, sizeof(result), original, search2, replace2);
475d6e57b53SShuhei Matsumoto CU_ASSERT(rc == 0);
476d6e57b53SShuhei Matsumoto CU_ASSERT(strcmp(result, expected2) == 0);
477d6e57b53SShuhei Matsumoto
478d6e57b53SShuhei Matsumoto /* A case that sizeof(replace) is less than sizeof(search), and the result array is
479d6e57b53SShuhei Matsumoto * smaller than the original string. */
480d6e57b53SShuhei Matsumoto rc = spdk_strcpy_replace(result, strlen(expected3) + 1, original, search3, replace3);
481d6e57b53SShuhei Matsumoto CU_ASSERT(rc == 0);
482d6e57b53SShuhei Matsumoto CU_ASSERT(strcmp(result, expected3) == 0);
483d6e57b53SShuhei Matsumoto
484d6e57b53SShuhei Matsumoto /* An error case that the result array is smaller than the string with replaced values
485d6e57b53SShuhei Matsumoto * and a terminated null byte. */
486d6e57b53SShuhei Matsumoto rc = spdk_strcpy_replace(result, strlen(expected3), original, search3, replace3);
487d6e57b53SShuhei Matsumoto CU_ASSERT(rc == -EINVAL);
488d6e57b53SShuhei Matsumoto
489d6e57b53SShuhei Matsumoto rc = spdk_strcpy_replace(result, sizeof(result), original, search4, replace4);
490d6e57b53SShuhei Matsumoto CU_ASSERT(rc == 0);
491d6e57b53SShuhei Matsumoto CU_ASSERT(strcmp(result, expected4) == 0);
492d6e57b53SShuhei Matsumoto
493d6e57b53SShuhei Matsumoto rc = spdk_strcpy_replace(result, sizeof(result), original, search5, replace5);
494d6e57b53SShuhei Matsumoto CU_ASSERT(rc == 0);
495d6e57b53SShuhei Matsumoto CU_ASSERT(strcmp(result, expected5) == 0);
496d6e57b53SShuhei Matsumoto
497d6e57b53SShuhei Matsumoto rc = spdk_strcpy_replace(result, sizeof(result), original, search6, replace6);
498d6e57b53SShuhei Matsumoto CU_ASSERT(rc == 0);
499d6e57b53SShuhei Matsumoto CU_ASSERT(strcmp(result, expected6) == 0);
500d6e57b53SShuhei Matsumoto
501d6e57b53SShuhei Matsumoto rc = spdk_strcpy_replace(result, sizeof(result), original, search7, replace7);
502d6e57b53SShuhei Matsumoto CU_ASSERT(rc == 0);
503d6e57b53SShuhei Matsumoto CU_ASSERT(strcmp(result, expected7) == 0);
504d6e57b53SShuhei Matsumoto }
505d6e57b53SShuhei Matsumoto
506e37b070aSDaniel Verkamp int
main(int argc,char ** argv)507e37b070aSDaniel Verkamp main(int argc, char **argv)
508e37b070aSDaniel Verkamp {
509e37b070aSDaniel Verkamp CU_pSuite suite = NULL;
510e37b070aSDaniel Verkamp unsigned int num_failures;
511e37b070aSDaniel Verkamp
51278b696bcSVitaliy Mysak CU_initialize_registry();
513e37b070aSDaniel Verkamp
514e37b070aSDaniel Verkamp suite = CU_add_suite("string", NULL, NULL);
515e37b070aSDaniel Verkamp
516dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_parse_ip_addr);
517dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_str_chomp);
518dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_parse_capacity);
519dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_sprintf_append_realloc);
520dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_strtol);
521dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_strtoll);
5221139cb14SJohn Levon CU_ADD_TEST(suite, test_strarray);
523d6e57b53SShuhei Matsumoto CU_ADD_TEST(suite, test_strcpy_replace);
524e37b070aSDaniel Verkamp
525e37b070aSDaniel Verkamp
526*ea941caeSKonrad Sztyber num_failures = spdk_ut_run_tests(argc, argv, NULL);
527e37b070aSDaniel Verkamp
528e37b070aSDaniel Verkamp CU_cleanup_registry();
529e37b070aSDaniel Verkamp
530e37b070aSDaniel Verkamp return num_failures;
531e37b070aSDaniel Verkamp }
532