@@ -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