@@ -144,6 +144,43 @@ public async Task PickAsync_WaitForReadyWithDrop_ThrowsError()
144
144
Assert . AreEqual ( StatusCode . DataLoss , ex . StatusCode ) ;
145
145
}
146
146
147
+ [ Test ]
148
+ public async Task PickAsync_ErrorConnectingToSubchannel_ThrowsError ( )
149
+ {
150
+ // Arrange
151
+ var services = new ServiceCollection ( ) ;
152
+ services . AddNUnitLogger ( ) ;
153
+ var serviceProvider = services . BuildServiceProvider ( ) ;
154
+ var loggerFactory = serviceProvider . GetRequiredService < ILoggerFactory > ( ) ;
155
+
156
+ var resolver = new TestResolver ( loggerFactory ) ;
157
+ resolver . UpdateAddresses ( new List < BalancerAddress >
158
+ {
159
+ new BalancerAddress ( "localhost" , 80 )
160
+ } ) ;
161
+
162
+ var transportFactory = new TestSubchannelTransportFactory ( ( s , c ) =>
163
+ {
164
+ return Task . FromException < ConnectivityState > ( new Exception ( "Test error!" ) ) ;
165
+ } ) ;
166
+ var clientChannel = CreateConnectionManager ( loggerFactory , resolver , transportFactory ) ;
167
+ clientChannel . ConfigureBalancer ( c => new PickFirstBalancer ( c , loggerFactory ) ) ;
168
+
169
+ // Act
170
+ _ = clientChannel . ConnectAsync ( waitForReady : false , CancellationToken . None ) . ConfigureAwait ( false ) ;
171
+
172
+ var pickTask = clientChannel . PickAsync (
173
+ new PickContext { Request = new HttpRequestMessage ( ) } ,
174
+ waitForReady : false ,
175
+ CancellationToken . None ) . AsTask ( ) ;
176
+
177
+ // Assert
178
+ var ex = await ExceptionAssert . ThrowsAsync < RpcException > ( ( ) => pickTask ) . DefaultTimeout ( ) ;
179
+ Assert . AreEqual ( StatusCode . Unavailable , ex . StatusCode ) ;
180
+ Assert . AreEqual ( "Error connecting to subchannel." , ex . Status . Detail ) ;
181
+ Assert . AreEqual ( "Test error!" , ex . Status . DebugException ? . Message ) ;
182
+ }
183
+
147
184
[ Test ]
148
185
public async Task PickAsync_RetryWithDrop_ThrowsError ( )
149
186
{
0 commit comments