Browse Source

Tests/FindX11: add a test

Ben Boeckel 7 years ago
parent
commit
bced9d5e56
4 changed files with 508 additions and 0 deletions
  1. 4 0
      Tests/CMakeLists.txt
  2. 10 0
      Tests/FindX11/CMakeLists.txt
  3. 89 0
      Tests/FindX11/Test/CMakeLists.txt
  4. 405 0
      Tests/FindX11/Test/main.c

+ 4 - 0
Tests/CMakeLists.txt

@@ -1485,6 +1485,10 @@ ${CMake_BINARY_DIR}/bin/cmake -DDIR=dev -P ${CMake_SOURCE_DIR}/Utilities/Release
     add_subdirectory(FindVulkan)
   endif()
 
+  if(CMake_TEST_FindX11)
+    add_subdirectory(FindX11)
+  endif()
+
   if(CMake_TEST_FindXalanC)
     add_subdirectory(FindXalanC)
   endif()

+ 10 - 0
Tests/FindX11/CMakeLists.txt

@@ -0,0 +1,10 @@
+add_test(NAME FindX11.Test COMMAND
+  ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+  --build-and-test
+  "${CMake_SOURCE_DIR}/Tests/FindX11/Test"
+  "${CMake_BINARY_DIR}/Tests/FindX11/Test"
+  ${build_generator_args}
+  --build-project TestFindX11
+  --build-options ${build_options}
+  --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+  )

+ 89 - 0
Tests/FindX11/Test/CMakeLists.txt

@@ -0,0 +1,89 @@
+cmake_minimum_required(VERSION 3.10)
+project(TestFindX11 C)
+include(CTest)
+
+find_package(X11 REQUIRED)
+
+function (test_x11_component have_var component)
+  if (NOT X11_${component}_FOUND)
+    message("Skipping ${component} because it was not found.")
+    return ()
+  endif ()
+
+  add_executable(test_tgt_${component} main.c)
+  target_link_libraries(test_tgt_${component} PRIVATE X11::${component})
+  target_compile_definitions(test_tgt_${component} PRIVATE HAVE_X11_${component})
+  add_test(NAME test_tgt_${component} COMMAND test_tgt_${component})
+
+  # Add to the list of components to test for the parent.
+  set(${have_var}
+    ${${have_var}}
+    HAVE_X11_${component}
+    PARENT_SCOPE)
+endfunction ()
+
+set(x11_components)
+test_x11_component(x11_components ICE)
+test_x11_component(x11_components SM)
+# Not a component; hack it up.
+set(X11_X11_FOUND ${X11_FOUND})
+test_x11_component(x11_components X11)
+test_x11_component(x11_components Xau)
+test_x11_component(x11_components Xcomposite)
+test_x11_component(x11_components Xdamage)
+test_x11_component(x11_components Xdmcp)
+test_x11_component(x11_components Xext)
+test_x11_component(x11_components Xxf86misc)
+test_x11_component(x11_components Xxf86vm)
+test_x11_component(x11_components Xfixes)
+# We ignore the Xft component because the variables do not provide the required
+# dependency information (Freetype and Fontconfig).
+test_x11_component(x11_components_ignore Xft)
+test_x11_component(x11_components Xi)
+test_x11_component(x11_components Xinerama)
+test_x11_component(x11_components Xkb)
+test_x11_component(x11_components xkbfile)
+test_x11_component(x11_components Xmu)
+test_x11_component(x11_components Xpm)
+test_x11_component(x11_components Xtst)
+test_x11_component(x11_components Xrandr)
+test_x11_component(x11_components Xrender)
+test_x11_component(x11_components XRes)
+test_x11_component(x11_components Xss)
+test_x11_component(x11_components Xt)
+test_x11_component(x11_components Xutil)
+test_x11_component(x11_components Xv)
+
+# The variables do not include dependency information. Just test "everything".
+add_executable(test_var main.c)
+target_include_directories(test_var PRIVATE ${X11_INCLUDE_DIRS})
+target_link_libraries(test_var PRIVATE ${X11_LIBRARIES})
+# Not included in X11_LIBRARIES.
+foreach(lib
+    Xau
+    Xcomposite
+    Xdamage
+    Xdmcp
+    Xxf86misc
+    Xxf86vm
+    Xfixes
+    Xi
+    Xinerama
+    Xkb
+    xkbfile
+    Xmu
+    Xpm
+    Xtst
+    Xrandr
+    Xrender
+    XRes
+    Xss
+    Xt
+    Xv
+    )
+  if (X11_${lib}_FOUND)
+    target_link_libraries(test_var PRIVATE ${X11_${lib}_LIB})
+  endif ()
+endforeach()
+target_compile_definitions(test_var PRIVATE ${x11_components})
+add_test(NAME test_var COMMAND test_var)

+ 405 - 0
Tests/FindX11/Test/main.c

@@ -0,0 +1,405 @@
+#ifdef HAVE_X11_ICE
+#  include <X11/ICE/ICElib.h>
+
+static Status test_ICE(void)
+{
+  return IceInitThreads();
+}
+#endif
+
+#ifdef HAVE_X11_SM
+#  include <X11/SM/SMlib.h>
+#  include <stdlib.h>
+
+static void test_SM(void)
+{
+  SmcProtocolVersion(NULL);
+}
+#endif
+
+#ifdef HAVE_X11_X11
+#  include <X11/Xlib.h>
+
+static Status test_X11(void)
+{
+  return XInitThreads();
+}
+#endif
+
+#ifdef HAVE_X11_Xau
+#  include <X11/Xauth.h>
+
+static char* test_Xau(void)
+{
+  return XauFileName();
+}
+#endif
+
+#ifdef HAVE_X11_Xcomposite
+#  include <X11/extensions/Xcomposite.h>
+
+static int test_Xcomposite(void)
+{
+  return XCompositeVersion();
+}
+#endif
+
+#ifdef HAVE_X11_Xdamage
+#  include <X11/extensions/Xdamage.h>
+
+static Bool test_Xdamage(void)
+{
+  Display* dpy = XOpenDisplay(NULL);
+  int ev_base;
+  int err_base;
+  Bool ret = XDamageQueryExtension(dpy, &ev_base, &err_base);
+  XCloseDisplay(dpy);
+  return ret;
+}
+#endif
+
+#ifdef HAVE_X11_Xdmcp
+#  include <X11/Xdmcp.h>
+
+static int test_Xdmcp(void)
+{
+  BYTE data[1024];
+  XdmcpBuffer buf = { data, sizeof(data), 0, 0 };
+  return XdmcpReadRemaining(&buf);
+}
+#endif
+
+#ifdef HAVE_X11_Xext
+#  include <X11/Xlib.h>
+#  include <X11/extensions/Xext.h>
+
+static int test_Xext(void)
+{
+  Display* dpy = XOpenDisplay(NULL);
+  int ret = XMissingExtension(dpy, "cmake");
+  XCloseDisplay(dpy);
+  return ret;
+}
+#endif
+
+#ifdef HAVE_X11_Xxf86misc
+#  include <X11/Xlib.h>
+#  include <X11/extensions/xf86misc.h>
+
+static Bool test_Xxf86misc(void)
+{
+  Display* dpy = XOpenDisplay(NULL);
+  Bool ret = XF86MiscSetClientVersion(dpy);
+  XCloseDisplay(dpy);
+  return ret;
+}
+#endif
+
+#ifdef HAVE_X11_Xxf86vm
+#  include <X11/Xlib.h>
+#  include <X11/extensions/xf86vmode.h>
+
+static Bool test_Xxf86vm(void)
+{
+  Display* dpy = XOpenDisplay(NULL);
+  Bool ret = XF86VidModeSetClientVersion(dpy);
+  XCloseDisplay(dpy);
+  return ret;
+}
+#endif
+
+#ifdef HAVE_X11_Xfixes
+#  include <X11/extensions/Xfixes.h>
+
+static Bool test_Xfixes(void)
+{
+  Display* dpy = XOpenDisplay(NULL);
+  int ev_base;
+  int err_base;
+  Bool ret = XFixesQueryExtension(dpy, &ev_base, &err_base);
+  XCloseDisplay(dpy);
+  return ret;
+}
+#endif
+
+#ifdef HAVE_X11_Xft
+#  include <X11/Xft/Xft.h>
+
+static FcBool test_Xft(void)
+{
+  return XftInitFtLibrary();
+}
+#endif
+
+#ifdef HAVE_X11_Xi
+#  include <X11/extensions/XInput.h>
+
+static XExtensionVersion* test_Xi(void)
+{
+  Display* dpy = XOpenDisplay(NULL);
+  XExtensionVersion* ret = XGetExtensionVersion(dpy, "cmake");
+  XCloseDisplay(dpy);
+  return ret;
+}
+#endif
+
+#ifdef HAVE_X11_Xinerama
+#  include <X11/extensions/Xinerama.h>
+
+static Bool test_Xinerama(void)
+{
+  Display* dpy = XOpenDisplay(NULL);
+  int ev_base;
+  int err_base;
+  Bool ret = XineramaQueryExtension(dpy, &ev_base, &err_base);
+  XCloseDisplay(dpy);
+  return ret;
+}
+#endif
+
+#ifdef HAVE_X11_Xkb
+#  include <X11/XKBlib.h>
+
+static Bool test_Xkb(void)
+{
+  return XkbIgnoreExtension(0);
+}
+#endif
+
+#ifdef HAVE_X11_xkbfile
+#  include <stdio.h>
+
+#  include <X11/XKBlib.h>
+#  include <X11/extensions/XKBfile.h>
+
+#  include <stdlib.h>
+
+static void test_xkbfile(void)
+{
+  Display* dpy = XOpenDisplay(NULL);
+  XkbInitAtoms(dpy);
+  XCloseDisplay(dpy);
+}
+#endif
+
+#ifdef HAVE_X11_Xmu
+#  include <X11/Xmu/Xmu.h>
+
+#  include <stdlib.h>
+
+static Bool test_Xmu(void)
+{
+  return XmuValidArea(NULL);
+}
+#endif
+
+#ifdef HAVE_X11_Xpm
+#  include <X11/xpm.h>
+
+static int test_Xpm(void)
+{
+  return XpmAttributesSize();
+}
+#endif
+
+#ifdef HAVE_X11_Xtst
+#  include <X11/extensions/XTest.h>
+
+static Status test_Xtst(void)
+{
+  Display* dpy = XOpenDisplay(NULL);
+  Status ret = XTestDiscard(dpy);
+  XCloseDisplay(dpy);
+  return ret;
+}
+#endif
+
+#ifdef HAVE_X11_Xrandr
+#  include <X11/extensions/Xrandr.h>
+
+static Bool test_Xrandr(void)
+{
+  Display* dpy = XOpenDisplay(NULL);
+  int ev_base;
+  int err_base;
+  Bool ret = XRRQueryExtension(dpy, &ev_base, &err_base);
+  XCloseDisplay(dpy);
+  return ret;
+}
+#endif
+
+#ifdef HAVE_X11_Xrender
+#  include <X11/extensions/Xrender.h>
+
+static Bool test_Xrender(void)
+{
+  Display* dpy = XOpenDisplay(NULL);
+  int ev_base;
+  int err_base;
+  Bool ret = XRenderQueryExtension(dpy, &ev_base, &err_base);
+  XCloseDisplay(dpy);
+  return ret;
+}
+#endif
+
+#ifdef HAVE_X11_XRes
+#  include <X11/Xlib.h>
+#  include <X11/extensions/XRes.h>
+
+static Bool test_XRes(void)
+{
+  Display* dpy = XOpenDisplay(NULL);
+  int ev_base;
+  int err_base;
+  Bool ret = XResQueryExtension(dpy, &ev_base, &err_base);
+  XCloseDisplay(dpy);
+  return ret;
+}
+#endif
+
+#ifdef HAVE_X11_Xss
+#  include <X11/extensions/scrnsaver.h>
+
+static Bool test_Xss(void)
+{
+  Display* dpy = XOpenDisplay(NULL);
+  int ev_base;
+  int err_base;
+  Bool ret = XScreenSaverQueryExtension(dpy, &ev_base, &err_base);
+  XCloseDisplay(dpy);
+  return ret;
+}
+#endif
+
+#ifdef HAVE_X11_Xt
+#  include <X11/Intrinsic.h>
+
+static void test_Xt(void)
+{
+  return XtToolkitInitialize();
+}
+#endif
+
+#ifdef HAVE_X11_Xutil
+#  include <X11/Xutil.h>
+
+static int test_Xutil(void)
+{
+  Region r = XCreateRegion();
+  return XDestroyRegion(r);
+}
+#endif
+
+#ifdef HAVE_X11_Xv
+#  include <X11/Xlib.h>
+#  include <X11/extensions/Xvlib.h>
+
+static int test_Xv(void)
+{
+  Display* dpy = XOpenDisplay(NULL);
+  unsigned int version;
+  unsigned int revision;
+  unsigned int req_base;
+  unsigned int ev_base;
+  unsigned int err_base;
+  int ret =
+    XvQueryExtension(dpy, &version, &revision, &req_base, &ev_base, &err_base);
+  XCloseDisplay(dpy);
+  return ret;
+}
+#endif
+
+#include <stddef.h>
+
+int main(int argc, char* argv[])
+{
+  (void)argv;
+  void* fptrs[] = {
+#ifdef HAVE_X11_ICE
+    test_ICE,
+#endif
+#ifdef HAVE_X11_SM
+    test_SM,
+#endif
+#ifdef HAVE_X11_X11
+    test_X11,
+#endif
+#ifdef HAVE_X11_Xau
+    test_Xau,
+#endif
+#ifdef HAVE_X11_Xcomposite
+    test_Xcomposite,
+#endif
+#ifdef HAVE_X11_Xdamage
+    test_Xdamage,
+#endif
+#ifdef HAVE_X11_Xdmcp
+    test_Xdmcp,
+#endif
+#ifdef HAVE_X11_Xext
+    test_Xext,
+#endif
+#ifdef HAVE_X11_Xxf86misc
+    test_Xxf86misc,
+#endif
+#ifdef HAVE_X11_Xxf86vm
+    test_Xxf86vm,
+#endif
+#ifdef HAVE_X11_Xfixes
+    test_Xfixes,
+#endif
+#ifdef HAVE_X11_Xft
+    test_Xft,
+#endif
+#ifdef HAVE_X11_Xi
+    test_Xi,
+#endif
+#ifdef HAVE_X11_Xinerama
+    test_Xinerama,
+#endif
+#ifdef HAVE_X11_Xkb
+    test_Xkb,
+#endif
+#ifdef HAVE_X11_xkbfile
+    test_xkbfile,
+#endif
+#ifdef HAVE_X11_Xmu
+    test_Xmu,
+#endif
+#ifdef HAVE_X11_Xpm
+    test_Xpm,
+#endif
+#ifdef HAVE_X11_Xtst
+    test_Xtst,
+#endif
+#ifdef HAVE_X11_Xrandr
+    test_Xrandr,
+#endif
+#ifdef HAVE_X11_Xrender
+    test_Xrender,
+#endif
+#ifdef HAVE_X11_XRes
+    test_XRes,
+#endif
+#ifdef HAVE_X11_Xss
+    test_Xss,
+#endif
+#ifdef HAVE_X11_Xt
+    test_Xt,
+#endif
+#ifdef HAVE_X11_Xutil
+    test_Xutil,
+#endif
+#ifdef HAVE_X11_Xv
+    test_Xv,
+#endif
+    NULL,
+  };
+
+  // The code here is to convince the compiler to keep the static functions but
+  // without calling them. This ends up always being "0" because `argc` is
+  // always 1 in the test harness which always returns the sentinel at the end
+  // of the array. The array logic is there to ensure that the contents of
+  // `fptrs` is not optimized out.
+  return (int)fptrs[(sizeof(fptrs) / sizeof(*fptrs)) - argc];
+}