Skip to content

Commit ef39514

Browse files
committed
tests: posix: c_lib_ext: add tests for getsubopt()
Add tests for getsubopt(). Signed-off-by: Chris Friedt <cfriedt@tenstorrent.com>
1 parent c4971c1 commit ef39514

File tree

1 file changed

+131
-0
lines changed

1 file changed

+131
-0
lines changed

tests/posix/c_lib_ext/src/getsubopt.c

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
/*
2+
* Copyright (c) 2025 Tenstorrent AI ULC
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <zephyr/ztest.h>
8+
9+
#include <stdlib.h>
10+
11+
extern int getsubopt(char **optionp, char *const *keylistp, char **valuep);
12+
13+
ZTEST(posix_c_lib_ext, test_getsubopt)
14+
{
15+
char *value;
16+
char *option;
17+
char buf[32];
18+
19+
enum opte {
20+
RO_OPTION,
21+
RW_OPTION,
22+
READ_SIZE_OPTION,
23+
WRITE_SIZE_OPTION,
24+
EMBEDDED_EQ_OPTION,
25+
};
26+
27+
static const char *key_list[] = {
28+
[RO_OPTION] = "ro",
29+
[RW_OPTION] = "rw",
30+
[READ_SIZE_OPTION] = "rsize",
31+
[WRITE_SIZE_OPTION] = "wsize",
32+
[EMBEDDED_EQ_OPTION] = "equal",
33+
NULL,
34+
};
35+
36+
static const char *empty_key_list[] = {
37+
NULL,
38+
};
39+
40+
/* degenerate cases */
41+
zexpect_equal(-1, getsubopt(NULL, NULL, NULL));
42+
zexpect_equal(-1, getsubopt(NULL, NULL, &value));
43+
zexpect_equal(-1, getsubopt(NULL, (char **)key_list, NULL));
44+
zexpect_equal(-1, getsubopt(NULL, (char **)key_list, &value));
45+
zexpect_equal(-1, getsubopt(&option, NULL, NULL));
46+
zexpect_equal(-1, getsubopt(&option, NULL, &value));
47+
48+
/* iterate over valuep being NULL and valid */
49+
for (size_t j = 0; j < 2; ++j) {
50+
char **valuep = (j == 0) ? NULL : &value;
51+
52+
/* empty options string */
53+
memset(buf, 0, sizeof(buf));
54+
option = buf;
55+
value = (char *)0x4242;
56+
zexpect_equal(-1, getsubopt(&option, (char **)key_list, valuep));
57+
if (valuep != NULL) {
58+
zexpect_equal(value, NULL);
59+
}
60+
61+
/* empty key list */
62+
strcpy(buf, "ro,rsize=512,equal=1=2,rw");
63+
option = buf;
64+
value = (char *)0x4242;
65+
zexpect_equal(-1, getsubopt(&option, (char **)empty_key_list, valuep));
66+
if (valuep != NULL) {
67+
zexpect_equal(value, NULL);
68+
}
69+
70+
strcpy(buf, "ro,rsize=512,equal=1=2,rw");
71+
option = buf;
72+
value = (char *)0x4242;
73+
zexpect_equal(RO_OPTION, getsubopt(&option, (char **)key_list, valuep));
74+
zexpect_equal(option, &buf[strlen("ro,")]);
75+
if (valuep != NULL) {
76+
zexpect_equal(value, NULL);
77+
}
78+
79+
value = (char *)0x4242;
80+
zexpect_equal(READ_SIZE_OPTION, getsubopt(&option, (char **)key_list, valuep));
81+
zexpect_equal(option, &buf[strlen("ro,rsize=512,")]);
82+
if (valuep != NULL) {
83+
zexpect_str_equal(value, "512");
84+
}
85+
86+
value = (char *)0x4242;
87+
zexpect_equal(EMBEDDED_EQ_OPTION, getsubopt(&option, (char **)key_list, valuep));
88+
zexpect_equal(option, &buf[strlen("ro,rsize=512,equal=1=2,")]);
89+
if (valuep != NULL) {
90+
zexpect_str_equal(value, "1=2");
91+
}
92+
93+
value = (char *)0x4242;
94+
zexpect_equal(RW_OPTION, getsubopt(&option, (char **)key_list, valuep));
95+
zexpect_equal(option, &buf[strlen("ro,rsize=512,equal=1=2,rw")]);
96+
if (valuep != NULL) {
97+
zexpect_equal(value, NULL);
98+
}
99+
100+
value = (char *)0x4242;
101+
zexpect_equal(getsubopt(&option, (char **)key_list, valuep), -1);
102+
if (valuep != NULL) {
103+
zexpect_equal(value, NULL);
104+
}
105+
106+
strcpy(buf, "oops");
107+
option = buf;
108+
value = (char *)0x4242;
109+
zexpect_equal(getsubopt(&option, (char **)key_list, valuep), -1);
110+
if (valuep != NULL) {
111+
zexpect_equal(value, NULL);
112+
}
113+
114+
/* some corner cases */
115+
strcpy(buf, ",rsize=,");
116+
option = buf;
117+
value = (char *)0x4242;
118+
zexpect_equal(-1, getsubopt(&option, (char **)key_list, valuep));
119+
zexpect_equal(option, &buf[strlen(",")]);
120+
if (valuep != NULL) {
121+
zexpect_equal(value, NULL);
122+
}
123+
124+
value = (char *)0x4242;
125+
zexpect_equal(READ_SIZE_OPTION, getsubopt(&option, (char **)key_list, valuep));
126+
zexpect_equal(option, &buf[strlen(",rsize=,")]);
127+
if (valuep != NULL) {
128+
zexpect_str_equal(value, "");
129+
}
130+
}
131+
}

0 commit comments

Comments
 (0)