Skip to content

Commit 2629483

Browse files
Fix and test AnyCommandCompleted (#55)
1 parent b76b3d0 commit 2629483

File tree

7 files changed

+30
-8
lines changed

7 files changed

+30
-8
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ Run the command `git submodule update --remote --merge` to update IDL to the lat
4646

4747
- [x] Reset workflow API (Cadence only, TODO for Temporal)
4848
- [ ] Command type(s) for inter-state communications (e.g. internal channel)
49-
- [ ] AnyCommandCompleted Decider trigger type
49+
- [x] AnyCommandCompleted Decider trigger type
5050
- [ ] More workflow start options: IdReusePolicy, initial earch attributes, cron schedule, retry, etc
5151
- [ ] StateOption: Start/Decide API timeout and retry
5252
- [ ] Reset workflow by stateId

src/main/java/io/github/cadenceoss/iwf/core/JacksonJsonObjectEncoder.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ public EncodedObject encode(Object object) {
7676

7777
@Override
7878
public <T> T decode(EncodedObject encodedObject, Class<T> type) {
79+
if (encodedObject == null) {
80+
return null;
81+
}
82+
7983
String data = encodedObject.getData();
8084
if (data == null || data.isEmpty()) {
8185
return null;

src/main/java/io/github/cadenceoss/iwf/core/command/SignalCommandResult.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,16 @@
33
import io.github.cadenceoss.iwf.gen.models.SignalResult;
44
import org.immutables.value.Value;
55

6+
import java.util.Optional;
7+
68
@Value.Immutable
79
public abstract class SignalCommandResult {
810

911
public abstract String getCommandId();
1012

1113
public abstract String getSignalChannelName();
1214

13-
public abstract Object getSignalValue();
15+
public abstract Optional<Object> getSignalValue();
1416

1517
public abstract SignalResult.SignalRequestStatusEnum getSignalRequestStatusEnum();
1618
}

src/main/java/io/github/cadenceoss/iwf/core/mapper/SignalResultMapper.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import io.github.cadenceoss.iwf.core.command.SignalCommandResult;
66
import io.github.cadenceoss.iwf.gen.models.SignalResult;
77

8+
import java.util.Optional;
9+
810
public class SignalResultMapper {
911
public static SignalCommandResult fromGenerated(
1012
SignalResult signalResult,
@@ -14,7 +16,7 @@ public static SignalCommandResult fromGenerated(
1416
.commandId(signalResult.getCommandId())
1517
.signalRequestStatusEnum(signalResult.getSignalRequestStatus())
1618
.signalChannelName(signalResult.getSignalChannelName())
17-
.signalValue(objectEncoder.decode(signalResult.getSignalValue(), signalType))
19+
.signalValue(Optional.ofNullable(objectEncoder.decode(signalResult.getSignalValue(), signalType)))
1820
.build();
1921
}
2022
}

src/test/java/io/github/cadenceoss/iwf/integ/SignalTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public void testBasicSignalWorkflow() throws InterruptedException {
2828
final String runId = client.StartWorkflow(
2929
BasicSignalWorkflow.class, BasicSignalWorkflowState1.STATE_ID, input, wfId, startOptions);
3030
client.SignalWorkflow(
31-
BasicSignalWorkflow.class, wfId, runId, BasicSignalWorkflowState1.SIGNAL_CHANNEL_NAME, Integer.valueOf(2));
31+
BasicSignalWorkflow.class, wfId, runId, BasicSignalWorkflowState1.SIGNAL_CHANNEL_NAME_1, Integer.valueOf(2));
3232
final Integer output = client.GetSimpleWorkflowResultWithWait(Integer.class, wfId);
3333
Assertions.assertEquals(3, output);
3434
}

src/test/java/io/github/cadenceoss/iwf/integ/signal/BasicSignalWorkflow.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@
1010
public class BasicSignalWorkflow implements Workflow {
1111
@Override
1212
public List<SignalChannelDef> getSignalChannels() {
13-
return Arrays.asList(SignalChannelDef.create(Integer.class, BasicSignalWorkflowState1.SIGNAL_CHANNEL_NAME));
13+
return Arrays.asList(
14+
SignalChannelDef.create(Integer.class, BasicSignalWorkflowState1.SIGNAL_CHANNEL_NAME_1),
15+
SignalChannelDef.create(Integer.class, BasicSignalWorkflowState1.SIGNAL_CHANNEL_NAME_2)
16+
);
1417
}
1518

1619
@Override

src/test/java/io/github/cadenceoss/iwf/integ/signal/BasicSignalWorkflowState1.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,13 @@
1111
import io.github.cadenceoss.iwf.core.command.InterStateChannel;
1212
import io.github.cadenceoss.iwf.core.command.SignalCommand;
1313
import io.github.cadenceoss.iwf.core.command.SignalCommandResult;
14+
import io.github.cadenceoss.iwf.gen.models.SignalResult;
1415

1516
public class BasicSignalWorkflowState1 implements WorkflowState<Integer> {
1617
public static final String STATE_ID = "signal-s1";
17-
public static final String SIGNAL_CHANNEL_NAME = "test-signal";
18+
public static final String SIGNAL_CHANNEL_NAME_1 = "test-signal-1";
19+
20+
public static final String SIGNAL_CHANNEL_NAME_2 = "test-signal-2";
1821
public static final String COMMAND_ID = "test-signal-id";
1922

2023
@Override
@@ -34,7 +37,10 @@ public CommandRequest start(
3437
StateLocal stateLocals,
3538
SearchAttributesRW searchAttributes,
3639
QueryAttributesRW queryAttributes, final InterStateChannel interStateChannel) {
37-
return CommandRequest.forAllCommandCompleted(SignalCommand.create(COMMAND_ID, SIGNAL_CHANNEL_NAME));
40+
return CommandRequest.forAnyCommandCompleted(
41+
SignalCommand.create(COMMAND_ID, SIGNAL_CHANNEL_NAME_1),
42+
SignalCommand.create(COMMAND_ID, SIGNAL_CHANNEL_NAME_2)
43+
);
3844
}
3945

4046
@Override
@@ -46,7 +52,12 @@ public StateDecision decide(
4652
SearchAttributesRW searchAttributes,
4753
QueryAttributesRW queryAttributes, final InterStateChannel interStateChannel) {
4854
SignalCommandResult signalCommandResult = commandResults.getAllSignalCommandResults().get(0);
49-
Integer output = input + (Integer) signalCommandResult.getSignalValue();
55+
Integer output = input + (Integer) signalCommandResult.getSignalValue().get();
56+
57+
SignalCommandResult signalCommandResult2 = commandResults.getAllSignalCommandResults().get(1);
58+
if (signalCommandResult2.getSignalRequestStatusEnum() != SignalResult.SignalRequestStatusEnum.WAITING) {
59+
throw new RuntimeException("the second signal should be waiting");
60+
}
5061
return StateDecision.gracefulCompleteWorkflow(output);
5162
}
5263
}

0 commit comments

Comments
 (0)