This source file includes following definitions.
- __wrap_abort
- __wrap_calloc
- __wrap_getenv
- __wrap_realloc
- __wrap_setenv
- __wrap_unsetenv
- __wrap_getpid
- __wrap_setgrent
- __wrap_getgrent
- __wrap_endgrent
- __wrap_fopen
- __wrap_fopen64
- __wrap_getpwnam_r
- __wrap_readlink
- __wrap_strdup
1
2
3
4
5
6
7
8
9
10 #include <crm_internal.h>
11
12 #include <errno.h>
13 #include <pwd.h>
14 #include <stdarg.h>
15 #include <stdbool.h>
16 #include <stdint.h>
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <string.h>
20 #include <setjmp.h>
21 #include <sys/types.h>
22 #include <sys/utsname.h>
23 #include <unistd.h>
24 #include <grp.h>
25
26 #include <cmocka.h>
27 #include <crm/common/unittest_internal.h>
28 #include "mock_private.h"
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 _Noreturn void
70 __wrap_abort(void)
71 {
72 #if (PCMK__WITH_COVERAGE == 1)
73 __gcov_dump();
74 #endif
75 __real_abort();
76 }
77
78
79
80
81
82
83
84
85
86
87
88
89 bool pcmk__mock_calloc = false;
90
91 void *
92 __wrap_calloc(size_t nmemb, size_t size)
93 {
94 if (!pcmk__mock_calloc) {
95 return __real_calloc(nmemb, size);
96 }
97 check_expected(nmemb);
98 check_expected(size);
99 return NULL;
100 }
101
102
103
104
105
106
107
108
109
110
111
112
113
114 bool pcmk__mock_getenv = false;
115
116 char *
117 __wrap_getenv(const char *name)
118 {
119 if (!pcmk__mock_getenv) {
120 return __real_getenv(name);
121 }
122 check_expected_ptr(name);
123 return mock_ptr_type(char *);
124 }
125
126
127
128
129
130
131
132
133
134
135
136
137
138 bool pcmk__mock_realloc = false;
139
140 void *
141 __wrap_realloc(void *ptr, size_t size)
142 {
143 if (!pcmk__mock_realloc) {
144 return __real_realloc(ptr, size);
145 }
146 check_expected_ptr(ptr);
147 check_expected(size);
148 return NULL;
149 }
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166 bool pcmk__mock_setenv = false;
167
168 int
169 __wrap_setenv(const char *name, const char *value, int overwrite)
170 {
171 if (!pcmk__mock_setenv) {
172 return __real_setenv(name, value, overwrite);
173 }
174 check_expected_ptr(name);
175 check_expected_ptr(value);
176 check_expected(overwrite);
177 errno = mock_type(int);
178 return (errno == 0)? 0 : -1;
179 }
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194 bool pcmk__mock_unsetenv = false;
195
196 int
197 __wrap_unsetenv(const char *name)
198 {
199 if (!pcmk__mock_unsetenv) {
200 return __real_unsetenv(name);
201 }
202 check_expected_ptr(name);
203 errno = mock_type(int);
204 return (errno == 0)? 0 : -1;
205 }
206
207
208
209
210
211
212
213
214
215
216 bool pcmk__mock_getpid = false;
217
218 pid_t
219 __wrap_getpid(void)
220 {
221 return pcmk__mock_getpid? mock_type(pid_t) : __real_getpid();
222 }
223
224
225
226
227
228
229
230
231
232
233
234
235 bool pcmk__mock_grent = false;
236
237
238 static int group_idx = 0;
239
240
241 static const char* grp0_members[] = {
242 "user0", "user1", NULL
243 };
244
245 static const char* grp1_members[] = {
246 "user1", NULL
247 };
248
249 static const char* grp2_members[] = {
250 "user2", "user1", NULL
251 };
252
253
254
255
256
257
258
259
260
261
262 static const int NUM_GROUPS = 3;
263 static struct group groups[] = {
264 {(char*)"grp0", (char*)"", 0, (char**)grp0_members},
265 {(char*)"grp1", (char*)"", 1, (char**)grp1_members},
266 {(char*)"grp2", (char*)"", 2, (char**)grp2_members},
267 };
268
269
270 void
271 __wrap_setgrent(void) {
272 if (pcmk__mock_grent) {
273 group_idx = 0;
274 } else {
275 __real_setgrent();
276 }
277 }
278
279
280
281
282
283 struct group *
284 __wrap_getgrent(void) {
285 if (pcmk__mock_grent) {
286 if (group_idx >= NUM_GROUPS) {
287 return NULL;
288 }
289 return &groups[group_idx++];
290 } else {
291 return __real_getgrent();
292 }
293 }
294
295 void
296 __wrap_endgrent(void) {
297 if (!pcmk__mock_grent) {
298 __real_endgrent();
299 }
300 }
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317 bool pcmk__mock_fopen = false;
318
319 FILE *
320 __wrap_fopen(const char *pathname, const char *mode)
321 {
322 if (pcmk__mock_fopen) {
323 check_expected_ptr(pathname);
324 check_expected_ptr(mode);
325 errno = mock_type(int);
326
327 if (errno != 0) {
328 return NULL;
329 } else {
330 return __real_fopen(pathname, mode);
331 }
332
333 } else {
334 return __real_fopen(pathname, mode);
335 }
336 }
337
338 #ifdef HAVE_FOPEN64
339 FILE *
340 __wrap_fopen64(const char *pathname, const char *mode)
341 {
342 if (pcmk__mock_fopen) {
343 check_expected_ptr(pathname);
344 check_expected_ptr(mode);
345 errno = mock_type(int);
346
347 if (errno != 0) {
348 return NULL;
349 } else {
350 return __real_fopen64(pathname, mode);
351 }
352
353 } else {
354 return __real_fopen64(pathname, mode);
355 }
356 }
357 #endif
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375 bool pcmk__mock_getpwnam_r = false;
376
377 int
378 __wrap_getpwnam_r(const char *name, struct passwd *pwd, char *buf,
379 size_t buflen, struct passwd **result)
380 {
381 if (pcmk__mock_getpwnam_r) {
382 int retval = mock_type(int);
383
384 check_expected_ptr(name);
385 check_expected_ptr(pwd);
386 check_expected_ptr(buf);
387 check_expected(buflen);
388 check_expected_ptr(result);
389 *result = mock_ptr_type(struct passwd *);
390 return retval;
391
392 } else {
393 return __real_getpwnam_r(name, pwd, buf, buflen, result);
394 }
395 }
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412 bool pcmk__mock_readlink = false;
413
414 ssize_t
415 __wrap_readlink(const char *restrict path, char *restrict buf,
416 size_t bufsize)
417 {
418 if (pcmk__mock_readlink) {
419 const char *contents = NULL;
420
421 check_expected_ptr(path);
422 check_expected(buf);
423 check_expected(bufsize);
424 errno = mock_type(int);
425 contents = mock_ptr_type(const char *);
426
427 if (errno == 0) {
428 strncpy(buf, contents, bufsize - 1);
429 return strlen(contents);
430 }
431 return -1;
432
433 } else {
434 return __real_readlink(path, buf, bufsize);
435 }
436 }
437
438
439
440
441
442
443
444
445
446
447
448
449 bool pcmk__mock_strdup = false;
450
451 char *
452 __wrap_strdup(const char *s)
453 {
454 if (!pcmk__mock_strdup) {
455 return __real_strdup(s);
456 }
457 check_expected_ptr(s);
458 return NULL;
459 }
460
461