This commit is contained in:
+75
@@ -211,6 +211,81 @@ class SystemUpdateApplicationServiceTest {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void restoresDownloadMetricsAndRuntimeEventsFromUpdaterState() throws Exception {
|
||||
HttpServer server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0);
|
||||
Path inbox = Files.createDirectory(tempDir.resolve("progress-inbox"));
|
||||
Path statusFile = tempDir.resolve("progress-status.json");
|
||||
Files.writeString(statusFile, """
|
||||
{"state":"DOWNLOADING","message":"Downloading signed release","targetVersion":"1.0.0-preview.2",
|
||||
"updatedAt":"2026-08-18T03:00:00Z","downloadedBytes":5242880,"totalBytes":10485760,
|
||||
"bytesPerSecond":1048576,"downloadPercent":50,"restartExpectedSeconds":10}
|
||||
""");
|
||||
Files.writeString(tempDir.resolve("events.jsonl"), """
|
||||
{"occurredAt":"2026-08-18T02:59:59Z","level":"INFO","stage":"VERIFYING","message":"签名校验开始"}
|
||||
{"occurredAt":"2026-08-18T03:00:00Z","level":"INFO","stage":"DOWNLOADING","message":"更新包下载中"}
|
||||
""");
|
||||
SystemUpdateApplicationService service = serviceForGitea(server, inbox, statusFile);
|
||||
|
||||
var status = service.status();
|
||||
|
||||
assertEquals("DOWNLOADING", status.state());
|
||||
assertEquals(5_242_880L, status.downloadedBytes());
|
||||
assertEquals(10_485_760L, status.totalBytes());
|
||||
assertEquals(1_048_576L, status.bytesPerSecond());
|
||||
assertEquals(50, status.downloadPercent());
|
||||
assertEquals(10, status.restartExpectedSeconds());
|
||||
assertEquals(2, status.events().size());
|
||||
assertEquals("DOWNLOADING", status.events().get(1).stage());
|
||||
assertFalse(status.allowedActions().contains("DOWNLOAD"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void recoveryRequiredStateBlocksEveryUpdateAction() throws Exception {
|
||||
HttpServer server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0);
|
||||
server.createContext("/api/v1/repos/ERP-Team/kaidi/releases/latest", exchange -> {
|
||||
String assetUrl = "http://127.0.0.1:" + server.getAddress().getPort()
|
||||
+ "/ERP-Team/kaidi/releases/download/v1.0.0-preview.2/release-manifest.json";
|
||||
byte[] body = """
|
||||
{"tag_name":"v1.0.0-preview.2","assets":[
|
||||
{"name":"release-manifest.json","browser_download_url":"%s"}]}
|
||||
""".formatted(assetUrl).getBytes(StandardCharsets.UTF_8);
|
||||
exchange.sendResponseHeaders(200, body.length);
|
||||
exchange.getResponseBody().write(body);
|
||||
exchange.close();
|
||||
});
|
||||
server.createContext("/ERP-Team/kaidi/releases/download/v1.0.0-preview.2/release-manifest.json",
|
||||
exchange -> {
|
||||
byte[] body = """
|
||||
{"version":"1.0.0-preview.2","artifact":"kaidi-finance-1.0.0-preview.2.tar.gz",
|
||||
"sha256":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}
|
||||
""".getBytes(StandardCharsets.UTF_8);
|
||||
exchange.sendResponseHeaders(200, body.length);
|
||||
exchange.getResponseBody().write(body);
|
||||
exchange.close();
|
||||
});
|
||||
server.start();
|
||||
Path inbox = Files.createDirectory(tempDir.resolve("recovery-inbox"));
|
||||
Path statusFile = tempDir.resolve("recovery-status.json");
|
||||
Files.writeString(statusFile, """
|
||||
{"state":"RECOVERY_REQUIRED","message":"自动回滚未完成","targetVersion":"1.0.0-preview.2",
|
||||
"updatedAt":"2026-08-18T03:10:00Z"}
|
||||
""");
|
||||
SystemUpdateApplicationService service = serviceForGitea(server, inbox, statusFile);
|
||||
|
||||
try {
|
||||
var status = service.status();
|
||||
|
||||
assertEquals("RECOVERY_REQUIRED", status.state());
|
||||
assertTrue(status.allowedActions().isEmpty());
|
||||
assertThrows(BusinessException.class,
|
||||
() -> service.download(new DownloadUpdateRequest("1.0.0-preview.2")));
|
||||
assertFalse(Files.exists(inbox.resolve("request.json")));
|
||||
} finally {
|
||||
server.stop(0);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void checksConfiguredManifestAndQueuesOnlyItsLatestVersion() throws Exception {
|
||||
HttpServer server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0);
|
||||
|
||||
Reference in New Issue
Block a user