]> git.draconx.ca Git - dxcommon.git/commitdiff
Add library test for libdiscid
authorNick Bowler <nbowler@draconx.ca>
Sat, 1 Jun 2019 14:27:15 +0000 (10:27 -0400)
committerNick Bowler <nbowler@draconx.ca>
Sat, 1 Jun 2019 14:27:15 +0000 (10:27 -0400)
And establish a basic scheme to cover these macros in the test suite.

.gitignore
Makefile.am
configure.ac
m4/libdiscid.m4 [new file with mode: 0644]
t/libdummy.c [new file with mode: 0644]
tests/libs.at [new file with mode: 0644]
tests/macros.at
testsuite.at

index 621f62ff440bb0c5b15d2df618ce4e8f17f91d14..ae53a6932b6f18311bcd844cf3a20c4c7445ee05 100644 (file)
@@ -18,3 +18,4 @@ Makefile
 .deps
 *.lo
 *.o
+*.a
index de51272b2a816fe65ba039551db96539a727b8ea..17cf7d5aa8386273c4557ec8c1df5c935bd913dc 100644 (file)
@@ -8,6 +8,8 @@ ACLOCAL_AMFLAGS = -I m4
 
 AM_CFLAGS = -I$(top_srcdir)/src
 
+check_LIBRARIES = t/libdummy.a
+
 check_PROGRAMS = t/packtestu t/packtests t/packtestu64 t/packtests64
 
 t_packtestu_SOURCES = t/packtestu.c src/pack.c src/tap.c
index abfccf7cd13ab77c9398a0ca6b44a32f0f1394df..a74cd71500503f45bedc26dd3b866d5151411935 100644 (file)
@@ -9,6 +9,7 @@ AC_INIT([dxcommon], [0], [nbowler@draconx.ca])
 AC_CONFIG_SRCDIR([m4/base.m4])
 
 AC_PROG_CC
+AC_PROG_RANLIB
 
 AM_INIT_AUTOMAKE([-Wall -Wno-portability foreign subdir-objects])
 AM_SILENT_RULES([yes])
diff --git a/m4/libdiscid.m4 b/m4/libdiscid.m4
new file mode 100644 (file)
index 0000000..7e28c4a
--- /dev/null
@@ -0,0 +1,39 @@
+AC_DEFUN([DX_LIB_LIBDISCID],
+[DX_LIB_SETUP([libdiscid])dnl
+DX_LIB_PKGCONFIG_FLAGS([libdiscid])
+AC_MSG_CHECKING([for libdiscid[]m4_ifnblank([$1], [ at least version $1])])
+DX_LIB_SEARCH_LINK([libdiscid],
+  [m4_apply([_DX_LIB_LIBDISCID_TEST], m4_split([$1], [\.]))],
+  [ [[$LIBDISCID_CFLAGS], [$LIBDISCID_LIBS]],
+    [[$dx_cv_libdiscid_pkg_cflags], [$dx_cv_libdiscid_pkg_libs],
+      [test x"$dx_cv_libdiscid_pkg_found" = x"yes"]],
+    [[], [-ldiscid]] ])
+AS_IF([test x"$dx_cv_libdiscid_lib_found" = x"yes"], [$2],
+  [m4_default([$3], [AC_MSG_FAILURE(
+[libdiscid[]m4_ifnblank([$1], [ version $1 or newer]) is required.  The latest
+version may be found at <https://musicbrainz.org/doc/libdiscid>.
+m4_newline([DX_LIB_USERFLAG_BLURB([libdiscid])])
+m4_newline([DX_LIB_PKGCONFIG_BLURB([libdiscid])])
+])])])])
+
+dnl Internal test program for libdiscid.  Check that the version numbers in the
+dnl header are sufficient and that some important functions are defined.
+m4_define([_DX_LIB_LIBDISCID_TEST], [AC_LANG_PROGRAM(
+[#include <discid/discid.h>
+m4_ifnblank([$1], [dnl
+#if DISCID_VERSION_MAJOR < $1
+DX_LIB_COMPILE_ERROR([major version insufficient])
+m4_ifnblank([$2], [dnl
+#elif DISCID_VERSION_MAJOR == $1
+#  if DISCID_VERSION_MINOR < $2
+DX_LIB_COMPILE_ERROR([minor version insufficient])
+m4_ifnblank([$3], [dnl
+#  elif DISCID_VERSION_MINOR == $2
+#    if DISCID_VERSION_PATCH < $3
+DX_LIB_COMPILE_ERROR([patch version insufficient])
+#    endif
+])dnl
+#  endif
+])dnl
+#endif
+])], [discid_free(discid_new());])])
diff --git a/t/libdummy.c b/t/libdummy.c
new file mode 100644 (file)
index 0000000..5404a08
--- /dev/null
@@ -0,0 +1,3 @@
+/* Stub function definitions to satisfy link tests, as required. */
+void discid_new(void) {}
+void discid_free(void) {}
diff --git a/tests/libs.at b/tests/libs.at
new file mode 100644 (file)
index 0000000..ab348de
--- /dev/null
@@ -0,0 +1,87 @@
+dnl Copyright © 2019 Nick Bowler
+dnl
+dnl License WTFPL2: Do What The Fuck You Want To Public License, version 2.
+dnl This is free software: you are free to do what the fuck you want to.
+dnl There is NO WARRANTY, to the extent permitted by law.
+
+AT_BANNER([Library tests])
+
+dnl TEST_DUMMY_PKGCONFIG([cflags], [libs])
+dnl
+dnl Create a hack pkg-config script in the current working directory which
+dnl responds to --cflags and --libs with the provided values.  The macro
+dnl arguments should each be a single shell word, suitable for the right
+dnl hand side of a shell assignment.
+m4_define([TEST_DUMMY_PKGCONFIG],
+[[cat >pkg-config <<EOF
+#!/bin/sh
+cflags= libs=
+for arg
+do
+  case \$arg in
+  --cflags) cflags=]$1[;;
+  --libs) libs=]$2[;;
+  esac
+done
+printf '%s %s\n' "\$cflags" "\$libs"
+EOF
+chmod +x pkg-config
+]])
+
+AT_SETUP([libdiscid probes])
+AT_KEYWORDS([libdiscid])
+
+mkdir discid
+AT_DATA([discid/discid.h],
+[[typedef void DiscId;
+DiscId *discid_new(void);
+void discid_free(DiscId *);
+#ifndef DISCID_VERSION_MAJOR
+#  define DISCID_VERSION_MAJOR 2
+#endif
+]])
+
+AT_DATA([test.in],
+[[@HAVE_LIBDISCID@
+@LIBDISCID_CFLAGS@
+@LIBDISCID_LIBS@
+]])
+
+TEST_CONFIGURE_AC([[DX_LIB_LIBDISCID([1.2.3], [HAVE_LIBDISCID=yes],
+                                              [HAVE_LIBDISCID=no])
+AC_SUBST([HAVE_LIBDISCID])
+AC_CONFIG_FILES([test])
+]])
+TEST_AUTORECONF
+
+# Check the search via explicit flags
+TEST_CONFIGURE([LIBDISCID_CFLAGS=-I. LIBDISCID_LIBS="$builddir/t/libdummy.a"])
+AT_CHECK_UNQUOTED([cat test], [0], [yes
+-I.
+$builddir/t/libdummy.a
+])
+
+# Check the search via pkg-config
+TEST_DUMMY_PKGCONFIG([-I.], [$builddir/t/libdummy.a])
+TEST_CONFIGURE([PKG_CONFIG=$PWD/pkg-config])
+AT_CHECK_UNQUOTED([cat test], [0], [yes
+-I.
+$builddir/t/libdummy.a
+])
+
+# Check the default -ldiscid search
+cp "$builddir/t/libdummy.a" libdiscid.a
+TEST_CONFIGURE([PKG_CONFIG=false CFLAGS=-I. LDFLAGS=-L.])
+AT_CHECK_UNQUOTED([cat test], [0], [yes
+
+-ldiscid
+])
+
+# Check the failure case
+TEST_CONFIGURE([PKG_CONFIG=false CFLAGS='-I. -DDISCID_VERSION_MAJOR=0'])
+AT_CHECK_UNQUOTED([cat test], [0], [no
+
+
+])
+
+AT_CLEANUP
index f3ada4563f5230decf9b9ee6e93c211076e229ce..3b851fc09793227fa24210e097a36a40f7d57caa 100644 (file)
@@ -6,22 +6,6 @@ dnl There is NO WARRANTY, to the extent permitted by law.
 
 AT_BANNER([Autoconf macros])
 
-m4_define([TEST_CONFIGURE_AC], [AT_DATA([configure.ac],
-[[AC_INIT([test], [0])
-]$1[
-AC_OUTPUT
-]])
-cp "$srcdir/install-sh" \
-   "$srcdir/config.guess" \
-   "$srcdir/config.sub" \
-   .
-])
-
-m4_define([TEST_AUTORECONF],
-  [AT_CHECK([autoreconf -I "$srcdir/m4"], [0], [], [stderr])])
-
-m4_define([TEST_CONFIGURE], [AT_CHECK([./configure $1], [0], [ignore])])
-
 dnl Verify that the DX_BASEDIR macro expands correctly during argument
 dnl collection.  Crucially, the output must not contain any other text.
 AT_SETUP([DX_BASEDIR during argument collection])
index ee9925f876d941fc749241b5b3a60e4ed0e81412..11b48a6b144e1ae6b7ccebf4bfa83b809a3b1414 100644 (file)
@@ -9,5 +9,23 @@ AT_COLOR_TESTS
 
 AT_TESTED([prove])
 
+m4_define([TEST_CONFIGURE_AC], [AT_KEYWORDS([autoconf m4])dnl
+AT_DATA([configure.ac],
+[[AC_INIT([test], [0])
+]$1[
+AC_OUTPUT
+]])
+cp "$srcdir/install-sh" \
+   "$srcdir/config.guess" \
+   "$srcdir/config.sub" \
+   .
+])
+m4_define([TEST_AUTORECONF], [AT_KEYWORDS([autoconf])dnl
+AT_CHECK([autoreconf -I "$srcdir/m4"], [0], [], [stderr])])
+
+m4_define([TEST_CONFIGURE], [AT_KEYWORDS([configure])dnl
+AT_CHECK([./configure $1], [0], [ignore])])
+
 m4_include([tests/macros.at])
 m4_include([tests/functions.at])
+m4_include([tests/libs.at])