【问题标题】:Corda Schedulable State caused Flow tests to hangCorda 可调度状态导致流测试挂起
【发布时间】:2020-04-08 13:42:57
【问题描述】:

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

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

[INFO] 14:39:40,604 [模拟节点 1 线程] (FlowStateMachineImpl.kt:419) 流。[742bd708-244d-49a0-91af-8127267029a1].initiateSession - 启动与方 O=Mock Company 2、L=London、C=GB 的流程会话。 用于跟踪目的的会话 id 是 会话 ID(toLong=4148369640629821591)。 {} [信息] 14:39:40,619 [模拟 节点 2 线程] (StateMachineManagerImpl.kt:367) statemachine.StateMachineManagerImpl.onSessionInit - 接受流 来自派对 O=Mock Company 1、L=London、C=GB 的会话。会话 ID 跟踪目的是 SessionId(toLong=4148369640629821591)。 {invocation_id=2c33f7e4-63bd-4fad-98a0-6b568a78136d, 调用时间戳=2020-03-23T19:39:40.619Z, session_id=2c33f7e4-63bd-4fad-98a0-6b568a78136d, session_timestamp=2020-03-23T19:39:40.619Z} [信息] 14:39:40,706 [模拟 节点 1 线程] (FlowStateMachineImpl.kt:419) 流。[742bd708-244d-49a0-91af-8127267029a1].initiateSession - 启动与方 O=Mock Company 2、L=London、C=GB 的流程会话。 用于跟踪目的的会话 id 是 会话 ID(toLong=-5160466662167158789)。 {} [信息] 14:39:40,715 [模拟 节点 2 线程] (StateMachineManagerImpl.kt:367) statemachine.StateMachineManagerImpl.onSessionInit - 接受流 来自派对 O=Mock Company 1、L=London、C=GB 的会话。会话 ID 跟踪目的是 SessionId(toLong=-5160466662167158789)。 {invocation_id=af86ddea-0bae-43eb-998c-c2ae3fc91fcf, 调用时间戳=2020-03-23T19:39:40.715Z, session_id=af86ddea-0bae-43eb-998c-c2ae3fc91fcf, session_timestamp=2020-03-23T19:39:40.715Z} [信息] 14:39:40,742 [模拟 节点 1 线程] (FlowStateMachineImpl.kt:419) 流。[742bd708-244d-49a0-91af-8127267029a1].initiateSession - 启动与方 O=ParentCompany、L=London、C=GB 的流程会话。 用于跟踪目的的会话 id 是 会话 ID(toLong=6693667128513799995)。 {} [信息] 14:39:40,750 [模拟 节点 3 线程] (StateMachineManagerImpl.kt:367) statemachine.StateMachineManagerImpl.onSessionInit - 接受流 来自派对 O=Mock Company 1、L=London、C=GB 的会话。会话 ID 跟踪目的是 SessionId(toLong=6693667128513799995)。 {actor_id=仅用于测试,actor_owningIdentity=O=ParentCompany, L=伦敦,C=GB,actor_store_id=TEST, invocation_id=487f4d03-c5b7-4aea-81a6-a000e788e0a2, 调用时间戳=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 等待所有 ScheduledActivities 完成。是否需要等待处理相同类型的功能而不等待 ScheduledActivities 完成?

【问题讨论】:

  • 你能分享一下你的测试类的代码吗?

标签: corda


【解决方案1】:

您可能错过了调用 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

【讨论】:

    猜你喜欢
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多