Skip to content

Commit 77a2f6a

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 c1630db commit 77a2f6a

File tree

1 file changed

+115
-0
lines changed

1 file changed

+115
-0
lines changed

fabtests/unit/av_test.c

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

0 commit comments

Comments
 (0)