@@ -36,6 +36,7 @@ func TestSingleMessageIDNoAckTracker(t *testing.T) {
3636 options : & partitionConsumerOpts {},
3737 metrics : newTestMetrics (),
3838 decryptor : crypto .NewNoopDecryptor (),
39+ ackTrackers : newAckTrackers (),
3940 }
4041 pc .availablePermits = & availablePermits {pc : & pc }
4142 pc .ackGroupingTracker = newAckGroupingTracker (& AckGroupingOptions {MaxSize : 0 },
@@ -75,6 +76,7 @@ func TestBatchMessageIDNoAckTracker(t *testing.T) {
7576 options : & partitionConsumerOpts {},
7677 metrics : newTestMetrics (),
7778 decryptor : crypto .NewNoopDecryptor (),
79+ ackTrackers : newAckTrackers (),
7880 }
7981 pc .availablePermits = & availablePermits {pc : & pc }
8082 pc .ackGroupingTracker = newAckGroupingTracker (& AckGroupingOptions {MaxSize : 0 },
@@ -111,6 +113,7 @@ func TestBatchMessageIDWithAckTracker(t *testing.T) {
111113 options : & partitionConsumerOpts {},
112114 metrics : newTestMetrics (),
113115 decryptor : crypto .NewNoopDecryptor (),
116+ ackTrackers : newAckTrackers (),
114117 }
115118 pc .availablePermits = & availablePermits {pc : & pc }
116119 pc .ackGroupingTracker = newAckGroupingTracker (& AckGroupingOptions {MaxSize : 0 },
@@ -150,6 +153,67 @@ func TestBatchMessageIDWithAckTracker(t *testing.T) {
150153 }
151154}
152155
156+ func TestBatchMessageIDWithAckTrackers (t * testing.T ) {
157+ eventsCh := make (chan interface {}, 1 )
158+ pc := partitionConsumer {
159+ queueCh : make (chan []* message , 1 ),
160+ eventsCh : eventsCh ,
161+ compressionProviders : sync.Map {},
162+ options : & partitionConsumerOpts {},
163+ metrics : newTestMetrics (),
164+ decryptor : crypto .NewNoopDecryptor (),
165+ ackTrackers : newAckTrackers (),
166+ }
167+ pc .availablePermits = & availablePermits {pc : & pc }
168+ pc .ackGroupingTracker = newAckGroupingTracker (& AckGroupingOptions {MaxSize : 0 },
169+ func (id MessageID ) { pc .sendIndividualAck (id ) }, nil , nil )
170+
171+ headersAndPayload := internal .NewBufferWrapper (rawBatchMessage10 )
172+ if err := pc .MessageReceived (nil , headersAndPayload ); err != nil {
173+ t .Fatal (err )
174+ }
175+
176+ // ensure the tracker was set on the message id
177+ messages := <- pc .queueCh
178+ for _ , m := range messages {
179+ assert .NotNil (t , m .ID ().(* trackingMessageID ).tracker )
180+ }
181+
182+ noAckTrackerMessages := make ([]MessageID , 10 )
183+ for i , m := range messages {
184+ tmp := m .ID ().Serialize ()
185+ mid , err := DeserializeMessageID (tmp )
186+ if err != nil {
187+ t .Fatal (err )
188+ }
189+ noAckTrackerMessages [i ] = mid
190+ }
191+
192+ // ack all message ids except the last one
193+ for i := 0 ; i < 9 ; i ++ {
194+ _ , ok := noAckTrackerMessages [i ].(* trackingMessageID )
195+ assert .False (t , ok )
196+ err := pc .AckID (noAckTrackerMessages [i ])
197+ assert .Nil (t , err )
198+ }
199+
200+ select {
201+ case <- eventsCh :
202+ t .Error ("The message id should not be acked!" )
203+ default :
204+ }
205+
206+ // ack last message
207+ err := pc .AckID (noAckTrackerMessages [9 ])
208+ assert .Nil (t , err )
209+
210+ select {
211+ case <- eventsCh :
212+ default :
213+ t .Error ("Expected an ack request to be triggered!" )
214+ }
215+ }
216+
153217// Raw single message in old format
154218// metadata properties:<key:"a" value:"1" > properties:<key:"b" value:"2" >
155219// payload = "hello"
0 commit comments