如何测试预定流量?

时间:2018-01-29 17:21:16

标签: corda

我使用模拟网络来测试预定的流量,但我无法跟踪给定的结果,因为它不像使用node.services.startFlow(...)那样作为未来返回。

我已经尝试过心跳示例中说明的方法:

val recordedTxs = node.database.transaction {
  val (recordedTxs, futureTxs) = node.services.validatedTransactions.track()
  futureTxs.notUsed()
  recordedTxs
}

我已在recordedTxs内列出了内容,并且未显示由预定流量加载的内容。我还订阅了futureTxs,但没有观察到的更新。

还有其他方法吗?

由于

2 个答案:

答案 0 :(得分:1)

测试计划流程的另一个方面是使用参数来调整流量以调节流量。 corda节点的调度程序将启动(通过合同调度逻辑)预期现在或过去完成的流程。这为您提供了两种检查流程完成的方法。

  1. 立即设置要安排的流量,然后检查 节点的数据库,用于具有您期望的属性的新消耗状态 看。
  2. 启动流程并将平台时钟(在测试设置中)移动到a 计划流程完成然后检查的时间 的状态。
  3. 样品:

    // Set up the network as:  
    net: MockNetwork = MockNetwork(threadPerNode = true)
    // Logic to set up nodes 
    ...
    net.startNodes()
    
    // Additional set up 
    ... 
    val scheduledFlow = SimpleScheduledFlow(parameterForImmediateScheduling)
    testNode.services.startFlow(scheduledFlow)
    net.waitQuiescent()
    
    node.database.transaction {
        // Check validated transactions ...
        // Checks on the states newly produced by the flow ...
    }
    

    可替换地,

    val scheduledFlow = SimpleScheduledFlow(parameterForLaterScheduling)
    testNode.services.startFlow(scheduledFlow)
    (node.internals.platformClock as TestClock).setTo(valueDate.atTime(LocalTime.MIDNIGHT).plusSeconds(1).toInstant(ZoneOffset.UTC))
    net.waitQuiescent()
    
    node.database.transaction {
        // Check validated transactions ...
        // Checks on the states newly produced by the flow ...
    }
    

    补充参考:

答案 1 :(得分:0)

您可以按如下方式测试预定状态:

  • 调用创建计划活动的流程
  • 长时间睡眠以使计划的活动发生
  • 检查计划的活动是否已发生

例如,请参阅心跳样本(https://github.com/joeldudleyr3/heartbeat)中的流量测试:

@Test
fun `heartbeat occurs every second`() {
    val flow = StartHeartbeatFlow()
    a.services.startFlow(flow).resultFuture

    val enoughTimeForFiveScheduledTxs: Long = 5500
    Thread.sleep(enoughTimeForFiveScheduledTxs)

    val recordedTxs = a.database.transaction {
        val (recordedTxs, futureTxs) = a.services.validatedTransactions.track()
        futureTxs.notUsed()
        recordedTxs
    }

    val originalTxPlusFiveScheduledTxs = 6
    assertEquals(originalTxPlusFiveScheduledTxs, recordedTxs.size)
}

在此测试中,我们按以下步骤操作:

  • 我们运行StartHeartbeatFlow。此流程创建一个计划状态,一秒钟之后将创建创建另一个计划状态的事务,依此类推。这意味着运行StartHeartbeatFlow会导致每秒发生一次新事务,直到节点关闭为止
  • 我们等5.5秒。这足以让另外五笔交易发生
  • 我们检查金库中现在有六笔交易

使用此方法时,您必须确保使用MockNetwork初始化threadPerNode = true,否则在线程上休眠将阻止所有网络活动。