Beispiel #1
0
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"));
}
Beispiel #2
0
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);

}