mirror of
https://github.com/callstack/agent-device.git
synced 2026-09-14 20:06:34 +08:00
b15121ffc8
* test(ios): add snapshot convergence evidence harness * fix(ios): satisfy benchmark CI guards * fix(ios): constrain benchmark proxy routes * fix(ios-benchmark): enforce cell admission evidence * fix(ios-benchmark): protect benchmark state ownership * fix(ios-benchmark): use proxy port flag * fix(ios-benchmark): let proxy choose an ephemeral port * test(ios-benchmark): keep CLI process seam local * fix(ios-benchmark): parse proxy startup envelope * fix(ios-benchmark): bind proxy lease to simulator * fix(ios-benchmark): keep fresh proxy CLI sessions isolated * fix(ios-benchmark): preserve async timeout evidence * docs(ios-benchmark): retain exact-head evidence * test(ios): reveal offscreen alert fixture controls * test(ios): reset alert between relaunch samples * test(ios): admit native alert snapshots * docs(ios): publish snapshot convergence corpus * chore(ios): format benchmark evidence * fix(ios-benchmark): admit proxy fixture anchors * docs(ios): republish exact-head benchmark corpus * fix(size): make publish asset evidence hermetic * style(size): format package evidence test * test(size): update publish preparation contracts * fix: retire stale utils layering zone * test: pin shared publish asset owner * test: verify preserved size reporter closure * fix: move mutation ownership to snapshot module * test(ios): add snapshot convergence evidence harness * fix(ios): satisfy benchmark CI guards * fix(ios): constrain benchmark proxy routes * fix(ios-benchmark): enforce cell admission evidence * fix(ios-benchmark): protect benchmark state ownership * fix(ios-benchmark): use proxy port flag * fix(ios-benchmark): let proxy choose an ephemeral port * test(ios-benchmark): keep CLI process seam local * fix(ios-benchmark): parse proxy startup envelope * fix(ios-benchmark): bind proxy lease to simulator * fix(ios-benchmark): keep fresh proxy CLI sessions isolated * fix(ios-benchmark): preserve async timeout evidence * docs(ios-benchmark): retain exact-head evidence * test(ios): reveal offscreen alert fixture controls * test(ios): reset alert between relaunch samples * test(ios): admit native alert snapshots * docs(ios): publish snapshot convergence corpus * chore(ios): format benchmark evidence * fix(ios-benchmark): admit proxy fixture anchors * docs(ios): republish exact-head benchmark corpus * fix(size): make publish asset evidence hermetic * test(size): update publish preparation contracts * fix: keep git-state gates out of mutation sandboxes
74 lines
2.6 KiB
TypeScript
74 lines
2.6 KiB
TypeScript
import assert from 'node:assert/strict';
|
|
import http from 'node:http';
|
|
import { test } from 'vitest';
|
|
import { createNetworkConditioner } from './proxy-conditioner.ts';
|
|
|
|
test('forwards an RPC response and records exact body bytes at zero loss', async () => {
|
|
const upstream = http.createServer((request, response) => {
|
|
request.resume();
|
|
request.on('end', () => {
|
|
response.setHeader('content-type', 'application/json');
|
|
response.end('{"result":{"ok":true}}');
|
|
});
|
|
});
|
|
await new Promise<void>((resolve) => upstream.listen(0, '127.0.0.1', resolve));
|
|
const address = upstream.address();
|
|
assert.ok(address && typeof address !== 'string');
|
|
const conditioner = await createNetworkConditioner({
|
|
upstreamBaseUrl: `http://127.0.0.1:${address.port}`,
|
|
network: { rttMs: 0, bandwidthKbps: null, packetLossPercent: 0, seed: 1 },
|
|
});
|
|
try {
|
|
const response = await fetch(`${conditioner.baseUrl}/agent-device/rpc`, {
|
|
method: 'POST',
|
|
body: '{"request":true}',
|
|
});
|
|
assert.equal(await response.text(), '{"result":{"ok":true}}');
|
|
assert.deepEqual(conditioner.recordsSince(0), [
|
|
{
|
|
sequence: 1,
|
|
requestBytes: 16,
|
|
responseBytes: 22,
|
|
status: 200,
|
|
failed: false,
|
|
},
|
|
]);
|
|
} finally {
|
|
await conditioner.close();
|
|
await new Promise<void>((resolve, reject) =>
|
|
upstream.close((error) => (error ? reject(error) : resolve())),
|
|
);
|
|
}
|
|
});
|
|
|
|
test('rejects non-loopback upstreams before binding the conditioner', async () => {
|
|
await assert.rejects(
|
|
createNetworkConditioner({
|
|
upstreamBaseUrl: 'https://example.com:443',
|
|
network: { rttMs: 0, bandwidthKbps: null, packetLossPercent: 0, seed: 1 },
|
|
}),
|
|
/must be an HTTP 127\.0\.0\.1 URL with a port/,
|
|
);
|
|
});
|
|
|
|
test('does not forward unsupported paths upstream', async () => {
|
|
const upstream = http.createServer((_request, response) => response.end('unexpected'));
|
|
await new Promise<void>((resolve) => upstream.listen(0, '127.0.0.1', resolve));
|
|
const address = upstream.address();
|
|
assert.ok(address && typeof address !== 'string');
|
|
const conditioner = await createNetworkConditioner({
|
|
upstreamBaseUrl: `http://127.0.0.1:${address.port}`,
|
|
network: { rttMs: 0, bandwidthKbps: null, packetLossPercent: 0, seed: 1 },
|
|
});
|
|
try {
|
|
const response = await fetch(`${conditioner.baseUrl}/unsupported`);
|
|
assert.equal(response.status, 404);
|
|
assert.equal(await response.text(), 'Not found');
|
|
} finally {
|
|
await conditioner.close();
|
|
await new Promise<void>((resolve, reject) =>
|
|
upstream.close((error) => (error ? reject(error) : resolve())),
|
|
);
|
|
}
|
|
});
|