diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/RunTimeExperienceService.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/RunTimeExperienceService.java index 19e181fbc..5045d7f8c 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/RunTimeExperienceService.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/RunTimeExperienceService.java @@ -1,5 +1,7 @@ package dev.sheldan.abstracto.experience.service; +import java.util.HashSet; +import java.util.Set; import lombok.Getter; import org.springframework.stereotype.Component; @@ -38,6 +40,7 @@ public class RunTimeExperienceService { public void cleanupRunTimeStorage() { Instant now = Instant.now(); + Set serverIdsToRemove = new HashSet<>(); runtimeExperience.forEach((serverId, userInstantMap) -> { List userIdsToRemove = new ArrayList<>(); userInstantMap.forEach((userId, instant) -> { @@ -46,6 +49,10 @@ public class RunTimeExperienceService { } }); userIdsToRemove.forEach(userInstantMap::remove); + if(userInstantMap.isEmpty()) { + serverIdsToRemove.add(serverId); + } }); + serverIdsToRemove.forEach(runtimeExperience::remove); } } \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/service/RuntimeExperienceServiceTest.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/service/RuntimeExperienceServiceTest.java new file mode 100644 index 000000000..54005b0b6 --- /dev/null +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/service/RuntimeExperienceServiceTest.java @@ -0,0 +1,32 @@ +package dev.sheldan.abstracto.experience.service; + + +import static org.assertj.core.api.Assertions.assertThat; + +import java.time.Instant; +import java.util.HashMap; +import java.util.Map; +import org.junit.Test; + +public class RuntimeExperienceServiceTest { + + @Test + public void shouldCleanExpiredExperience() { + RunTimeExperienceService experienceService = new RunTimeExperienceService(); + Map mapValue = new HashMap<>(Map.of(2L, Instant.now().minusSeconds(5))); + experienceService.getRuntimeExperience().put(1L, mapValue); + experienceService.cleanupRunTimeStorage(); + assertThat(experienceService.getRuntimeExperience()).isEmpty(); + } + + @Test + public void shouldLeaveExperienceIfNotYetExpired() { + RunTimeExperienceService experienceService = new RunTimeExperienceService(); + Map mapValue2 = new HashMap<>(Map.of(3L, Instant.now().plusSeconds(5))); + experienceService.getRuntimeExperience().put(2L, mapValue2); + experienceService.cleanupRunTimeStorage(); + assertThat(experienceService.getRuntimeExperience().get(2L)).containsKey(3L); + assertThat(experienceService.getRuntimeExperience()).hasSize(1); + } + +}