]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
tests: Fix mock chaining on macOS
authorRoman Bolshakov <r.bolshakov@yadro.com>
Mon, 23 Nov 2020 22:10:14 +0000 (01:10 +0300)
committerMichal Privoznik <mprivozn@redhat.com>
Fri, 27 Nov 2020 15:28:31 +0000 (16:28 +0100)
Some tests in qemuxml2argvtest need opendir() from virpcimock, others
need opendir() from virfilewrapper.

But as of now, only opendir() from virpcimock has an effect.
real_opendir in virpcimock has a pointer to opendir$INODE64 in
libsystem_kernel.dylib instead of pointing to opendir$INODE64 in
qemuxml2argvtest (from virfilewrapper). And because the second one is
never used, tests that rely on prefixes added by virFileWrapperAddPrefix
fail.

That can be fixed if dlsym(3) is asked explicitly to search symbols in
main executable with RTLD_MAIN_ONLY before going to other dylibs.
Existing RTLD_NEXT handle results into libsystem_kernel.dylib being
searched before main executable.

Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
tests/virmock.h
tests/virpcimock.c

index dea5feb80f73ce47bb71a64d9dea3c5b949ba208..5250e733a156fa50c85db4c1215b9c336876ce9d 100644 (file)
     static void (*real_##name)(void); \
     void wrap_##name(void)
 
+#if defined(VIR_MOCK_LOOKUP_MAIN) && defined(__APPLE__)
+# define VIR_MOCK_REAL_INIT_MAIN(name, alias) \
+    do { \
+        if (real_##name == NULL) { \
+            real_##name = dlsym(RTLD_MAIN_ONLY, alias); \
+        } \
+    } while (0)
+#else
+# define VIR_MOCK_REAL_INIT_MAIN(name, alias) \
+    do {} while (0)
+#endif
 
 #define VIR_MOCK_REAL_INIT(name) \
     do { \
+        VIR_MOCK_REAL_INIT_MAIN(name, #name); \
         if (real_##name == NULL && \
             !(real_##name = dlsym(RTLD_NEXT, \
                                   #name))) { \
 
 #define VIR_MOCK_REAL_INIT_ALIASED(name, alias) \
     do { \
+        VIR_MOCK_REAL_INIT_MAIN(name, alias); \
         if (real_##name == NULL && \
             !(real_##name = dlsym(RTLD_NEXT, \
                                   alias))) { \
index 686f894e99c6244135467aaea7a76c44943c0a83..4aa96cae0842a4687cd5285f36fb0502c7a973ab 100644 (file)
@@ -19,6 +19,7 @@
 #include <config.h>
 
 #if defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__)
+# define VIR_MOCK_LOOKUP_MAIN
 # include "virmock.h"
 # include <unistd.h>
 # include <fcntl.h>