From 9e5f2ec5e15f995e124065d30711d2dc1f7988ee Mon Sep 17 00:00:00 2001 From: Jeremy Bernard Date: Thu, 4 Sep 2025 14:47:34 +0200 Subject: [PATCH 1/5] refactor: refactor ReplicateStatus --- .../common/replicate/ReplicateStatus.java | 101 ++++++++++++------ .../replicate/ReplicateStatusTests.java | 6 +- 2 files changed, 74 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/iexec/common/replicate/ReplicateStatus.java b/src/main/java/com/iexec/common/replicate/ReplicateStatus.java index d3f503a6..d6240f2b 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. @@ -19,10 +19,8 @@ import com.iexec.commons.poco.chain.ChainContributionStatus; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; - public enum ReplicateStatus { CREATED, @@ -60,37 +58,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 +137,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,15 +151,14 @@ 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. + /** + * Statuses that should be updated to COMPLETED at the end of a task. */ public static List getCompletableStatuses() { - return Arrays.asList( + return List.of( REVEALED, RESULT_UPLOAD_REQUESTED, RESULT_UPLOADING, @@ -140,12 +169,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 +197,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 +242,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 +259,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 +290,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,8 +305,12 @@ public static ChainContributionStatus getChainStatus(ReplicateStatus replicateSt } } + /** + * @deprecated unused in other projects + */ + @Deprecated(forRemoval = true) public static List getStatusesBeforeContributed() { - return Arrays.asList( + return List.of( CREATED, STARTING, START_FAILED, @@ -306,8 +341,12 @@ public static List getMissingStatuses(ReplicateStatus from, Rep return 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( + return List.of( CREATED, STARTING, STARTED, @@ -319,7 +358,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..62a43065 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. @@ -94,7 +94,9 @@ 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()); } } From 97603ffb08700b054576a781e47eacf322642b36 Mon Sep 17 00:00:00 2001 From: Jeremy Bernard Date: Thu, 4 Sep 2025 16:43:44 +0200 Subject: [PATCH 2/5] test: improve test coverage --- .../replicate/ReplicateStatusTests.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/test/java/com/iexec/common/replicate/ReplicateStatusTests.java b/src/test/java/com/iexec/common/replicate/ReplicateStatusTests.java index 62a43065..92db70a8 100644 --- a/src/test/java/com/iexec/common/replicate/ReplicateStatusTests.java +++ b/src/test/java/com/iexec/common/replicate/ReplicateStatusTests.java @@ -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,6 +26,18 @@ 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); @@ -56,6 +69,7 @@ void shouldNotGetMissingStatusesIfFromOrToIsNotInSuccessList() { List missingStatuses = ReplicateStatus.getMissingStatuses(CREATED, COMPUTE_FAILED); assertThat(missingStatuses).isEmpty(); } + // endregion @Test void shouldBeFailedBeforeComputed() { @@ -99,4 +113,12 @@ void shouldBeFailedBeforeComputed() { 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 } From 89018675ec621ebf8e1de7c23f3849e5cb4606d2 Mon Sep 17 00:00:00 2001 From: Jeremy Bernard Date: Thu, 4 Sep 2025 17:49:14 +0200 Subject: [PATCH 3/5] revert: do not update deprecated methods code --- .../java/com/iexec/common/replicate/ReplicateStatus.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/iexec/common/replicate/ReplicateStatus.java b/src/main/java/com/iexec/common/replicate/ReplicateStatus.java index d6240f2b..60ac7eae 100644 --- a/src/main/java/com/iexec/common/replicate/ReplicateStatus.java +++ b/src/main/java/com/iexec/common/replicate/ReplicateStatus.java @@ -19,6 +19,7 @@ import com.iexec.commons.poco.chain.ChainContributionStatus; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public enum ReplicateStatus { @@ -310,7 +311,7 @@ public static ChainContributionStatus getChainStatus(ReplicateStatus replicateSt */ @Deprecated(forRemoval = true) public static List getStatusesBeforeContributed() { - return List.of( + return Arrays.asList( CREATED, STARTING, START_FAILED, @@ -346,7 +347,7 @@ public static List getMissingStatuses(ReplicateStatus from, Rep */ @Deprecated(forRemoval = true) public static List getSuccessStatusesBeforeComputed() { - return List.of( + return Arrays.asList( CREATED, STARTING, STARTED, From 626c945683c4561d70041a70b6dcc7daabdc51af Mon Sep 17 00:00:00 2001 From: Jeremy Bernard Date: Thu, 4 Sep 2025 18:06:35 +0200 Subject: [PATCH 4/5] refactor: deprecate getCompletableStatuses as well --- .../java/com/iexec/common/replicate/ReplicateStatus.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/iexec/common/replicate/ReplicateStatus.java b/src/main/java/com/iexec/common/replicate/ReplicateStatus.java index 60ac7eae..95a490ea 100644 --- a/src/main/java/com/iexec/common/replicate/ReplicateStatus.java +++ b/src/main/java/com/iexec/common/replicate/ReplicateStatus.java @@ -156,10 +156,11 @@ public static List getFailureStatuses() { } /** - * 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 List.of( + return Arrays.asList( REVEALED, RESULT_UPLOAD_REQUESTED, RESULT_UPLOADING, From 9e6d7558a686832cc03ac7c4302019da1fcfe395 Mon Sep 17 00:00:00 2001 From: Jeremy Bernard Date: Thu, 4 Sep 2025 18:10:33 +0200 Subject: [PATCH 5/5] refactor: update getMissingStatuses to return un-modifiable lists --- .../java/com/iexec/common/replicate/ReplicateStatus.java | 8 ++++---- .../com/iexec/common/replicate/ReplicateStatusTests.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/iexec/common/replicate/ReplicateStatus.java b/src/main/java/com/iexec/common/replicate/ReplicateStatus.java index 95a490ea..add9edd0 100644 --- a/src/main/java/com/iexec/common/replicate/ReplicateStatus.java +++ b/src/main/java/com/iexec/common/replicate/ReplicateStatus.java @@ -331,16 +331,16 @@ 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)); } /** diff --git a/src/test/java/com/iexec/common/replicate/ReplicateStatusTests.java b/src/test/java/com/iexec/common/replicate/ReplicateStatusTests.java index 92db70a8..e6162cd0 100644 --- a/src/test/java/com/iexec/common/replicate/ReplicateStatusTests.java +++ b/src/test/java/com/iexec/common/replicate/ReplicateStatusTests.java @@ -40,7 +40,7 @@ void checkWorkflowStatuses() { // 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); @@ -54,19 +54,19 @@ 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