@@ -90,23 +90,23 @@ public async void ConsumerStoreOffset()
90
90
var config = new StreamSystemConfig ( ) ;
91
91
var system = await StreamSystem . Create ( config ) ;
92
92
await system . CreateStream ( new StreamSpec ( stream ) ) ;
93
- const int numberOfMessages = 10 ;
94
- await SystemUtils . PublishMessages ( system , stream , numberOfMessages , testOutputHelper ) ;
93
+ const int NumberOfMessages = 10 ;
94
+ await SystemUtils . PublishMessages ( system , stream , NumberOfMessages , testOutputHelper ) ;
95
95
var count = 0 ;
96
96
var consumer = await system . CreateRawConsumer (
97
97
new RawConsumerConfig ( stream )
98
98
{
99
99
Reference = "consumer_offset" ,
100
100
OffsetSpec = new OffsetTypeFirst ( ) ,
101
- MessageHandler = async ( consumer , ctx , message ) =>
101
+ MessageHandler = async ( consumer , ctx , _ ) =>
102
102
{
103
103
testOutputHelper . WriteLine ( $ "ConsumerStoreOffset receiving.. { count } ") ;
104
104
count ++ ;
105
- if ( count == numberOfMessages )
105
+ if ( count == NumberOfMessages )
106
106
{
107
107
await consumer . StoreOffset ( ctx . Offset ) ;
108
108
testOutputHelper . WriteLine ( $ "ConsumerStoreOffset done: { count } ") ;
109
- testPassed . SetResult ( numberOfMessages ) ;
109
+ testPassed . SetResult ( NumberOfMessages ) ;
110
110
}
111
111
112
112
await Task . CompletedTask ;
@@ -122,7 +122,7 @@ public async void ConsumerStoreOffset()
122
122
var client = await Client . Create ( clientParameters ) ;
123
123
var offset = await client . QueryOffset ( "consumer_offset" , stream ) ;
124
124
// The offset must be numberOfMessages less one
125
- Assert . Equal ( offset . Offset , Convert . ToUInt64 ( numberOfMessages - 1 ) ) ;
125
+ Assert . Equal ( offset . Offset , Convert . ToUInt64 ( NumberOfMessages - 1 ) ) ;
126
126
await consumer . Close ( ) ;
127
127
await system . DeleteStream ( stream ) ;
128
128
await system . Close ( ) ;
@@ -456,33 +456,33 @@ public async void ConsumerQueryOffset()
456
456
var config = new StreamSystemConfig ( ) ;
457
457
var system = await StreamSystem . Create ( config ) ;
458
458
await system . CreateStream ( new StreamSpec ( stream ) ) ;
459
- const int numberOfMessages = 10 ;
460
- const int numberOfMessagesToStore = 4 ;
461
- await SystemUtils . PublishMessages ( system , stream , numberOfMessages , testOutputHelper ) ;
459
+ const int NumberOfMessages = 10 ;
460
+ const int NumberOfMessagesToStore = 4 ;
461
+ await SystemUtils . PublishMessages ( system , stream , NumberOfMessages , testOutputHelper ) ;
462
462
var count = 0 ;
463
- const string reference = "consumer_offset" ;
463
+ const string Reference = "consumer_offset" ;
464
464
var rawConsumer = await system . CreateRawConsumer (
465
465
new RawConsumerConfig ( stream )
466
466
{
467
467
Crc32 = _crc32 ,
468
- Reference = reference ,
468
+ Reference = Reference ,
469
469
OffsetSpec = new OffsetTypeOffset ( ) ,
470
470
MessageHandler = async ( consumer , ctx , message ) =>
471
471
{
472
472
testOutputHelper . WriteLine ( $ "ConsumerStoreOffset receiving.. { count } ") ;
473
473
count ++ ;
474
- if ( count == numberOfMessagesToStore )
475
- {
476
- // store the the offset after numberOfMessagesToStore messages
477
- // so when we query the offset we should (must) have the same
478
- // values
479
- await consumer . StoreOffset ( ctx . Offset ) ;
480
- testOutputHelper . WriteLine ( $ "ConsumerStoreOffset done: { count } ") ;
481
- }
482
-
483
- if ( count == numberOfMessages )
474
+ switch ( count )
484
475
{
485
- testPassed . SetResult ( numberOfMessages ) ;
476
+ case NumberOfMessagesToStore :
477
+ // store the the offset after numberOfMessagesToStore messages
478
+ // so when we query the offset we should (must) have the same
479
+ // values
480
+ await consumer . StoreOffset ( ctx . Offset ) ;
481
+ testOutputHelper . WriteLine ( $ "ConsumerStoreOffset done: { count } ") ;
482
+ break ;
483
+ case NumberOfMessages :
484
+ testPassed . SetResult ( NumberOfMessages ) ;
485
+ break ;
486
486
}
487
487
488
488
await Task . CompletedTask ;
@@ -494,8 +494,8 @@ public async void ConsumerQueryOffset()
494
494
// it may need some time to store the offset
495
495
SystemUtils . Wait ( ) ;
496
496
// numberOfMessagesToStore index 0
497
- Assert . Equal ( ( ulong ) ( numberOfMessagesToStore - 1 ) ,
498
- await system . QueryOffset ( reference , stream ) ) ;
497
+ Assert . Equal ( ( ulong ) ( NumberOfMessagesToStore - 1 ) ,
498
+ await system . QueryOffset ( Reference , stream ) ) ;
499
499
500
500
// this has to raise OffsetNotFoundException in case the offset
501
501
// does not exist like in this case.
@@ -696,5 +696,41 @@ public async void ProducerConsumerMixingDifferentSendTypesCompressAndStandard()
696
696
await system . DeleteStream ( stream ) ;
697
697
await system . Close ( ) ;
698
698
}
699
+
700
+ [ Fact ]
701
+ public async void ShouldConsumeFromDateTimeOffset ( )
702
+ {
703
+ // validate the consumer can start from a specific time
704
+ // this test is not deterministic because it depends on the
705
+ // time the test is executed.
706
+ // but at least we can validate the consumer can start from a specific time less 100 ms
707
+ // and it has to receive all the messages
708
+ // not 100% perfect but it is better than nothing
709
+
710
+ SystemUtils . InitStreamSystemWithRandomStream ( out var system , out var stream ) ;
711
+ var before = DateTimeOffset . Now . AddMilliseconds ( - 100 ) ;
712
+ await SystemUtils . PublishMessages ( system , stream , 100 , testOutputHelper ) ;
713
+ var testPassed = new TaskCompletionSource < bool > ( ) ;
714
+
715
+ var consumer = await system . CreateRawConsumer (
716
+ new RawConsumerConfig ( stream )
717
+ {
718
+ Reference = "consumer" ,
719
+ OffsetSpec = new OffsetTypeTimestamp ( before ) ,
720
+ MessageHandler = async ( _ , ctx , _ ) =>
721
+ {
722
+ Assert . True ( ctx . Timestamp >= before . Offset ) ;
723
+ if ( ctx . Offset == 99 )
724
+ {
725
+ testPassed . SetResult ( true ) ;
726
+ }
727
+
728
+ await Task . CompletedTask ;
729
+ }
730
+ } ) ;
731
+ new Utils < bool > ( testOutputHelper ) . WaitUntilTaskCompletes ( testPassed ) ;
732
+ await consumer . Close ( ) . ConfigureAwait ( false ) ;
733
+ await SystemUtils . CleanUpStreamSystem ( system , stream ) ;
734
+ }
699
735
}
700
736
}
0 commit comments