@@ -141,8 +141,9 @@ async Task<HelloReply> UnaryMethod(HelloRequest request, ServerCallContext conte
141
141
await ExceptionAssert . ThrowsAsync < OperationCanceledException > ( ( ) => connectTask ) . DefaultTimeout ( ) ;
142
142
}
143
143
144
- [ Test ]
145
- public async Task Active_UnaryCall_ConnectionIdleTimeout_SocketRecreated ( )
144
+ [ TestCase ( 0 ) ] // TimeSpan.Zero
145
+ [ TestCase ( 1000 ) ] // 1 second
146
+ public async Task Active_UnaryCall_ConnectionIdleTimeout_SocketRecreated ( int milliseconds )
146
147
{
147
148
// Ignore errors
148
149
SetExpectedErrorsFilter ( writeContext =>
@@ -158,7 +159,7 @@ Task<HelloReply> UnaryMethod(HelloRequest request, ServerCallContext context)
158
159
// Arrange
159
160
using var endpoint = BalancerHelpers . CreateGrpcEndpoint < HelloRequest , HelloReply > ( 50051 , UnaryMethod , nameof ( UnaryMethod ) , loggerFactory : LoggerFactory ) ;
160
161
161
- var connectionIdleTimeout = TimeSpan . FromSeconds ( 1 ) ;
162
+ var connectionIdleTimeout = TimeSpan . FromMilliseconds ( milliseconds ) ;
162
163
var channel = await BalancerHelpers . CreateChannel (
163
164
LoggerFactory ,
164
165
new PickFirstConfig ( ) ,
@@ -168,18 +169,52 @@ Task<HelloReply> UnaryMethod(HelloRequest request, ServerCallContext context)
168
169
Logger . LogInformation ( "Connecting channel." ) ;
169
170
await channel . ConnectAsync ( ) ;
170
171
171
- await Task . Delay ( connectionIdleTimeout ) ;
172
+ // Wait for timeout plus a little extra to avoid issues from imprecise timers.
173
+ await Task . Delay ( connectionIdleTimeout + TimeSpan . FromMilliseconds ( 50 ) ) ;
172
174
173
175
var client = TestClientFactory . Create ( channel , endpoint . Method ) ;
174
176
var response = await client . UnaryCall ( new HelloRequest { Name = "Test!" } ) . ResponseAsync . DefaultTimeout ( ) ;
175
177
176
178
// Assert
177
179
Assert . AreEqual ( "Test!" , response . Message ) ;
178
180
179
- AssertHasLog ( LogLevel . Debug , "ClosingSocketFromIdleTimeoutOnCreateStream" , "Subchannel id '1' socket 127.0.0.1:50051 is being closed because it exceeds the idle timeout of 00:00:01." ) ;
181
+ AssertHasLog ( LogLevel . Debug , "ClosingSocketFromIdleTimeoutOnCreateStream" ) ;
180
182
AssertHasLog ( LogLevel . Trace , "ConnectingOnCreateStream" , "Subchannel id '1' doesn't have a connected socket available. Connecting new stream socket for 127.0.0.1:50051." ) ;
181
183
}
182
184
185
+ public async Task Active_UnaryCall_InfiniteConnectionIdleTimeout_SocketNotClosed ( )
186
+ {
187
+ SetExpectedErrorsFilter ( writeContext =>
188
+ {
189
+ return true ;
190
+ } ) ;
191
+
192
+ Task < HelloReply > UnaryMethod ( HelloRequest request , ServerCallContext context )
193
+ {
194
+ return Task . FromResult ( new HelloReply { Message = request . Name } ) ;
195
+ }
196
+
197
+ // Arrange
198
+ using var endpoint = BalancerHelpers . CreateGrpcEndpoint < HelloRequest , HelloReply > ( 50051 , UnaryMethod , nameof ( UnaryMethod ) , loggerFactory : LoggerFactory ) ;
199
+
200
+ var channel = await BalancerHelpers . CreateChannel (
201
+ LoggerFactory ,
202
+ new PickFirstConfig ( ) ,
203
+ new [ ] { endpoint . Address } ,
204
+ connectionIdleTimeout : Timeout . InfiniteTimeSpan ) . DefaultTimeout ( ) ;
205
+
206
+ Logger . LogInformation ( "Connecting channel." ) ;
207
+ await channel . ConnectAsync ( ) ;
208
+
209
+ var client = TestClientFactory . Create ( channel , endpoint . Method ) ;
210
+ var response = await client . UnaryCall ( new HelloRequest { Name = "Test!" } ) . ResponseAsync . DefaultTimeout ( ) ;
211
+
212
+ // Assert
213
+ Assert . AreEqual ( "Test!" , response . Message ) ;
214
+
215
+ Assert . IsFalse ( Logs . Any ( l => l . EventId . Name == "ClosingSocketFromIdleTimeoutOnCreateStream" ) , "Shouldn't have a ClosingSocketFromIdleTimeoutOnCreateStream log." ) ;
216
+ }
217
+
183
218
[ Test ]
184
219
public async Task Active_UnaryCall_ServerCloseOnKeepAlive_SocketRecreatedOnRequest ( )
185
220
{
0 commit comments