Skip to content

Commit 8635fd7

Browse files
authored
Use @DataMongoTest and @Testcontainers annotations in replicates and compute logs tests (#662)
1 parent 7e3be65 commit 8635fd7

File tree

7 files changed

+201
-159
lines changed

7 files changed

+201
-159
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ All notable changes to this project will be documented in this file.
1313
- Filter out `CONTRIBUTE_AND_FINALIZE` tasks when detecting missed `REVEALED` status update. (#658)
1414
- Fetch `results` on-chain when updating a replicate status in `CONTRIBUTE_AND_FINALIZE` workflow. (#659 #660)
1515

16+
### Quality
17+
18+
- Use `@DataMongoTest` and `@Testcontainers` annotations in replicates and compute logs tests. (#662)
19+
1620
## [[8.3.0]](https://github.com/iExecBlockchainComputing/iexec-core/releases/tag/v8.3.0) 2024-01-11
1721

1822
### New Features

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ tasks.named("bootJar") {
130130

131131
test {
132132
useJUnitPlatform()
133+
systemProperty "mongo.image", "mongo:4.4.28-focal"
133134
}
134135

135136
tasks.register('itest') {

src/test/java/com/iexec/core/logs/TaskLogsServiceTests.java

Lines changed: 68 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,14 @@
1919
import com.iexec.common.replicate.ComputeLogs;
2020
import org.junit.jupiter.api.BeforeEach;
2121
import org.junit.jupiter.api.Test;
22-
import org.mockito.ArgumentCaptor;
23-
import org.mockito.InjectMocks;
24-
import org.mockito.Mock;
25-
import org.mockito.MockitoAnnotations;
22+
import org.springframework.beans.factory.annotation.Autowired;
23+
import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest;
24+
import org.springframework.test.context.DynamicPropertyRegistry;
25+
import org.springframework.test.context.DynamicPropertySource;
26+
import org.testcontainers.containers.MongoDBContainer;
27+
import org.testcontainers.junit.jupiter.Container;
28+
import org.testcontainers.junit.jupiter.Testcontainers;
29+
import org.testcontainers.utility.DockerImageName;
2630

2731
import java.util.Collections;
2832
import java.util.List;
@@ -31,32 +35,46 @@
3135
import static com.iexec.commons.poco.utils.TestUtils.CHAIN_TASK_ID;
3236
import static com.iexec.commons.poco.utils.TestUtils.WORKER_ADDRESS;
3337
import static org.assertj.core.api.Assertions.assertThat;
34-
import static org.mockito.Mockito.*;
38+
import static org.mockito.Mockito.spy;
3539

40+
@DataMongoTest
41+
@Testcontainers
3642
class TaskLogsServiceTests {
3743

3844
private static final String STDOUT = "This is an stdout string";
3945
private static final String STDERR = "This is an stderr string";
46+
private static final ComputeLogs COMPUTE_LOGS = new ComputeLogs(WORKER_ADDRESS, STDOUT, STDERR);
4047

41-
@Mock
42-
private TaskLogsRepository taskLogsRepository;
43-
@InjectMocks
44-
private TaskLogsService taskLogsService;
48+
@Container
49+
private static final MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse(System.getProperty("mongo.image")));
50+
51+
@DynamicPropertySource
52+
static void registerProperties(DynamicPropertyRegistry registry) {
53+
registry.add("spring.data.mongodb.host", mongoDBContainer::getHost);
54+
registry.add("spring.data.mongodb.port", () -> mongoDBContainer.getMappedPort(27017));
55+
}
56+
57+
private final TaskLogsRepository taskLogsRepository;
58+
private final TaskLogsService taskLogsService;
59+
60+
@Autowired
61+
public TaskLogsServiceTests(TaskLogsRepository taskLogsRepository) {
62+
this.taskLogsRepository = taskLogsRepository;
63+
this.taskLogsService = new TaskLogsService(taskLogsRepository);
64+
spy(taskLogsRepository);
65+
}
4566

4667
@BeforeEach
4768
void init() {
48-
MockitoAnnotations.openMocks(this);
69+
taskLogsRepository.deleteAll();
4970
}
5071

5172
//region addComputeLogs
5273
@Test
5374
void shouldAddComputeLogs() {
54-
final ComputeLogs computeLogs = new ComputeLogs(WORKER_ADDRESS, STDOUT, STDERR);
55-
56-
ArgumentCaptor<TaskLogs> argumentCaptor = ArgumentCaptor.forClass(TaskLogs.class);
57-
taskLogsService.addComputeLogs(CHAIN_TASK_ID, computeLogs);
58-
verify(taskLogsRepository, times(1)).save(argumentCaptor.capture());
59-
TaskLogs capturedEvent = argumentCaptor.getAllValues().get(0);
75+
taskLogsService.addComputeLogs(CHAIN_TASK_ID, COMPUTE_LOGS);
76+
assertThat(taskLogsRepository.count()).isOne();
77+
TaskLogs capturedEvent = taskLogsRepository.findOneByChainTaskId(CHAIN_TASK_ID).orElseThrow();
6078
assertThat(capturedEvent.getComputeLogsList().get(0).getStdout()).isEqualTo(STDOUT);
6179
assertThat(capturedEvent.getComputeLogsList().get(0).getStderr()).isEqualTo(STDERR);
6280
assertThat(capturedEvent.getComputeLogsList().get(0).getWalletAddress()).isEqualTo(WORKER_ADDRESS);
@@ -65,37 +83,57 @@ void shouldAddComputeLogs() {
6583
@Test
6684
void shouldNotAddComputeLogsSinceNull() {
6785
taskLogsService.addComputeLogs(CHAIN_TASK_ID, null);
68-
verifyNoInteractions(taskLogsRepository);
86+
assertThat(taskLogsRepository.count()).isZero();
6987
}
7088

7189
@Test
7290
void shouldNotAddComputeLogsSinceLogsAlreadyKnown() {
73-
final ComputeLogs computeLogs = new ComputeLogs(WORKER_ADDRESS, STDOUT, STDERR);
7491
final TaskLogs taskLogs = TaskLogs.builder()
7592
.chainTaskId(CHAIN_TASK_ID)
76-
.computeLogsList(Collections.singletonList(computeLogs))
93+
.computeLogsList(Collections.singletonList(COMPUTE_LOGS))
7794
.build();
95+
taskLogsRepository.save(taskLogs);
96+
assertThat(taskLogs.containsWalletAddress(WORKER_ADDRESS)).isTrue();
97+
taskLogsService.addComputeLogs(CHAIN_TASK_ID, COMPUTE_LOGS);
98+
assertThat(taskLogsRepository.count()).isOne();
99+
assertThat(taskLogsRepository.findOneByChainTaskId(CHAIN_TASK_ID)).contains(taskLogs);
100+
}
101+
//endregion
78102

79-
when(taskLogsService.getTaskLogs(CHAIN_TASK_ID))
80-
.thenReturn(Optional.of(taskLogs));
81-
82-
taskLogsService.addComputeLogs(CHAIN_TASK_ID, computeLogs);
103+
//region delete
104+
@Test
105+
void shouldDeleteKnownTask() {
106+
final TaskLogs taskLogs = TaskLogs.builder()
107+
.chainTaskId(CHAIN_TASK_ID)
108+
.computeLogsList(List.of(COMPUTE_LOGS))
109+
.build();
110+
taskLogsRepository.save(taskLogs);
111+
assertThat(taskLogsRepository.count()).isOne();
112+
taskLogsService.delete(List.of(CHAIN_TASK_ID));
113+
assertThat(taskLogsRepository.count()).isZero();
114+
}
83115

84-
verify(taskLogsRepository).findOneByChainTaskId(CHAIN_TASK_ID);
85-
verify(taskLogsRepository, times(0)).save(any());
116+
@Test
117+
void shouldNotDeleteUnknownTask() {
118+
final TaskLogs taskLogs = TaskLogs.builder()
119+
.chainTaskId(CHAIN_TASK_ID)
120+
.computeLogsList(List.of(COMPUTE_LOGS))
121+
.build();
122+
taskLogsRepository.save(taskLogs);
123+
assertThat(taskLogsRepository.count()).isOne();
124+
taskLogsService.delete(List.of("0x00"));
125+
assertThat(taskLogsRepository.count()).isOne();
86126
}
87127
//endregion
88128

89129
//region getComputeLogs
90130
@Test
91131
void shouldGetComputeLogs() {
92-
ComputeLogs computeLogs = new ComputeLogs(WORKER_ADDRESS, STDOUT, STDERR);
93-
TaskLogs taskLogs = TaskLogs.builder()
132+
final TaskLogs taskLogs = TaskLogs.builder()
94133
.chainTaskId(CHAIN_TASK_ID)
95-
.computeLogsList(List.of(computeLogs))
134+
.computeLogsList(List.of(COMPUTE_LOGS))
96135
.build();
97-
when(taskLogsRepository.findByChainTaskIdAndWalletAddress(CHAIN_TASK_ID, WORKER_ADDRESS))
98-
.thenReturn(Optional.of(taskLogs));
136+
taskLogsRepository.save(taskLogs);
99137
Optional<ComputeLogs> optional = taskLogsService.getComputeLogs(CHAIN_TASK_ID, WORKER_ADDRESS);
100138
assertThat(optional).isPresent();
101139
final ComputeLogs actualLogs = optional.get();

0 commit comments

Comments
 (0)