Corda可调度状态导致Flow测试挂起



我有一个LoanState,它是ScheduledState。所有使用LoanState的Flow测试都会无限挂起。如果我将nextScheduledActivity()设置为return null,那么测试运行良好。单元测试日志中没有可见的错误。这是Corda 3.2。

这是控制台挂起之前的最后一段文本:

〔信息〕14:39:40604〔模拟节点1线程〕(FlowStateMachineImpl.kt:419(流[742bd708-244d-49ao-91af-8127267029a1]。启动会话-启动与第O方的流程会话=模拟公司2,L=伦敦,C=英国。用于跟踪目的的会话id为SessionId(toLong=4148369640629821591(。{}[信息]14:39:40619[模拟node 2 thread](StateMachineManagerImpl.kt:367(状态机。StateMachineManagerImpl.onSessionInit-正在接受流来自一方的会话O=模拟公司1,L=伦敦,C=英国。的会话id追踪的目的是SessionId(toLong=44148369640629821591(。{invocation_id=2c33f7e4-63bd-4fad-980a0-6b568a78136d,invocation_ timestamp=2020-03-23T19:39:40.619Z,session_id=2c33f7e4-63bd-4fad-98a0-6b568a78136d,session_timestamp=2020-03-23T19:39:40.619Z}[信息]14:39:40706[模拟node 1 thread](FlowStateMachineImpl.kt:419(流[742bd708-244d-49ao-91af-8127267029a1]。启动会话-启动与第O方的流程会话=模拟公司2,L=伦敦,C=英国。用于跟踪目的的会话id为SessionId(toLong=-5160466662167158789(。{}[信息]14:39:40715[模拟node 2 thread](StateMachineManagerImpl.kt:367(状态机。StateMachineManagerImpl.onSessionInit-正在接受流来自一方的会话O=模拟公司1,L=伦敦,C=英国。的会话id跟踪目的是SessionId(toLong=-5160466662167158789(。{invocation_id=af86ddea-0bae-43eb-998c-c2ae3fc91fcf,invocation_ timestamp=2020-03-23T19:39:40.715Z,session_id=af86ddea-0bae-43eb-998c-c2ae3fc91fcf,session_timestamp=2020-03-23T19:39:40.715Z}[信息]14:39:40742[模拟node 1 thread](FlowStateMachineImpl.kt:419(流[742bd708-244d-49ao-91af-8127267029a1]。启动会话-启动与第O方的流程会话=ParentCompany,L=London,C=GB。用于跟踪目的的会话id为SessionId(toLong=6693667128513799995(。{}[信息]14:39:40750[模拟node 3 thread](StateMachineManagerImpl.kt:367(状态机。StateMachineManagerImpl.onSessionInit-正在接受流来自一方的会话O=模拟公司1,L=伦敦,C=英国。的会话id跟踪目的是SessionId(toLong=6693667128513799995(。{actor_id=仅用于测试,actor_owningIdentity=O=ParentCompany,L=伦敦,C=英国,actor_store_id=测试,invocation_id=487f4d03-c5b7-4aea-81a6-a000e788e0a2,invocation_ timestamp=2020-03-23T19:39:40.750Z,session_id=487f4d03-c5b7-4aea-81a6-a000e788e0a2,session_timestamp=2020-03-23T19:39:40.750Z}

@Nullable
@Override
public ScheduledActivity nextScheduledActivity(@NotNull StateRef thisStateRef, @NotNull 
FlowLogicRefFactory flowLogicRefFactory) {
FlowLogicRef flow = flowLogicRefFactory.create(
"com.myapp.MySchedulableFlow",
thisStateRef
);
return new ScheduledActivity(flow, paymentDueDate);
}

如果我将流名称设置为不存在的流,那么测试将不会挂起,并报告找不到流。

更新:确认挂起的是waitQuiscent((。如果我删除它并用Thread.sleep((替换它,我的测试就会通过。看起来waitQuiscent在等待所有ScheduledActivity完成。在不等待ScheduledActivities完成的情况下,是否需要等待来处理相同类型的功能?

您可能错过了调用MockNetwork.runNetwork方法。这里有一个例子:

@Test
public void testCreateAuctionFlow() throws Exception {
CreateAssetFlow assetflow = new CreateAssetFlow("Test Asset", "Dummy Asset", dummy.png");
CordaFuture<SignedTransaction> future = a.startFlow(assetflow);
network.runNetwork();
SignedTransaction signedTransaction = future.get();
Asset asset = (Asset) signedTransaction.getTx().getOutput(0);
CreateAuctionFlow.Initiator auctionFlow = new CreateAuctionFlow.Initiator(Amount.parseCurrency("1000 USD"),
asset.getLinearId().getId(), LocalDateTime.ofInstant(Instant.now().plusMillis(30000), ZoneId.systemDefault()));
CordaFuture<SignedTransaction> future1 = a.startFlow(auctionFlow);
network.runNetwork();
SignedTransaction transaction = future1.get();
AuctionState auctionState = (AuctionState) transaction.getTx().getOutput(0);
assertNotNull(auctionState);
}

runNetwork方法应该在每个流被触发之后被调用。这有助于模拟网络在节点之间正确地反弹消息。

查看此处的文档以了解更多详细信息:https://docs.corda.net/docs/corda-os/4.4/flow-testing.html

请查看此处示例中SchedulableState的测试用例:https://github.com/corda/samples/blob/release-V4/auction-cordapp/workflows/src/test/java/net/corda/samples/FlowTests.java#L68

最新更新