1 // test the basename, dirname, basename_r and dirname_r
2 #include <libgen.h>
3 #include <errno.h>
4 #include <stdio.h>
5 #include <string.h>
6
7 static int fail = 0;
8
9 static void
test_basename(char * _input,const char * _expected,int _errno)10 test_basename(char* _input, const char* _expected, int _errno)
11 {
12 char temp[256], *input = _input;
13 char* ret;
14 #if HOST
15 /* GLibc does modify the input string. bummer */
16 if (_input) {
17 strcpy(temp, _input);
18 input = temp;
19 }
20 #endif
21 errno = 0;
22 ret = basename(input);
23 if (_expected == NULL) {
24 if (ret != NULL) {
25 fprintf(stderr,
26 "KO: basename(\"%s\") returned \"%s\", NULL expected)\n",
27 _input, ret);
28 fail += 1;
29 } else if (errno != _errno) {
30 fprintf(stderr,
31 "KO: basename(\"%s\") returned NULL with error: %d (%d expected)\n",
32 _input, errno, _errno);
33 fail += 1;
34 } else {
35 printf( "OK: basename(\"%s\") returned NULL with error %d\n",
36 _input, _errno );
37 }
38 } else {
39 if (ret == NULL) {
40 fprintf(stderr, "KO: basename(\"%s\") returned NULL with error %d\n",
41 _input, errno);
42 fail += 1;
43 }
44 else if (strcmp(ret, _expected)) {
45 fprintf(stderr, "KO: basename(\"%s\") returned \"%s\", instead of \"%s\"\n",
46 _input, ret, _expected);
47 }
48 else {
49 printf( "OK: basename(\"%s\") returned \"%s\"\n",
50 _input, ret );
51 }
52 }
53 }
54
55
56 #if !HOST
57 static void
test_basename_r(char * _input,const char * _expected_content,int _expected,char * _buff,size_t _bufflen,int _errno)58 test_basename_r(char* _input, const char* _expected_content, int _expected, char* _buff, size_t _bufflen, int _errno)
59 {
60 int ret;
61 errno = 0;
62 ret = basename_r(_input, _buff, _bufflen );
63 if (ret != _expected) {
64 fprintf(stderr,
65 "KO: basename_r(\"%s\", <buff>, %d) returned %d (expected %d)\n",
66 _input, _bufflen, ret, _expected);
67 fail += 1;
68 return;
69 }
70 if (ret == -1) {
71 if (errno != _errno) {
72 fprintf(stderr,
73 "KO: basename_r(\"%s\", <buff>, %d) returned -1 with errno=%d (expected %d)\n",
74 _input, _bufflen, errno, _errno);
75 fail += 1;
76 return;
77 }
78 }
79 else if (_buff != NULL && memcmp( _buff, _expected_content, ret ) ) {
80 fprintf(stderr,
81 "KO: basename_r(\"%s\", <buff>, %d) returned \"%s\", expected \"%s\"\n",
82 _input, _bufflen, _buff, _expected_content );
83 fail += 1;
84 return;
85 }
86 printf("OK: basename_r(\"%s\", <buff>, %d) returned \"%s\"\n",
87 _input, _bufflen, _expected_content );
88 }
89
90 static void
test_dirname_r(char * _input,const char * _expected_content,int _expected,char * _buff,size_t _bufflen,int _errno)91 test_dirname_r(char* _input, const char* _expected_content, int _expected, char* _buff, size_t _bufflen, int _errno)
92 {
93 int ret;
94 errno = 0;
95 ret = dirname_r(_input, _buff, _bufflen );
96 if (ret != _expected) {
97 fprintf(stderr,
98 "KO: dirname_r(\"%s\", <buff>, %d) returned %d (expected %d)\n",
99 _input, _bufflen, ret, _expected);
100 fail += 1;
101 return;
102 }
103 if (ret == -1) {
104 if (errno != _errno) {
105 fprintf(stderr,
106 "KO: dirname_r(\"%s\", <buff>, %d) returned -1 with errno=%d (expected %d)\n",
107 _input, _bufflen, errno, _errno);
108 fail += 1;
109 return;
110 }
111 }
112 else if (_buff != NULL && memcmp( _buff, _expected_content, ret ) ) {
113 fprintf(stderr,
114 "KO: dirname_r(\"%s\", <buff>, %d) returned \"%s\", expected \"%s\"\n",
115 _input, _bufflen, _buff, _expected_content );
116 fail += 1;
117 return;
118 }
119 printf("OK: dirname_r(\"%s\", <buff>, %d) returned \"%s\"\n",
120 _input, _bufflen, _expected_content );
121 }
122 #endif
123
124
125 static void
test_dirname(char * _input,const char * _expected,int _errno)126 test_dirname(char* _input, const char* _expected, int _errno)
127 {
128 char temp[256], *input = _input;
129 char* ret;
130 #if HOST
131 /* GLibc does modify the input string. bummer */
132 if (_input) {
133 strcpy(temp, _input);
134 input = temp;
135 }
136 #endif
137 errno = 0;
138 ret = dirname(input);
139 if (_expected == NULL) {
140 if (ret != NULL) {
141 fprintf(stderr,
142 "KO: dirname(\"%s\") returned \"%s\", NULL expected)\n",
143 _input, ret);
144 fail += 1;
145 } else if (errno != _errno) {
146 fprintf(stderr,
147 "KO: dirname(\"%s\") returned NULL with error: %d (%d expected)\n",
148 _input, errno, _errno);
149 fail += 1;
150 } else {
151 printf( "OK: dirname(\"%s\") returned NULL with error %d\n",
152 _input, _errno );
153 }
154 } else {
155 if (ret == NULL) {
156 fprintf(stderr, "KO: dirname(\"%s\") returned NULL with error %d\n",
157 _input, errno);
158 fail += 1;
159 }
160 else if (strcmp(ret, _expected)) {
161 fprintf(stderr, "KO: dirname(\"%s\") returned \"%s\", instead of \"%s\"\n",
162 _input, ret, _expected);
163 }
164 else {
165 printf( "OK: dirname(\"%s\") returned \"%s\"\n",
166 _input, ret );
167 }
168 }
169 }
170
171
172
173
main(void)174 int main( void )
175 {
176 char buff[256];
177
178 test_basename( "", ".", 0 );
179 test_basename( "/usr/lib", "lib", 0 );
180 test_basename( "/usr/", "usr", 0 );
181 test_basename( "usr", "usr", 0 );
182 test_basename( "/", "/", 0 );
183 test_basename( ".", ".", 0 );
184 test_basename( "..", "..", 0 );
185
186 #if !HOST
187 test_basename_r( "", ".", 1, NULL, 0, 0 );
188 test_basename_r( "", ".", -1, buff, 0, ERANGE );
189 test_basename_r( "", ".", -1, buff, 1, ERANGE );
190 test_basename_r( "", ".", 1, buff, 2, 0 );
191 test_basename_r( "", ".", 1, buff, sizeof(buff), 0 );
192 test_basename_r( "/usr/lib", "lib", 3, buff, sizeof(buff), 0 );
193 test_basename_r( "/usr/", "usr", 3, buff, sizeof(buff), 0 );
194 test_basename_r( "usr", "usr", 3, buff, sizeof(buff), 0 );
195 test_basename_r( "/", "/", 1, buff, sizeof(buff), 0 );
196 test_basename_r( ".", ".", 1, buff, sizeof(buff), 0 );
197 test_basename_r( "..", "..", 2, buff, sizeof(buff), 0 );
198 #endif
199
200 test_dirname( "", ".", 0 );
201 test_dirname( "/usr/lib", "/usr", 0 );
202 test_dirname( "/usr/", "/", 0 );
203 test_dirname( "usr", ".", 0 );
204 test_dirname( ".", ".", 0 );
205 test_dirname( "..", ".", 0 );
206
207 #if !HOST
208 test_dirname_r( "", ".", 1, NULL, 0, 0 );
209 test_dirname_r( "", ".", -1, buff, 0, ERANGE );
210 test_dirname_r( "", ".", -1, buff, 1, ERANGE );
211 test_dirname_r( "", ".", 1, buff, 2, 0 );
212 test_dirname_r( "/usr/lib", "/usr", 4, buff, sizeof(buff), 0 );
213 test_dirname_r( "/usr/", "/", 1, buff, sizeof(buff), 0 );
214 test_dirname_r( "usr", ".", 1, buff, sizeof(buff), 0 );
215 test_dirname_r( ".", ".", 1, buff, sizeof(buff), 0 );
216 test_dirname_r( "..", ".", 1, buff, sizeof(buff), 0 );
217 #endif
218
219 return (fail > 0);
220 }
221
222