Запланированное состояние Corda привело к зависанию тестов потока - PullRequest
0 голосов
/ 23 марта 2020

У меня LoanState, который является ScheduledState. Все тесты потока, которые используют LoanState, зависают бесконечно. Если я установлю nextScheduledActivity() на return null, тогда тесты пройдут нормально. В журнале модульных тестов нет видимых ошибок. Это на Corda 3.2.

Это последний бит текста в консоли перед зависанием:

[INFO] 14: 39: 40,604 [Поток фиктивного узла 1] ( FlowStateMachineImpl.kt: 419) flow. [742bd708-244d-49a0-91af-8127267029a1] .initiateSession - инициирование сеанса потока со стороной O = Mock Company 2, L = Лондон, C = GB. Идентификатор сеанса для целей трассировки - SessionId (toLong = 4148369640629821591). {} [ИНФОРМАЦИЯ] 14: 39: 40,619 [Поток фиктивного узла 2] (StateMachineManagerImpl.kt: 367) statemachine.StateMachineManagerImpl.onSessionInit - Принятие сеанса потока от стороны O = Подразделение 1, L = Лондон, C = GB. Идентификатор сеанса для целей трассировки - SessionId (toLong = 4148369640629821591). {invocation_id = 2c33f7e4-63bd-4fad-98a0-6b568a78136d, invocation_timestamp = 2020-03-23T19: 39: 40.619Z, session_id = 2c33f7e4-63bd-4fad-98a0-6b568a78136d, сессия_time.6: 2020: отметка времени сессии: 2020: } [INFO] 14: 39: 40,706 [Поток фиктивного узла 1] (FlowStateMachineImpl.kt: 419) flow. [742bd708-244d-49a0-91af-8127267029a1] .initiateSession - Инициирование сеанса потока со стороной O = Mock Company 2, L = Лондон, C = ГБ. Идентификатор сеанса для целей трассировки - SessionId (toLong = -5160466662167158789). {} [ИНФО] 14: 39: 40,715 [Поток фиктивного узла 2] (StateMachineManagerImpl.kt: 367) statemachine.StateMachineManagerImpl.onSessionInit - Принятие сеанса потока от стороны O = Подразделение 1, L = Лондон, C = ГБ. Идентификатор сеанса для целей трассировки - SessionId (toLong = -5160466662167158789). {invocation_id = af86ddea-0bae-43eb-998 c -c2ae3fc91fcf, invocation_timestamp = 2020-03-23T19: 39: 40.715Z, session_id = af86ddea-0bae-43eb-998 c -c2ae3fc91fcf = время_ сессии 23T19: 39: 40.715Z} [ИНФОРМАЦИЯ] 14: 39: 40,742 [Поток фиктивного узла 1] (FlowStateMachineImpl.kt: 419) поток. [742bd708-244d-49a0-91af-8127267029a1] .initiateSession - Инициирование сеанса потока со стороной O = ParentCompany, L = Лондон, C = ГБ. Идентификатор сеанса для целей трассировки - SessionId (toLong = 6693667128513799995). {} [ИНФО] 14: 39: 40,750 [Поток фиктивного узла 3] (StateMachineManagerImpl.kt: 367) statemachine.StateMachineManagerImpl.onSessionInit - Принятие сеанса потока от стороны O = Подразделение 1, L = Лондон, C = ГБ. Идентификатор сеанса для целей трассировки - SessionId (toLong = 6693667128513799995). {actor_id = Только для тестирования, actor_owningIdentity = O = ParentCompany, L = Лондон, C = GB, actor_store_id = TEST, invocation_id = 487f4d03-c5b7-4aea-81a6-a000e788e0a2, invocation_timestamp = 2020-03-235019: 39: 39: 50Z: 39: 39,750: 39 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 завершат sh. Есть ли ожидание для обработки того же типа функциональности, не дожидаясь, пока ScheduledActivities завершит работу sh?

1 Ответ

1 голос
/ 08 апреля 2020

Возможно, вы пропустили вызов метода 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

Посмотрите на testCase для SchedulableState в примерах здесь: https://github.com/corda/samples/blob/release-V4/auction-cordapp/workflows/src/test/java/net/corda/samples/FlowTests.java#L68

...