How to wait for a multiple signals corectly?

Hello everyone! Sorry for my bad English

I try to build a workflow that can accept 2 signals 1st to start workflow and some actions and 2nd for actions and finish. I’d like to wait for 1st signal (start) and do “save” and “update” activities.

After that I’d like workflow to wait for next signal (SecondSignal) (maybe in 1 minute, maybe in 1h). When it has received the second signal new activity must be run “CalculateDeliveryDates” and UpdateOrder and finish my workflow.

Is it the correct way to do that?

startWorkflowSignal := workflow.GetSignalChannel(ctx, string(pkgworkflow.StartWorkflowSignal))
calculateDeliveryDatesSignal := workflow.GetSignalChannel(ctx, string(pkgworkflow.SecondSignal))

for {
		selector := workflow.NewSelector(ctx)

		selector.AddReceive(startWorkflowSignal, func(c workflow.ReceiveChannel, _ bool) {
			c.Receive(ctx, &o)

			ao := workflow.ActivityOptions{
				StartToCloseTimeout:    time.Minute,
			}

			ctx = workflow.WithActivityOptions(ctx, ao)

			err := workflow.ExecuteActivity(ctx, w.activities.Save, o).Get(ctx, &order)
			if err != nil {
				logger.Error("SaveOrder activity: %v", err)
				myErr = err
				finished = true

				return
			}

			ao = workflow.ActivityOptions{
				StartToCloseTimeout:    time.Minute,
			}

			ctx = workflow.WithActivityOptions(ctx, ao)

			err = workflow.ExecuteActivity(ctx, w.activities.Update, &order).Get(ctx, nil)
			if err != nil {
				logger.Error("UpdateOrder activity: %v", err)
				myErr = err
				finished = true

				return
			}
	
		})

		selector.AddReceive(calculateDeliveryDatesSignal, func(c workflow.ReceiveChannel, _ bool) {
			c.Receive(ctx, &reservedOrder)

			ao := workflow.ActivityOptions{
				StartToCloseTimeout:    time.Minute,
			}

			ctx = workflow.WithActivityOptions(ctx, ao)

			err := workflow.ExecuteActivity(ctx, w.activities.CalculateDeliveryDates, reservedOrder).Get(ctx, &deliveryDates)
			if err != nil {
				logger.Error("CalculateDeliveryDates activity: %v", err)
				myErr = err
				finished = true

				return
			}

			ao = workflow.ActivityOptions{
				StartToCloseTimeout:    time.Minute,
			}

			ctx = workflow.WithActivityOptions(ctx, ao)

			err = workflow.ExecuteActivity(ctx, w.activities.UpdateOrder, &order).Get(ctx, nil)
			if err != nil {
				logger.Error("UpdateOrder activity: %v", err)
				myErr = err
				finished = true

				return
			}

			finished = true
		})

		selector.Select(ctx)

		if finished {
			break
		}
	}

I tried to test only 1st signal, but I got
workflow execution error (type: Start, workflowID: default-test-workflow-id, runID: default-test-run-id): deadline exceeded (type: ScheduleToClose)

s.env.OnActivity(activities.Save, mock.Anything, mock.Anything).Return(&ordersrv, nil)

	s.env.OnActivity(activities.UpdateOrder, mock.Anything, &ordersrv).Return(nil)

	// First callback at 1ms: query to make sure the cart is empty, and signal to add an item.
	s.env.RegisterDelayedCallback(func() {
		s.env.SignalWorkflow(string(workflow.StartWorkflowSignal), o)
	}, time.Millisecond*10)

	s.env.ExecuteWorkflow(workflowB2C.Start)
	s.True(s.env.IsWorkflowCompleted())

	require.NoError(s.T(), s.env.GetWorkflowError())

Please help me anyone

There is no need to use Selector when waiting on a single signal. You can do something like:

signal1Channel.ReceiveWithTimeout(...)
// whatever logic
signal2Channel.ReceiveWithTimeout(...)