diff --git a/src/main/java/com/iexec/worker/replicate/ReplicateActionResponse.java b/src/main/java/com/iexec/worker/replicate/ReplicateActionResponse.java index 8c3220454..9f4bbe1a1 100644 --- a/src/main/java/com/iexec/worker/replicate/ReplicateActionResponse.java +++ b/src/main/java/com/iexec/worker/replicate/ReplicateActionResponse.java @@ -1,5 +1,5 @@ /* - * Copyright 2020-2023 IEXEC BLOCKCHAIN TECH + * Copyright 2020-2025 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. @@ -16,7 +16,6 @@ package com.iexec.worker.replicate; -import com.iexec.common.replicate.ComputeLogs; import com.iexec.common.replicate.ReplicateStatusCause; import com.iexec.common.replicate.ReplicateStatusDetails; import com.iexec.commons.poco.chain.ChainReceipt; @@ -30,7 +29,6 @@ @NoArgsConstructor @AllArgsConstructor public class ReplicateActionResponse { - private boolean isSuccess; private ReplicateStatusDetails details; @@ -38,25 +36,20 @@ public static ReplicateActionResponse success() { return new ReplicateActionResponse(true, null); } - public static ReplicateActionResponse success(ChainReceipt chainReceipt) { - ReplicateStatusDetails details = ReplicateStatusDetails.builder() - .chainReceipt(chainReceipt) - .build(); - return new ReplicateActionResponse(true, details); + public static ReplicateActionResponse success(final ChainReceipt chainReceipt) { + return new ReplicateActionResponse( + true, ReplicateStatusDetails.builder().chainReceipt(chainReceipt).build()); } - public static ReplicateActionResponse success(String resultLink, String callbackData) { - ReplicateStatusDetails details = ReplicateStatusDetails.builder() + public static ReplicateActionResponse success(final String resultLink, final String callbackData) { + final ReplicateStatusDetails details = ReplicateStatusDetails.builder() .resultLink(resultLink) .chainCallbackData(callbackData) .build(); return new ReplicateActionResponse(true, details); } - public static ReplicateActionResponse successWithLogs(ComputeLogs computeLogs) { - ReplicateStatusDetails details = ReplicateStatusDetails.builder() - .computeLogs(computeLogs) - .build(); + public static ReplicateActionResponse successWithDetails(final ReplicateStatusDetails details) { return new ReplicateActionResponse(true, details); } @@ -64,29 +57,8 @@ public static ReplicateActionResponse failure() { return new ReplicateActionResponse(false, null); } - public static ReplicateActionResponse failure(ReplicateStatusCause cause) { - ReplicateStatusDetails details = ReplicateStatusDetails.builder() - .cause(cause) - .build(); - return new ReplicateActionResponse(false, details); - } - - public static ReplicateActionResponse failureWithStdout(String stdout) { - ReplicateStatusDetails details = ReplicateStatusDetails.builder() - .computeLogs(ComputeLogs.builder().stdout(stdout).build()) - .build(); - return new ReplicateActionResponse(false, details); - } - - public static ReplicateActionResponse failureWithStdout(ReplicateStatusCause cause, String stdout) { - ReplicateStatusDetails details = ReplicateStatusDetails.builder() - .cause(cause) - .computeLogs(ComputeLogs.builder().stdout(stdout).build()) - .build(); - return new ReplicateActionResponse(false, details); - } - - public static ReplicateActionResponse failureWithDetails(ReplicateStatusDetails details) { - return new ReplicateActionResponse(false, details); + public static ReplicateActionResponse failure(final ReplicateStatusCause cause) { + return new ReplicateActionResponse( + false, ReplicateStatusDetails.builder().cause(cause).build()); } } diff --git a/src/main/java/com/iexec/worker/task/TaskManagerService.java b/src/main/java/com/iexec/worker/task/TaskManagerService.java index ea0c2ccb3..3ef974ac8 100644 --- a/src/main/java/com/iexec/worker/task/TaskManagerService.java +++ b/src/main/java/com/iexec/worker/task/TaskManagerService.java @@ -48,6 +48,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -264,39 +265,25 @@ ReplicateActionResponse compute(final TaskDescription taskDescription) { } final PreComputeResponse preResponse = computeManagerService.runPreCompute(taskDescription); - if (!preResponse.isSuccessful()) { - return getFailureResponseAndPrintErrors(preResponse.getExitCauses(), context, chainTaskId); - } + final List cumulatedErrors = new ArrayList<>(preResponse.getExitCauses()); final AppComputeResponse appResponse = computeManagerService.runCompute(taskDescription); - if (!appResponse.isSuccessful()) { - final List appErrors = appResponse.getExitCauses(); - appErrors.forEach(error -> logError(error.cause(), context, chainTaskId)); - return ReplicateActionResponse.failureWithDetails( - ReplicateStatusDetails.builder() - .cause(appErrors.get(0).cause()) //TODO: Handle list of causes - .exitCode(appResponse.getExitCode()) - .computeLogs( - ComputeLogs.builder() - .stdout(appResponse.getStdout()) - .stderr(appResponse.getStderr()) - .build() - ) - .build()); - } + cumulatedErrors.addAll(appResponse.getExitCauses()); final PostComputeResponse postResponse = computeManagerService.runPostCompute(taskDescription); - if (!postResponse.isSuccessful()) { - final List postComputeErrors = postResponse.getExitCauses(); - postComputeErrors.forEach(error -> logError(error.cause(), context, chainTaskId)); - return ReplicateActionResponse.failureWithStdout(postComputeErrors.get(0).cause(), postResponse.getStdout()); // TODO: Handle list of causes - } - return ReplicateActionResponse.successWithLogs( - ComputeLogs.builder() - .stdout(appResponse.getStdout()) - .stderr(appResponse.getStderr()) - .build() - ); + cumulatedErrors.addAll(postResponse.getExitCauses()); + final ComputeLogs computeLogs = ComputeLogs.builder() + .stdout(appResponse.getStdout()) + .stderr(appResponse.getStderr()) + .build(); + final ReplicateStatusDetails details = ReplicateStatusDetails.builder() + .exitCode(appResponse.getExitCode()) + .computeLogs(computeLogs) + .build(); + + // Always return success to avoid returning COMPUTE_FAILED as this would stop the task execution + cumulatedErrors.forEach(error -> logError(error.cause(), context, chainTaskId)); + return ReplicateActionResponse.successWithDetails(details); } /** diff --git a/src/test/java/com/iexec/worker/task/TaskManagerServiceTests.java b/src/test/java/com/iexec/worker/task/TaskManagerServiceTests.java index 857579b2c..8e2db19d9 100644 --- a/src/test/java/com/iexec/worker/task/TaskManagerServiceTests.java +++ b/src/test/java/com/iexec/worker/task/TaskManagerServiceTests.java @@ -47,7 +47,6 @@ import com.iexec.worker.tee.TeeServicesManager; import com.iexec.worker.workflow.WorkflowError; import com.iexec.worker.workflow.WorkflowException; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; @@ -172,8 +171,8 @@ void shouldNotStartSinceStandardTaskWithEncryption() { when(contributionService.getCannotContributeStatusCause(CHAIN_TASK_ID)) .thenReturn(emptyCauses); ReplicateActionResponse actionResponse = taskManagerService.start(taskDescription); - Assertions.assertThat(actionResponse.isSuccess()).isFalse(); - Assertions.assertThat(actionResponse.getDetails().getCause()).isEqualTo(TASK_DESCRIPTION_INVALID); + assertThat(actionResponse.isSuccess()).isFalse(); + assertThat(actionResponse.getDetails().getCause()).isEqualTo(TASK_DESCRIPTION_INVALID); } @Test @@ -612,8 +611,7 @@ void shouldWithInputFilesDataDownloadFailedAndTriggerPostComputeHookWithFailure2 .thenReturn(PostComputeResponse.builder() .exitCauses(List.of(new WorkflowError(POST_COMPUTE_FAILED_UNKNOWN_ISSUE))).build()); - ReplicateActionResponse actionResponse = - taskManagerService.downloadData(taskDescription); + final ReplicateActionResponse actionResponse = taskManagerService.downloadData(taskDescription); assertThat(actionResponse.isSuccess()).isFalse(); assertThat(actionResponse.getDetails().getCause()) @@ -637,19 +635,20 @@ void shouldComputeStandardTask() { when(computeManagerService.runPostCompute(any())) .thenReturn(PostComputeResponse.builder().build()); - ReplicateActionResponse replicateActionResponse = - taskManagerService.compute(taskDescription); + final ReplicateActionResponse replicateActionResponse = taskManagerService.compute(taskDescription); verify(computeManagerService).runPostCompute(any()); verifyNoInteractions(iexecHubService, teeServicesManager); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() - .isEqualTo( - ReplicateActionResponse - .successWithLogs(ComputeLogs.builder() + .isEqualTo(ReplicateActionResponse.successWithDetails( + ReplicateStatusDetails.builder() + .exitCode(0) + .computeLogs(ComputeLogs.builder() .stdout("stdout") .stderr("stderr") - .build())); + .build()) + .build())); verifyNoInteractions(teeServicesManager, resultService); } @@ -671,19 +670,19 @@ void shouldComputeTeeTask() { when(computeManagerService.runPostCompute(any())) .thenReturn(PostComputeResponse.builder().build()); - ReplicateActionResponse replicateActionResponse = - taskManagerService.compute(taskDescription); + final ReplicateActionResponse replicateActionResponse = taskManagerService.compute(taskDescription); verify(computeManagerService).runPostCompute(any()); verifyNoInteractions(iexecHubService); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() - .isEqualTo( - ReplicateActionResponse - .successWithLogs(ComputeLogs.builder() - .stdout("stdout") + .isEqualTo(ReplicateActionResponse.successWithDetails( + ReplicateStatusDetails.builder() + .exitCode(0) + .computeLogs(ComputeLogs.builder().stdout("stdout") .stderr("stderr") - .build())); + .build()) + .build())); } @ParameterizedTest @@ -694,10 +693,9 @@ void shouldNotComputeSinceCannotContributeStatusIsPresent(ReplicateStatusCause r when(contributionService.getCannotContributeStatusCause(CHAIN_TASK_ID)) .thenReturn(List.of(new WorkflowError(replicateStatusCause))); - ReplicateActionResponse replicateActionResponse = - taskManagerService.compute(getTaskDescriptionBuilder(OrderTag.STANDARD).build()); + final ReplicateActionResponse replicateActionResponse = taskManagerService.compute(getTaskDescriptionBuilder(OrderTag.STANDARD).build()); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() .isEqualTo(ReplicateActionResponse.failure(replicateStatusCause)); } @@ -714,7 +712,7 @@ void shouldNotComputeSinceAppNotDownloaded() { ReplicateActionResponse replicateActionResponse = taskManagerService.compute(taskDescription); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() .isEqualTo(ReplicateActionResponse .failure(APP_NOT_FOUND_LOCALLY)); @@ -722,46 +720,52 @@ void shouldNotComputeSinceAppNotDownloaded() { } @Test - void shouldNotComputeSinceFailedPreCompute() { - final TaskDescription taskDescription = TaskDescription.builder().chainTaskId(CHAIN_TASK_ID).build(); + void shouldNotComputeSinceFailedLasStart() { + final TaskDescription taskDescription = getTaskDescriptionBuilder(OrderTag.TEE_SCONE).build(); when(contributionService.getCannotContributeStatusCause(CHAIN_TASK_ID)) .thenReturn(emptyCauses); when(computeManagerService.isAppDownloaded(taskDescription.getAppUri())) .thenReturn(true); - when(computeManagerService.runPreCompute(any())) - .thenReturn(PreComputeResponse.builder() - .exitCauses(List.of(new WorkflowError(PRE_COMPUTE_DATASET_URL_MISSING))) - .build()); + when(teeServicesManager.getTeeService(taskDescription.getTeeFramework())) + .thenReturn(teeMockedService); + when(teeMockedService.prepareTeeForTask(CHAIN_TASK_ID)) + .thenReturn(false); - ReplicateActionResponse replicateActionResponse = - taskManagerService.compute(taskDescription); + final ReplicateActionResponse replicateActionResponse = taskManagerService.compute(taskDescription); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() .isEqualTo(ReplicateActionResponse - .failure(PRE_COMPUTE_DATASET_URL_MISSING)); + .failure(TEE_PREPARATION_FAILED)); } @Test - void shouldNotComputeSinceFailedLasStart() { - final TaskDescription taskDescription = getTaskDescriptionBuilder(OrderTag.TEE_SCONE).build(); + void shouldNotComputeSinceFailedPreCompute() { + final TaskDescription taskDescription = TaskDescription.builder().chainTaskId(CHAIN_TASK_ID).build(); when(contributionService.getCannotContributeStatusCause(CHAIN_TASK_ID)) .thenReturn(emptyCauses); when(computeManagerService.isAppDownloaded(taskDescription.getAppUri())) .thenReturn(true); - when(teeServicesManager.getTeeService(any())).thenReturn(teeMockedService); - when(teeMockedService.prepareTeeForTask(CHAIN_TASK_ID)) - .thenReturn(false); + when(computeManagerService.runPreCompute(taskDescription)) + .thenReturn(PreComputeResponse.builder() + .exitCauses(List.of(new WorkflowError(PRE_COMPUTE_DATASET_URL_MISSING))) + .build()); + when(computeManagerService.runCompute(taskDescription)) + .thenReturn(AppComputeResponse.builder().stdout("stdout").build()); + when(computeManagerService.runPostCompute(taskDescription)) + .thenReturn(PostComputeResponse.builder().build()); - ReplicateActionResponse replicateActionResponse = - taskManagerService.compute(taskDescription); + final ReplicateActionResponse replicateActionResponse = taskManagerService.compute(taskDescription); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() - .isEqualTo(ReplicateActionResponse - .failure(TEE_PREPARATION_FAILED)); + .isEqualTo(ReplicateActionResponse.successWithDetails( + ReplicateStatusDetails.builder() + .exitCode(0) + .computeLogs(ComputeLogs.builder().stdout("stdout").build()) + .build())); } @Test @@ -772,24 +776,25 @@ void shouldNotComputeSinceFailedAppCompute() { .thenReturn(emptyCauses); when(computeManagerService.isAppDownloaded(taskDescription.getAppUri())) .thenReturn(true); - when(computeManagerService.runPreCompute(any())) + when(computeManagerService.runPreCompute(taskDescription)) .thenReturn(PreComputeResponse.builder().build()); - when(computeManagerService.runCompute(any())) + when(computeManagerService.runCompute(taskDescription)) .thenReturn(AppComputeResponse.builder() .exitCauses(List.of(new WorkflowError(APP_COMPUTE_FAILED))) .exitCode(5) .stdout("stdout") .build()); + when(computeManagerService.runPostCompute(taskDescription)) + .thenReturn(PostComputeResponse.builder().build()); - ReplicateActionResponse replicateActionResponse = - taskManagerService.compute(taskDescription); + final ReplicateActionResponse replicateActionResponse = taskManagerService.compute(taskDescription); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() - .isEqualTo(ReplicateActionResponse.failureWithDetails( + .isEqualTo(ReplicateActionResponse.successWithDetails( ReplicateStatusDetails.builder() - .cause(APP_COMPUTE_FAILED) + //.cause(APP_COMPUTE_FAILED) .exitCode(5) .computeLogs(ComputeLogs.builder().stdout("stdout").build()) .build())); @@ -803,23 +808,24 @@ void shouldNotComputeSinceFailedPostCompute() { .thenReturn(emptyCauses); when(computeManagerService.isAppDownloaded(taskDescription.getAppUri())) .thenReturn(true); - when(computeManagerService.runPreCompute(any())) + when(computeManagerService.runPreCompute(taskDescription)) .thenReturn(PreComputeResponse.builder().build()); - when(computeManagerService.runCompute(any())) + when(computeManagerService.runCompute(taskDescription)) .thenReturn(AppComputeResponse.builder().stdout("stdout").build()); - when(computeManagerService.runPostCompute(any())) + when(computeManagerService.runPostCompute(taskDescription)) .thenReturn(PostComputeResponse.builder() .exitCauses(List.of(new WorkflowError(POST_COMPUTE_FAILED_UNKNOWN_ISSUE))) .build()); + final ReplicateActionResponse replicateActionResponse = taskManagerService.compute(taskDescription); - ReplicateActionResponse replicateActionResponse = - taskManagerService.compute(taskDescription); - - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() - .isEqualTo(ReplicateActionResponse - .failureWithStdout(POST_COMPUTE_FAILED_UNKNOWN_ISSUE, null)); + .isEqualTo(ReplicateActionResponse.successWithDetails( + ReplicateStatusDetails.builder() + .exitCode(0) + .computeLogs(ComputeLogs.builder().stdout("stdout").build()) + .build())); } //endregion @@ -871,7 +877,7 @@ void shouldNotContributeSinceNotEnoughGas() { ReplicateActionResponse replicateActionResponse = taskManagerService.contribute(CHAIN_TASK_ID); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() .isEqualTo(ReplicateActionResponse .failure(OUT_OF_GAS)); @@ -888,7 +894,7 @@ void shouldNotContributeSinceNoComputedFile() { ReplicateActionResponse replicateActionResponse = taskManagerService.contribute(CHAIN_TASK_ID); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() .isEqualTo(ReplicateActionResponse .failure(DETERMINISM_HASH_NOT_FOUND)); @@ -908,7 +914,7 @@ void shouldNotContributeSinceNoContribution() { ReplicateActionResponse replicateActionResponse = taskManagerService.contribute(CHAIN_TASK_ID); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() .isEqualTo(ReplicateActionResponse .failure(ENCLAVE_SIGNATURE_NOT_FOUND)); @@ -931,7 +937,7 @@ void shouldNotContributeSinceFailedToContribute() { ReplicateActionResponse replicateActionResponse = taskManagerService.contribute(CHAIN_TASK_ID); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() .isEqualTo(ReplicateActionResponse.failure(CHAIN_RECEIPT_NOT_VALID)); } @@ -955,7 +961,7 @@ void shouldNotContributeSinceInvalidContributeChainReceipt() { ReplicateActionResponse replicateActionResponse = taskManagerService.contribute(CHAIN_TASK_ID); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() .isEqualTo(ReplicateActionResponse.failure(CHAIN_RECEIPT_NOT_VALID)); } @@ -983,7 +989,7 @@ void shouldReveal() { ReplicateActionResponse replicateActionResponse = taskManagerService.reveal(CHAIN_TASK_ID, extra); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() .isEqualTo(ReplicateActionResponse.success(chainReceipt)); } @@ -996,7 +1002,7 @@ void shouldNotRevealSinceNoConsensusBlock() { ReplicateActionResponse replicateActionResponse = taskManagerService.reveal(CHAIN_TASK_ID, extra); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() .isEqualTo(ReplicateActionResponse.failure(CONSENSUS_BLOCK_MISSING)); } @@ -1006,7 +1012,7 @@ void shouldNotRevealSinceNoExtraForRetrievingConsensusBlock() { ReplicateActionResponse replicateActionResponse = taskManagerService.reveal(CHAIN_TASK_ID, null); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() .isEqualTo(ReplicateActionResponse.failure(CONSENSUS_BLOCK_MISSING)); } @@ -1023,7 +1029,7 @@ void shouldNotRevealSinceEmptyResultDigest() { taskManagerService.reveal(CHAIN_TASK_ID, TaskNotificationExtra.builder().blockNumber(consensusBlock).build()); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() .isEqualTo(ReplicateActionResponse.failure(DETERMINISM_HASH_NOT_FOUND)); } @@ -1042,7 +1048,7 @@ void shouldNotRevealSinceConsensusBlockNotReached() { ReplicateActionResponse replicateActionResponse = taskManagerService.reveal(CHAIN_TASK_ID, extra); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() .isEqualTo(ReplicateActionResponse.failure(BLOCK_NOT_REACHED)); } @@ -1063,7 +1069,7 @@ void shouldNotRevealSinceCannotReveal() { ReplicateActionResponse replicateActionResponse = taskManagerService.reveal(CHAIN_TASK_ID, extra); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() .isEqualTo(ReplicateActionResponse.failure(CANNOT_REVEAL)); } @@ -1088,7 +1094,7 @@ void shouldNotRevealSinceFailedToReveal() { ReplicateActionResponse replicateActionResponse = taskManagerService.reveal(CHAIN_TASK_ID, extra); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() .isEqualTo(ReplicateActionResponse.failure(CHAIN_RECEIPT_NOT_VALID)); } @@ -1114,7 +1120,7 @@ void shouldNotRevealSinceInvalidRevealChainReceipt() { ReplicateActionResponse replicateActionResponse = taskManagerService.reveal(CHAIN_TASK_ID, extra); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() .isEqualTo(ReplicateActionResponse.failure(CHAIN_RECEIPT_NOT_VALID)); } @@ -1132,7 +1138,7 @@ void shouldUploadResultWithResultUri() { ReplicateActionResponse replicateActionResponse = taskManagerService.uploadResult(CHAIN_TASK_ID); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() .isEqualTo(ReplicateActionResponse.success(resultUri, "")); } @@ -1152,7 +1158,7 @@ void shouldUploadResultWithResultUriAndCallbackData() { ReplicateActionResponse replicateActionResponse = taskManagerService.uploadResult(CHAIN_TASK_ID); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() .isEqualTo(ReplicateActionResponse.success(resultUri, callbackData)); } @@ -1165,7 +1171,7 @@ void shouldNotUploadResultSinceEmptyResultLink() { ReplicateActionResponse replicateActionResponse = taskManagerService.uploadResult(CHAIN_TASK_ID); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() .isEqualTo(ReplicateActionResponse.failure(RESULT_LINK_MISSING)); } @@ -1337,7 +1343,7 @@ void shouldComplete() { ReplicateActionResponse replicateActionResponse = taskManagerService.complete(CHAIN_TASK_ID); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() .isEqualTo(ReplicateActionResponse.success()); @@ -1351,7 +1357,7 @@ void shouldNotCompleteSinceCannotRemoveResult() { ReplicateActionResponse replicateActionResponse = taskManagerService.complete(CHAIN_TASK_ID); - Assertions.assertThat(replicateActionResponse) + assertThat(replicateActionResponse) .isNotNull() .isEqualTo(ReplicateActionResponse.failure());