From cc8d4f68abd691e54a41d8aa6c948aabad2e388b Mon Sep 17 00:00:00 2001 From: Audrey Diacre Date: Thu, 12 Jan 2012 08:49:19 +0000 Subject: [PATCH] tests: add test_dep which tests states of 2 devices. --- test/Makefile.am | 4 + test/test_dep.c | 190 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 194 insertions(+) create mode 100644 test/test_dep.c diff --git a/test/Makefile.am b/test/Makefile.am index 5075c36..6c61715 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -9,6 +9,7 @@ TESTS_ENVIRONMENT = NO_MAKE=yes CUTTER="$(CUTTER)" cutter_unit_test_libs = \ test_access_storm.la \ + test_dep.la \ test_dep_active.la \ test_dep_passive.la \ test_register_access.la \ @@ -25,6 +26,9 @@ AM_LDFLAGS = -module -rpath $(libdir) -avoid-version -no-undefined test_access_storm_la_SOURCES = test_access_storm.c test_access_storm_la_LIBADD = $(top_builddir)/libnfc/libnfc.la +test_dep_la_SOURCES = test_dep.c +test_dep_la_LIBADD = $(top_builddir)/libnfc/libnfc.la + test_dep_active_la_SOURCES = test_dep_active.c test_dep_active_la_LIBADD = $(top_builddir)/libnfc/libnfc.la \ $(top_builddir)/utils/libnfcutils.la diff --git a/test/test_dep.c b/test/test_dep.c new file mode 100644 index 0000000..0c7170c --- /dev/null +++ b/test/test_dep.c @@ -0,0 +1,190 @@ +#include +#include +#include +#include + +#include "nfc/nfc.h" +#include "utils/nfc-utils.h" + +pthread_t threads[2]; +nfc_connstring connstrings[2]; +nfc_device *first_device, *second_device; +intptr_t result[2]; + +void +abort_test_by_keypress (int sig) +{ + (void) sig; + printf ("\033[0;1;31mSIGINT\033[0m"); + + nfc_abort_command (first_device); + nfc_abort_command (second_device); +} + +void +cut_setup (void) +{ + size_t n = nfc_list_devices (connstrings, 2); + if (n < 2) { + cut_omit ("At least two NFC devices must be plugged-in to run this test"); + } + + second_device = nfc_connect (connstrings[0]); + first_device = nfc_connect (connstrings[1]); + + signal (SIGINT, abort_test_by_keypress); +} + +void +cut_teardown (void) +{ + nfc_disconnect (second_device); + nfc_disconnect (first_device); +} + +struct thread_data { + nfc_device *device; + void *cut_test_context; +}; + +void * +target_thread (void *arg) +{ + intptr_t thread_res = 0; + nfc_device *device = ((struct thread_data *) arg)->device; + cut_set_current_test_context (((struct thread_data *) arg)->cut_test_context); + + printf ("=========== TARGET %s =========\n", nfc_device_get_name (device)); + nfc_target nt = { + .nm = { + .nmt = NMT_DEP, + .nbr = NBR_UNDEFINED + }, + .nti = { + .ndi = { + .abtNFCID3 = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA }, + .szGB = 4, + .abtGB = { 0x12, 0x34, 0x56, 0x78 }, + .ndm = NDM_PASSIVE, + /* These bytes are not used by nfc_target_init: the chip will provide them automatically to the initiator */ + .btDID = 0x00, + .btBS = 0x00, + .btBR = 0x00, + .btTO = 0x00, + .btPP = 0x01, + }, + }, + }; + + uint8_t abtRx[1024]; + size_t szRx = sizeof (abtRx); + int res = nfc_target_init (device, &nt, abtRx, szRx, 0); + cut_assert_operator_int (res, >, 0, cut_message ("Can't initialize NFC device as target: %s", nfc_strerror (device))); + if (res < 0) { thread_res = -1; return (void*) thread_res; } + + // First pass + res = nfc_target_receive_bytes (device, abtRx, sizeof (abtRx), 500); + cut_assert_operator_int (res, >, 0, cut_message ("Can't receive bytes from initiator: %s", nfc_strerror (device))); + szRx = (size_t) res; + + const uint8_t abtAttRx[] = "Hello DEP target!"; + cut_assert_equal_memory (abtAttRx, sizeof (abtAttRx), abtRx, szRx, cut_message ("Invalid received data")); + if (res <= 0) { thread_res = -1; return (void*) thread_res; } + + const uint8_t abtTx[] = "Hello DEP initiator!"; + res = nfc_target_send_bytes (device, abtTx, sizeof(abtTx), 500); + cut_assert_operator_int (res, >, 0, cut_message ("Can't send bytes to initiator: %s", nfc_strerror (device))); + if (res <= 0) { thread_res = -1; return (void*) thread_res; } + + sleep (1); + nfc_idle (device); + + return (void *) thread_res; +} + +void * +initiator_thread (void *arg) +{ + intptr_t thread_res = 0; + nfc_device *device = ((struct thread_data *) arg)->device; + cut_set_current_test_context (((struct thread_data *) arg)->cut_test_context); + + /* + * Wait some time for the other thread to initialise NFC device as target + */ + sleep (1); + printf ("=========== INITIATOR %s =========\n", nfc_device_get_name (device)); + + int res = nfc_initiator_init (device); + cut_assert_equal_int (0, res, cut_message ("Can't initialize NFC device as initiator: %s", nfc_strerror (device))); + if (res < 0) { thread_res = -1; return (void*) thread_res; } + + nfc_target nt; + + // Passive mode / 106Kbps + printf ("=========== INITIATOR %s (Passive mode / 106Kbps) =========\n", nfc_device_get_name (device)); + res = nfc_initiator_poll_dep_target (device, NDM_PASSIVE, NBR_106, NULL, &nt, 5000); + cut_assert_operator_int (res, >, 0, cut_message ("Can't select any DEP target: %s", nfc_strerror (device))); + cut_assert_equal_int (NMT_DEP, nt.nm.nmt, cut_message ("Invalid target modulation")); + cut_assert_equal_int (NBR_106, nt.nm.nbr, cut_message ("Invalid target baud rate")); + cut_assert_equal_memory ("\x11\x22\x33\x44\x55\x66\x77\x88\x99\xAA", 10, nt.nti.ndi.abtNFCID3, 10, cut_message ("Invalid target NFCID3")); + cut_assert_equal_int (NDM_PASSIVE, nt.nti.ndi.ndm, cut_message ("Invalid target DEP mode")); + cut_assert_equal_memory ("\x12\x34\x56\x78", 4, nt.nti.ndi.abtGB, nt.nti.ndi.szGB, cut_message ("Invalid target general bytes")); + if (res <= 0) { thread_res = -1; return (void*) thread_res; } + + const uint8_t abtTx[] = "Hello DEP target!"; + uint8_t abtRx[1024]; + size_t szRx = sizeof (abtRx); + res = nfc_initiator_transceive_bytes (device, abtTx, sizeof (abtTx), abtRx, &szRx, 500); + cut_assert_operator_int (res, >=, 0, cut_message ("Can't transceive bytes to target: %s", nfc_strerror (device))); + + const uint8_t abtAttRx[] = "Hello DEP initiator!"; + cut_assert_equal_memory (abtAttRx, sizeof (abtAttRx), abtRx, szRx, cut_message ("Invalid received data")); + if (res < 0) { thread_res = -1; return (void*) thread_res; } + + res = nfc_initiator_deselect_target (device); + cut_assert_operator_int (res, >=, 0, cut_message ("Can't deselect target: %s", nfc_strerror (device))); + if (res < 0) { thread_res = -1; return (void*) thread_res; } +nfc_target nt1; + res = nfc_initiator_poll_dep_target (device, NDM_PASSIVE, NBR_106, NULL, &nt1, 1000); + cut_assert_equal_int (-1, res, cut_message ("Problem with nfc_idle")); + if (res != -1) { thread_res = -1; return (void*) thread_res; } + + return (void *) thread_res; +} + +void +test_dep_states (void) +{ + int res; + + CutTestContext *test_context = cut_get_current_test_context (); + struct thread_data target_data = { + .device = first_device, + .cut_test_context = test_context, + }; + + struct thread_data initiator_data = { + .device = second_device, + .cut_test_context = test_context, + }; + + for (int i = 0; i < 2; i++) { + if ((res = pthread_create (&(threads[1]), NULL, target_thread, &target_data))) + cut_fail ("pthread_create() returned %d", res); + + if ((res = pthread_create (&(threads[0]), NULL, initiator_thread, &initiator_data))) + cut_fail ("pthread_create() returned %d", res); + + if ((res = pthread_join (threads[0], (void *) &result[0]))) + cut_fail ("pthread_join() returned %d", res); + if ((res = pthread_join (threads[1], (void *) &result[1]))) + cut_fail ("pthread_join() returned %d", res); + + cut_assert_equal_int (0, result[0], cut_message ("Unexpected initiator return code")); + cut_assert_equal_int (0, result[1], cut_message ("Unexpected target return code")); + + target_data.device = second_device; + initiator_data.device = first_device; + } +}