diff --git a/src/main/java/com/iexec/common/replicate/ReplicateStatus.java b/src/main/java/com/iexec/common/replicate/ReplicateStatus.java index d3f503a6..add9edd0 100644 --- a/src/main/java/com/iexec/common/replicate/ReplicateStatus.java +++ b/src/main/java/com/iexec/common/replicate/ReplicateStatus.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. @@ -22,7 +22,6 @@ import java.util.Arrays; import java.util.List; - public enum ReplicateStatus { CREATED, @@ -60,37 +59,69 @@ public enum ReplicateStatus { RECOVERING, WORKER_LOST; - public static boolean isSuccess(ReplicateStatus status) { return getSuccessStatuses().contains(status); } + /** + * @deprecated not used in other projects + */ + @Deprecated(forRemoval = true) public static boolean isFailure(ReplicateStatus status) { return getFailureStatuses().contains(status); } + /** + * @deprecated Use non-static method on Enum member instead + */ + @Deprecated(forRemoval = true) public static boolean isFailedBeforeComputed(ReplicateStatus status) { return status.ordinal() < COMPUTED.ordinal() && getFailureStatuses().contains(status); } + /** + * Covers START_FAILED, APP_DOWNLOAD_FAILED, DATA_DOWNLOAD_FAILED and COMPUTE_FAILED + * + * @return {@literal true} if the status is in the list, {@literal false} otherwise + */ + public boolean isFailedBeforeComputed() { + return this.ordinal() < COMPUTED.ordinal() && getFailureStatuses().contains(this); + } + + /** + * @deprecated not used in other projects + */ + @Deprecated(forRemoval = true) public static boolean isCompletable(ReplicateStatus status) { return getCompletableStatuses().contains(status); } + /** + * @deprecated not used in other projects + */ + @Deprecated(forRemoval = true) public static boolean isFailable(ReplicateStatus status) { return getFailableStatuses().contains(status); } + /** + * @deprecated not used in other projects + */ + @Deprecated(forRemoval = true) public static boolean isAbortable(ReplicateStatus status) { return getAbortableStatuses().contains(status); } + /** + * @deprecated not used in other projects + */ + @Deprecated(forRemoval = true) public static boolean isRecoverable(ReplicateStatus status) { return true; // just temporary } public static List getSuccessStatuses() { - return new ArrayList<>(Arrays.asList( + return List.of( CREATED, STARTING, STARTED, @@ -107,11 +138,11 @@ public static List getSuccessStatuses() { CONTRIBUTE_AND_FINALIZE_ONGOING, CONTRIBUTE_AND_FINALIZE_DONE, COMPLETING, - COMPLETED)); + COMPLETED); } public static List getFailureStatuses() { - return Arrays.asList( + return List.of( START_FAILED, APP_DOWNLOAD_FAILED, DATA_DOWNLOAD_FAILED, @@ -121,13 +152,13 @@ public static List getFailureStatuses() { RESULT_UPLOAD_FAILED, CONTRIBUTE_AND_FINALIZE_FAILED, COMPLETE_FAILED, - FAILED); + FAILED); // FAILED can be set from ReplicateListener in scheduler } - /* - * Statuses that should be updated - * to COMPLETED at the end of a task. + /** + * @deprecated not used in other projects */ + @Deprecated(forRemoval = true) public static List getCompletableStatuses() { return Arrays.asList( REVEALED, @@ -140,12 +171,11 @@ public static List getCompletableStatuses() { COMPLETE_FAILED); } - /* - * Statuses that should be updated - * to FAILED at the end of a task. + /** + * Statuses that should be updated to FAILED at the end of a task. */ public static List getFailableStatuses() { - return Arrays.asList( + return List.of( CREATED, STARTING, START_FAILED, @@ -169,21 +199,20 @@ public static List getFailableStatuses() { ABORTED); } - /* - * Statuses that can be updated - * to ABORTED by the worker. + /** + * Statuses that can be updated to ABORTED by the worker. */ public static List getAbortableStatuses() { - List nonFinal = new ArrayList<>(getNonFinalWorkflowStatuses()); + final List nonFinal = new ArrayList<>(getNonFinalWorkflowStatuses()); nonFinal.add(WORKER_LOST); - return nonFinal; + return List.copyOf(nonFinal); } - /* - * Statuses that can be recovered by the worker + /** + * Statuses that can be recovered by the worker */ public static List getRecoverableStatuses() { - return Arrays.asList( + return List.of( CREATED, STARTING, STARTED, @@ -215,14 +244,14 @@ public static List getRecoverableStatuses() { * CREATED -> COMPLETED/FAILED */ public static List getWorkflowStatuses() { - List nonFinal = new ArrayList<>(getNonFinalWorkflowStatuses()); + final List nonFinal = new ArrayList<>(getNonFinalWorkflowStatuses()); nonFinal.add(COMPLETED); nonFinal.add(FAILED); - return nonFinal; + return List.copyOf(nonFinal); } public static List getFinalStatuses() { - return Arrays.asList( + return List.of( COMPLETED, FAILED); } @@ -232,7 +261,7 @@ public static List getFinalStatuses() { * CREATED -> COMPLETING/COMPLETE_FAILED */ public static List getNonFinalWorkflowStatuses() { - return Arrays.asList( + return List.of( CREATED, STARTING, START_FAILED, @@ -263,6 +292,10 @@ public static List getNonFinalWorkflowStatuses() { COMPLETE_FAILED); } + /** + * @deprecated unused in other projects + */ + @Deprecated(forRemoval = true) public static ChainContributionStatus getChainStatus(ReplicateStatus replicateStatus) { switch (replicateStatus) { case CONTRIBUTED: @@ -274,6 +307,10 @@ public static ChainContributionStatus getChainStatus(ReplicateStatus replicateSt } } + /** + * @deprecated unused in other projects + */ + @Deprecated(forRemoval = true) public static List getStatusesBeforeContributed() { return Arrays.asList( CREATED, @@ -294,18 +331,22 @@ public static List getStatusesBeforeContributed() { } public static List getMissingStatuses(ReplicateStatus from, ReplicateStatus to) { - List statuses = getSuccessStatuses(); + final List statuses = getSuccessStatuses(); if (!statuses.contains(from) || !statuses.contains(to)) { - return new ArrayList<>(); + return List.of(); } if (statuses.indexOf(from) >= statuses.indexOf(to)) { - return new ArrayList<>(); + return List.of(); } - return statuses.subList(statuses.indexOf(from) + 1, statuses.indexOf(to) + 1); + return List.copyOf(statuses.subList(statuses.indexOf(from) + 1, statuses.indexOf(to) + 1)); } + /** + * @deprecated called once from a scheduler method itself never used + */ + @Deprecated(forRemoval = true) public static List getSuccessStatusesBeforeComputed() { return Arrays.asList( CREATED, @@ -319,7 +360,7 @@ public static List getSuccessStatusesBeforeComputed() { } public static List getUncompletableStatuses() { - return Arrays.asList( + return List.of( CONTRIBUTE_FAILED, REVEAL_FAILED, CONTRIBUTE_AND_FINALIZE_FAILED diff --git a/src/test/java/com/iexec/common/replicate/ReplicateStatusTests.java b/src/test/java/com/iexec/common/replicate/ReplicateStatusTests.java index e0b4f979..e6162cd0 100644 --- a/src/test/java/com/iexec/common/replicate/ReplicateStatusTests.java +++ b/src/test/java/com/iexec/common/replicate/ReplicateStatusTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 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. @@ -18,6 +18,7 @@ import org.junit.jupiter.api.Test; +import java.util.ArrayList; import java.util.List; import static com.iexec.common.replicate.ReplicateStatus.*; @@ -25,9 +26,21 @@ class ReplicateStatusTests { + // region getWorkflowStatus + @Test + void checkWorkflowStatuses() { + final List finalStatuses = getFinalStatuses(); + final List nonFinalStatuses = getNonFinalWorkflowStatuses(); + final List expectedStatuses = new ArrayList<>(nonFinalStatuses); + expectedStatuses.addAll(finalStatuses); + assertThat(getWorkflowStatuses()).isEqualTo(expectedStatuses); + } + // endregion + + // region getMissingStatuses @Test void shouldGetMissingStatuses() { - List missingStatuses = ReplicateStatus.getMissingStatuses(CREATED, COMPUTING); + final List missingStatuses = ReplicateStatus.getMissingStatuses(CREATED, COMPUTING); assertThat(missingStatuses).hasSize(7); assertThat(missingStatuses.get(0)).isEqualTo(STARTING); @@ -41,21 +54,22 @@ void shouldGetMissingStatuses() { @Test void shouldNotGetMissingStatusesWhenFromGreaterThanTo() { - List missingStatuses = ReplicateStatus.getMissingStatuses(COMPUTING, CREATED); + final List missingStatuses = ReplicateStatus.getMissingStatuses(COMPUTING, CREATED); assertThat(missingStatuses).isEmpty(); } @Test void shouldNotGetMissingStatusesWhenFromEqualsTo() { - List missingStatuses = ReplicateStatus.getMissingStatuses(CREATED, CREATED); + final List missingStatuses = ReplicateStatus.getMissingStatuses(CREATED, CREATED); assertThat(missingStatuses).isEmpty(); } @Test void shouldNotGetMissingStatusesIfFromOrToIsNotInSuccessList() { - List missingStatuses = ReplicateStatus.getMissingStatuses(CREATED, COMPUTE_FAILED); + final List missingStatuses = ReplicateStatus.getMissingStatuses(CREATED, COMPUTE_FAILED); assertThat(missingStatuses).isEmpty(); } + // endregion @Test void shouldBeFailedBeforeComputed() { @@ -94,7 +108,17 @@ void shouldBeFailedBeforeComputed() { WORKER_LOST ); - runningFailures .forEach(status -> assertThat(ReplicateStatus.isFailedBeforeComputed(status)).isTrue()); + runningFailures.forEach(status -> assertThat(ReplicateStatus.isFailedBeforeComputed(status)).isTrue()); notRunningFailures.forEach(status -> assertThat(ReplicateStatus.isFailedBeforeComputed(status)).isFalse()); + runningFailures.forEach(status -> assertThat(status.isFailedBeforeComputed()).isTrue()); + notRunningFailures.forEach(status -> assertThat(status.isFailedBeforeComputed()).isFalse()); + } + + // region getUnCompletableStatuses + @Test + void checkUncompletableStatuses() { + assertThat(ReplicateStatus.getUncompletableStatuses()) + .isEqualTo(List.of(CONTRIBUTE_FAILED, REVEAL_FAILED, CONTRIBUTE_AND_FINALIZE_FAILED)); } + // endregion }