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