1616
1717namespace DotNetCore . CAP . Test ;
1818
19- public class DispatcherTests
19+ public class DispatcherTests
2020{
2121 private readonly ILogger < Dispatcher > _logger ;
2222 private readonly ISubscribeExecutor _executor ;
@@ -41,22 +41,22 @@ public async Task EnqueueToPublish_ShouldInvokeSend_WhenParallelSendDisabled()
4141 SubscriberParallelExecuteThreadCount = 2 ,
4242 SubscriberParallelExecuteBufferFactor = 2
4343 } ) ;
44-
44+
4545 var dispatcher = new Dispatcher ( _logger , sender , options , _executor , _storage ) ;
4646
4747 using var cts = new CancellationTokenSource ( ) ;
4848 var messageId = "testId" ;
49-
49+
5050 // Act
5151 await dispatcher . Start ( cts . Token ) ;
5252 await dispatcher . EnqueueToPublish ( CreateTestMessage ( messageId ) ) ;
5353 await cts . CancelAsync ( ) ;
54-
54+
5555 // Assert
5656 sender . Count . Should ( ) . Be ( 1 ) ;
5757 sender . ReceivedMessages . First ( ) . DbId . Should ( ) . Be ( messageId ) ;
5858 }
59-
59+
6060 [ Fact ]
6161 public async Task EnqueueToPublish_ShouldBeThreadSafe_WhenParallelSendDisabled ( )
6262 {
@@ -150,18 +150,88 @@ public async Task EnqueueToScheduler_ShouldSendMessagesInCorrectOrder_WhenEarlie
150150 // Act
151151 await dispatcher . Start ( cts . Token ) ;
152152 var dateTime = DateTime . Now ;
153-
153+
154154 await dispatcher . EnqueueToScheduler ( messages [ 0 ] , dateTime . AddSeconds ( 1 ) ) ;
155155 await dispatcher . EnqueueToScheduler ( messages [ 1 ] , dateTime . AddMilliseconds ( 200 ) ) ;
156156 await dispatcher . EnqueueToScheduler ( messages [ 2 ] , dateTime . AddMilliseconds ( 100 ) ) ;
157157
158158 await Task . Delay ( 1200 , CancellationToken . None ) ;
159159 await cts . CancelAsync ( ) ;
160-
160+
161+ // Assert
162+ sender . ReceivedMessages . Select ( m => m . DbId ) . Should ( ) . Equal ( [ "3" , "2" , "1" ] ) ;
163+ }
164+
165+ [ Fact ]
166+ public async Task EnqueueToScheduler_ShouldBeThreadSafe_WhenDelayLessThenMinuteAndParallelSendEnabled ( )
167+ {
168+ // Arrange
169+ var sender = new TestThreadSafeMessageSender ( ) ;
170+ var options = Options . Create ( new CapOptions
171+ {
172+ EnableSubscriberParallelExecute = false ,
173+ EnablePublishParallelSend = true ,
174+ SubscriberParallelExecuteThreadCount = 2 ,
175+ SubscriberParallelExecuteBufferFactor = 2
176+ } ) ;
177+ var dispatcher = new Dispatcher ( _logger , sender , options , _executor , _storage ) ;
178+
179+ using var cts = new CancellationTokenSource ( ) ;
180+ var messages = Enumerable . Range ( 1 , 10000 )
181+ . Select ( i => CreateTestMessage ( i . ToString ( ) ) )
182+ . ToArray ( ) ;
183+
184+ // Act
185+ await dispatcher . Start ( cts . Token ) ;
186+ var dateTime = DateTime . Now . AddMilliseconds ( 50 ) ;
187+ await Parallel . ForEachAsync ( messages , CancellationToken . None ,
188+ async ( m , ct ) => { await dispatcher . EnqueueToScheduler ( m , dateTime ) ; } ) ;
189+
190+ await Task . Delay ( 3000 , CancellationToken . None ) ;
191+
192+ await cts . CancelAsync ( ) ;
193+
194+ // Assert
195+ sender . Count . Should ( ) . Be ( 10000 ) ;
196+
197+ var receivedMessages = sender . ReceivedMessages . Select ( m => m . DbId ) . Order ( ) . ToList ( ) ;
198+ var expected = messages . Select ( m => m . DbId ) . Order ( ) . ToList ( ) ;
199+ expected . Should ( ) . Equal ( receivedMessages ) ;
200+ }
201+
202+ [ Fact ]
203+ public async Task EnqueueToScheduler_ShouldSendMessagesInCorrectOrder_WhenParallelSendEnabled ( )
204+ {
205+ // Arrange
206+ var sender = new TestThreadSafeMessageSender ( ) ;
207+ var options = Options . Create ( new CapOptions
208+ {
209+ EnableSubscriberParallelExecute = true ,
210+ EnablePublishParallelSend = true ,
211+ SubscriberParallelExecuteThreadCount = 2 ,
212+ SubscriberParallelExecuteBufferFactor = 2 ,
213+ } ) ;
214+ var dispatcher = new Dispatcher ( _logger , sender , options , _executor , _storage ) ;
215+
216+ using var cts = new CancellationTokenSource ( ) ;
217+ var messages = Enumerable . Range ( 1 , 3 )
218+ . Select ( i => CreateTestMessage ( i . ToString ( ) ) )
219+ . ToArray ( ) ;
220+
221+ // Act
222+ await dispatcher . Start ( cts . Token ) ;
223+ var dateTime = DateTime . Now ;
224+
225+ await dispatcher . EnqueueToScheduler ( messages [ 0 ] , dateTime . AddSeconds ( 1 ) ) ;
226+ await dispatcher . EnqueueToScheduler ( messages [ 1 ] , dateTime . AddMilliseconds ( 200 ) ) ;
227+ await dispatcher . EnqueueToScheduler ( messages [ 2 ] , dateTime . AddMilliseconds ( 100 ) ) ;
228+
229+ await Task . Delay ( 1200 , CancellationToken . None ) ;
230+ await cts . CancelAsync ( ) ;
231+
161232 // Assert
162233 sender . ReceivedMessages . Select ( m => m . DbId ) . Should ( ) . Equal ( [ "3" , "2" , "1" ] ) ;
163234 }
164-
165235
166236 private MediumMessage CreateTestMessage ( string id = "1" )
167237 {
0 commit comments