Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/Temporalio/Client/TemporalClient.Workflow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -607,6 +607,7 @@ private async Task<WorkflowHandle<TWorkflow, TResult>> StartWorkflowInternalAsyn
Header = req.Header,
WorkflowStartDelay = req.WorkflowStartDelay,
SignalName = input.Options.StartSignal,
WorkflowIdConflictPolicy = input.Options.IdConflictPolicy,
};
if (input.Options.StartSignalArgs != null && input.Options.StartSignalArgs.Count > 0)
{
Expand Down
41 changes: 41 additions & 0 deletions tests/Temporalio.Tests/Worker/WorkflowWorkerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5618,9 +5618,20 @@ await AssertWarnings(
[Workflow]
public class IdConflictWorkflow
{
private string signal = "nothing";

// Just wait forever
[WorkflowRun]
public Task RunAsync() => Workflow.WaitConditionAsync(() => false);

[WorkflowSignal]
public async Task TheSignal(string sig)
{
signal = sig;
}

[WorkflowQuery]
public string GetSignal() => signal;
}

[Fact]
Expand Down Expand Up @@ -5648,6 +5659,7 @@ await Assert.ThrowsAsync<WorkflowAlreadyStartedException>(() =>
{
IdConflictPolicy = WorkflowIdConflictPolicy.Fail,
}));
// signal-with-start does not allow fail policy

// Confirm gives back same handle if requested
var newHandle = await Env.Client.StartWorkflowAsync(
Expand All @@ -5660,6 +5672,19 @@ await Assert.ThrowsAsync<WorkflowAlreadyStartedException>(() =>
Assert.Equal(handle.RunId, newHandle.RunId);
Assert.Equal(WorkflowExecutionStatus.Running, (await handle.DescribeAsync()).Status);
Assert.Equal(WorkflowExecutionStatus.Running, (await newHandle.DescribeAsync()).Status);
// Also with signal-with-start
newHandle = await Env.Client.StartWorkflowAsync(
(IdConflictWorkflow wf) => wf.RunAsync(),
new(id: handle.Id, taskQueue: worker.Options.TaskQueue!)
{
StartSignal = "TheSignal",
StartSignalArgs = new[] { "hi!" },
IdConflictPolicy = WorkflowIdConflictPolicy.UseExisting,
});
newHandle = newHandle with { RunId = newHandle.ResultRunId };
Assert.Equal(handle.RunId, newHandle.RunId);
Assert.Equal(WorkflowExecutionStatus.Running, (await handle.DescribeAsync()).Status);
Assert.Equal(WorkflowExecutionStatus.Running, (await newHandle.DescribeAsync()).Status);

// Confirm terminates and starts new if requested
newHandle = await Env.Client.StartWorkflowAsync(
Expand All @@ -5672,6 +5697,22 @@ await Assert.ThrowsAsync<WorkflowAlreadyStartedException>(() =>
Assert.NotEqual(handle.RunId, newHandle.RunId);
Assert.Equal(WorkflowExecutionStatus.Terminated, (await handle.DescribeAsync()).Status);
Assert.Equal(WorkflowExecutionStatus.Running, (await newHandle.DescribeAsync()).Status);
// Also with signal-with-start
newHandle = await Env.Client.StartWorkflowAsync(
(IdConflictWorkflow wf) => wf.RunAsync(),
new(id: handle.Id, taskQueue: worker.Options.TaskQueue!)
{
StartSignal = "TheSignal",
StartSignalArgs = new[] { "hi!" },
IdConflictPolicy = WorkflowIdConflictPolicy.TerminateExisting,
});
newHandle = newHandle with { RunId = newHandle.ResultRunId };
Assert.NotEqual(handle.RunId, newHandle.RunId);
Assert.Equal(WorkflowExecutionStatus.Terminated, (await handle.DescribeAsync()).Status);
Assert.Equal(WorkflowExecutionStatus.Running, (await newHandle.DescribeAsync()).Status);
// Ensure it actually got the signal this time
var queryRes = await newHandle.QueryAsync(wf => wf.GetSignal());
Assert.Equal("hi!", queryRes);
});
}

Expand Down