@@ -217,7 +217,7 @@ public void NameAndDisplayNameDifferent_MultipleInstances_ReturnName()
217217
218218 private static bool TryResolvePeerName ( IDictionary < string , ResourceViewModel > resources , KeyValuePair < string , string > [ ] attributes , out string ? peerName )
219219 {
220- return ResourceOutgoingPeerResolver . TryResolvePeerNameCore ( resources , attributes , out peerName , out _ ) ;
220+ return ResourceOutgoingPeerResolver . TryResolvePeerCore ( resources , attributes , out peerName , out _ ) ;
221221 }
222222
223223 [ Fact ]
@@ -357,6 +357,117 @@ private static ResourceViewModel CreateResourceWithParameterValue(string name, s
357357 properties : properties ) ;
358358 }
359359
360+ [ Fact ]
361+ public void MultipleResourcesMatch_SqlServerAddresses_ReturnsFalse ( )
362+ {
363+ // Arrange - Multiple SQL Server resources with same address
364+ var resources = new Dictionary < string , ResourceViewModel >
365+ {
366+ [ "sqlserver1" ] = CreateResource ( "sqlserver1" , "localhost" , 1433 ) ,
367+ [ "sqlserver2" ] = CreateResource ( "sqlserver2" , "localhost" , 1433 )
368+ } ;
369+
370+ // Act & Assert - Both resources would match "localhost:1433"
371+ // so this should return false (ambiguous match)
372+ Assert . False ( TryResolvePeerName ( resources , [ KeyValuePair . Create ( "peer.service" , "localhost:1433" ) ] , out var name ) ) ;
373+ Assert . Null ( name ) ;
374+ }
375+
376+ [ Fact ]
377+ public void MultipleResourcesMatch_RedisAddresses_ReturnsFalse ( )
378+ {
379+ // Arrange - Multiple Redis resources with equivalent addresses
380+ var resources = new Dictionary < string , ResourceViewModel >
381+ {
382+ [ "redis-cache" ] = CreateResource ( "redis-cache" , "localhost" , 6379 ) ,
383+ [ "redis-session" ] = CreateResource ( "redis-session" , "localhost" , 6379 )
384+ } ;
385+
386+ // Act & Assert - Both resources would match "localhost:6379"
387+ // so this should return false (ambiguous match)
388+ Assert . False ( TryResolvePeerName ( resources , [ KeyValuePair . Create ( "peer.service" , "localhost:6379" ) ] , out var name ) ) ;
389+ Assert . Null ( name ) ;
390+ }
391+
392+ [ Fact ]
393+ public void MultipleResourcesMatch_SqlServerCommaFormat_ReturnsFalse ( )
394+ {
395+ // Arrange - Multiple SQL Server resources where comma format would match both
396+ var resources = new Dictionary < string , ResourceViewModel >
397+ {
398+ [ "sqldb1" ] = CreateResource ( "sqldb1" , "localhost" , 1433 ) ,
399+ [ "sqldb2" ] = CreateResource ( "sqldb2" , "localhost" , 1433 )
400+ } ;
401+
402+ // Act & Assert - SQL Server comma format "localhost,1433" should match both resources
403+ // so this should return false (ambiguous match)
404+ Assert . False ( TryResolvePeerName ( resources , [ KeyValuePair . Create ( "peer.service" , "localhost,1433" ) ] , out var name ) ) ;
405+ Assert . Null ( name ) ;
406+ }
407+
408+ [ Fact ]
409+ public void MultipleResourcesMatch_MixedPortFormats_ReturnsFalse ( )
410+ {
411+ // Arrange - Resources with same logical address but different port formats
412+ var resources = new Dictionary < string , ResourceViewModel >
413+ {
414+ [ "db-primary" ] = CreateResource ( "db-primary" , "dbserver" , 5432 ) ,
415+ [ "db-replica" ] = CreateResource ( "db-replica" , "dbserver" , 5432 )
416+ } ;
417+
418+ // Act & Assert - Should be ambiguous since both resources have same address
419+ Assert . False ( TryResolvePeerName ( resources , [ KeyValuePair . Create ( "server.address" , "dbserver" ) , KeyValuePair . Create ( "server.port" , "5432" ) ] , out var name ) ) ;
420+ Assert . Null ( name ) ;
421+ }
422+
423+ [ Fact ]
424+ public void MultipleResourcesMatch_AddressTransformation_ReturnsFalse ( )
425+ {
426+ // Arrange - Multiple resources with exact same address (not just after transformation)
427+ var resources = new Dictionary < string , ResourceViewModel >
428+ {
429+ [ "web-frontend" ] = CreateResource ( "web-frontend" , "localhost" , 8080 ) ,
430+ [ "web-backend" ] = CreateResource ( "web-backend" , "localhost" , 8080 )
431+ } ;
432+
433+ // Act & Assert - Both resources have identical cached address "localhost:8080"
434+ // so this should return false (ambiguous match)
435+ Assert . False ( TryResolvePeerName ( resources , [ KeyValuePair . Create ( "peer.service" , "localhost:8080" ) ] , out var name ) ) ;
436+ Assert . Null ( name ) ;
437+ }
438+
439+ [ Fact ]
440+ public void MultipleResourcesMatch_ViaTransformation_ReturnsFirstMatch ( )
441+ {
442+ // Arrange - Resources that become ambiguous after address transformation
443+ // Note: This test documents current behavior where transformation order matters
444+ var resources = new Dictionary < string , ResourceViewModel >
445+ {
446+ [ "sql-primary" ] = CreateResource ( "sql-primary" , "localhost" , 1433 ) ,
447+ [ "sql-replica" ] = CreateResource ( "sql-replica" , "127.0.0.1" , 1433 )
448+ } ;
449+
450+ // Act & Assert - Due to transformation order, this currently finds sql-replica first
451+ // before the transformation that would make sql-primary match as well
452+ Assert . True ( TryResolvePeerName ( resources , [ KeyValuePair . Create ( "peer.service" , "127.0.0.1:1433" ) ] , out var name ) ) ;
453+ Assert . Equal ( "sql-replica" , name ) ;
454+ }
455+
456+ [ Fact ]
457+ public void SingleResourceAfterTransformation_ReturnsTrue ( )
458+ {
459+ // Arrange - Only one resource that matches after address transformation
460+ var resources = new Dictionary < string , ResourceViewModel >
461+ {
462+ [ "unique-service" ] = CreateResource ( "unique-service" , "localhost" , 8080 ) ,
463+ [ "other-service" ] = CreateResource ( "other-service" , "remotehost" , 9090 )
464+ } ;
465+
466+ // Act & Assert - Only the first resource should match "127.0.0.1:8080" after transformation
467+ Assert . True ( TryResolvePeerName ( resources , [ KeyValuePair . Create ( "peer.service" , "127.0.0.1:8080" ) ] , out var name ) ) ;
468+ Assert . Equal ( "unique-service" , name ) ;
469+ }
470+
360471 private sealed class MockDashboardClient ( Task < ResourceViewModelSubscription > subscribeResult ) : IDashboardClient
361472 {
362473 public bool IsEnabled => true ;
0 commit comments