diff --git a/Makefile.am b/Makefile.am index 1bf98ee..721d237 100644 --- a/Makefile.am +++ b/Makefile.am @@ -2,7 +2,7 @@ ACLOCAL_AMFLAGS = -I m4 AM_CFLAGS = $(LIBNFC_CFLAGS) -SUBDIRS = libnfc examples include cmake_modules +SUBDIRS = libnfc examples include cmake_modules test pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libnfc.pc diff --git a/configure.ac b/configure.ac index 37874bd..a827da0 100644 --- a/configure.ac +++ b/configure.ac @@ -111,6 +111,14 @@ AC_SUBST(PKG_CONFIG_REQUIRES) AM_CONDITIONAL(LIBUSB_ENABLED, [test "$HAVE_LIBUSB" = "1"]) AM_CONDITIONAL(PCSC_ENABLED, [test "$HAVE_PCSC" = "1"]) +CUTTER_REQUIRED_VERSION=1.1.2 +m4_ifdef([AC_CHECK_CUTTER], [AC_CHECK_CUTTER([>= $CUTTER_REQUIRED_VERSION])], [ac_cv_use_cutter="no"]) +if test x$ac_cv_with_cutter = xyes -a x$ac_cv_use_cutter = xno; then + AC_MSG_ERROR([cutter >= $CUTTER_REQUIRED_VERSION is mandatory.]) +fi +AM_CONDITIONAL([WITH_CUTTER], [test "$ac_cv_use_cutter" != "no"]) + + # Defines and C flags CFLAGS="$CFLAGS -std=c99" @@ -127,6 +135,7 @@ AC_CONFIG_FILES([ libnfc/Makefile examples/Makefile cmake_modules/Makefile + test/Makefile libnfc.pc Doxyfile ]) diff --git a/test/Makefile.am b/test/Makefile.am new file mode 100644 index 0000000..9c8fafd --- /dev/null +++ b/test/Makefile.am @@ -0,0 +1,24 @@ +# $Id$ + +INCLUDES = $(CUTTER_CFLAGS) $(LIBNFC_CFLAGS) +LIBS = $(CUTTER_LIBS) + +if WITH_CUTTER +TESTS = run-test.sh +TESTS_ENVIRONMENT = NO_MAKE=yes CUTTER="$(CUTTER)" + +noinst_LTLIBRARIES = \ + test_access.la + +AM_LDFLAGS = -module -rpath $(libdir) -avoid-version -no-undefined + +test_access_la_SOURCES = test_access.c +test_access_la_LIBADD = $(top_builddir)/libnfc/libnfc.la + +echo-cutter: + @echo $(CUTTER) + +EXTRA_DIST = run-test.sh +CLEANFILES = *.gcno + +endif diff --git a/test/run-test.sh b/test/run-test.sh new file mode 100755 index 0000000..2c8bc7b --- /dev/null +++ b/test/run-test.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +export BASE_DIR="`dirname $0`" + +if test -z "$NO_MAKE"; then + make -C "$BASE_DIR/../" > /dev/null || exit 1 +fi + +if test -z "$CUTTER"; then + CUTTER="`make -s -C "$BASE_DIR" echo-cutter`" +fi + +"$CUTTER" --keep-opening-modules -s "$BASE_DIR" "$@" "$BASE_DIR" +# ^^^^^^^^^^^^^^^^^^^^^^ +# FIXME: Remove this workaround once cutter has been fixed upstream. +# Bug report: +# http://sourceforge.net/mailarchive/forum.php?thread_name=20100626123941.GA258%40blogreen.org&forum_name=cutter-users-en diff --git a/test/test_access.c b/test/test_access.c new file mode 100644 index 0000000..df96156 --- /dev/null +++ b/test/test_access.c @@ -0,0 +1,56 @@ +#include + +#include + +#define NTESTS 42 +#define MAX_TARGET_COUNT 8 + +void +test_access (void) +{ + int n = NTESTS; + nfc_device_desc_t devices[8]; + size_t device_count, ref_device_count, target_count; + bool res; + + nfc_list_devices (devices, 8, &ref_device_count); + if (!ref_device_count) + cut_omit ("No NFC device found"); + + while (n) { + size_t i; + + nfc_list_devices (devices, 8, &device_count); + cut_assert_equal_int (ref_device_count, device_count, cut_message ("device count")); + + for (i = 0; i < device_count; i++) { + nfc_device_t *device; + nfc_target_info_t anti[MAX_TARGET_COUNT]; + + device = nfc_connect (&(devices[i])); + cut_assert_not_null (device, cut_message ("nfc_connect")); + + nfc_initiator_init(device); + + // Drop the field for a while + nfc_configure(device,NDO_ACTIVATE_FIELD,false); + + // Let the reader only try once to find a tag + nfc_configure(device,NDO_INFINITE_SELECT,false); + + // Configure the CRC and Parity settings + nfc_configure(device,NDO_HANDLE_CRC,true); + nfc_configure(device,NDO_HANDLE_PARITY,true); + + // Enable field so more power consuming cards can power themselves + nfc_configure(device,NDO_ACTIVATE_FIELD,true); + + res = nfc_initiator_list_passive_targets(device, NM_ISO14443A_106, anti, MAX_TARGET_COUNT, &target_count); + cut_assert_true (res, cut_message ("nfc_initiator_list_passive_targets")); + + nfc_disconnect (device); + } + + n--; + } +}