From e075e1ecf732fdd595690771ff160961e1a2588e Mon Sep 17 00:00:00 2001 From: Jeremy Bernard Date: Mon, 27 Apr 2026 12:31:07 +0200 Subject: [PATCH 1/4] fix: submit tx with backoff delay --- .gitignore | 2 +- .../iexec/blockchain/IntegrationTests.java | 10 +++----- .../blockchain/chain/IexecHubService.java | 9 ++++++-- .../command/generic/CommandEngine.java | 23 ++++++++++++++----- .../task/finalize/TaskFinalizeService.java | 15 +++++++----- .../TaskInitializeBlockchainService.java | 2 +- .../initialize/TaskInitializeService.java | 15 +++++++----- src/main/resources/application.yml | 1 + .../chain/IexecHubServiceTests.java | 6 ++--- .../finalize/TaskFinalizeServiceTests.java | 14 +++++++---- .../TaskInitializeServiceTests.java | 14 +++++++---- 11 files changed, 71 insertions(+), 40 deletions(-) diff --git a/.gitignore b/.gitignore index 62a7d3b5..c5e3cc96 100644 --- a/.gitignore +++ b/.gitignore @@ -36,4 +36,4 @@ build /out/ /bin/ -.vscode/ \ No newline at end of file +.vscode/ diff --git a/src/itest/java/com/iexec/blockchain/IntegrationTests.java b/src/itest/java/com/iexec/blockchain/IntegrationTests.java index 142ef511..e43b0961 100644 --- a/src/itest/java/com/iexec/blockchain/IntegrationTests.java +++ b/src/itest/java/com/iexec/blockchain/IntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2021-2025 IEXEC BLOCKCHAIN TECH + * Copyright 2021-2026 IEXEC BLOCKCHAIN TECH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -52,7 +52,6 @@ import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import org.web3j.crypto.Hash; -import org.web3j.protocol.core.methods.response.TransactionReceipt; import org.web3j.protocol.exceptions.TransactionException; import org.web3j.utils.Numeric; @@ -160,7 +159,6 @@ private static String getServiceUrl(String serviceHost, int servicePort) { @Test void shouldBeFinalized() throws IOException, TransactionException { - TransactionReceipt receipt; final String dealId = triggerDeal(1); final String chainTaskId = appClient.requestInitializeTask(dealId, 0); @@ -174,18 +172,16 @@ void shouldBeFinalized() throws IOException, TransactionException { final String enclaveSignature = BytesUtils.bytesToString(new byte[65]); final WorkerpoolAuthorization workerpoolAuthorization = mockAuthorization(chainTaskId, enclaveChallenge); - receipt = iexecHubService.contribute( + iexecHubService.contribute( chainTaskId, someBytes32Payload, workerpoolAuthorization.getSignature().getValue(), enclaveChallenge, enclaveSignature); - log.info("contribute {}", receipt); waitStatus(chainTaskId, ChainTaskStatus.REVEALING, MAX_POLLING_ATTEMPTS); - receipt = iexecHubService.reveal(chainTaskId, someBytes32Payload); - log.info("reveal {}", receipt); + iexecHubService.reveal(chainTaskId, someBytes32Payload); waitBeforeFinalizing(chainTaskId); final TaskFinalizeArgs taskFinalizeArgs = new TaskFinalizeArgs("", ""); diff --git a/src/main/java/com/iexec/blockchain/chain/IexecHubService.java b/src/main/java/com/iexec/blockchain/chain/IexecHubService.java index ab3b6f78..ca8b79fe 100644 --- a/src/main/java/com/iexec/blockchain/chain/IexecHubService.java +++ b/src/main/java/com/iexec/blockchain/chain/IexecHubService.java @@ -1,5 +1,5 @@ /* - * Copyright 2020-2025 IEXEC BLOCKCHAIN TECH + * Copyright 2020-2026 IEXEC BLOCKCHAIN TECH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -65,7 +65,12 @@ public static boolean isByte32(final String hexString) { } public TransactionReceipt initializeTask(final String chainDealId, - final int taskIndex) throws IOException, TransactionException { + final int taskIndex, + final String chainTaskId) throws IOException, TransactionException { + if (!isTaskInUnsetStatusOnChain(chainTaskId)) { + log.warn("task is already initialized [chainTaskId:{}]", chainTaskId); + return new TransactionReceipt(); + } final String txData = PoCoDataEncoder.encodeInitialize(chainDealId, taskIndex); final SubmittedTx submittedTx = submit("initialize", txData); return waitForTxMined(submittedTx); diff --git a/src/main/java/com/iexec/blockchain/command/generic/CommandEngine.java b/src/main/java/com/iexec/blockchain/command/generic/CommandEngine.java index 1af6614e..5cf901bf 100644 --- a/src/main/java/com/iexec/blockchain/command/generic/CommandEngine.java +++ b/src/main/java/com/iexec/blockchain/command/generic/CommandEngine.java @@ -1,5 +1,5 @@ /* - * Copyright 2020-2025 IEXEC BLOCKCHAIN TECH + * Copyright 2020-2026 IEXEC BLOCKCHAIN TECH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ import lombok.extern.slf4j.Slf4j; import org.web3j.protocol.core.methods.response.TransactionReceipt; +import java.time.Duration; import java.util.Optional; @Slf4j @@ -31,15 +32,16 @@ public abstract class CommandEngine { private final CommandBlockchain blockchainService; private final CommandStorage updaterService; private final QueueService queueService; + private final Duration backoffDelay; - protected CommandEngine( - CommandBlockchain blockchainService, - CommandStorage updaterService, - QueueService queueService - ) { + protected CommandEngine(final CommandBlockchain blockchainService, + final CommandStorage updaterService, + final QueueService queueService, + final Duration backoffDelay) { this.blockchainService = blockchainService; this.updaterService = updaterService; this.queueService = queueService; + this.backoffDelay = backoffDelay; } /** @@ -85,6 +87,15 @@ public void triggerBlockchainCommand(final A args) { log.info("Processing command [{}]", messageDetails); TransactionReceipt receipt = null; while (attempt < MAX_ATTEMPTS && receipt == null) { + if (attempt != 0) { + try { + log.warn("Backoff delay before retrying tx"); + Thread.sleep(backoffDelay.toMillis()); + } catch (InterruptedException e) { + log.warn("Thread has been interrupted", e); + Thread.currentThread().interrupt(); + } + } attempt++; try { receipt = blockchainService.sendBlockchainCommand(args); diff --git a/src/main/java/com/iexec/blockchain/command/task/finalize/TaskFinalizeService.java b/src/main/java/com/iexec/blockchain/command/task/finalize/TaskFinalizeService.java index fc1c0bcf..7990bdfe 100644 --- a/src/main/java/com/iexec/blockchain/command/task/finalize/TaskFinalizeService.java +++ b/src/main/java/com/iexec/blockchain/command/task/finalize/TaskFinalizeService.java @@ -1,5 +1,5 @@ /* - * Copyright 2020-2025 IEXEC BLOCKCHAIN TECH + * Copyright 2020-2026 IEXEC BLOCKCHAIN TECH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,19 +20,22 @@ import com.iexec.blockchain.command.generic.CommandEngine; import com.iexec.blockchain.command.generic.CommandStorage; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import java.time.Duration; + import static com.iexec.blockchain.chain.IexecHubService.isByte32; @Slf4j @Service public class TaskFinalizeService extends CommandEngine { - public TaskFinalizeService( - final TaskFinalizeBlockchainService blockchainService, - final CommandStorage storageService, - final QueueService queueService) { - super(blockchainService, storageService, queueService); + public TaskFinalizeService(final TaskFinalizeBlockchainService blockchainService, + final CommandStorage storageService, + final QueueService queueService, + @Value("${chain.tx-backoff-delay}") final Duration backoffDelay) { + super(blockchainService, storageService, queueService, backoffDelay); } public String start(final String chainTaskId, final String resultLink, final String callbackData) { diff --git a/src/main/java/com/iexec/blockchain/command/task/initialize/TaskInitializeBlockchainService.java b/src/main/java/com/iexec/blockchain/command/task/initialize/TaskInitializeBlockchainService.java index 395921ac..11f87e22 100644 --- a/src/main/java/com/iexec/blockchain/command/task/initialize/TaskInitializeBlockchainService.java +++ b/src/main/java/com/iexec/blockchain/command/task/initialize/TaskInitializeBlockchainService.java @@ -60,7 +60,7 @@ private void logError(final String chainTaskId, final TaskInitializeArgs args, f @Override public TransactionReceipt sendBlockchainCommand(final TaskInitializeArgs args) throws IOException, TransactionException { - return iexecHubService.initializeTask(args.getChainDealId(), args.getTaskIndex()); + return iexecHubService.initializeTask(args.getChainDealId(), args.getTaskIndex(), args.getChainTaskId()); } } diff --git a/src/main/java/com/iexec/blockchain/command/task/initialize/TaskInitializeService.java b/src/main/java/com/iexec/blockchain/command/task/initialize/TaskInitializeService.java index bdd14425..26587d75 100644 --- a/src/main/java/com/iexec/blockchain/command/task/initialize/TaskInitializeService.java +++ b/src/main/java/com/iexec/blockchain/command/task/initialize/TaskInitializeService.java @@ -1,5 +1,5 @@ /* - * Copyright 2020-2025 IEXEC BLOCKCHAIN TECH + * Copyright 2020-2026 IEXEC BLOCKCHAIN TECH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,18 +20,21 @@ import com.iexec.blockchain.command.generic.CommandEngine; import com.iexec.blockchain.command.generic.CommandStorage; import com.iexec.commons.poco.chain.ChainUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import java.time.Duration; + import static com.iexec.blockchain.chain.IexecHubService.isByte32; @Service public class TaskInitializeService extends CommandEngine { - public TaskInitializeService( - final TaskInitializeBlockchainService blockchainService, - final CommandStorage updaterService, - final QueueService queueService) { - super(blockchainService, updaterService, queueService); + public TaskInitializeService(final TaskInitializeBlockchainService blockchainService, + final CommandStorage updaterService, + final QueueService queueService, + @Value("${chain.tx-backoff-delay}") final Duration backoffDelay) { + super(blockchainService, updaterService, queueService, backoffDelay); } public String start(final String chainDealId, final int taskIndex) { diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 89e16892..b57ace7a 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -22,6 +22,7 @@ chain: gas-price-multiplier: ${IEXEC_GAS_PRICE_MULTIPLIER:1.0} # txs will be sent with networkGasPrice*gasPriceMultiplier, 4.0 means super fast gas-price-cap: ${IEXEC_GAS_PRICE_CAP:22000000000} #in Wei, will be used for txs if networkGasPrice*gasPriceMultiplier > gasPriceCap max-allowed-tx-per-block: ${IEXEC_BLOCKCHAIN_ADAPTER_API_MAX_ALLOWED_TX_PER_BLOCK:1} # 1 or 2 + tx-backoff-delay: PT0.5S wallet: path: ${IEXEC_BLOCKCHAIN_ADAPTER_API_WALLET_PATH:src/main/resources/wallet.json} password: ${IEXEC_BLOCKCHAIN_ADAPTER_API_WALLET_PASSWORD:whatever} diff --git a/src/test/java/com/iexec/blockchain/chain/IexecHubServiceTests.java b/src/test/java/com/iexec/blockchain/chain/IexecHubServiceTests.java index 4f17f7af..638eb3ac 100644 --- a/src/test/java/com/iexec/blockchain/chain/IexecHubServiceTests.java +++ b/src/test/java/com/iexec/blockchain/chain/IexecHubServiceTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2025 IEXEC BLOCKCHAIN TECH + * Copyright 2023-2026 IEXEC BLOCKCHAIN TECH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -90,7 +90,7 @@ private void mockTransaction() throws IOException, TransactionException { @Test void shouldInitializeTask() throws IOException, TransactionException { mockTransaction(); - assertThat(iexecHubService.initializeTask(chainDealId, 0)) + assertThat(iexecHubService.initializeTask(chainDealId, 0, chainTaskId)) .isEqualTo(receipt); } @@ -99,7 +99,7 @@ void shouldNotInitializeTask() throws IOException { when(signerService.estimateGas(any(), any())).thenReturn(BigInteger.valueOf(100_000L)); when(signerService.signAndSendTransaction(any(), any(), any(), any(), any())) .thenThrow(IOException.class); - assertThatThrownBy(() -> iexecHubService.initializeTask(chainDealId, 0)) + assertThatThrownBy(() -> iexecHubService.initializeTask(chainDealId, 0, chainTaskId)) .isInstanceOf(IOException.class); } diff --git a/src/test/java/com/iexec/blockchain/command/task/finalize/TaskFinalizeServiceTests.java b/src/test/java/com/iexec/blockchain/command/task/finalize/TaskFinalizeServiceTests.java index d390ba92..cfe98687 100644 --- a/src/test/java/com/iexec/blockchain/command/task/finalize/TaskFinalizeServiceTests.java +++ b/src/test/java/com/iexec/blockchain/command/task/finalize/TaskFinalizeServiceTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2024-2025 IEXEC BLOCKCHAIN TECH + * Copyright 2024-2026 IEXEC BLOCKCHAIN TECH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,16 +20,17 @@ import com.iexec.blockchain.chain.QueueService; import com.iexec.blockchain.command.generic.CommandName; import com.iexec.blockchain.command.generic.CommandStorage; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.web3j.protocol.core.methods.response.TransactionReceipt; +import java.time.Duration; import java.util.Optional; import java.util.stream.Stream; @@ -46,8 +47,6 @@ class TaskFinalizeServiceTests { "0xe90fc4654b5ea32ad8689091e7610cad7ee5c8b9b1a6e39401b57d90343bfcaa"; private static final String RESULT_LINK = "/ipfs/QmeQHGKFAkEkA5tm3kuXqBM9zz9JorkvCsAJ2bzAAh6NX4"; - @InjectMocks - private TaskFinalizeService taskFinalizeService; @Mock private TaskFinalizeBlockchainService blockchainService; @Mock @@ -55,8 +54,15 @@ class TaskFinalizeServiceTests { @Mock private QueueService queueService; + private TaskFinalizeService taskFinalizeService; private final TaskFinalizeArgs args = new TaskFinalizeArgs(CHAIN_TASK_ID, RESULT_LINK, EMPTY_ADDRESS); + @BeforeEach + void init() { + taskFinalizeService = new TaskFinalizeService( + blockchainService, updaterService, queueService, Duration.ofMillis(100L)); + } + // region start @Test void shouldFinalizeTask() { diff --git a/src/test/java/com/iexec/blockchain/command/task/initialize/TaskInitializeServiceTests.java b/src/test/java/com/iexec/blockchain/command/task/initialize/TaskInitializeServiceTests.java index 1acaa6ea..f16c485a 100644 --- a/src/test/java/com/iexec/blockchain/command/task/initialize/TaskInitializeServiceTests.java +++ b/src/test/java/com/iexec/blockchain/command/task/initialize/TaskInitializeServiceTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2021-2025 IEXEC BLOCKCHAIN TECH + * Copyright 2021-2026 IEXEC BLOCKCHAIN TECH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,16 +21,17 @@ import com.iexec.blockchain.command.generic.CommandName; import com.iexec.blockchain.command.generic.CommandStorage; import com.iexec.commons.poco.chain.ChainUtils; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.web3j.protocol.core.methods.response.TransactionReceipt; +import java.time.Duration; import java.util.Optional; import java.util.stream.Stream; @@ -46,8 +47,6 @@ class TaskInitializeServiceTests { public static final String CHAIN_TASK_ID = ChainUtils.generateChainTaskId(CHAIN_DEAL_ID, TASK_INDEX); - @InjectMocks - private TaskInitializeService taskInitializeService; @Mock private TaskInitializeBlockchainService blockchainCheckerService; @Mock @@ -55,8 +54,15 @@ class TaskInitializeServiceTests { @Mock private QueueService queueService; + private TaskInitializeService taskInitializeService; private final TaskInitializeArgs args = new TaskInitializeArgs(CHAIN_TASK_ID, CHAIN_DEAL_ID, TASK_INDEX); + @BeforeEach + void init() { + taskInitializeService = new TaskInitializeService( + blockchainCheckerService, updaterService, queueService, Duration.ofMillis(100L)); + } + // region start @Test void shouldInitializeTask() { From 3a2eb51833aeeee781d598f69c1705dc3676ee0b Mon Sep 17 00:00:00 2001 From: Jeremy Bernard Date: Mon, 27 Apr 2026 13:52:57 +0200 Subject: [PATCH 2/4] test: improve coverage with new unit test --- .../com/iexec/blockchain/chain/IexecHubServiceTests.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/test/java/com/iexec/blockchain/chain/IexecHubServiceTests.java b/src/test/java/com/iexec/blockchain/chain/IexecHubServiceTests.java index 638eb3ac..facb502f 100644 --- a/src/test/java/com/iexec/blockchain/chain/IexecHubServiceTests.java +++ b/src/test/java/com/iexec/blockchain/chain/IexecHubServiceTests.java @@ -103,6 +103,13 @@ void shouldNotInitializeTask() throws IOException { .isInstanceOf(IOException.class); } + @Test + void shouldDetectAlreadyInitializedTask() throws IOException, TransactionException { + doReturn(false).when(iexecHubService).isTaskInUnsetStatusOnChain(chainTaskId); + assertThat(iexecHubService.initializeTask(chainDealId, 0, chainTaskId)) + .isEqualTo(new TransactionReceipt()); + } + // endregion @Test From 81ff0be3c157319618188cb824cc4f6d7b44286c Mon Sep 17 00:00:00 2001 From: Jeremy Bernard Date: Mon, 27 Apr 2026 14:05:05 +0200 Subject: [PATCH 3/4] refactor: to reach coverage theshold --- .../java/com/iexec/blockchain/chain/IexecHubService.java | 4 ++-- .../task/initialize/TaskInitializeBlockchainService.java | 2 +- .../com/iexec/blockchain/chain/IexecHubServiceTests.java | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/iexec/blockchain/chain/IexecHubService.java b/src/main/java/com/iexec/blockchain/chain/IexecHubService.java index ca8b79fe..2e1fdd63 100644 --- a/src/main/java/com/iexec/blockchain/chain/IexecHubService.java +++ b/src/main/java/com/iexec/blockchain/chain/IexecHubService.java @@ -65,8 +65,8 @@ public static boolean isByte32(final String hexString) { } public TransactionReceipt initializeTask(final String chainDealId, - final int taskIndex, - final String chainTaskId) throws IOException, TransactionException { + final int taskIndex) throws IOException, TransactionException { + final String chainTaskId = ChainUtils.generateChainTaskId(chainDealId, taskIndex); if (!isTaskInUnsetStatusOnChain(chainTaskId)) { log.warn("task is already initialized [chainTaskId:{}]", chainTaskId); return new TransactionReceipt(); diff --git a/src/main/java/com/iexec/blockchain/command/task/initialize/TaskInitializeBlockchainService.java b/src/main/java/com/iexec/blockchain/command/task/initialize/TaskInitializeBlockchainService.java index 11f87e22..395921ac 100644 --- a/src/main/java/com/iexec/blockchain/command/task/initialize/TaskInitializeBlockchainService.java +++ b/src/main/java/com/iexec/blockchain/command/task/initialize/TaskInitializeBlockchainService.java @@ -60,7 +60,7 @@ private void logError(final String chainTaskId, final TaskInitializeArgs args, f @Override public TransactionReceipt sendBlockchainCommand(final TaskInitializeArgs args) throws IOException, TransactionException { - return iexecHubService.initializeTask(args.getChainDealId(), args.getTaskIndex(), args.getChainTaskId()); + return iexecHubService.initializeTask(args.getChainDealId(), args.getTaskIndex()); } } diff --git a/src/test/java/com/iexec/blockchain/chain/IexecHubServiceTests.java b/src/test/java/com/iexec/blockchain/chain/IexecHubServiceTests.java index facb502f..1f802f35 100644 --- a/src/test/java/com/iexec/blockchain/chain/IexecHubServiceTests.java +++ b/src/test/java/com/iexec/blockchain/chain/IexecHubServiceTests.java @@ -90,7 +90,7 @@ private void mockTransaction() throws IOException, TransactionException { @Test void shouldInitializeTask() throws IOException, TransactionException { mockTransaction(); - assertThat(iexecHubService.initializeTask(chainDealId, 0, chainTaskId)) + assertThat(iexecHubService.initializeTask(chainDealId, 0)) .isEqualTo(receipt); } @@ -99,14 +99,14 @@ void shouldNotInitializeTask() throws IOException { when(signerService.estimateGas(any(), any())).thenReturn(BigInteger.valueOf(100_000L)); when(signerService.signAndSendTransaction(any(), any(), any(), any(), any())) .thenThrow(IOException.class); - assertThatThrownBy(() -> iexecHubService.initializeTask(chainDealId, 0, chainTaskId)) + assertThatThrownBy(() -> iexecHubService.initializeTask(chainDealId, 0)) .isInstanceOf(IOException.class); } @Test void shouldDetectAlreadyInitializedTask() throws IOException, TransactionException { - doReturn(false).when(iexecHubService).isTaskInUnsetStatusOnChain(chainTaskId); - assertThat(iexecHubService.initializeTask(chainDealId, 0, chainTaskId)) + doReturn(false).when(iexecHubService).isTaskInUnsetStatusOnChain(anyString()); + assertThat(iexecHubService.initializeTask(chainDealId, 0)) .isEqualTo(new TransactionReceipt()); } From f45115bbb03112b614b3b10a21ee47536ce392e2 Mon Sep 17 00:00:00 2001 From: Jeremy Bernard Date: Mon, 27 Apr 2026 15:42:14 +0200 Subject: [PATCH 4/4] test: fix unit test --- .../java/com/iexec/blockchain/chain/IexecHubServiceTests.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/iexec/blockchain/chain/IexecHubServiceTests.java b/src/test/java/com/iexec/blockchain/chain/IexecHubServiceTests.java index 1f802f35..c437cea4 100644 --- a/src/test/java/com/iexec/blockchain/chain/IexecHubServiceTests.java +++ b/src/test/java/com/iexec/blockchain/chain/IexecHubServiceTests.java @@ -105,7 +105,8 @@ void shouldNotInitializeTask() throws IOException { @Test void shouldDetectAlreadyInitializedTask() throws IOException, TransactionException { - doReturn(false).when(iexecHubService).isTaskInUnsetStatusOnChain(anyString()); + final String initializedChainTaskId = ChainUtils.generateChainTaskId(chainDealId, 0); + doReturn(false).when(iexecHubService).isTaskInUnsetStatusOnChain(initializedChainTaskId); assertThat(iexecHubService.initializeTask(chainDealId, 0)) .isEqualTo(new TransactionReceipt()); }