1 /*
2 * Copyright 2021 the Pacemaker project contributors
3 *
4 * The version control history for this file may have further details.
5 *
6 * This source code is licensed under the GNU Lesser General Public License
7 * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY.
8 */
9
10 #include <stdlib.h>
11 #include <sys/utsname.h>
12
13 #include "mock_private.h"
14
15 /* This file is only used when running "make check". It is built into
16 * libcrmcommon_test.a, not into libcrmcommon.so. It is used to support
17 * constructing mock versions of library functions for unit testing.
18 *
19 * Each unit test will only ever want to use a mocked version of one or two
20 * library functions. However, we need to mark all the mocked functions as
21 * wrapped (with -Wl,--wrap= in the LDFLAGS) in libcrmcommon_test.a so that
22 * all those unit tests can share the same special test library. The unit
23 * test then defines its own wrapped function. Because a unit test won't
24 * define every single wrapped function, there will be undefined references
25 * at link time.
26 *
27 * This file takes care of those undefined references. It defines a
28 * wrapped version of every function that simply calls the real libc
29 * version. These wrapped versions are defined with a weak attribute,
30 * which means the unit tests can define another wrapped version for
31 * unit testing that will override the version defined here.
32 *
33 * IN SUMMARY:
34 *
35 * - Define two functions for each function listed in WRAPPED in mock.mk.
36 * One function is a weakly defined __wrap_X function that just calls
37 * __real_X.
38 * - Add a __real_X and __wrap_X function prototype for each function to
39 * mock_private.h.
40 * - Each unit test defines its own __wrap_X for whatever function it's
41 * mocking that overrides the version here.
42 */
43
44 char *__attribute__((weak))
45 __wrap_getenv(const char *name) {
/* ![[previous]](../icons/n_left.png)
![[next]](../icons/right.png)
![[first]](../icons/n_first.png)
![[last]](../icons/last.png)
![[top]](../icons/top.png)
![[bottom]](../icons/bottom.png)
![[index]](../icons/index.png)
*/
46 return __real_getenv(name);
47 }
48
49 int __attribute__((weak))
50 __wrap_uname(struct utsname *buf) {
/* ![[previous]](../icons/left.png)
![[next]](../icons/n_right.png)
![[first]](../icons/first.png)
![[last]](../icons/n_last.png)
![[top]](../icons/top.png)
![[bottom]](../icons/bottom.png)
![[index]](../icons/index.png)
*/
51 return __real_uname(buf);
52 }