void test_mac_link(void) { int res; struct test_thread_data thread_data[2]; thread_data[INITIATOR].context = thread_data[TARGET].context = cut_get_current_test_context(); thread_data[INITIATOR].device = devices[INITIATOR]; thread_data[TARGET].device = devices[TARGET]; if ((res = pthread_create(&(threads[TARGET]), NULL, target_thread, &thread_data[TARGET]))) cut_fail("pthread_create() returned %d", res); if ((res = pthread_create(&(threads[INITIATOR]), NULL, initiator_thread, &thread_data[INITIATOR]))) cut_fail("pthread_create() returned %d", res); signal(SIGINT, abort_test_by_keypress); if ((res = pthread_join(threads[INITIATOR], (void *) &result[INITIATOR]))) cut_fail("pthread_join() returned %d", res); if ((res = pthread_join(threads[TARGET], (void *) &result[TARGET]))) cut_fail("pthread_join() returned %d", res); cut_assert_equal_int(0, result[INITIATOR], cut_message("Unexpected initiator return code")); cut_assert_equal_int(0, result[TARGET], cut_message("Unexpected target return code")); }
void test_failure (void) { GThread *threads[64]; gsize i; for (i = 0; i < sizeof(threads) / sizeof(*threads); i++) { GError *error = NULL; threads[i] = g_thread_create(fail, cut_get_current_test_context(), TRUE, &error); gcut_assert_error(error); } for (i = 0; i < sizeof(threads) / sizeof(*threads); i++) { g_thread_join(threads[i]); } }
void dummy_mac_transport(struct llc_link *initiator, struct llc_link *target) { int n; char buffer[1024]; for (;;) { struct timespec ts = { .tv_sec = 0, .tv_nsec = 10000, }; n = mq_timedreceive(initiator->llc_down, buffer, sizeof(buffer), NULL, &ts); if (n < 0) { if (errno == ETIMEDOUT) { n = 2; buffer[0] = buffer[1] = 0x00; } else break; } pthread_testcancel(); n = mq_send(target->llc_up, buffer, n, 0); if (n < 0) break; pthread_testcancel(); n = mq_timedreceive(target->llc_down, buffer, sizeof(buffer), NULL, &ts); if (n < 0) { if (errno == ETIMEDOUT) { n = 2; buffer[0] = buffer[1] = 0x00; } else break; } pthread_testcancel(); n = mq_send(initiator->llc_up, buffer, n, 0); if (n < 0) break; pthread_testcancel(); } } void * dummy_mac_transport_thread(void *arg) { struct dummy_mac_transport_endpoints *eps = (struct dummy_mac_transport_endpoints *)arg; dummy_mac_transport(eps->initiator, eps->target); return NULL; } void test_dummy_mac_link(void) { int res; struct llc_link *initiator, *target; struct llc_service *service; struct mac_link mac_initiator, mac_target; initiator = llc_link_new(); cut_assert_not_null(initiator, cut_message("llc_link_new()")); target = llc_link_new(); cut_assert_not_null(target, cut_message("llc_link_new()")); initiator->cut_test_context = cut_get_current_test_context(); service = llc_service_new(NULL, echo_service, NULL); cut_assert_not_null(service, cut_message("llc_service_new()")); res = llc_link_service_bind(initiator, service, ECHO_SAP); cut_assert_equal_int(ECHO_SAP, res, cut_message("llc_link_service_bind()")); res = llc_link_activate(initiator, LLC_INITIATOR | LLC_PAX_PDU_PROHIBITED, NULL, 0); cut_assert_equal_int(0, res, cut_message("llc_link_activate()")); res = llc_link_activate(target, LLC_TARGET | LLC_PAX_PDU_PROHIBITED, NULL, 0); cut_assert_equal_int(0, res, cut_message("llc_link_activate()")); char buffer[1024]; pthread_t transport; struct dummy_mac_transport_endpoints eps = { .initiator = initiator, .target = target, }; pthread_create(&transport, NULL, dummy_mac_transport_thread, &eps); mac_initiator.exchange_pdus_thread = &transport; mac_target.exchange_pdus_thread = &transport; //initiator->mac_link = &mac_initiator; //target->mac_link = &mac_target; buffer[0] = ECHO_SAP << 2; buffer[1] = '\xC0'; buffer[2] = 'H'; buffer[3] = 'e'; buffer[4] = 'l'; buffer[5] = 'l'; buffer[6] = 'o'; res = mq_send(initiator->llc_up, buffer, 7, 0); cut_assert_equal_int(0, res, cut_message("mq_send")); struct timespec ts = { .tv_sec = time(NULL) + 2, .tv_nsec = 0, }; int old_cancelstate; pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_cancelstate); res = sem_timedwait(sem_cutter, &ts); cut_assert_equal_int(0, res, cut_message("Message not received")); pthread_setcancelstate(old_cancelstate, NULL); pthread_cancel(transport); //pthread_kill (transport, SIGUSR1); pthread_join(transport, NULL); llc_link_deactivate(initiator); llc_link_deactivate(target); llc_link_free(initiator); llc_link_free(target); }