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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user