Harden Android realtime recovery
This commit is contained in:
68
tests/android-realtime-client-regression.test.ts
Normal file
68
tests/android-realtime-client-regression.test.ts
Normal file
@@ -0,0 +1,68 @@
|
||||
import test from "node:test";
|
||||
import assert from "node:assert/strict";
|
||||
import { readFile } from "node:fs/promises";
|
||||
|
||||
const realtimeClientSourceUrl = new URL(
|
||||
"../android/app/src/main/java/com/hyzq/boss/BossRealtimeClient.java",
|
||||
import.meta.url,
|
||||
);
|
||||
|
||||
async function readRealtimeClientSource() {
|
||||
return readFile(realtimeClientSourceUrl, "utf8");
|
||||
}
|
||||
|
||||
test("android realtime client restores session when the SSE stream returns 401", async () => {
|
||||
const source = await readRealtimeClientSource();
|
||||
|
||||
assert.match(
|
||||
source,
|
||||
/REALTIME_STREAM_HTTP_401/,
|
||||
"expected realtime client to classify 401 stream failures explicitly",
|
||||
);
|
||||
assert.match(
|
||||
source,
|
||||
/catch\s*\(Exception\s+\w+\)\s*\{[\s\S]{0,800}apiClient\.restoreSession\(\)/,
|
||||
"expected realtime loop to attempt restoreSession before falling back to blind retry",
|
||||
);
|
||||
});
|
||||
|
||||
test("android realtime client does not wait a full minute before reconnecting a silent stream", async () => {
|
||||
const source = await readRealtimeClientSource();
|
||||
|
||||
assert.doesNotMatch(
|
||||
source,
|
||||
/setReadTimeout\(60_000\)/,
|
||||
"a 60s SSE read timeout makes message delivery feel stale after transient network stalls",
|
||||
);
|
||||
assert.match(
|
||||
source,
|
||||
/STREAM_READ_TIMEOUT_MS\s*=\s*(25_000|30_000|35_000)/,
|
||||
"expected the SSE read timeout budget to stay close to the server keepalive window",
|
||||
);
|
||||
assert.match(
|
||||
source,
|
||||
/setReadTimeout\(STREAM_READ_TIMEOUT_MS\)/,
|
||||
"expected the realtime stream to apply the tighter read timeout budget",
|
||||
);
|
||||
});
|
||||
|
||||
test("android realtime client emits connection logs for reconnect debugging", async () => {
|
||||
const source = await readRealtimeClientSource();
|
||||
|
||||
assert.match(source, /android\.util\.Log/, "expected realtime client to import Android logging");
|
||||
assert.match(
|
||||
source,
|
||||
/Log\.(i|w|e)\(TAG,\s*"/,
|
||||
"expected realtime client to log connection state changes for field debugging",
|
||||
);
|
||||
});
|
||||
|
||||
test("android realtime client always clears the active connection after stream setup failures", async () => {
|
||||
const source = await readRealtimeClientSource();
|
||||
|
||||
assert.match(
|
||||
source,
|
||||
/try\s*\{[\s\S]{0,1200}int statusCode = connection\.getResponseCode\(\);[\s\S]{0,220}throw new IOException\("REALTIME_STREAM_HTTP_" \+ statusCode\);[\s\S]{0,2000}finally\s*\{\s*activeConnection = null;\s*connection\.disconnect\(\);\s*\}/,
|
||||
"expected non-2xx SSE setup failures to still flow through the connection cleanup finally block",
|
||||
);
|
||||
});
|
||||
Reference in New Issue
Block a user