@@ -18,15 +18,22 @@ namespace Microsoft.Extensions.ServiceDiscovery.Yarp.Tests;
18
18
/// </summary>
19
19
public class YarpServiceDiscoveryTests
20
20
{
21
+ private static ServiceDiscoveryDestinationResolver CreateResolver ( IServiceProvider serviceProvider )
22
+ {
23
+ var coreResolver = serviceProvider . GetRequiredService < ServiceEndpointResolver > ( ) ;
24
+ return new ServiceDiscoveryDestinationResolver (
25
+ coreResolver ,
26
+ serviceProvider . GetRequiredService < IOptions < ServiceDiscoveryOptions > > ( ) ) ;
27
+ }
28
+
21
29
[ Fact ]
22
30
public async Task ServiceDiscoveryDestinationResolverTests_PassThrough ( )
23
31
{
24
32
await using var services = new ServiceCollection ( )
25
33
. AddServiceDiscoveryCore ( )
26
34
. AddPassThroughServiceEndpointProvider ( )
27
35
. BuildServiceProvider ( ) ;
28
- var coreResolver = services . GetRequiredService < ServiceEndpointResolver > ( ) ;
29
- var yarpResolver = new ServiceDiscoveryDestinationResolver ( coreResolver , services . GetRequiredService < IOptions < ServiceDiscoveryOptions > > ( ) ) ;
36
+ var yarpResolver = CreateResolver ( services ) ;
30
37
31
38
var destinationConfigs = new Dictionary < string , DestinationConfig >
32
39
{
@@ -57,8 +64,7 @@ public async Task ServiceDiscoveryDestinationResolverTests_Configuration()
57
64
. AddServiceDiscoveryCore ( )
58
65
. AddConfigurationServiceEndpointProvider ( )
59
66
. BuildServiceProvider ( ) ;
60
- var coreResolver = services . GetRequiredService < ServiceEndpointResolver > ( ) ;
61
- var yarpResolver = new ServiceDiscoveryDestinationResolver ( coreResolver , services . GetRequiredService < IOptions < ServiceDiscoveryOptions > > ( ) ) ;
67
+ var yarpResolver = CreateResolver ( services ) ;
62
68
63
69
var destinationConfigs = new Dictionary < string , DestinationConfig >
64
70
{
@@ -88,8 +94,7 @@ public async Task ServiceDiscoveryDestinationResolverTests_Configuration_NonPref
88
94
. AddServiceDiscoveryCore ( )
89
95
. AddConfigurationServiceEndpointProvider ( )
90
96
. BuildServiceProvider ( ) ;
91
- var coreResolver = services . GetRequiredService < ServiceEndpointResolver > ( ) ;
92
- var yarpResolver = new ServiceDiscoveryDestinationResolver ( coreResolver , services . GetRequiredService < IOptions < ServiceDiscoveryOptions > > ( ) ) ;
97
+ var yarpResolver = CreateResolver ( services ) ;
93
98
94
99
var destinationConfigs = new Dictionary < string , DestinationConfig >
95
100
{
@@ -106,6 +111,89 @@ public async Task ServiceDiscoveryDestinationResolverTests_Configuration_NonPref
106
111
a => Assert . Equal ( "http://localhost:1111/" , a ) ) ;
107
112
}
108
113
114
+ [ Theory ]
115
+ [ InlineData ( false ) ]
116
+ [ InlineData ( true ) ]
117
+ public async Task ServiceDiscoveryDestinationResolverTests_Configuration_Host_Value ( bool configHasHost )
118
+ {
119
+ var config = new ConfigurationBuilder ( ) . AddInMemoryCollection ( new Dictionary < string , string ? >
120
+ {
121
+ [ "services:basket:default:0" ] = "https://localhost:1111" ,
122
+ [ "services:basket:default:1" ] = "https://127.0.0.1:2222" ,
123
+ [ "services:basket:default:2" ] = "https://[::1]:3333" ,
124
+ [ "services:basket:default:3" ] = "https://baskets-galore.faketld" ,
125
+ } ) ;
126
+ await using var services = new ServiceCollection ( )
127
+ . AddSingleton < IConfiguration > ( config . Build ( ) )
128
+ . AddServiceDiscoveryCore ( )
129
+ . AddConfigurationServiceEndpointProvider ( )
130
+ . BuildServiceProvider ( ) ;
131
+ var yarpResolver = CreateResolver ( services ) ;
132
+
133
+ var destinationConfigs = new Dictionary < string , DestinationConfig >
134
+ {
135
+ [ "dest-a" ] = new ( )
136
+ {
137
+ Address = "https://basket" ,
138
+ Host = configHasHost ? "my-basket-svc.faketld" : null
139
+ } ,
140
+ } ;
141
+
142
+ var result = await yarpResolver . ResolveDestinationsAsync ( destinationConfigs , CancellationToken . None ) ;
143
+
144
+ Assert . Equal ( 4 , result . Destinations . Count ) ;
145
+ Assert . Collection ( result . Destinations . Values ,
146
+ a =>
147
+ {
148
+ Assert . Equal ( "https://localhost:1111/" , a . Address ) ;
149
+ if ( configHasHost )
150
+ {
151
+ Assert . Equal ( "my-basket-svc.faketld" , a . Host ) ;
152
+ }
153
+ else
154
+ {
155
+ Assert . Null ( a . Host ) ;
156
+ }
157
+ } ,
158
+ a =>
159
+ {
160
+ Assert . Equal ( "https://127.0.0.1:2222/" , a . Address ) ;
161
+ if ( configHasHost )
162
+ {
163
+ Assert . Equal ( "my-basket-svc.faketld" , a . Host ) ;
164
+ }
165
+ else
166
+ {
167
+ Assert . Null ( a . Host ) ;
168
+ }
169
+ } ,
170
+ a =>
171
+ {
172
+ Assert . Equal ( "https://[::1]:3333/" , a . Address ) ;
173
+ if ( configHasHost )
174
+ {
175
+ Assert . Equal ( "my-basket-svc.faketld" , a . Host ) ;
176
+ }
177
+ else
178
+ {
179
+ Assert . Null ( a . Host ) ;
180
+ }
181
+ } ,
182
+ a =>
183
+ {
184
+ Assert . Equal ( "https://baskets-galore.faketld/" , a . Address ) ;
185
+ if ( configHasHost )
186
+ {
187
+ Assert . Equal ( "my-basket-svc.faketld" , a . Host ) ;
188
+ }
189
+ else
190
+ {
191
+ // For non-localhost values, fallback to the input address.
192
+ Assert . Equal ( "basket" , a . Host ) ;
193
+ }
194
+ } ) ;
195
+ }
196
+
109
197
[ Fact ]
110
198
public async Task ServiceDiscoveryDestinationResolverTests_Configuration_DisallowedScheme ( )
111
199
{
@@ -125,8 +213,7 @@ public async Task ServiceDiscoveryDestinationResolverTests_Configuration_Disallo
125
213
} )
126
214
. AddConfigurationServiceEndpointProvider ( )
127
215
. BuildServiceProvider ( ) ;
128
- var coreResolver = services . GetRequiredService < ServiceEndpointResolver > ( ) ;
129
- var yarpResolver = new ServiceDiscoveryDestinationResolver ( coreResolver , services . GetRequiredService < IOptions < ServiceDiscoveryOptions > > ( ) ) ;
216
+ var yarpResolver = CreateResolver ( services ) ;
130
217
131
218
var destinationConfigs = new Dictionary < string , DestinationConfig >
132
219
{
@@ -149,8 +236,7 @@ public async Task ServiceDiscoveryDestinationResolverTests_Dns()
149
236
. AddServiceDiscoveryCore ( )
150
237
. AddDnsServiceEndpointProvider ( )
151
238
. BuildServiceProvider ( ) ;
152
- var coreResolver = services . GetRequiredService < ServiceEndpointResolver > ( ) ;
153
- var yarpResolver = new ServiceDiscoveryDestinationResolver ( coreResolver , services . GetRequiredService < IOptions < ServiceDiscoveryOptions > > ( ) ) ;
239
+ var yarpResolver = CreateResolver ( services ) ;
154
240
155
241
var destinationConfigs = new Dictionary < string , DestinationConfig >
156
242
{
@@ -209,8 +295,7 @@ public async Task ServiceDiscoveryDestinationResolverTests_DnsSrv()
209
295
. AddServiceDiscoveryCore ( )
210
296
. AddDnsSrvServiceEndpointProvider ( options => options . QuerySuffix = ".ns" )
211
297
. BuildServiceProvider ( ) ;
212
- var coreResolver = services . GetRequiredService < ServiceEndpointResolver > ( ) ;
213
- var yarpResolver = new ServiceDiscoveryDestinationResolver ( coreResolver , services . GetRequiredService < IOptions < ServiceDiscoveryOptions > > ( ) ) ;
298
+ var yarpResolver = CreateResolver ( services ) ;
214
299
215
300
var destinationConfigs = new Dictionary < string , DestinationConfig >
216
301
{
0 commit comments