App 2.15.0: queued live data survives restarts

Unsent live samples were kept in memory only, so a reboot or a killed
process during a dead spot lost them. The queue is now saved to
files/telemetry_queue.json with AtomicFile, at most every 5 minutes and
only after a change (the flash is not written every 15 s), and at once
when the service stops; it is restored, oldest first and within the
2000-sample cap, when the service starts. A damaged file restores
nothing rather than failing. Tested on the emulator across a reboot.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLJfZQZeAKAwSqViTmLzki
This commit is contained in:
2026-10-18 17:56:25 +02:00
co-authored by Claude Opus 5.5
parent f63f48131e
commit f88249427f
6 changed files with 164 additions and 7 deletions
@@ -1,6 +1,7 @@
package com.evsuite.abrp;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.List;
@@ -37,4 +38,46 @@ public class TelemetryQueueTest {
assertEquals(List.of("c", "d", "e"), queue.peekBatch());
assertEquals(2, queue.dropped());
}
@Test
public void aSavedQueueComesBackInOrder() {
TelemetryQueue q = new TelemetryQueue(10);
q.add("{\"utc\":1}");
q.add("{\"utc\":2}");
TelemetryQueue restarted = new TelemetryQueue(10);
restarted.add("{\"utc\":3}"); // taken after the restart
assertEquals(2, restarted.restore(q.encode()));
assertEquals(java.util.Arrays.asList("{\"utc\":1}", "{\"utc\":2}", "{\"utc\":3}"), restarted.peekBatch());
}
@Test
public void restoringKeepsTheCapacityByDroppingTheOldest() {
TelemetryQueue q = new TelemetryQueue(10);
for (int i = 1; i <= 4; i++) q.add("{\"utc\":" + i + "}");
TelemetryQueue small = new TelemetryQueue(3);
small.restore(q.encode());
assertEquals(java.util.Arrays.asList("{\"utc\":2}", "{\"utc\":3}", "{\"utc\":4}"), small.peekBatch());
assertEquals(1, small.dropped());
}
@Test
public void aDamagedFileRestoresNothing() {
TelemetryQueue q = new TelemetryQueue(10);
assertEquals(0, q.restore("[\"{\\\"utc\\\":1}\", trunc"));
assertEquals(0, q.restore(""));
assertEquals(0, q.restore(null));
assertEquals(0, q.size());
}
@Test
public void everyChangeMovesTheVersion() {
TelemetryQueue q = new TelemetryQueue(10);
long v0 = q.version();
q.add("{\"utc\":1}");
long v1 = q.version();
q.remove(0);
assertEquals(v1, q.version()); // nothing removed, nothing to save
q.remove(1);
assertTrue(q.version() > v1 && v1 > v0);
}
}