@@ -985,6 +985,108 @@ func TestConsumerExpiryTicker(t *testing.T) {
985
985
broker0 .Close ()
986
986
}
987
987
988
+ func TestConsumerTimestamps (t * testing.T ) {
989
+ now := time .Now ().Truncate (time .Millisecond )
990
+ type testMessage struct {
991
+ key Encoder
992
+ value Encoder
993
+ offset int64
994
+ timestamp time.Time
995
+ }
996
+ for _ , d := range []struct {
997
+ kversion KafkaVersion
998
+ logAppendTime bool
999
+ messages []testMessage
1000
+ expectedTimestamp []time.Time
1001
+ }{
1002
+ {V0_8_2_0 , false , []testMessage {
1003
+ {nil , testMsg , 1 , now },
1004
+ {nil , testMsg , 2 , now },
1005
+ }, []time.Time {{}, {}}},
1006
+ {V0_10_2_1 , false , []testMessage {
1007
+ {nil , testMsg , 1 , now .Add (time .Second )},
1008
+ {nil , testMsg , 2 , now .Add (2 * time .Second )},
1009
+ }, []time.Time {now .Add (time .Second ), now .Add (2 * time .Second )}},
1010
+ {V0_10_2_1 , true , []testMessage {
1011
+ {nil , testMsg , 1 , now .Add (time .Second )},
1012
+ {nil , testMsg , 2 , now .Add (2 * time .Second )},
1013
+ }, []time.Time {now , now }},
1014
+ {V0_11_0_0 , false , []testMessage {
1015
+ {nil , testMsg , 1 , now .Add (time .Second )},
1016
+ {nil , testMsg , 2 , now .Add (2 * time .Second )},
1017
+ }, []time.Time {now .Add (time .Second ), now .Add (2 * time .Second )}},
1018
+ {V0_11_0_0 , true , []testMessage {
1019
+ {nil , testMsg , 1 , now .Add (time .Second )},
1020
+ {nil , testMsg , 2 , now .Add (2 * time .Second )},
1021
+ }, []time.Time {now , now }},
1022
+ } {
1023
+ var fr * FetchResponse
1024
+ var offsetResponseVersion int16
1025
+ cfg := NewConfig ()
1026
+ cfg .Version = d .kversion
1027
+ switch d .kversion {
1028
+ default :
1029
+ fr = & FetchResponse {}
1030
+ for _ , m := range d .messages {
1031
+ fr .AddMessageWithTimestamp ("my_topic" , 0 , m .key , testMsg , m .offset , m .timestamp , 0 )
1032
+ }
1033
+ case V0_10_2_1 :
1034
+ offsetResponseVersion = 1
1035
+ fr = & FetchResponse {Version : 3 , LogAppendTime : d .logAppendTime , Timestamp : now }
1036
+ for _ , m := range d .messages {
1037
+ fr .AddMessageWithTimestamp ("my_topic" , 0 , m .key , testMsg , m .offset , m .timestamp , 1 )
1038
+ }
1039
+ case V0_11_0_0 :
1040
+ offsetResponseVersion = 1
1041
+ fr = & FetchResponse {Version : 4 , LogAppendTime : d .logAppendTime , Timestamp : now }
1042
+ for _ , m := range d .messages {
1043
+ fr .AddRecordWithTimestamp ("my_topic" , 0 , m .key , testMsg , m .offset , m .timestamp )
1044
+ }
1045
+ fr .SetLastOffsetDelta ("my_topic" , 0 , 2 )
1046
+ fr .SetLastStableOffset ("my_topic" , 0 , 2 )
1047
+ }
1048
+
1049
+ broker0 := NewMockBroker (t , 0 )
1050
+ broker0 .SetHandlerByMap (map [string ]MockResponse {
1051
+ "MetadataRequest" : NewMockMetadataResponse (t ).
1052
+ SetBroker (broker0 .Addr (), broker0 .BrokerID ()).
1053
+ SetLeader ("my_topic" , 0 , broker0 .BrokerID ()),
1054
+ "OffsetRequest" : NewMockOffsetResponse (t ).
1055
+ SetVersion (offsetResponseVersion ).
1056
+ SetOffset ("my_topic" , 0 , OffsetNewest , 1234 ).
1057
+ SetOffset ("my_topic" , 0 , OffsetOldest , 0 ),
1058
+ "FetchRequest" : NewMockSequence (fr ),
1059
+ })
1060
+
1061
+ master , err := NewConsumer ([]string {broker0 .Addr ()}, cfg )
1062
+ if err != nil {
1063
+ t .Fatal (err )
1064
+ }
1065
+
1066
+ consumer , err := master .ConsumePartition ("my_topic" , 0 , 1 )
1067
+ if err != nil {
1068
+ t .Fatal (err )
1069
+ }
1070
+
1071
+ for i , ts := range d .expectedTimestamp {
1072
+ select {
1073
+ case msg := <- consumer .Messages ():
1074
+ assertMessageOffset (t , msg , int64 (i )+ 1 )
1075
+ if msg .Timestamp != ts {
1076
+ t .Errorf ("Wrong timestamp (kversion:%v, logAppendTime:%v): got: %v, want: %v" ,
1077
+ d .kversion , d .logAppendTime , msg .Timestamp , ts )
1078
+ }
1079
+ case err := <- consumer .Errors ():
1080
+ t .Fatal (err )
1081
+ }
1082
+ }
1083
+
1084
+ safeClose (t , consumer )
1085
+ safeClose (t , master )
1086
+ broker0 .Close ()
1087
+ }
1088
+ }
1089
+
988
1090
func assertMessageOffset (t * testing.T , msg * ConsumerMessage , expectedOffset int64 ) {
989
1091
if msg .Offset != expectedOffset {
990
1092
t .Errorf ("Incorrect message offset: expected=%d, actual=%d" , expectedOffset , msg .Offset )
0 commit comments