Test(gnix_cancel, cancel_ep_no_event) { int ret; ret = fi_cancel(&ep[0]->fid, NULL); cr_assert(ret == -FI_ENOENT, "fi_cancel failed"); }
Test(gnix_cancel, cancel_ep_send) { int ret; struct gnix_fid_ep *gnix_ep; struct gnix_fab_req *req; struct fi_cq_err_entry buf; struct gnix_vc *vc; void *foobar_ptr = NULL; gnix_ht_key_t *key; /* simulate a posted request */ gnix_ep = container_of(ep[0], struct gnix_fid_ep, ep_fid); req = _gnix_fr_alloc(gnix_ep); req->msg.send_info[0].send_addr = 0xdeadbeef; req->msg.cum_send_len = req->msg.send_info[0].send_len = 128; req->user_context = foobar_ptr; req->type = GNIX_FAB_RQ_SEND; /* allocate, store vc */ ret = _gnix_vc_alloc(gnix_ep, NULL, &vc); cr_assert(ret == FI_SUCCESS, "_gnix_vc_alloc failed"); key = (gnix_ht_key_t *)&gnix_ep->my_name.gnix_addr; ret = _gnix_ht_insert(gnix_ep->vc_ht, *key, vc); cr_assert(!ret); /* make a dummy request */ fastlock_acquire(&vc->tx_queue_lock); dlist_insert_head(&req->dlist, &vc->tx_queue); fastlock_release(&vc->tx_queue_lock); /* cancel simulated request */ ret = fi_cancel(&ep[0]->fid, foobar_ptr); cr_assert(ret == FI_SUCCESS, "fi_cancel failed"); /* check for event */ ret = fi_cq_readerr(msg_cq[0], &buf, FI_SEND); cr_assert(ret == 1, "did not find one error event"); cr_assert(buf.buf == (void *) 0xdeadbeef, "buffer mismatch"); cr_assert(buf.data == 0, "data mismatch"); cr_assert(buf.err == FI_ECANCELED, "error code mismatch"); cr_assert(buf.prov_errno == FI_ECANCELED, "prov error code mismatch"); cr_assert(buf.len == 128, "length mismatch"); }
Test(gnix_cancel, cancel_ep_no_domain) { int ret; struct gnix_fid_ep *gnix_ep; struct gnix_fid_domain *gnix_dom; /* simulate a disconnected endpoint */ gnix_ep = container_of(ep[0], struct gnix_fid_ep, ep_fid); gnix_dom = gnix_ep->domain; gnix_ep->domain = NULL; /* run test */ ret = fi_cancel(&ep[0]->fid, NULL); cr_assert(ret == -FI_EDOMAIN, "fi_cancel failed"); /* reconnect */ gnix_ep->domain = gnix_dom; }
Test(gnix_cancel, cancel_ep_recv) { int ret; struct fi_cq_err_entry buf; /* simulate a posted request */ ret = fi_recv(ep[0], (void *) 0xdeadbeef, 128, 0, FI_ADDR_UNSPEC, (void *) 0xcafebabe); cr_assert(ret == FI_SUCCESS, "fi_recv failed"); /* cancel simulated request */ ret = fi_cancel(&ep[0]->fid, (void *) 0xcafebabe); cr_assert(ret == FI_SUCCESS, "fi_cancel failed"); /* check for event */ ret = fi_cq_readerr(msg_cq[0], &buf, FI_RECV); cr_assert(ret == 1, "did not find one error event"); cr_assert(buf.buf == (void *) 0xdeadbeef, "buffer mismatch"); cr_assert(buf.data == 0, "data mismatch"); cr_assert(buf.err == FI_ECANCELED, "error code mismatch"); cr_assert(buf.prov_errno == FI_ECANCELED, "prov error code mismatch"); cr_assert(buf.len == 128, "length mismatch"); }