From c306b8d378f0e71feaa18b44a102e904b3640d9f Mon Sep 17 00:00:00 2001 From: Mohamed Bilel Besrour Date: Sat, 5 Oct 2024 20:25:26 +0200 Subject: [PATCH 1/4] Add logging (REVERT LATER) --- .../artemis/programming/icl/LocalVCLocalCITestService.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/test/java/de/tum/cit/aet/artemis/programming/icl/LocalVCLocalCITestService.java b/src/test/java/de/tum/cit/aet/artemis/programming/icl/LocalVCLocalCITestService.java index 08c02eedceed..85004d91e05a 100644 --- a/src/test/java/de/tum/cit/aet/artemis/programming/icl/LocalVCLocalCITestService.java +++ b/src/test/java/de/tum/cit/aet/artemis/programming/icl/LocalVCLocalCITestService.java @@ -573,7 +573,10 @@ public void testLatestSubmission(Long participationId, String expectedCommitHash int expectedCodeIssueCount, Integer timeoutInSeconds) { // wait for result to be persisted Duration timeoutDuration = timeoutInSeconds != null ? Duration.ofSeconds(timeoutInSeconds) : Duration.ofSeconds(DEFAULT_AWAITILITY_TIMEOUT_IN_SECONDS); - await().atMost(timeoutDuration).until(() -> resultRepository.findFirstWithSubmissionsByParticipationIdOrderByCompletionDateDesc(participationId).isPresent()); + await().atMost(timeoutDuration).until(() -> { + log.info("Checking if result is present for participation with id: {} and commit hash: {}", participationId, expectedCommitHash); + return resultRepository.findFirstWithSubmissionsByParticipationIdOrderByCompletionDateDesc(participationId).isPresent(); + }); Authentication auth = SecurityContextHolder.getContext().getAuthentication(); List submissions = programmingSubmissionRepository.findAllByParticipationIdWithResults(participationId); From a6e852fa8ebbde07246d9bd4d992548d54949985 Mon Sep 17 00:00:00 2001 From: Mohamed Bilel Besrour Date: Sat, 5 Oct 2024 21:56:45 +0200 Subject: [PATCH 2/4] execute tests on same thread --- .../artemis/programming/icl/LocalVCLocalCIIntegrationTest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/test/java/de/tum/cit/aet/artemis/programming/icl/LocalVCLocalCIIntegrationTest.java b/src/test/java/de/tum/cit/aet/artemis/programming/icl/LocalVCLocalCIIntegrationTest.java index 1ccdaed26a7f..ccd9539afc3f 100644 --- a/src/test/java/de/tum/cit/aet/artemis/programming/icl/LocalVCLocalCIIntegrationTest.java +++ b/src/test/java/de/tum/cit/aet/artemis/programming/icl/LocalVCLocalCIIntegrationTest.java @@ -34,6 +34,8 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.parallel.Execution; +import org.junit.jupiter.api.parallel.ExecutionMode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -69,6 +71,7 @@ * assistant assignment, instructor assignment). */ @TestInstance(TestInstance.Lifecycle.PER_CLASS) +@Execution(ExecutionMode.SAME_THREAD) class LocalVCLocalCIIntegrationTest extends AbstractLocalCILocalVCIntegrationTest { private static final Logger log = LoggerFactory.getLogger(LocalVCLocalCIIntegrationTest.class); From 6fb3ae7f06f0e5cd3b027ac3f24535907b11407a Mon Sep 17 00:00:00 2001 From: Mohamed Bilel Besrour Date: Sat, 5 Oct 2024 23:03:43 +0200 Subject: [PATCH 3/4] execute tests on same thread --- .../programming/icl/LocalVCLocalCIIntegrationTest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/test/java/de/tum/cit/aet/artemis/programming/icl/LocalVCLocalCIIntegrationTest.java b/src/test/java/de/tum/cit/aet/artemis/programming/icl/LocalVCLocalCIIntegrationTest.java index ccd9539afc3f..3fde06ce36ac 100644 --- a/src/test/java/de/tum/cit/aet/artemis/programming/icl/LocalVCLocalCIIntegrationTest.java +++ b/src/test/java/de/tum/cit/aet/artemis/programming/icl/LocalVCLocalCIIntegrationTest.java @@ -70,7 +70,17 @@ * This class contains integration tests for the base repositories (template, solution, tests) and the different types of assignment repositories (student assignment, teaching * assistant assignment, instructor assignment). */ + +// TestInstance.Lifecycle.PER_CLASS allows all test methods in this class to share the same instance of the test class. +// This reduces the overhead of repeatedly creating and tearing down a new Spring application context for each test method. +// This is especially useful when the test setup is expensive or when we want to share resources, such as database connections or mock objects, across multiple tests. +// In this case, we want to share the same GitService and UsernamePasswordCredentialsProvider. @TestInstance(TestInstance.Lifecycle.PER_CLASS) + +// ExecutionMode.SAME_THREAD ensures that all tests within this class are executed sequentially in the same thread, rather than in parallel or in a different thread. +// This is important in the context of LocalCI because it avoids potential race conditions or inconsistencies that could arise if multiple test methods are executed +// concurrently. For example, it prevents overloading the LocalCI's result processing system with too many build job results at the same time, which could lead to flaky tests +// or timeouts. By keeping everything in the same thread, we maintain more predictable and stable test behavior, while not increasing the test execution time significantly. @Execution(ExecutionMode.SAME_THREAD) class LocalVCLocalCIIntegrationTest extends AbstractLocalCILocalVCIntegrationTest { From b44f695151196c119d001a07e2a1284896121c85 Mon Sep 17 00:00:00 2001 From: Mohamed Bilel Besrour Date: Sat, 5 Oct 2024 23:33:28 +0200 Subject: [PATCH 4/4] Revert "Add logging (REVERT LATER)" This reverts commit c306b8d378f0e71feaa18b44a102e904b3640d9f. --- .../artemis/programming/icl/LocalVCLocalCITestService.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/test/java/de/tum/cit/aet/artemis/programming/icl/LocalVCLocalCITestService.java b/src/test/java/de/tum/cit/aet/artemis/programming/icl/LocalVCLocalCITestService.java index 85004d91e05a..08c02eedceed 100644 --- a/src/test/java/de/tum/cit/aet/artemis/programming/icl/LocalVCLocalCITestService.java +++ b/src/test/java/de/tum/cit/aet/artemis/programming/icl/LocalVCLocalCITestService.java @@ -573,10 +573,7 @@ public void testLatestSubmission(Long participationId, String expectedCommitHash int expectedCodeIssueCount, Integer timeoutInSeconds) { // wait for result to be persisted Duration timeoutDuration = timeoutInSeconds != null ? Duration.ofSeconds(timeoutInSeconds) : Duration.ofSeconds(DEFAULT_AWAITILITY_TIMEOUT_IN_SECONDS); - await().atMost(timeoutDuration).until(() -> { - log.info("Checking if result is present for participation with id: {} and commit hash: {}", participationId, expectedCommitHash); - return resultRepository.findFirstWithSubmissionsByParticipationIdOrderByCompletionDateDesc(participationId).isPresent(); - }); + await().atMost(timeoutDuration).until(() -> resultRepository.findFirstWithSubmissionsByParticipationIdOrderByCompletionDateDesc(participationId).isPresent()); Authentication auth = SecurityContextHolder.getContext().getAuthentication(); List submissions = programmingSubmissionRepository.findAllByParticipationIdWithResults(participationId);