From 2e697d158110174a736d303b871aa6343a7a70d4 Mon Sep 17 00:00:00 2001 From: XiaoSeS <87064762+XiaoSeS@users.noreply.github.com> Date: Thu, 3 Sep 2026 17:38:35 +0800 Subject: [PATCH] test(scanner): reproduce unbounded unavailable task Signed-off-by: XiaoSeS <87064762+XiaoSeS@users.noreply.github.com> --- .../skillhub/stream/ScanTaskConsumerTest.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/server/skillhub-app/src/test/java/com/iflytek/skillhub/stream/ScanTaskConsumerTest.java b/server/skillhub-app/src/test/java/com/iflytek/skillhub/stream/ScanTaskConsumerTest.java index 9bf8447f..f837ea71 100644 --- a/server/skillhub-app/src/test/java/com/iflytek/skillhub/stream/ScanTaskConsumerTest.java +++ b/server/skillhub-app/src/test/java/com/iflytek/skillhub/stream/ScanTaskConsumerTest.java @@ -370,6 +370,43 @@ class ScanTaskConsumerTest { verify(consumer.stream, never()).ack("skillhub-scanners", messageId); } + @Test + void handleMessage_whenScannerRemainsUnavailablePastRecoveryWindow_failsAndRemovesDelivery() { + StubSecurityScanner securityScanner = new StubSecurityScanner(); + securityScanner.failure = new SecurityScanException( + "scanner timed out", new HttpClientException("request timed out", new java.util.concurrent.TimeoutException())); + SkillVersion version = new SkillVersion(8L, "1.0.0", "publisher-1"); + try { + setField(version, "id", 42L); + } catch (Exception e) { + throw new AssertionError(e); + } + version.setStatus(SkillVersionStatus.SCANNING); + InMemorySkillVersionRepository repository = new InMemorySkillVersionRepository(version); + TestableScanTaskConsumer consumer = new TestableScanTaskConsumer( + securityScanner, + new StubSecurityScanService(), + repository, + new InMemoryScanTaskProducer(), + new InMemoryObjectStorageService() + ); + + StreamMessageId messageId = new StreamMessageId(13, 0); + when(consumer.stream.ack("skillhub-scanners", messageId)).thenReturn(1L); + consumer.handleMessage(messageId, Map.of( + "taskId", "task-expired-timeout", + "versionId", "42", + "skillPath", "/tmp/skillhub-scans/42", + "createdAtMillis", "1", + "scannerType", ScannerType.SKILL_SCANNER.getValue() + )); + + assertThat(version.getStatus()).isEqualTo(SkillVersionStatus.SCAN_FAILED); + assertThat(repository.savedVersion).isSameAs(version); + verify(consumer.stream).ack("skillhub-scanners", messageId); + verify(consumer.stream).remove(messageId); + } + @Test void processBusiness_whenScannerFails_releasesProcessingLock() { StubSecurityScanner securityScanner = new StubSecurityScanner();