@@ -310,7 +310,7 @@ void testGetAttemptAttributes_destinationResourceId() {
310310 ApiTracerContext context =
311311 ApiTracerContext .newBuilder ()
312312 .setLibraryMetadata (LibraryMetadata .empty ())
313- .setDestinationResourceId ( "projects/123/instances/abc" )
313+ .setDestinationResourceIdSupplier (() -> "projects/123/instances/abc" )
314314 .build ();
315315 Map <String , Object > attributes = context .getAttemptAttributes ();
316316
@@ -383,13 +383,13 @@ void testMerge_destinationResourceId() {
383383 ApiTracerContext context1 =
384384 ApiTracerContext .newBuilder ()
385385 .setLibraryMetadata (LibraryMetadata .empty ())
386- .setDestinationResourceId ( "name1" )
386+ .setDestinationResourceIdSupplier (() -> "name1" )
387387 .build ();
388388
389389 ApiTracerContext context2 =
390390 ApiTracerContext .newBuilder ()
391391 .setLibraryMetadata (LibraryMetadata .empty ())
392- .setDestinationResourceId ( "name2" )
392+ .setDestinationResourceIdSupplier (() -> "name2" )
393393 .build ();
394394
395395 ApiTracerContext merged = context1 .merge (context2 );
@@ -434,4 +434,121 @@ void testMerge_httpFields() {
434434 assertThat (merged .httpMethod ()).isEqualTo ("GET" );
435435 assertThat (merged .httpPathTemplate ()).isEqualTo ("v1/projects/{project}" );
436436 }
437+
438+ @ Test
439+ void testDestinationResourceId_withUrlDomain () {
440+ ApiTracerContext context =
441+ ApiTracerContext .newBuilder ()
442+ .setLibraryMetadata (LibraryMetadata .empty ())
443+ .setUrlDomain ("compute.googleapis.com" )
444+ .setDestinationResourceIdSupplier (() -> "projects/my-project/locations/us-central1" )
445+ .build ();
446+
447+ assertThat (context .destinationResourceId ())
448+ .isEqualTo ("//compute.googleapis.com/projects/my-project/locations/us-central1" );
449+ }
450+
451+ @ Test
452+ void testDestinationResourceId_withoutUrlDomain () {
453+ ApiTracerContext context =
454+ ApiTracerContext .newBuilder ()
455+ .setLibraryMetadata (LibraryMetadata .empty ())
456+ .setDestinationResourceIdSupplier (() -> "projects/my-project/locations/us-central1" )
457+ .build ();
458+
459+ assertThat (context .destinationResourceId ())
460+ .isEqualTo ("projects/my-project/locations/us-central1" );
461+ }
462+
463+ @ Test
464+ void testWithResourceNameExtraction_nullExtractor () {
465+ ApiTracerContext context = ApiTracerContext .empty ();
466+ ApiTracerContext result = context .withResourceNameExtraction ("request" , null );
467+ assertThat (result ).isSameInstanceAs (context );
468+ }
469+
470+ @ Test
471+ void testWithResourceNameExtraction_extractorReturnsNull () {
472+ ApiTracerContext context = ApiTracerContext .empty ();
473+ ApiTracerContext result = context .withResourceNameExtraction ("request" , req -> null );
474+ assertThat (result .destinationResourceId ()).isNull ();
475+ }
476+
477+ @ Test
478+ void testWithResourceNameExtraction_lazyExtraction () {
479+ ApiTracerContext context = ApiTracerContext .empty ();
480+ boolean [] extracted = {false };
481+ ApiTracerContext result =
482+ context .withResourceNameExtraction (
483+ "request" ,
484+ req -> {
485+ extracted [0 ] = true ;
486+ return "extracted-id" ;
487+ });
488+
489+ assertThat (extracted [0 ]).isFalse (); // Should be lazily evaluated
490+ assertThat (result .destinationResourceId ()).isEqualTo ("extracted-id" );
491+ assertThat (extracted [0 ]).isTrue ();
492+ }
493+
494+ @ Test
495+ void testWithResourceNameExtraction_extractorThrowsException () {
496+ ApiTracerContext context = ApiTracerContext .empty ();
497+ ApiTracerContext result =
498+ context .withResourceNameExtraction (
499+ "request" ,
500+ req -> {
501+ throw new RuntimeException ("Intentional mock extraction failure" );
502+ });
503+
504+ assertThat (result .destinationResourceId ()).isNull ();
505+ }
506+
507+ @ Test
508+ void testDestinationResourceId_emptyIdWithUrlDomain () {
509+ ApiTracerContext context =
510+ ApiTracerContext .newBuilder ()
511+ .setLibraryMetadata (LibraryMetadata .empty ())
512+ .setUrlDomain ("compute.googleapis.com" )
513+ .setDestinationResourceIdSupplier (() -> "" )
514+ .build ();
515+
516+ assertThat (context .destinationResourceId ()).isNull ();
517+ }
518+
519+ @ Test
520+ void testMerge_preservesLaziness () {
521+ ApiTracerContext context1 = ApiTracerContext .empty ();
522+ boolean [] extracted = {false };
523+ ApiTracerContext context2 =
524+ ApiTracerContext .empty ()
525+ .withResourceNameExtraction (
526+ "request" ,
527+ req -> {
528+ extracted [0 ] = true ;
529+ return "lazy-id" ;
530+ });
531+
532+ ApiTracerContext merged = context1 .merge (context2 );
533+ assertThat (extracted [0 ]).isFalse (); // Should not be evaluated during merge
534+ assertThat (merged .destinationResourceId ()).isEqualTo ("lazy-id" );
535+ assertThat (extracted [0 ]).isTrue (); // Evaluated upon calling getter
536+ }
537+
538+ @ Test
539+ void testDestinationResourceId_evaluatedEveryTime () {
540+ ApiTracerContext context = ApiTracerContext .empty ();
541+ int [] counter = {0 };
542+ ApiTracerContext result =
543+ context .withResourceNameExtraction (
544+ "request" ,
545+ req -> {
546+ counter [0 ]++;
547+ return "extracted-id-" + counter [0 ];
548+ });
549+
550+ assertThat (result .destinationResourceId ()).isEqualTo ("extracted-id-1" );
551+ assertThat (result .destinationResourceId ()).isEqualTo ("extracted-id-2" );
552+ assertThat (counter [0 ]).isEqualTo (2 );
553+ }
437554}
0 commit comments