Files
mg4/app/src/test/java/com/evsuite/abrp/TelemetryQueueTest.java
T
nilsandClaude Opus 5.5 f88249427f 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
2026-10-18 17:56:25 +02:00

84 lines
2.9 KiB
Java

package com.evsuite.abrp;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.List;
import org.junit.Test;
/** The offline buffer for live samples — pure JVM. */
public class TelemetryQueueTest {
@Test
public void batchesOldestFirstAndKeepsThemUntilConfirmed() {
TelemetryQueue queue = new TelemetryQueue();
queue.add("a");
queue.add("b");
assertEquals(List.of("a", "b"), queue.peekBatch());
// Not confirmed yet: a failed request must not lose them.
assertEquals(2, queue.size());
queue.remove(2);
assertEquals(0, queue.size());
}
@Test
public void aBatchNeverExceedsWhatTheServerAccepts() {
TelemetryQueue queue = new TelemetryQueue();
for (int i = 0; i < 1200; i++) queue.add(String.valueOf(i));
List<String> batch = queue.peekBatch();
assertEquals(TelemetryQueue.MAX_BATCH, batch.size());
assertEquals("0", batch.get(0));
}
@Test
public void whenFullTheOldestSamplesAreDropped() {
TelemetryQueue queue = new TelemetryQueue(3);
for (String s : new String[]{"a", "b", "c", "d", "e"}) queue.add(s);
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);
}
}