@@ -377,3 +377,58 @@ func TestWFTReset(t *testing.T) {
377
377
cachedExecution = cache .getWorkflowContext (runID )
378
378
require .True (t , originalCachedExecution == cachedExecution )
379
379
}
380
+
381
+ type panickingTaskHandler struct {
382
+ WorkflowTaskHandler
383
+ }
384
+
385
+ func (wth * panickingTaskHandler ) ProcessWorkflowTask (
386
+ task * workflowTask ,
387
+ wfctx * workflowExecutionContextImpl ,
388
+ hb workflowTaskHeartbeatFunc ,
389
+ ) (interface {}, error ) {
390
+ panic ("panickingTaskHandler" )
391
+ }
392
+
393
+ func TestWFTPanicInTaskHandler (t * testing.T ) {
394
+ cache := NewWorkerCache ()
395
+ params := workerExecutionParameters {cache : cache }
396
+ ensureRequiredParams (& params )
397
+ wfType := commonpb.WorkflowType {Name : t .Name () + "-workflow-type" }
398
+ reg := newRegistry ()
399
+ reg .RegisterWorkflowWithOptions (func (ctx Context ) error {
400
+ return nil
401
+ }, RegisterWorkflowOptions {
402
+ Name : wfType .Name ,
403
+ })
404
+ var (
405
+ taskQueue = taskqueuepb.TaskQueue {Name : t .Name () + "task-queue" }
406
+ startedAttrs = historypb.WorkflowExecutionStartedEventAttributes {
407
+ TaskQueue : & taskQueue ,
408
+ }
409
+ startedEvent = createTestEventWorkflowExecutionStarted (1 , & startedAttrs )
410
+ history = historypb.History {Events : []* historypb.HistoryEvent {startedEvent }}
411
+ runID = t .Name () + "-run-id"
412
+ wfID = t .Name () + "-workflow-id"
413
+ wfe = commonpb.WorkflowExecution {RunId : runID , WorkflowId : wfID }
414
+ ctrl = gomock .NewController (t )
415
+ client = workflowservicemock .NewMockWorkflowServiceClient (ctrl )
416
+ innerTaskHandler = newWorkflowTaskHandler (params , nil , newRegistry ())
417
+ taskHandler = & panickingTaskHandler {WorkflowTaskHandler : innerTaskHandler }
418
+ contextManager = taskHandler
419
+ codec = binary .LittleEndian
420
+ pollResp0 = workflowservice.PollWorkflowTaskQueueResponse {
421
+ Attempt : 1 ,
422
+ WorkflowExecution : & wfe ,
423
+ WorkflowType : & wfType ,
424
+ History : & history ,
425
+ TaskToken : codec .AppendUint32 (nil , 0 ),
426
+ }
427
+ task0 = workflowTask {task : & pollResp0 }
428
+ )
429
+
430
+ poller := newWorkflowTaskPoller (taskHandler , contextManager , client , params )
431
+ require .Error (t , poller .processWorkflowTask (& task0 ))
432
+ // Workflow should not be in cache
433
+ require .Nil (t , cache .getWorkflowContext (runID ))
434
+ }
0 commit comments