@@ -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+
716831struct 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