diff --git a/apps/coordinator/build.gradle.kts b/apps/coordinator/build.gradle.kts index e44bfd03..74500d3e 100644 --- a/apps/coordinator/build.gradle.kts +++ b/apps/coordinator/build.gradle.kts @@ -31,6 +31,7 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-actuator") implementation("org.springframework.boot:spring-boot-starter-websocket") implementation("org.springframework:spring-tx") + implementation("org.springframework.boot:spring-boot-starter-validation") implementation("io.github.microutils:kotlin-logging-jvm:2.0.11") diff --git a/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/TestBase.kt b/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/TestBase.kt index 32d20a00..1db6e1d4 100644 --- a/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/TestBase.kt +++ b/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/TestBase.kt @@ -49,8 +49,7 @@ open class TestBase { operation = setOf(OperationType.Encode, OperationType.ExtractSubtitles, OperationType.ConvertSubtitles, OperationType.Metadata), fileUri = "file:///unit/${UUID.randomUUID()}.mkv" ) - ) - start.newReferenceId() + ).apply { newReferenceId() } return start } diff --git a/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/CollectEventsListenerTest.kt b/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/CollectEventsListenerTest.kt index 80b6954c..c0393a76 100644 --- a/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/CollectEventsListenerTest.kt +++ b/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/CollectEventsListenerTest.kt @@ -84,7 +84,7 @@ class CollectEventsListenerTest : TestBase() { ) ) ) - } + }.newReferenceId() val parsed = mediaParsedEvent( collection = "MyCollection", @@ -128,7 +128,7 @@ class CollectEventsListenerTest : TestBase() { ) ) ) - } + }.newReferenceId() val parsed = mediaParsedEvent( collection = "MyCollection", @@ -279,7 +279,7 @@ class CollectEventsListenerTest : TestBase() { fun failure4() { val started = defaultStartEvent().let { ev -> ev.copy(data = ev.data.copy(operation = setOf(OperationType.Encode))) - } + }.newReferenceId() val parsed = mediaParsedEvent( collection = "MyCollection", diff --git a/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaCreateConvertTaskListenerTest.kt b/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaCreateConvertTaskListenerTest.kt index c2ac3032..2585f373 100644 --- a/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaCreateConvertTaskListenerTest.kt +++ b/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaCreateConvertTaskListenerTest.kt @@ -1,25 +1,18 @@ package no.iktdev.mediaprocessing.coordinator.listeners.events +import io.mockk.verify +import no.iktdev.eventi.models.Event import no.iktdev.eventi.models.store.TaskStatus import no.iktdev.mediaprocessing.TestBase -import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.ConvertTaskCreatedEvent -import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.OperationType -import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.ProcesserExtractResultEvent -import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.StartData -import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.StartProcessingEvent -import org.junit.jupiter.api.Assertions.* - -import org.junit.jupiter.api.DisplayName -import org.junit.jupiter.api.Test -import java.io.File - -import io.mockk.* -import no.iktdev.eventi.models.Event +import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.* import no.iktdev.mediaprocessing.shared.common.event_task_contract.tasks.ConvertTask import no.iktdev.mediaprocessing.shared.database.stores.TaskStore - +import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test import org.mockito.Mockito.mockStatic import org.mockito.kotlin.any +import java.io.File import java.nio.file.Files import java.nio.file.Path @@ -43,14 +36,14 @@ class MediaCreateConvertTaskListenerTest : TestBase() { fileUri = tempFile.absolutePath, operation = setOf(OperationType.ConvertSubtitles) ) - ) + ).newReferenceId() val extractEvent = ProcesserExtractResultEvent( status = TaskStatus.Completed, data = ProcesserExtractResultEvent.ExtractResult( cachedOutputFile = tempFile.absolutePath, language = "en" ) - ) + ).derivedOf(startEvent) val history = listOf(startEvent) val result = listener.onEvent(extractEvent, history) @@ -221,7 +214,7 @@ class MediaCreateConvertTaskListenerTest : TestBase() { fileUri = "/tmp/video.srt", operation = setOf(OperationType.ConvertSubtitles) ) - ) + ).newReferenceId() val extractEvent = ProcesserExtractResultEvent( status = TaskStatus.Completed, @@ -229,7 +222,7 @@ class MediaCreateConvertTaskListenerTest : TestBase() { cachedOutputFile = "/tmp/video.srt", language = "en" ) - ) + ).derivedOf(startEvent) val history = listOf(startEvent) val result = listener.onEvent(extractEvent, history) diff --git a/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaCreateEncodeTaskListenerTest.kt b/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaCreateEncodeTaskListenerTest.kt index e341a6b9..323d426c 100644 --- a/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaCreateEncodeTaskListenerTest.kt +++ b/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaCreateEncodeTaskListenerTest.kt @@ -45,17 +45,17 @@ class MediaCreateEncodeTaskListenerTest: TestBase() { fun testOnEventWithSingleAudioTrack() { val startEvent = StartProcessingEvent( StartData(setOf(OperationType.Encode), fileUri = "/tmp/movie.mkv") - ) + ).newReferenceId() val parsedEvent = MediaStreamParsedEvent( data = ParsedMediaStreams( videoStream = listOf(mockVideoStream(index = 0, codec = "h264", disposition = mockDisposition(), tags = mockTags())), audioStream = listOf(mockAudioStream(index = 1, codec = "aac", disposition = mockDisposition(), tags = mockTags())) ) - ) + ).derivedOf(startEvent) val selectedEvent = MediaTracksEncodeSelectedEvent( selectedVideoTrack = 0, selectedAudioTrack = 0 - ) + ).derivedOf(parsedEvent) val history = listOf(startEvent, parsedEvent) @@ -85,7 +85,8 @@ class MediaCreateEncodeTaskListenerTest: TestBase() { fun testOnEventWithExtendedAudioTrack() { val startEvent = StartProcessingEvent( StartData(setOf(OperationType.Encode), fileUri = "/tmp/movie.mkv") - ) + ).newReferenceId() + val parsedEvent = MediaStreamParsedEvent( data = ParsedMediaStreams( videoStream = listOf(mockVideoStream(index = 0, codec = "h264", disposition = mockDisposition(), tags = mockTags())), @@ -94,12 +95,12 @@ class MediaCreateEncodeTaskListenerTest: TestBase() { mockAudioStream(index = 2, codec = "aac", disposition = mockDisposition(), tags = mockTags()) ) ) - ) + ).derivedOf(startEvent) val selectedEvent = MediaTracksEncodeSelectedEvent( selectedVideoTrack = 0, selectedAudioTrack = 0, selectedAudioExtendedTrack = 1 - ) + ).derivedOf(parsedEvent) val history = listOf(startEvent, parsedEvent) diff --git a/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaCreateExtractTaskListenerTest.kt b/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaCreateExtractTaskListenerTest.kt index 4024e9b8..c4bad4e6 100644 --- a/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaCreateExtractTaskListenerTest.kt +++ b/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaCreateExtractTaskListenerTest.kt @@ -1,11 +1,7 @@ package no.iktdev.mediaprocessing.coordinator.listeners.events -import io.mockk.Runs -import io.mockk.every -import io.mockk.just -import io.mockk.mockkObject -import io.mockk.verify +import io.mockk.* import no.iktdev.eventi.models.Task import no.iktdev.eventi.models.store.PersistedTask import no.iktdev.eventi.models.store.TaskStatus @@ -13,22 +9,16 @@ import no.iktdev.mediaprocessing.ffmpeg.data.ParsedMediaStreams import no.iktdev.mediaprocessing.ffmpeg.data.SubtitleStream import no.iktdev.mediaprocessing.ffmpeg.data.SubtitleTags import no.iktdev.mediaprocessing.ffmpeg.data.Tags -import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.MediaStreamParsedEvent -import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.MediaTracksExtractSelectedEvent -import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.OperationType -import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.ProcesserExtractTaskCreatedEvent -import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.StartData -import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.StartProcessingEvent +import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.* import no.iktdev.mediaprocessing.shared.common.event_task_contract.tasks.ExtractSubtitleTask import no.iktdev.mediaprocessing.shared.database.stores.TaskStore - import org.junit.jupiter.api.Assertions.* import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import java.io.File import java.time.Duration -import java.util.UUID +import java.util.* class MediaCreateExtractTaskListenerTest { @@ -184,11 +174,12 @@ class MediaCreateExtractTaskListenerTest { fun testOnEventCreatesTasks() { val startEvent = StartProcessingEvent( StartData(setOf(OperationType.ExtractSubtitles), fileUri = "/tmp/movie.mkv") - ) + ).newReferenceId() val parsedEvent = MediaStreamParsedEvent( data = ParsedMediaStreams(subtitleStream = listOf(dummyStream(0, "subrip", "eng"))) - ) + ).derivedOf(startEvent) val selectedEvent = MediaTracksExtractSelectedEvent(selectedSubtitleTracks = listOf(0)) + .derivedOf(parsedEvent) val history = listOf(startEvent, parsedEvent) @@ -222,7 +213,7 @@ class MediaCreateExtractTaskListenerTest { // Hvis: vi har en StartProcessingEvent og to subtitle streams val startEvent = StartProcessingEvent( StartData(setOf(OperationType.ExtractSubtitles), fileUri = "/tmp/movie.mkv") - ) + ).newReferenceId() val parsedEvent = MediaStreamParsedEvent( data = ParsedMediaStreams( subtitleStream = listOf( @@ -230,8 +221,9 @@ class MediaCreateExtractTaskListenerTest { dummyStream(1, "ass", "jpn") ) ) - ) + ).derivedOf(startEvent) val selectedEvent = MediaTracksExtractSelectedEvent(selectedSubtitleTracks = listOf(0, 1)) + .derivedOf(parsedEvent) val history = listOf(startEvent, parsedEvent) diff --git a/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaDetermineSubtitleTrackTypeListenerTest.kt b/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaDetermineSubtitleTrackTypeListenerTest.kt index 8553692d..112b0e7b 100644 --- a/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaDetermineSubtitleTrackTypeListenerTest.kt +++ b/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaDetermineSubtitleTrackTypeListenerTest.kt @@ -9,12 +9,10 @@ import no.iktdev.mediaprocessing.ffmpeg.data.Tags import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.MediaStreamParsedEvent import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.MediaTracksDetermineSubtitleTypeEvent import no.iktdev.mediaprocessing.shared.common.model.SubtitleType -import org.junit.jupiter.api.Assertions.* - -import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Named -import org.junit.jupiter.api.Test import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.MethodSource import java.util.stream.Stream @@ -163,7 +161,7 @@ class MediaDetermineSubtitleTrackTypeListenerTest { fun testSubtitleCases(testCase: SubtitleTestCase) { val event = MediaStreamParsedEvent( ParsedMediaStreams(subtitleStream = listOf(testCase.stream)) - ) + ).newReferenceId() val result = listener.onEvent(event, emptyList()) as MediaTracksDetermineSubtitleTypeEvent if (testCase.expectedKept) { diff --git a/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaReadStreamsTaskCreatedListenerTest.kt b/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaReadStreamsTaskCreatedListenerTest.kt index e5f414e3..a7dea0fc 100644 --- a/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaReadStreamsTaskCreatedListenerTest.kt +++ b/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaReadStreamsTaskCreatedListenerTest.kt @@ -54,6 +54,8 @@ class MediaReadStreamsTaskCreatedListenerTest: TestBase() { Returneres CoordinatorReadStreamsTaskCreatedEvent med riktig taskId """) fun testOnEventParsedInfoEventWithStartProcessing() { + val startEvent = StartProcessingEvent(StartData(fileUri = "file://test.mkv", operation = emptySet())) + .newReferenceId() val parsedEvent = MediaParsedInfoEvent( MediaParsedInfoEvent.ParsedData( parsedCollection = "collection", @@ -61,8 +63,8 @@ class MediaReadStreamsTaskCreatedListenerTest: TestBase() { parsedSearchTitles = listOf("title"), mediaType = MediaType.Movie ) - ) - val startEvent = StartProcessingEvent(StartData(fileUri = "file://test.mkv", operation = emptySet())) + ).derivedOf(startEvent) + val result = listener.onEvent(parsedEvent, listOf(startEvent)) diff --git a/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaSelectEncodeTracksListenerTest.kt b/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaSelectEncodeTracksListenerTest.kt index 1ac67620..4dc3e2b6 100644 --- a/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaSelectEncodeTracksListenerTest.kt +++ b/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaSelectEncodeTracksListenerTest.kt @@ -1,15 +1,10 @@ package no.iktdev.mediaprocessing.coordinator.listeners.events import no.iktdev.eventi.models.Event -import no.iktdev.mediaprocessing.ffmpeg.data.AudioStream -import no.iktdev.mediaprocessing.ffmpeg.data.Disposition -import no.iktdev.mediaprocessing.ffmpeg.data.ParsedMediaStreams -import no.iktdev.mediaprocessing.ffmpeg.data.Tags -import no.iktdev.mediaprocessing.ffmpeg.data.VideoStream +import no.iktdev.mediaprocessing.ffmpeg.data.* import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.MediaStreamParsedEvent import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.MediaTracksEncodeSelectedEvent import org.junit.jupiter.api.Assertions.* -import org.junit.jupiter.api.Assertions.* import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test @@ -210,7 +205,7 @@ class MediaTracksEncodeSelectorTest: MediaSelectEncodeTracksListener() { val audioStreams = listOf(dummyAudioStream(0, "jpn", 2), dummyAudioStream(1, "jpn", 6)) val parsedEvent = MediaStreamParsedEvent( ParsedMediaStreams(videoStream = videoStreams, audioStream = audioStreams, subtitleStream = emptyList()) - ) + ).newReferenceId() val result = onEvent(parsedEvent, emptyList()) as MediaTracksEncodeSelectedEvent assertEquals(0, result.selectedVideoTrack) assertEquals(0, result.selectedAudioTrack) diff --git a/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaSelectExtractTracksListenerTest.kt b/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaSelectExtractTracksListenerTest.kt index d92c6b68..0252728b 100644 --- a/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaSelectExtractTracksListenerTest.kt +++ b/apps/coordinator/src/test/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MediaSelectExtractTracksListenerTest.kt @@ -8,7 +8,8 @@ import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.MediaT import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.MediaTracksExtractSelectedEvent import no.iktdev.mediaprocessing.shared.common.model.SubtitleItem import no.iktdev.mediaprocessing.shared.common.model.SubtitleType -import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertNull import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test @@ -78,7 +79,7 @@ class MediaSelectExtractTracksListenerTest: TestBase() { dummySubtitleStream(0, "eng", SubtitleType.Dialogue), dummySubtitleStream(1, "eng", SubtitleType.Commentary) ) - val event = MediaTracksDetermineSubtitleTypeEvent(subtitleTrackItems = items) + val event = MediaTracksDetermineSubtitleTypeEvent(subtitleTrackItems = items).newReferenceId() val result = listener.onEvent(event, emptyList()) as MediaTracksExtractSelectedEvent assertEquals(listOf(0), result.selectedSubtitleTracks) } diff --git a/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/config/DirectoryProperties.kt b/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/config/DirectoryProperties.kt index 6b98d860..d85b5988 100644 --- a/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/config/DirectoryProperties.kt +++ b/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/config/DirectoryProperties.kt @@ -1,8 +1,12 @@ package no.iktdev.mediaprocessing.processer.config +import org.jetbrains.annotations.NotNull import org.springframework.boot.context.properties.ConfigurationProperties +import org.springframework.validation.annotation.Validated @ConfigurationProperties(prefix = "directories") +@Validated data class DirectoryProperties( + @field:NotNull val logs: String, -) \ No newline at end of file +) diff --git a/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/listeners/SubtitleTaskListener.kt b/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/listeners/SubtitleTaskListener.kt index 2b852fd5..6775589e 100644 --- a/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/listeners/SubtitleTaskListener.kt +++ b/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/listeners/SubtitleTaskListener.kt @@ -88,7 +88,7 @@ class SubtitleTaskListener( TaskStatus.Cancelled -> "Canceled" else -> "" } - return ProcesserExtractResultEvent(null, status, error = message) + return ProcesserExtractResultEvent(null, status, error = message).producedFrom(task) } override fun getFfmpeg(): FFmpeg { diff --git a/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/listeners/VideoTaskListener.kt b/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/listeners/VideoTaskListener.kt index 30c38202..0c4db5a6 100644 --- a/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/listeners/VideoTaskListener.kt +++ b/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/listeners/VideoTaskListener.kt @@ -94,7 +94,7 @@ class VideoTaskListener( TaskStatus.Cancelled -> "Canceled" else -> "" } - return ProcesserEncodeResultEvent(null, null, status, error = message) + return ProcesserEncodeResultEvent(null, null, status, error = message).producedFrom(task) } diff --git a/apps/processer/src/test/kotlin/no/iktdev/mediaprocessing/processer/TestUtils.kt b/apps/processer/src/test/kotlin/no/iktdev/mediaprocessing/processer/TestUtils.kt index 4d2b7783..011ec8fc 100644 --- a/apps/processer/src/test/kotlin/no/iktdev/mediaprocessing/processer/TestUtils.kt +++ b/apps/processer/src/test/kotlin/no/iktdev/mediaprocessing/processer/TestUtils.kt @@ -1,8 +1,11 @@ package no.iktdev.mediaprocessing.processer +import no.iktdev.eventi.models.Event +import no.iktdev.eventi.models.Task import no.iktdev.mediaprocessing.processer.config.DirectoryProperties import no.iktdev.mediaprocessing.processer.config.ExecutablesConfig import no.iktdev.mediaprocessing.shared.common.configs.MediaPaths +import org.junit.jupiter.api.Assertions.assertEquals object TestUtils { fun getFileUtil(): FileUtil { @@ -24,4 +27,13 @@ object TestUtils { ) } -} \ No newline at end of file +} + +fun assertSameReferenceId(task: Task, event: Event?) { + requireNotNull(event) { "Event was null" } + assertEquals( + task.referenceId, + event.referenceId, + "Expected event to keep same referenceId as task" + ) +} diff --git a/apps/processer/src/test/kotlin/no/iktdev/mediaprocessing/processer/listeners/SubtitleTaskListenerTest.kt b/apps/processer/src/test/kotlin/no/iktdev/mediaprocessing/processer/listeners/SubtitleTaskListenerTest.kt index efa5f75f..3acb5811 100644 --- a/apps/processer/src/test/kotlin/no/iktdev/mediaprocessing/processer/listeners/SubtitleTaskListenerTest.kt +++ b/apps/processer/src/test/kotlin/no/iktdev/mediaprocessing/processer/listeners/SubtitleTaskListenerTest.kt @@ -8,12 +8,14 @@ import no.iktdev.eventi.tasks.TaskReporter import no.iktdev.eventi.tasks.TaskTypeRegistry import no.iktdev.mediaprocessing.ffmpeg.FFmpeg import no.iktdev.mediaprocessing.processer.TestUtils +import no.iktdev.mediaprocessing.processer.assertSameReferenceId import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.ProcesserExtractResultEvent import no.iktdev.mediaprocessing.shared.common.event_task_contract.tasks.ExtractSubtitleData import no.iktdev.mediaprocessing.shared.common.event_task_contract.tasks.ExtractSubtitleTask import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import java.util.* import kotlin.system.measureTimeMillis @@ -86,4 +88,86 @@ class SubtitleTaskListenerTest { } + @Test + @DisplayName(""" + Når en event produseres fra en task + Hvis task har en gitt referenceId + Så: + Skal eventen ha samme referenceId + """ + ) + fun producedFrom_keeps_referenceId() { + val task = ExtractSubtitleTask( + ExtractSubtitleData( + inputFile = "input.mp4", + outputFileName = "output.srt", + arguments = listOf("-y"), + language = "eng" + ) + ).newReferenceId() + + val event = ProcesserExtractResultEvent( + status = TaskStatus.Completed + ).producedFrom(task) + + assertSameReferenceId(task, event) + } + + @Test + @DisplayName(""" + Når en task feiler og createIncompleteStateTaskEvent kalles + Hvis task har en referenceId + Så: + Skal eventen som returneres ha samme referenceId + """) + fun createIncompleteStateTaskEvent_keeps_referenceId() { + val task = ExtractSubtitleTask( + ExtractSubtitleData( + inputFile = "input.mp4", + outputFileName = "output.srt", + arguments = listOf("-y"), + language = "eng" + ) + ).newReferenceId() + + val listener = SubtitleTaskListener( + fileUtil = TestUtils.getFileUtil(), + executableConfig = TestUtils.getExecutableConfig() + ) + + val event = listener.createIncompleteStateTaskEvent( + task = task, + status = TaskStatus.Failed, + exception = RuntimeException("boom") + ) + + assertSameReferenceId(task, event) + } + + @Test + @DisplayName(""" + Når VideoTaskListener kjører en EncodeTask + Hvis task har en referenceId + Så: + Skal resultat-eventen ha samme referenceId + """) + fun onTask_keeps_referenceId() = runTest { + val task = ExtractSubtitleTask( + ExtractSubtitleData( + inputFile = "input.mp4", + outputFileName = "output.srt", + arguments = listOf("-y"), + language = "eng" + ) + ).newReferenceId() + + val listener = TestListener(delay = 10) + + listener.accept(task, overrideReporter) + listener.getJob()?.join() + + val event = listener.getResult() + assertTrue(event is ProcesserExtractResultEvent) + assertSameReferenceId(task, event) + } } \ No newline at end of file diff --git a/apps/processer/src/test/kotlin/no/iktdev/mediaprocessing/processer/listeners/VideoTaskListenerTest.kt b/apps/processer/src/test/kotlin/no/iktdev/mediaprocessing/processer/listeners/VideoTaskListenerTest.kt index 69795931..75a6c891 100644 --- a/apps/processer/src/test/kotlin/no/iktdev/mediaprocessing/processer/listeners/VideoTaskListenerTest.kt +++ b/apps/processer/src/test/kotlin/no/iktdev/mediaprocessing/processer/listeners/VideoTaskListenerTest.kt @@ -11,12 +11,14 @@ import no.iktdev.mediaprocessing.ffmpeg.FFmpeg import no.iktdev.mediaprocessing.processer.CoordinatorClient import no.iktdev.mediaprocessing.processer.LocalProgressCache import no.iktdev.mediaprocessing.processer.TestUtils +import no.iktdev.mediaprocessing.processer.assertSameReferenceId import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.ProcesserEncodeResultEvent import no.iktdev.mediaprocessing.shared.common.event_task_contract.tasks.EncodeData import no.iktdev.mediaprocessing.shared.common.event_task_contract.tasks.EncodeTask import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import java.util.* import kotlin.system.measureTimeMillis @@ -24,8 +26,9 @@ import kotlin.system.measureTimeMillis class VideoTaskListenerTest { - class TestListener(val delay: Long, coordinatorClient: CoordinatorClient): - VideoTaskListener(coordinatorWebClient = coordinatorClient, + class TestListener(val delay: Long, coordinatorClient: CoordinatorClient) : + VideoTaskListener( + coordinatorWebClient = coordinatorClient, localProgress = LocalProgressCache(), fileUtil = TestUtils.getFileUtil(), executableConfig = TestUtils.getExecutableConfig(), @@ -36,12 +39,13 @@ class VideoTaskListenerTest { fun getResult(): Event? { return _result } + override fun onComplete(task: Task, result: Event?) { this._result = result } override fun getFfmpeg(): FFmpeg { - return MockFFmpeg(delayMillis = delay, listener = MockFFmpeg.emptyListener()) + return MockFFmpeg(delayMillis = delay, listener = MockFFmpeg.emptyListener()) } } @@ -62,6 +66,7 @@ class VideoTaskListenerTest { fun setup() { TaskTypeRegistry.register(EncodeTask::class.java) } + private val coordinatorClient = mockk(relaxed = true) @Test @@ -86,8 +91,85 @@ class VideoTaskListenerTest { } assertTrue(time >= delay, "Expected onTask to wait at least $delay ms, waited for $time ms") - assertTrue(time <= (delay*2), "Expected onTask to wait less than ${(delay*2)} ms, waited for $time ms") + assertTrue(time <= (delay * 2), "Expected onTask to wait less than ${(delay * 2)} ms, waited for $time ms") } + @Test + @DisplayName(""" + Når en event produseres fra en task + Hvis task har en gitt referenceId + Så: + Skal eventen ha samme referenceId + """ + ) + fun producedFrom_keeps_referenceId() { + val task = EncodeTask( + EncodeData(inputFile = "input.mp4", outputFileName = "output.mp4", arguments = listOf("-y")) + ).newReferenceId() + + val event = ProcesserEncodeResultEvent( + status = TaskStatus.Completed + ).producedFrom(task) + + assertSameReferenceId(task, event) + } + + @Test + @DisplayName(""" + Når en task feiler og createIncompleteStateTaskEvent kalles + Hvis task har en referenceId + Så: + Skal eventen som returneres ha samme referenceId + """) + fun createIncompleteStateTaskEvent_keeps_referenceId() { + val task = EncodeTask( + EncodeData(inputFile = "input.mp4", outputFileName = "output.mp4", arguments = listOf("-y")) + ).newReferenceId() + + val listener = VideoTaskListener( + coordinatorWebClient = coordinatorClient, + localProgress = LocalProgressCache(), + fileUtil = TestUtils.getFileUtil(), + executableConfig = TestUtils.getExecutableConfig() + ) + + val event = listener.createIncompleteStateTaskEvent( + task = task, + status = TaskStatus.Failed, + exception = RuntimeException("boom") + ) + + assertSameReferenceId(task, event) + } + + @Test + @DisplayName(""" + Når VideoTaskListener kjører en EncodeTask + Hvis task har en referenceId + Så: + Skal resultat-eventen ha samme referenceId + """) + fun onTask_keeps_referenceId() = runTest { + val task = EncodeTask( + EncodeData( + inputFile = "input.mp4", + outputFileName = "output.mp4", + arguments = listOf("-y") + ) + ).newReferenceId() + + val listener = TestListener(delay = 10, coordinatorClient) + + listener.accept(task, overrideReporter) + listener.getJob()?.join() + + val event = listener.getResult() + assertTrue(event is ProcesserEncodeResultEvent) + assertSameReferenceId(task, event) + } + + + + } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a2f6a9b8..c51abde8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -eventi = "1.0-rc38" +eventi = "1.0-rc39" exfl = "1.0-rc1" [libraries] diff --git a/shared/common/src/test/kotlin/no/iktdev/mediaprocessing/shared/common/event_task_contract/TaskResultEventSerializationTest.kt b/shared/common/src/test/kotlin/no/iktdev/mediaprocessing/shared/common/event_task_contract/TaskResultEventSerializationTest.kt index d255af85..33c38d1b 100644 --- a/shared/common/src/test/kotlin/no/iktdev/mediaprocessing/shared/common/event_task_contract/TaskResultEventSerializationTest.kt +++ b/shared/common/src/test/kotlin/no/iktdev/mediaprocessing/shared/common/event_task_contract/TaskResultEventSerializationTest.kt @@ -9,6 +9,7 @@ import com.google.gson.GsonBuilder import com.google.gson.JsonDeserializer import com.google.gson.JsonPrimitive import com.google.gson.JsonSerializer +import no.iktdev.eventi.models.Event import no.iktdev.eventi.models.store.TaskStatus import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertDoesNotThrow @@ -106,8 +107,9 @@ class TaskResultEventSerializationTest { // --- 5. Fallback --- null } - - return ctor.callBy(args) + val instance = ctor.callBy(args) + if (instance is Event) { instance.newReferenceId() } + return instance }