feat: surface /api/status memory+disk pressure on connect/status screens (#903) (#908)

Co-authored-by: M57 <hy4ri@users.noreply.github.com>
This commit is contained in:
M57andM57 authored and GitHub committed 2026-08-15 13:00:08 +03:00
1 parent 2746d39c7f
commit 85087c70c7
9 files changed
+402 -1

No files matched your search

@@ -328,6 +328,8 @@ class ModelSerializationTest {
assertNull(response.active_sessions)
assertNull(response.auth_required)
assertNull(response.gateway_platforms)
assertNull(response.memory)
assertNull(response.disk)
}
@Test
@@ -353,6 +355,71 @@ class ModelSerializationTest {
assertNull(iosPlatform.error_code)
}
@Test
fun testStatusResponseDeserialization_memoryAndDiskBlocks() {
val jsonStr =
"""
{
"version": "1.0.0",
"memory": {
"pressure": "elevated",
"gateway_rss_mb": 512,
"system_total_mb": 8192,
"system_available_mb": 900,
"swap_used_mb": 2048,
"sampled_at": "2026-08-14T19:00:00+00:00",
"last_boot_unclean": true,
"last_boot_suspected_oom": false,
"boot_id": "2026-08-14T18:00:00+00:00"
},
"disk": {
"pressure": "critical",
"total_mb": 512000,
"free_mb": 200,
"used_percent": 99.9
}
}
""".trimIndent()
val response = json.decodeFromString<StatusResponse>(jsonStr)
assertEquals("elevated", response.memory?.pressure)
assertEquals(512, response.memory?.gateway_rss_mb)
assertEquals(8192, response.memory?.system_total_mb)
assertEquals(900, response.memory?.system_available_mb)
assertEquals(2048, response.memory?.swap_used_mb)
assertEquals(true, response.memory?.last_boot_unclean)
assertEquals(false, response.memory?.last_boot_suspected_oom)
assertEquals("2026-08-14T18:00:00+00:00", response.memory?.boot_id)
assertEquals("critical", response.disk?.pressure)
assertEquals(512000, response.disk?.total_mb)
assertEquals(200, response.disk?.free_mb)
assertEquals(99.9, response.disk?.used_percent ?: 0.0, 0.01)
}
@Test
fun testStatusResponseDeserialization_pressureUnknownDegrades() {
val jsonStr =
"""
{
"memory": {
"pressure": "unknown",
"gateway_rss_mb": null,
"last_boot_unclean": false,
"last_boot_suspected_oom": false
},
"disk": {
"pressure": "unknown"
}
}
""".trimIndent()
val response = json.decodeFromString<StatusResponse>(jsonStr)
assertEquals("unknown", response.memory?.pressure)
assertNull(response.memory?.system_total_mb)
assertEquals(false, response.memory?.last_boot_unclean)
assertEquals("unknown", response.disk?.pressure)
assertNull(response.disk?.total_mb)
assertNull(response.disk?.free_mb)
}
@Test
fun testStatusResponseDeserialization_typeMismatchInGatewayPlatforms() {
val jsonStr =
@@ -0,0 +1,108 @@
package com.m57.hermescontrol.ui.common
import com.m57.hermescontrol.data.model.DiskPressureStatus
import com.m57.hermescontrol.data.model.MemoryPressureStatus
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Test
class PressureBannerTest {
private fun mem(
pressure: String? = null,
suspectedOom: Boolean? = null,
) = MemoryPressureStatus(
pressure = pressure,
last_boot_suspected_oom = suspectedOom,
)
private fun disk(pressure: String? = null) = DiskPressureStatus(pressure = pressure)
@Test
fun noTrigger_whenOkUnknownOrNull() {
assertNull(selectPressureTrigger(null, null))
assertNull(selectPressureTrigger(mem("ok"), disk("ok")))
assertNull(selectPressureTrigger(mem("unknown"), disk("unknown")))
assertNull(selectPressureTrigger(mem(), disk()))
}
@Test
fun diskCritical_outranksEverything() {
assertEquals(
PressureTrigger.DISK_CRITICAL,
selectPressureTrigger(mem("critical"), disk("critical")),
)
assertEquals(
PressureTrigger.DISK_CRITICAL,
selectPressureTrigger(mem("critical", suspectedOom = true), disk("critical")),
)
assertEquals(
PressureTrigger.DISK_CRITICAL,
selectPressureTrigger(mem("elevated"), disk("critical")),
)
}
@Test
fun memoryCritical_outranksOomAndElevated() {
assertEquals(
PressureTrigger.MEMORY_CRITICAL,
selectPressureTrigger(mem("critical", suspectedOom = true), disk("elevated")),
)
assertEquals(
PressureTrigger.MEMORY_CRITICAL,
selectPressureTrigger(mem("critical"), disk("elevated")),
)
}
@Test
fun oomRestart_shownEvenWhenPressureOk() {
assertEquals(
PressureTrigger.OOM_RESTART,
selectPressureTrigger(mem("ok", suspectedOom = true), disk("ok")),
)
assertEquals(
PressureTrigger.OOM_RESTART,
selectPressureTrigger(mem("unknown", suspectedOom = true), disk("unknown")),
)
}
@Test
fun oomRestart_outranksElevatedButNotCritical() {
assertEquals(
PressureTrigger.OOM_RESTART,
selectPressureTrigger(mem("elevated", suspectedOom = true), disk("elevated")),
)
assertEquals(
PressureTrigger.MEMORY_CRITICAL,
selectPressureTrigger(mem("critical", suspectedOom = true), disk("elevated")),
)
assertEquals(
PressureTrigger.DISK_CRITICAL,
selectPressureTrigger(mem("elevated", suspectedOom = true), disk("critical")),
)
}
@Test
fun diskElevated_outranksMemoryElevated() {
assertEquals(
PressureTrigger.DISK_ELEVATED,
selectPressureTrigger(mem("elevated"), disk("elevated")),
)
}
@Test
fun memoryElevated_shownWhenOnlyTrigger() {
assertEquals(
PressureTrigger.MEMORY_ELEVATED,
selectPressureTrigger(mem("elevated"), disk("ok")),
)
assertEquals(
PressureTrigger.DISK_ELEVATED,
selectPressureTrigger(mem("ok"), disk("elevated")),
)
}
@Test
fun oomFlagFalse_doesNotTrigger() {
assertNull(selectPressureTrigger(mem("ok", suspectedOom = false), disk("ok")))
}
}