test_libgen.c revision e16cb84e2324f05334d18dcf5956f20f44262b62
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
7static int  fail = 0;
8
9static void
10test_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
57static void
58test_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 ( 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
90static void
91test_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 ( 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
125static void
126test_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
174int  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