@@ -274,58 +274,151 @@ func (s *standaloneActivityTestSuite) TestPollActivityTaskQueue() {
274274 ctx , cancel := context .WithTimeout (t .Context (), 10 * time .Second )
275275 defer cancel ()
276276
277- activityID := testcore .RandomizeStr (t .Name ())
278- taskQueue := testcore .RandomizeStr (t .Name ())
279- namespace := s .Namespace ().String ()
277+ t .Run ("FirstAttempt" , func (t * testing.T ) {
278+ activityID := testcore .RandomizeStr (t .Name ())
279+ taskQueue := testcore .RandomizeStr (t .Name ())
280+ namespace := s .Namespace ().String ()
280281
281- startToCloseTimeout := durationpb .New (1 * time .Minute )
282- scheduleToCloseTimeout := durationpb .New (2 * time .Minute )
283- heartbeatTimeout := durationpb .New (20 * time .Second )
284- priority := & commonpb.Priority {
285- FairnessKey : "test-key" ,
286- }
282+ startToCloseTimeout := durationpb .New (1 * time .Minute )
283+ scheduleToCloseTimeout := durationpb .New (2 * time .Minute )
284+ heartbeatTimeout := durationpb .New (20 * time .Second )
285+ priority := & commonpb.Priority {
286+ FairnessKey : "test-key" ,
287+ }
287288
288- startResp , err := s .FrontendClient ().StartActivityExecution (ctx , & workflowservice.StartActivityExecutionRequest {
289- Namespace : namespace ,
290- ActivityId : activityID ,
291- ActivityType : s .tv .ActivityType (),
292- Identity : s .tv .WorkerIdentity (),
293- Input : defaultInput ,
294- TaskQueue : & taskqueuepb.TaskQueue {
295- Name : taskQueue ,
296- },
297- StartToCloseTimeout : startToCloseTimeout ,
298- ScheduleToCloseTimeout : scheduleToCloseTimeout ,
299- HeartbeatTimeout : heartbeatTimeout ,
300- RequestId : s .tv .RequestID (),
301- Priority : priority ,
302- Header : defaultHeader ,
289+ startResp , err := s .FrontendClient ().StartActivityExecution (ctx , & workflowservice.StartActivityExecutionRequest {
290+ Namespace : namespace ,
291+ ActivityId : activityID ,
292+ ActivityType : s .tv .ActivityType (),
293+ Identity : s .tv .WorkerIdentity (),
294+ Input : defaultInput ,
295+ TaskQueue : & taskqueuepb.TaskQueue {
296+ Name : taskQueue ,
297+ },
298+ StartToCloseTimeout : startToCloseTimeout ,
299+ ScheduleToCloseTimeout : scheduleToCloseTimeout ,
300+ HeartbeatTimeout : heartbeatTimeout ,
301+ RequestId : s .tv .RequestID (),
302+ Priority : priority ,
303+ Header : defaultHeader ,
304+ })
305+ require .NoError (t , err )
306+
307+ pollTaskResp , err := s .FrontendClient ().PollActivityTaskQueue (ctx , & workflowservice.PollActivityTaskQueueRequest {
308+ Namespace : namespace ,
309+ TaskQueue : & taskqueuepb.TaskQueue {
310+ Name : taskQueue ,
311+ Kind : enumspb .TASK_QUEUE_KIND_NORMAL ,
312+ },
313+ Identity : s .tv .WorkerIdentity (),
314+ })
315+ require .NoError (t , err )
316+ require .Equal (t , activityID , pollTaskResp .GetActivityId ())
317+ require .Equal (t , namespace , pollTaskResp .GetWorkflowNamespace ())
318+ protorequire .ProtoEqual (t , s .tv .ActivityType (), pollTaskResp .GetActivityType ())
319+ require .Equal (t , startResp .GetRunId (), pollTaskResp .GetActivityRunId ())
320+ protorequire .ProtoEqual (t , defaultInput , pollTaskResp .GetInput ())
321+ require .False (t , pollTaskResp .GetStartedTime ().AsTime ().IsZero ())
322+ require .False (t , pollTaskResp .GetScheduledTime ().AsTime ().IsZero ())
323+ require .EqualValues (t , 1 , pollTaskResp .Attempt )
324+ protorequire .ProtoEqual (t , startToCloseTimeout , pollTaskResp .GetStartToCloseTimeout ())
325+ protorequire .ProtoEqual (t , scheduleToCloseTimeout , pollTaskResp .GetScheduleToCloseTimeout ())
326+ protorequire .ProtoEqual (t , heartbeatTimeout , pollTaskResp .GetHeartbeatTimeout ())
327+ protorequire .ProtoEqual (t , priority , pollTaskResp .GetPriority ())
328+ protorequire .ProtoEqual (t , defaultHeader , pollTaskResp .GetHeader ())
329+ require .NotNil (t , pollTaskResp .TaskToken )
330+ protorequire .ProtoEqual (t , pollTaskResp .GetScheduledTime (), pollTaskResp .GetCurrentAttemptScheduledTime ()) // Equal on first attempt
303331 })
304- require .NoError (t , err )
305332
306- pollTaskResp , err := s .FrontendClient ().PollActivityTaskQueue (ctx , & workflowservice.PollActivityTaskQueueRequest {
307- Namespace : namespace ,
308- TaskQueue : & taskqueuepb.TaskQueue {
309- Name : taskQueue ,
310- Kind : enumspb .TASK_QUEUE_KIND_NORMAL ,
311- },
312- Identity : s .tv .WorkerIdentity (),
333+ t .Run ("RetriedAttempt" , func (t * testing.T ) {
334+ activityID := testcore .RandomizeStr (t .Name ())
335+ taskQueue := testcore .RandomizeStr (t .Name ())
336+ namespace := s .Namespace ().String ()
337+
338+ startToCloseTimeout := durationpb .New (1 * time .Minute )
339+ scheduleToCloseTimeout := durationpb .New (2 * time .Minute )
340+ heartbeatTimeout := durationpb .New (20 * time .Second )
341+ priority := & commonpb.Priority {
342+ FairnessKey : "test-key" ,
343+ }
344+
345+ startResp , err := s .FrontendClient ().StartActivityExecution (ctx , & workflowservice.StartActivityExecutionRequest {
346+ Namespace : namespace ,
347+ ActivityId : activityID ,
348+ ActivityType : s .tv .ActivityType (),
349+ Identity : s .tv .WorkerIdentity (),
350+ Input : defaultInput ,
351+ TaskQueue : & taskqueuepb.TaskQueue {
352+ Name : taskQueue ,
353+ },
354+ StartToCloseTimeout : startToCloseTimeout ,
355+ ScheduleToCloseTimeout : scheduleToCloseTimeout ,
356+ HeartbeatTimeout : heartbeatTimeout ,
357+ RequestId : s .tv .RequestID (),
358+ Priority : priority ,
359+ Header : defaultHeader ,
360+ })
361+ require .NoError (t , err )
362+
363+ pollTaskResp , err := s .FrontendClient ().PollActivityTaskQueue (ctx , & workflowservice.PollActivityTaskQueueRequest {
364+ Namespace : namespace ,
365+ TaskQueue : & taskqueuepb.TaskQueue {
366+ Name : taskQueue ,
367+ Kind : enumspb .TASK_QUEUE_KIND_NORMAL ,
368+ },
369+ Identity : s .tv .WorkerIdentity (),
370+ })
371+ require .NoError (t , err )
372+
373+ nextRetryDelay := durationpb .New (1 * time .Second )
374+ _ , err = s .FrontendClient ().RespondActivityTaskFailed (ctx , & workflowservice.RespondActivityTaskFailedRequest {
375+ Namespace : s .Namespace ().String (),
376+ TaskToken : pollTaskResp .TaskToken ,
377+ Failure : & failurepb.Failure {
378+ Message : "retryable failure" ,
379+ FailureInfo : & failurepb.Failure_ApplicationFailureInfo {ApplicationFailureInfo : & failurepb.ApplicationFailureInfo {
380+ NonRetryable : false ,
381+ NextRetryDelay : nextRetryDelay ,
382+ }},
383+ },
384+ })
385+ require .NoError (t , err )
386+
387+ describeResp , err := s .FrontendClient ().DescribeActivityExecution (ctx , & workflowservice.DescribeActivityExecutionRequest {
388+ Namespace : s .Namespace ().String (),
389+ ActivityId : activityID ,
390+ RunId : startResp .GetRunId (),
391+ })
392+ require .NoError (t , err )
393+
394+ pollTaskResp , err = s .FrontendClient ().PollActivityTaskQueue (ctx , & workflowservice.PollActivityTaskQueueRequest {
395+ Namespace : namespace ,
396+ TaskQueue : & taskqueuepb.TaskQueue {
397+ Name : taskQueue ,
398+ Kind : enumspb .TASK_QUEUE_KIND_NORMAL ,
399+ },
400+ Identity : s .tv .WorkerIdentity (),
401+ })
402+ require .NoError (t , err )
403+ require .Equal (t , activityID , pollTaskResp .GetActivityId ())
404+ require .Equal (t , namespace , pollTaskResp .GetWorkflowNamespace ())
405+ protorequire .ProtoEqual (t , s .tv .ActivityType (), pollTaskResp .GetActivityType ())
406+ require .Equal (t , startResp .GetRunId (), pollTaskResp .GetActivityRunId ())
407+ protorequire .ProtoEqual (t , defaultInput , pollTaskResp .GetInput ())
408+ require .False (t , pollTaskResp .GetStartedTime ().AsTime ().IsZero ())
409+ require .False (t , pollTaskResp .GetScheduledTime ().AsTime ().IsZero ())
410+ require .EqualValues (t , 2 , pollTaskResp .Attempt )
411+ protorequire .ProtoEqual (t , startToCloseTimeout , pollTaskResp .GetStartToCloseTimeout ())
412+ protorequire .ProtoEqual (t , scheduleToCloseTimeout , pollTaskResp .GetScheduleToCloseTimeout ())
413+ protorequire .ProtoEqual (t , heartbeatTimeout , pollTaskResp .GetHeartbeatTimeout ())
414+ protorequire .ProtoEqual (t , priority , pollTaskResp .GetPriority ())
415+ protorequire .ProtoEqual (t , defaultHeader , pollTaskResp .GetHeader ())
416+ require .NotNil (t , pollTaskResp .TaskToken )
417+
418+ expectedAttemptScheduledTime := timestamppb .New (
419+ describeResp .GetInfo ().GetLastAttemptCompleteTime ().AsTime ().Add (nextRetryDelay .AsDuration ()))
420+ protorequire .ProtoEqual (t , expectedAttemptScheduledTime , pollTaskResp .GetCurrentAttemptScheduledTime ())
313421 })
314- require .NoError (t , err )
315- require .Equal (t , activityID , pollTaskResp .GetActivityId ())
316- require .Equal (t , namespace , pollTaskResp .GetWorkflowNamespace ())
317- protorequire .ProtoEqual (t , s .tv .ActivityType (), pollTaskResp .GetActivityType ())
318- require .Equal (t , startResp .GetRunId (), pollTaskResp .GetActivityRunId ())
319- protorequire .ProtoEqual (t , defaultInput , pollTaskResp .GetInput ())
320- require .False (t , pollTaskResp .GetStartedTime ().AsTime ().IsZero ())
321- require .False (t , pollTaskResp .GetScheduledTime ().AsTime ().IsZero ())
322- require .EqualValues (t , 1 , pollTaskResp .Attempt )
323- protorequire .ProtoEqual (t , startToCloseTimeout , pollTaskResp .GetStartToCloseTimeout ())
324- protorequire .ProtoEqual (t , scheduleToCloseTimeout , pollTaskResp .GetScheduleToCloseTimeout ())
325- protorequire .ProtoEqual (t , heartbeatTimeout , pollTaskResp .GetHeartbeatTimeout ())
326- protorequire .ProtoEqual (t , priority , pollTaskResp .GetPriority ())
327- protorequire .ProtoEqual (t , defaultHeader , pollTaskResp .GetHeader ())
328- require .NotNil (t , pollTaskResp .TaskToken )
329422}
330423
331424func (s * standaloneActivityTestSuite ) TestStart () {
0 commit comments