@@ -194,4 +194,76 @@ func TestWorkerProcesses(t *testing.T) {
194194
195195 assert .Contains (t , logOutput .String (), "Task channel closed, worker exiting..." )
196196 })
197+
198+ t .Run ("should handle publish failure" , func (t * testing.T ) {
199+ mockBroker := NewMockBroker (1 )
200+ wg := & sync.WaitGroup {}
201+ cfg := taskqueue.WorkerConfig {ID : 1 , Broker : mockBroker , Backoff : nil , WG : wg }
202+ worker := taskqueue .DefaultWorkerFactory (cfg )
203+ worker .Register (failTaskName , failTaskHandler )
204+
205+ task := taskqueue.Task {
206+ Name : failTaskName ,
207+ Args : taskqueue.TaskArgs {},
208+ MaxRetry : 3 ,
209+ }
210+ err := mockBroker .Publish (task )
211+ assert .Nil (t , err )
212+
213+ ctx , cancel := context .WithCancel (context .Background ())
214+ defer cancel ()
215+
216+ var logOutput bytes.Buffer
217+ log .SetOutput (& logOutput )
218+ defer log .SetOutput (nil )
219+
220+ wg .Add (1 )
221+ go worker .Start (ctx )
222+ mockBroker .badPublish = true
223+ time .Sleep (100 * time .Millisecond )
224+
225+ cancel ()
226+ wg .Wait ()
227+
228+ expected := fmt .Sprintf ("Worker %d: failed to re-queue task %s" , cfg .ID , task .Name )
229+ assert .Contains (t , logOutput .String (), expected )
230+ })
231+
232+ t .Run ("should handle publish failure with backoff" , func (t * testing.T ) {
233+ backoff := & taskqueue.BackoffPolicy {
234+ BaseDelay : 1 * time .Second , // small delay for fast test
235+ MaxDelay : 20 * time .Second ,
236+ }
237+ mockBroker := NewMockBroker (1 )
238+ wg := & sync.WaitGroup {}
239+ cfg := taskqueue.WorkerConfig {ID : 1 , Broker : mockBroker , Backoff : backoff , WG : wg }
240+ worker := taskqueue .DefaultWorkerFactory (cfg )
241+ worker .Register (failTaskName , failTaskHandler )
242+
243+ task := taskqueue.Task {
244+ Name : failTaskName ,
245+ Args : taskqueue.TaskArgs {},
246+ MaxRetry : 3 ,
247+ }
248+ err := mockBroker .Publish (task )
249+ assert .Nil (t , err )
250+
251+ ctx , cancel := context .WithCancel (context .Background ())
252+ defer cancel ()
253+
254+ var logOutput bytes.Buffer
255+ log .SetOutput (& logOutput )
256+ defer log .SetOutput (nil )
257+
258+ wg .Add (1 )
259+ go worker .Start (ctx )
260+ mockBroker .badPublish = true
261+ time .Sleep (100 * time .Millisecond )
262+
263+ cancel ()
264+ wg .Wait ()
265+
266+ expected := fmt .Sprintf ("Worker %d: failed to re-queue task %s" , cfg .ID , task .Name )
267+ assert .Contains (t , logOutput .String (), expected )
268+ })
197269}
0 commit comments