diff --git a/gradle.properties b/gradle.properties index 8f9e30725..c74dbf758 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ # x-release-please-start-version version=9.0.0 # x-release-please-end -iexecCommonsPocoVersion=5.1.0 +iexecCommonsPocoVersion=5.2.0 iexecCommonVersion=9.1.0 iexecBlockchainAdapterVersion=9.0.0 iexecResultVersion=9.0.0 diff --git a/src/main/java/com/iexec/core/registry/PlatformRegistryConfiguration.java b/src/main/java/com/iexec/core/registry/PlatformRegistryConfiguration.java index da0982882..0cddd962e 100644 --- a/src/main/java/com/iexec/core/registry/PlatformRegistryConfiguration.java +++ b/src/main/java/com/iexec/core/registry/PlatformRegistryConfiguration.java @@ -1,20 +1,51 @@ +/* + * Copyright 2022-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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.iexec.core.registry; -import lombok.Getter; +import jakarta.validation.constraints.NotNull; +import lombok.Value; import org.hibernate.validator.constraints.URL; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.bind.DefaultValue; +import org.springframework.validation.annotation.Validated; -@Getter -@Configuration +@Value +@Validated +@ConfigurationProperties(prefix = "sms") public class PlatformRegistryConfiguration { + @URL + @NotNull + String scone; @URL - @Value("${sms.scone}") - private String sconeSms; + @NotNull + String gramine; @URL - @Value("${sms.gramine}") - private String gramineSms; - + @NotNull + String tdx; + + public PlatformRegistryConfiguration( + @DefaultValue("") final String scone, + @DefaultValue("") final String gramine, + @DefaultValue("") final String tdx + ) { + this.scone = scone; + this.gramine = gramine; + this.tdx = tdx; + } } diff --git a/src/main/java/com/iexec/core/sms/SmsService.java b/src/main/java/com/iexec/core/sms/SmsService.java index 29a926578..2c35d4834 100644 --- a/src/main/java/com/iexec/core/sms/SmsService.java +++ b/src/main/java/com/iexec/core/sms/SmsService.java @@ -29,13 +29,16 @@ import com.iexec.sms.api.SmsClient; import com.iexec.sms.api.SmsClientProvider; import feign.FeignException; +import jakarta.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; import org.web3j.crypto.Hash; +import java.util.Arrays; import java.util.Optional; +import java.util.function.Predicate; import static com.iexec.sms.secret.ReservedSecretKeyName.IEXEC_RESULT_IEXEC_RESULT_PROXY_URL; @@ -60,6 +63,16 @@ public SmsService(final IexecHubService iexecHubService, this.smsClientProvider = smsClientProvider; } + @PostConstruct + void initSmsClients() { + Arrays.stream(TeeFramework.values()) + .map(this::retrieveSmsUrl) + .filter(Optional::isPresent) + .map(Optional::get) + .filter(Predicate.not(String::isBlank)) + .forEach(smsClientProvider::getSmsClient); + } + private Optional getVerifiedSmsUrl(final String chainTaskId) { final TaskDescription taskDescription = iexecHubService.getTaskDescription(chainTaskId); return getVerifiedSmsUrl(chainTaskId, taskDescription.getTeeFramework()); @@ -86,35 +99,31 @@ public Optional getVerifiedSmsUrl(final String chainTaskId, final String Optional getVerifiedSmsUrl(final String chainTaskId, final TeeFramework teeFrameworkForDeal) { log.debug("getVerifiedSmsUrl [chainTaskId:{}, teeFrameworkForDeal:{}]", chainTaskId, teeFrameworkForDeal); if (teeFrameworkForDeal == null) { - log.error("Can't get verified SMS url with invalid TEE framework " + - "from tag [chainTaskId:{}]", chainTaskId); + log.error("Can't get verified SMS url with invalid TEE framework from tag [chainTaskId:{}]", chainTaskId); return Optional.empty(); } - Optional smsUrl = retrieveSmsUrl(teeFrameworkForDeal); + final Optional smsUrl = retrieveSmsUrl(teeFrameworkForDeal); if (smsUrl.isEmpty()) { - log.error("Can't get verified SMS url since type of tag is not " + - "supported [chainTaskId:{},teeFrameworkForDeal:{}]", + log.error("Can't get verified SMS url since type of tag is not supported [chainTaskId:{}, teeFrameworkForDeal:{}]", chainTaskId, teeFrameworkForDeal); return Optional.empty(); } final SmsClient smsClient = smsClientProvider.getSmsClient(smsUrl.get()); if (!checkSmsTeeFramework(smsClient, teeFrameworkForDeal, chainTaskId)) { - log.error("Can't get verified SMS url since tag TEE type " + - "does not match SMS TEE type [chainTaskId:{},teeFrameworkForDeal:{}]", + log.error("Can't get verified SMS url since tag TEE type does not match SMS TEE type [chainTaskId:{}, teeFrameworkForDeal:{}]", chainTaskId, teeFrameworkForDeal); return Optional.empty(); } return smsUrl; } - private Optional retrieveSmsUrl(TeeFramework teeFramework) { - Optional smsUrl = Optional.empty(); - if (teeFramework == TeeFramework.SCONE) { - smsUrl = Optional.of(registryConfiguration.getSconeSms()); - } else if (teeFramework == TeeFramework.GRAMINE) { - smsUrl = Optional.of(registryConfiguration.getGramineSms()); - } - return smsUrl; + private Optional retrieveSmsUrl(final TeeFramework teeFramework) { + return switch (teeFramework) { + case SCONE -> Optional.of(registryConfiguration.getScone()); + case GRAMINE -> Optional.of(registryConfiguration.getGramine()); + case TDX -> Optional.of(registryConfiguration.getTdx()); + default -> Optional.empty(); + }; } private boolean checkSmsTeeFramework(SmsClient smsClient, @@ -130,8 +139,7 @@ private boolean checkSmsTeeFramework(SmsClient smsClient, } if (smsTeeFramework != teeFrameworkForDeal) { - log.error("SMS is configured for another TEE framework " + - "[chainTaskId:{}, teeFrameworkForDeal:{}, smsTeeFramework:{}]", + log.error("SMS is configured for another TEE framework [chainTaskId:{}, teeFrameworkForDeal:{}, smsTeeFramework:{}]", chainTaskId, teeFrameworkForDeal, smsTeeFramework); return false; } diff --git a/src/test/java/com/iexec/core/chain/WebSocketBlockchainListenerTests.java b/src/test/java/com/iexec/core/chain/WebSocketBlockchainListenerTests.java index 8d78ee593..592a4a82d 100644 --- a/src/test/java/com/iexec/core/chain/WebSocketBlockchainListenerTests.java +++ b/src/test/java/com/iexec/core/chain/WebSocketBlockchainListenerTests.java @@ -56,8 +56,6 @@ class WebSocketBlockchainListenerTests { @DynamicPropertySource static void registerProperties(DynamicPropertyRegistry registry) { - registry.add("sms.scone", () -> ""); - registry.add("sms.gramine", () -> ""); registry.add("chain.node-address", () -> getServiceUrl( environment.getServiceHost(CHAIN_SVC_NAME, CHAIN_SVC_PORT), environment.getServicePort(CHAIN_SVC_NAME, CHAIN_SVC_PORT)) diff --git a/src/test/java/com/iexec/core/detector/replicate/ContributionAndFinalizationUnnotifiedDetectorTests.java b/src/test/java/com/iexec/core/detector/replicate/ContributionAndFinalizationUnnotifiedDetectorTests.java index d6530cebe..7bbbd807b 100644 --- a/src/test/java/com/iexec/core/detector/replicate/ContributionAndFinalizationUnnotifiedDetectorTests.java +++ b/src/test/java/com/iexec/core/detector/replicate/ContributionAndFinalizationUnnotifiedDetectorTests.java @@ -19,6 +19,7 @@ import com.iexec.common.replicate.ReplicateStatus; import com.iexec.common.replicate.ReplicateStatusUpdate; import com.iexec.commons.poco.task.TaskDescription; +import com.iexec.commons.poco.tee.TeeFramework; import com.iexec.core.chain.IexecHubService; import com.iexec.core.configuration.CronConfiguration; import com.iexec.core.replicate.Replicate; @@ -94,6 +95,7 @@ private void mockTaskAndTaskDecription(final String callback) { TaskDescription.builder() .trust(BigInteger.ONE) .isTeeTask(true) + .teeFramework(TeeFramework.SCONE) .callback(callback) .build() ); diff --git a/src/test/java/com/iexec/core/detector/task/FinalizedTaskDetectorTests.java b/src/test/java/com/iexec/core/detector/task/FinalizedTaskDetectorTests.java index bf81ea130..ae8792f7c 100644 --- a/src/test/java/com/iexec/core/detector/task/FinalizedTaskDetectorTests.java +++ b/src/test/java/com/iexec/core/detector/task/FinalizedTaskDetectorTests.java @@ -21,6 +21,7 @@ import com.iexec.commons.poco.chain.ChainTask; import com.iexec.commons.poco.chain.ChainTaskStatus; import com.iexec.commons.poco.task.TaskDescription; +import com.iexec.commons.poco.tee.TeeUtils; import com.iexec.core.chain.IexecHubService; import com.iexec.core.replicate.Replicate; import com.iexec.core.replicate.ReplicatesService; @@ -29,18 +30,21 @@ import com.iexec.core.task.TaskStatus; import com.iexec.core.task.update.TaskUpdateRequestManager; import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.mockito.*; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.junit.jupiter.MockitoExtension; import java.math.BigInteger; import java.util.List; import java.util.Optional; import static com.iexec.core.TestUtils.*; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; +import static org.mockito.Mockito.*; +@ExtendWith(MockitoExtension.class) class FinalizedTaskDetectorTests { @Mock private TaskService taskService; @@ -55,20 +59,16 @@ class FinalizedTaskDetectorTests { @InjectMocks private FinalizedTaskDetector detector; - @BeforeEach - void init() { - MockitoAnnotations.openMocks(this); - } - // region detect @Test void shouldDetectTasks() { final String completedChainTaskId = "0x65bc5e94ed1486b940bd6cc0013c418efad58a0a52a3d08cee89faaa21970426"; - final Task completedTask = getOnchainCompletedTask(completedChainTaskId).build(); + final Task completedTask = mockOnchainTask(completedChainTaskId, ChainTaskStatus.COMPLETED).build(); when(taskService.findByCurrentStatus(TaskStatus.FINALIZING)).thenReturn(List.of(completedTask)); final String contributedAndFinalizedChainTaskId = "0x75bc5e94ed1486b940bd6cc0013c418efad58a0a52a3d08cee89faaa21970426"; - final Task contributeAndFinalizeTask = getContributeAndFinalizeDoneTask(contributedAndFinalizedChainTaskId).build(); + final Task contributeAndFinalizeTask = getContributeAndFinalizeDoneTask( + contributedAndFinalizedChainTaskId, ChainTaskStatus.COMPLETED, ReplicateStatus.CONTRIBUTE_AND_FINALIZE_DONE).build(); when(taskService.findByCurrentStatus(TaskStatus.RUNNING)).thenReturn(List.of(contributeAndFinalizeTask)); mockTaskDescriptionFromTask(contributeAndFinalizeTask); @@ -82,7 +82,7 @@ void shouldDetectTasks() { // region detectFinalizedTasks @Test void shouldDetectFinalizedTask() { - final Task task = getOnchainCompletedTask(CHAIN_TASK_ID).build(); + final Task task = mockOnchainTask(CHAIN_TASK_ID, ChainTaskStatus.COMPLETED).build(); when(taskService.findByCurrentStatus(TaskStatus.FINALIZING)).thenReturn(List.of(task)); @@ -92,21 +92,22 @@ void shouldDetectFinalizedTask() { } @Test - void shouldDetectNoFinalizedTaskAsTaskIsRevealing() { - final Task task = getOnchainRevealingTask(CHAIN_TASK_ID).build(); + void shouldNotDetectFinalizedTaskAsTaskIsRevealing() { + final Task task = mockOnchainTask(CHAIN_TASK_ID, ChainTaskStatus.REVEALING).build(); when(taskService.findByCurrentStatus(TaskStatus.FINALIZING)).thenReturn(List.of(task)); detector.detectFinalizedTasks(); - verify(taskUpdateRequestManager, Mockito.never()).publishRequest(CHAIN_TASK_ID); + verifyNoInteractions(taskUpdateRequestManager); } // endregion // region detectContributeAndFinalizeDoneTasks @Test void shouldDetectContributeAndFinalizeDoneTask() { - final Task task = getContributeAndFinalizeDoneTask(CHAIN_TASK_ID).build(); + final Task task = getContributeAndFinalizeDoneTask( + CHAIN_TASK_ID, ChainTaskStatus.COMPLETED, ReplicateStatus.CONTRIBUTE_AND_FINALIZE_DONE).build(); when(taskService.findByCurrentStatus(TaskStatus.RUNNING)).thenReturn(List.of(task)); mockTaskDescriptionFromTask(task); @@ -117,22 +118,23 @@ void shouldDetectContributeAndFinalizeDoneTask() { } @Test - void shouldDetectNoContributeAndFinalizeDoneTaskAsTaskIsRevealing() { - final Task task = getOnchainRevealingTask(CHAIN_DEAL_ID).build(); + void shouldNotDetectContributeAndFinalizeDoneTaskAsTaskIsActive() { + final Task task = getContributeAndFinalizeDoneTask( + CHAIN_TASK_ID, ChainTaskStatus.ACTIVE, ReplicateStatus.COMPUTING).build(); when(taskService.findByCurrentStatus(TaskStatus.RUNNING)).thenReturn(List.of(task)); mockTaskDescriptionFromTask(task); detector.detectContributeAndFinalizeDoneTasks(); - verify(taskUpdateRequestManager, Mockito.never()).publishRequest(CHAIN_TASK_ID); + verifyNoInteractions(taskUpdateRequestManager); } // endregion // region isChainTaskCompleted @Test void shouldChainTaskBeCompleted() { - final Task task = getOnchainCompletedTask(CHAIN_TASK_ID).build(); + final Task task = mockOnchainTask(CHAIN_TASK_ID, ChainTaskStatus.COMPLETED).build(); final boolean chainTaskCompleted = detector.isChainTaskCompleted(task); @@ -155,7 +157,7 @@ void shouldChainTaskNotBeCompletedAsChainTaskAbsent() { @Test void shouldChainTaskNotBeCompletedAsChainTaskNotCompleted() { - final Task task = getOnchainRevealingTask(CHAIN_DEAL_ID).build(); + final Task task = mockOnchainTask(CHAIN_TASK_ID, ChainTaskStatus.REVEALING).build(); final boolean chainTaskCompleted = detector.isChainTaskCompleted(task); @@ -166,7 +168,8 @@ void shouldChainTaskNotBeCompletedAsChainTaskNotCompleted() { // region isTaskContributeAndFinalizeDone @Test void shouldTaskBeContributeAndFinalizeDone() { - final Task task = getContributeAndFinalizeDoneTask(CHAIN_TASK_ID).build(); + final Task task = getContributeAndFinalizeDoneTask( + CHAIN_TASK_ID, ChainTaskStatus.COMPLETED, ReplicateStatus.CONTRIBUTE_AND_FINALIZE_DONE).build(); mockTaskDescriptionFromTask(task); final boolean taskContributeAndFinalizeDone = detector.isTaskContributeAndFinalizeDone(task); @@ -193,17 +196,13 @@ void shouldTaskNotBeContributeAndFinalizeDoneAsMultipleReplicates() { final Task task = Task.builder() .chainTaskId(CHAIN_TASK_ID) .currentStatus(TaskStatus.FINALIZING) + .trust(1) .tag(TEE_TAG) .build(); final Replicate replicate1 = new Replicate(WALLET_WORKER_1, CHAIN_TASK_ID); final Replicate replicate2 = new Replicate(WALLET_WORKER_2, CHAIN_TASK_ID); - final ChainTask chainTask = ChainTask.builder() - .chainTaskId(CHAIN_TASK_ID) - .status(ChainTaskStatus.COMPLETED) - .build(); when(replicatesService.getReplicates(CHAIN_TASK_ID)).thenReturn(List.of(replicate1, replicate2)); - when(iexecHubService.getChainTask(CHAIN_TASK_ID)).thenReturn(Optional.of(chainTask)); mockTaskDescriptionFromTask(task); final boolean taskContributeAndFinalizeDone = detector.isTaskContributeAndFinalizeDone(task); @@ -216,6 +215,7 @@ void shouldTaskNotBeContributeAndFinalizeDoneAsReplicateNotDone() { final Task task = Task.builder() .chainTaskId(CHAIN_TASK_ID) .currentStatus(TaskStatus.FINALIZING) + .trust(1) .tag(TEE_TAG) .build(); final Replicate replicate = new Replicate(WALLET_WORKER_1, CHAIN_TASK_ID); @@ -231,20 +231,14 @@ void shouldTaskNotBeContributeAndFinalizeDoneAsReplicateNotDone() { @Test void shouldTaskNotBeContributeAndFinalizeDoneAsChainTaskNotCompleted() { - final Task task = Task.builder() - .chainTaskId(CHAIN_TASK_ID) - .currentStatus(TaskStatus.FINALIZING) + final Task task = mockOnchainTask(CHAIN_TASK_ID, ChainTaskStatus.REVEALING) + .trust(1) .tag(TEE_TAG) .build(); final Replicate replicate = new Replicate(WALLET_WORKER_1, CHAIN_TASK_ID); replicate.updateStatus(ReplicateStatus.CONTRIBUTE_AND_FINALIZE_DONE, ReplicateStatusModifier.WORKER); - final ChainTask chainTask = ChainTask.builder() - .chainTaskId(CHAIN_TASK_ID) - .status(ChainTaskStatus.REVEALING) - .build(); when(replicatesService.getReplicates(CHAIN_TASK_ID)).thenReturn(List.of(replicate)); - when(iexecHubService.getChainTask(CHAIN_TASK_ID)).thenReturn(Optional.of(chainTask)); mockTaskDescriptionFromTask(task); final boolean taskContributeAndFinalizeDone = detector.isTaskContributeAndFinalizeDone(task); @@ -268,23 +262,28 @@ void shouldPublishTaskUpdateRequest() { // endregion // region Utils - private Task.TaskBuilder getOnchainCompletedTask(String chainTaskId) { - final ChainTask chainTask = ChainTask.builder() - .chainTaskId(chainTaskId) - .status(ChainTaskStatus.COMPLETED) - .build(); + private Task.TaskBuilder getContributeAndFinalizeDoneTask(final String chainTaskId, + final ChainTaskStatus chainTaskStatus, + final ReplicateStatus replicateStatus) { + final Replicate replicate = new Replicate(WALLET_WORKER_1, CHAIN_TASK_ID); + replicate.updateStatus(replicateStatus, ReplicateStatusModifier.WORKER); - when(iexecHubService.getChainTask(chainTaskId)).thenReturn(Optional.of(chainTask)); + when(replicatesService.getReplicates(chainTaskId)).thenReturn(List.of(replicate)); - return Task.builder() - .chainTaskId(chainTaskId) - .currentStatus(TaskStatus.FINALIZING); + // iexecHubService.getChainTask will only be called if task has single replicate with CONTRIBUTE_AND_FINALIZE_DONE status + final Task.TaskBuilder taskBuilder = + replicateStatus == ReplicateStatus.CONTRIBUTE_AND_FINALIZE_DONE ? mockOnchainTask(chainTaskId, chainTaskStatus) : Task.builder().chainTaskId(chainTaskId); + + return taskBuilder + .currentStatus(TaskStatus.RUNNING) + .trust(1) + .tag(TEE_TAG); } - private Task.TaskBuilder getOnchainRevealingTask(String chainTaskId) { + private Task.TaskBuilder mockOnchainTask(final String chainTaskId, final ChainTaskStatus chainTaskStatus) { final ChainTask chainTask = ChainTask.builder() .chainTaskId(chainTaskId) - .status(ChainTaskStatus.REVEALING) + .status(chainTaskStatus) .build(); when(iexecHubService.getChainTask(chainTaskId)).thenReturn(Optional.of(chainTask)); @@ -294,21 +293,11 @@ private Task.TaskBuilder getOnchainRevealingTask(String chainTaskId) { .currentStatus(TaskStatus.FINALIZING); } - private Task.TaskBuilder getContributeAndFinalizeDoneTask(String chainTaskId) { - final Replicate replicate = new Replicate(WALLET_WORKER_1, CHAIN_TASK_ID); - replicate.updateStatus(ReplicateStatus.CONTRIBUTE_AND_FINALIZE_DONE, ReplicateStatusModifier.WORKER); - - when(replicatesService.getReplicates(chainTaskId)).thenReturn(List.of(replicate)); - - return getOnchainCompletedTask(chainTaskId) - .tag(TEE_TAG) - .trust(1); - } - - private void mockTaskDescriptionFromTask(Task task) { + private void mockTaskDescriptionFromTask(final Task task) { final TaskDescription taskDescription = TaskDescription.builder() .chainTaskId(task.getChainTaskId()) .isTeeTask(task.isTeeTask()) + .teeFramework(TeeUtils.getTeeFramework(task.getTag())) .trust(BigInteger.valueOf(task.getTrust())) .callback("") .build(); diff --git a/src/test/java/com/iexec/core/registry/PlatformRegistryConfigurationTests.java b/src/test/java/com/iexec/core/registry/PlatformRegistryConfigurationTests.java index 4945aaa6c..9b24527e2 100644 --- a/src/test/java/com/iexec/core/registry/PlatformRegistryConfigurationTests.java +++ b/src/test/java/com/iexec/core/registry/PlatformRegistryConfigurationTests.java @@ -1,30 +1,70 @@ +/* + * Copyright 2022-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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.iexec.core.registry; -import org.assertj.core.api.Assertions; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = PlatformRegistryConfiguration.class) -@TestPropertySource(properties = { - "sms.scone=http://scone-sms", - "sms.gramine=http://gramine-sms" - }) + +import static org.assertj.core.api.Assertions.assertThat; + class PlatformRegistryConfigurationTests { - @Autowired - PlatformRegistryConfiguration platformRegistryConfiguration; - + private Validator validator; + + @BeforeEach + void setUp() { + try (final ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) { + validator = factory.getValidator(); + } + } + + @Test + void shouldAcceptUrlValues() { + final PlatformRegistryConfiguration config = new PlatformRegistryConfiguration("http://scone-sms", "http://gramine-sms", "http://tdx-sms"); + assertThat(validator.validate(config)).isEmpty(); + assertThat(config.getScone()).isEqualTo("http://scone-sms"); + assertThat(config.getGramine()).isEqualTo("http://gramine-sms"); + assertThat(config.getTdx()).isEqualTo("http://tdx-sms"); + } + + @Test + void shouldAcceptBlankValues() { + final PlatformRegistryConfiguration config = new PlatformRegistryConfiguration("", "", ""); + assertThat(validator.validate(config)).isEmpty(); + } + + @Test + void shouldRejectNullValues() { + final PlatformRegistryConfiguration config = new PlatformRegistryConfiguration(null, null, null); + assertThat(validator.validate(config)) + .extracting(ConstraintViolation::getMessage) + .containsExactly("must not be null", "must not be null", "must not be null"); + } + @Test - void shouldGetValues() { - Assertions.assertThat(platformRegistryConfiguration.getSconeSms()) - .isEqualTo("http://scone-sms"); - Assertions.assertThat(platformRegistryConfiguration.getGramineSms()) - .isEqualTo("http://gramine-sms"); + void shouldRejectNonUrlValues() { + final PlatformRegistryConfiguration config = new PlatformRegistryConfiguration("a", "b", "c"); + assertThat(validator.validate(config)) + .extracting(ConstraintViolation::getMessage) + .containsExactly("must be a valid URL", "must be a valid URL", "must be a valid URL"); } } diff --git a/src/test/java/com/iexec/core/sms/SmsServiceTests.java b/src/test/java/com/iexec/core/sms/SmsServiceTests.java index d124c9eb9..6357ce36c 100644 --- a/src/test/java/com/iexec/core/sms/SmsServiceTests.java +++ b/src/test/java/com/iexec/core/sms/SmsServiceTests.java @@ -73,7 +73,7 @@ class SmsServiceTests { @Test void shouldGetVerifiedGramineSmsUrl() { - when(registryConfiguration.getGramineSms()).thenReturn(GRAMINE_SMS_URL); + when(registryConfiguration.getGramine()).thenReturn(GRAMINE_SMS_URL); when(smsClientProvider.getSmsClient(GRAMINE_SMS_URL)).thenReturn(smsClient); when(smsClient.getTeeFramework()).thenReturn(TeeUtils.getTeeFramework(TeeUtils.TEE_GRAMINE_ONLY_TAG)); @@ -86,7 +86,7 @@ void shouldGetVerifiedGramineSmsUrl() { @Test void shouldGetVerifiedSconeSmsUrl() { - when(registryConfiguration.getSconeSms()).thenReturn(SCONE_SMS_URL); + when(registryConfiguration.getScone()).thenReturn(SCONE_SMS_URL); when(smsClientProvider.getSmsClient(SCONE_SMS_URL)).thenReturn(smsClient); when(smsClient.getTeeFramework()).thenReturn(TeeUtils.getTeeFramework(TeeUtils.TEE_SCONE_ONLY_TAG)); @@ -107,7 +107,7 @@ void shouldNotGetVerifiedSmsUrlSinceCannotGetEnclaveProviderFromTag() { @Test void shouldNotGetVerifiedSmsUrlSinceWrongTeeEnclaveProviderOnRemoteSms() { - when(registryConfiguration.getGramineSms()).thenReturn(GRAMINE_SMS_URL); + when(registryConfiguration.getGramine()).thenReturn(GRAMINE_SMS_URL); when(smsClientProvider.getSmsClient(GRAMINE_SMS_URL)).thenReturn(smsClient); when(smsClient.getTeeFramework()).thenReturn(TeeFramework.SCONE); @@ -232,7 +232,7 @@ private void initResultProxyStubs() { when(resultRepositoryConfiguration.getUrl()).thenReturn(RESULT_PROXY_URL); when(iexecHubService.getTaskDescription(CHAIN_TASK_ID)).thenReturn( TaskDescription.builder().teeFramework(TeeFramework.SCONE).build()); - when(registryConfiguration.getSconeSms()).thenReturn(SCONE_SMS_URL); + when(registryConfiguration.getScone()).thenReturn(SCONE_SMS_URL); when(smsClientProvider.getSmsClient(SCONE_SMS_URL)).thenReturn(smsClient); } // endregion diff --git a/src/test/java/com/iexec/core/task/update/TaskUpdateManagerTests.java b/src/test/java/com/iexec/core/task/update/TaskUpdateManagerTests.java index a31ff94ec..8d6199164 100644 --- a/src/test/java/com/iexec/core/task/update/TaskUpdateManagerTests.java +++ b/src/test/java/com/iexec/core/task/update/TaskUpdateManagerTests.java @@ -1616,6 +1616,7 @@ private void mockTaskDescriptionFromTask(Task task) { final TaskDescription taskDescription = TaskDescription.builder() .chainTaskId(task.getChainTaskId()) .isTeeTask(task.isTeeTask()) + .teeFramework(TeeUtils.getTeeFramework(task.getTag())) .trust(BigInteger.valueOf(task.getTrust())) .callback("") .build(); diff --git a/src/test/java/com/iexec/core/workflow/ReplicateWorkflowTests.java b/src/test/java/com/iexec/core/workflow/ReplicateWorkflowTests.java index d1ecd7b6f..d26c8b0e5 100644 --- a/src/test/java/com/iexec/core/workflow/ReplicateWorkflowTests.java +++ b/src/test/java/com/iexec/core/workflow/ReplicateWorkflowTests.java @@ -19,6 +19,7 @@ import com.iexec.common.replicate.ReplicateStatus; import com.iexec.common.replicate.ReplicateStatusCause; import com.iexec.commons.poco.task.TaskDescription; +import com.iexec.commons.poco.tee.TeeFramework; import com.iexec.commons.poco.utils.BytesUtils; import com.iexec.core.notification.TaskNotificationType; import org.junit.Rule; @@ -167,7 +168,7 @@ void shouldGetNextActionOnComputedWithTeeTaskShouldBePleaseContributeAndFinalize assertThat(replicateWorkflow .getNextAction(COMPUTED, null, - TaskDescription.builder().isTeeTask(true).trust(BigInteger.ONE).callback(BytesUtils.EMPTY_ADDRESS).build())) + TaskDescription.builder().isTeeTask(true).teeFramework(TeeFramework.SCONE).trust(BigInteger.ONE).callback(BytesUtils.EMPTY_ADDRESS).build())) .isEqualTo(PLEASE_CONTRIBUTE_AND_FINALIZE); }