Skip to content

Commit f7cd052

Browse files
committed
fabtests/unit: Add negative testing for fi_av_lookup
Premise: AV opened with num_good_addr + 1 Insert num_good_addr addresses so 0->num_good_addr-1 are taken Negative Tests: Case 1: Lookup addr of non-inserted location in opened range Lookup fi_addr num_good_addr Expected Result: -EINVAL Case 2: Lookup addr outside of av_open range Lookup fi_addr num_good_addr + 32 Expected Result: -EINVAL Case 3: Lookup fi_addr UINT_MAX Expected Result: -EINVAL Case 4: Remove an addr and then lookup its location Remove fi_addr 0 -> lookup fi_addr 0 Expected Result: -EINVAL Signed-off-by: Zach Dworkin <[email protected]>
1 parent eb17e78 commit f7cd052

File tree

1 file changed

+118
-0
lines changed

1 file changed

+118
-0
lines changed

fabtests/unit/av_test.c

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -713,6 +713,121 @@ av_lookup_good(void)
713713
return TEST_RET_VAL(ret, testret);
714714
}
715715

716+
static int
717+
av_lookup_bad(void)
718+
{
719+
int testret;
720+
int ret;
721+
int i;
722+
struct fid_av *av = NULL;
723+
struct fi_av_attr attr;
724+
uint8_t addrbuf[4096];
725+
size_t buflen;
726+
uint8_t lookup_buf[4096];
727+
size_t lookup_len;
728+
fi_addr_t *fi_addr;
729+
730+
testret = FAIL;
731+
732+
fi_addr = calloc(num_good_addr, sizeof(fi_addr_t));
733+
if (!fi_addr) {
734+
sprintf(err_buf, "malloc fi_addr failed");
735+
ret = -FI_ENOMEM;
736+
goto fail;
737+
}
738+
739+
memset(&attr, 0, sizeof(attr));
740+
attr.type = av_type;
741+
attr.count = num_good_addr + 1;
742+
743+
av = NULL;
744+
ret = fi_av_open(domain, &attr, &av, NULL);
745+
if (ret != 0) {
746+
sprintf(err_buf, "fi_av_open(%s) = %d, %s",
747+
fi_tostr(&av_type, FI_TYPE_AV_TYPE), ret,
748+
fi_strerror(-ret));
749+
goto fail;
750+
}
751+
752+
for (i = 0; i < num_good_addr + 1; i++)
753+
fi_addr[i] = FI_ADDR_NOTAVAIL;
754+
755+
buflen = sizeof(addrbuf);
756+
ret = av_create_address_list(good_address, 0, num_good_addr, addrbuf, 0,
757+
buflen);
758+
if (ret < 0)
759+
goto fail;
760+
761+
ret = fi_av_insert(av, addrbuf, num_good_addr, fi_addr, 0, NULL);
762+
if (ret != num_good_addr) {
763+
sprintf(err_buf, "fi_av_insert ret=%d, %s", ret,
764+
fi_strerror(-ret));
765+
goto fail;
766+
}
767+
768+
for (i = 0; i < num_good_addr; i++) {
769+
if (fi_addr[i] == FI_ADDR_NOTAVAIL) {
770+
sprintf(err_buf, "fi_av_insert failed ret=%d, %s", ret,
771+
fi_strerror(-ret));
772+
}
773+
}
774+
775+
/* case 1: lookup addr of non-inserted location in av open range */
776+
memset(lookup_buf, 0, sizeof(lookup_buf));
777+
lookup_len = sizeof(lookup_buf);
778+
ret = fi_av_lookup(av, (fi_addr_t) num_good_addr, &lookup_buf,
779+
&lookup_len);
780+
if (ret >= 0) {
781+
sprintf(err_buf, "fi_av_lookup of non-inserted location "
782+
"ret=%d, should be < 0", ret);
783+
goto fail;
784+
}
785+
786+
/* case 2: lookup addr outside of av open range */
787+
memset(lookup_buf, 0, sizeof(lookup_buf));
788+
lookup_len = sizeof(lookup_buf);
789+
ret = fi_av_lookup(av, (fi_addr_t) (num_good_addr + 32), &lookup_buf,
790+
&lookup_len);
791+
if (ret >= 0) {
792+
sprintf(err_buf, "fi_av_lookup addr outside of range ret=%d, "
793+
"should be < 0", ret);
794+
goto fail;
795+
}
796+
797+
/* case 3: lookup UINT_MAX*/
798+
memset(lookup_buf, 0, sizeof(lookup_buf));
799+
lookup_len = sizeof(lookup_buf);
800+
ret = fi_av_lookup(av, (fi_addr_t) UINT64_MAX, &lookup_buf,
801+
&lookup_len);
802+
if (ret >= 0) {
803+
sprintf(err_buf, "fi_av_lookup of UINT64_MAX ret=%d, should "
804+
"be < 0", ret);
805+
goto fail;
806+
}
807+
808+
/* case 4: remove an addr and then lookup its location */
809+
memset(lookup_buf, 0, sizeof(lookup_buf));
810+
lookup_len = sizeof(lookup_buf);
811+
ret = fi_av_remove(av, &fi_addr[0], 1, 0);
812+
if (ret != FI_SUCCESS) {
813+
sprintf(err_buf, "fi_av_remove ret=%d, %s", ret,
814+
fi_strerror(-ret));
815+
goto fail;
816+
}
817+
ret = fi_av_lookup(av, 0, &lookup_buf, &lookup_len);
818+
if (ret >= 0) {
819+
sprintf(err_buf, "fi_av_lookup of removed addr ret=%d, "
820+
"should be < 0", ret);
821+
goto fail;
822+
}
823+
824+
testret = PASS;
825+
fail:
826+
FT_CLOSE_FID(av);
827+
free(fi_addr);
828+
return TEST_RET_VAL(ret, testret);
829+
}
830+
716831
struct test_entry test_array_good[] = {
717832
TEST_ENTRY(av_open_close, "Test open and close AVs of varying sizes"),
718833
TEST_ENTRY(av_good, "Test AV insert with good address"),
@@ -728,6 +843,9 @@ struct test_entry test_array_bad[] = {
728843
"Test AV insert of 1 good and 1 bad address"),
729844
TEST_ENTRY(av_goodbad_vector_sync_err,
730845
"Test AV insert of 1 good, 1 bad address using FI_SYNC_ERR"),
846+
TEST_ENTRY(av_lookup_bad,
847+
"Test lookup of address not in AV after inserting good "
848+
"addresses"),
731849
{ NULL, "" }
732850
};
733851

0 commit comments

Comments
 (0)