cat / goq
clone

turns a linux box into a private steam streaming appliance: plug in, tap your key, play from another computer

fix/architecture-review-findings
goq / portal / network-diagnostics.test.mjs
network-diagnostics.test.mjs 5.1K
1import test from 'node:test';2import assert from 'node:assert/strict';3import {4 networkDiagnosticsPresentation,5 normalizeNetworkDiagnostics,6} from './network-diagnostics.mjs';78function leg(overrides = {}) {9 return {10 mode: 'direct',11 sample_count: 3,12 direct_samples: 3,13 relay_samples: 0,14 custom_samples: 0,15 unknown_samples: 0,16 path_epoch: 1,17 path_switch_total: 0,18 mode_transition_total: 0,19 rtt_sample_count: 3,20 rtt_current_ms: 9.25,21 rtt_p50_ms: 8,22 rtt_p95_ms: 12.5,23 rtt_max_ms: 13,24 rtt_overflow_total: 0,25 tx_datagrams: 20,26 tx_bytes: 2048,27 rx_datagrams: 18,28 rx_bytes: 1024,29 lost_packets: 1,30 lost_bytes: 64,31 cwnd_bytes: 65536,32 mtu: 1200,33 congestion_events: 2,34 black_holes_detected: 0,35 counter_regression_total: 0,36 complete: true,37 ...overrides,38 };39}4041function snapshot(overrides = {}) {42 return {43 version: 1,44 session_elapsed_ms: 12345,45 media: leg(),46 input: leg({ mode: 'relay', direct_samples: 0, relay_samples: 3 }),47 audio: null,48 input_ack: {49 negotiated: true,50 sent_total: 10,51 acknowledged_total: 9,52 pending_count: 1,53 pending_capacity: 64,54 duplicate_total: 1,55 untracked_total: 0,56 malformed: false,57 closed: false,58 latency_sample_count: 3,59 latency_p50_ms: 4,60 latency_p95_ms: 9,61 latency_max_ms: 10,62 latency_overflow_total: 0,63 complete: true,64 },65 ...overrides,66 };67}6869test('normalizes a bounded v1 snapshot and keeps transport legs separate', () => {70 const diagnostics = normalizeNetworkDiagnostics(snapshot());71 assert.equal(diagnostics.version, 1);72 assert.equal(diagnostics.sessionElapsedMs, 12345);73 assert.equal(diagnostics.media.mode, 'direct');74 assert.equal(diagnostics.input.mode, 'relay');75 assert.equal(diagnostics.audio, null);76 assert.equal(diagnostics.media.rttCurrentMs, 9.25);77 assert.deepEqual(diagnostics.media.rtt, {78 sampleCount: 3,79 p50Ms: 8,80 p95Ms: 12.5,81 maxMs: 13,82 overflowTotal: 0,83 });84 assert.equal(diagnostics.inputAck.pendingCount, 1);85});8687test('validates exact counters, classified samples, percentiles, and completeness', () => {88 assert.throws(() => normalizeNetworkDiagnostics(snapshot({89 media: leg({ tx_bytes: Number.MAX_SAFE_INTEGER + 1 }),90 })), /exact unsigned integer/);91 assert.throws(() => normalizeNetworkDiagnostics(snapshot({92 media: leg({ direct_samples: 2 }),93 })), /exactly match sample_count/);94 assert.throws(() => normalizeNetworkDiagnostics(snapshot({95 media: leg({ rtt_p50_ms: 14 }),96 })), /percentiles must be monotonic/);97 assert.throws(() => normalizeNetworkDiagnostics(snapshot({98 media: leg({ complete: 'yes' }),99 })), /must be a boolean/);100 assert.throws(() => normalizeNetworkDiagnostics(snapshot({101 input_ack: { ...snapshot().input_ack, pending_count: 65 },102 })), /pending_count cannot exceed pending_capacity/);103});104105test('requires null percentiles for an empty bounded window', () => {106 const empty = leg({107 rtt_sample_count: 0,108 rtt_current_ms: null,109 rtt_p50_ms: null,110 rtt_p95_ms: null,111 rtt_max_ms: null,112 });113 assert.equal(normalizeNetworkDiagnostics(snapshot({ media: empty })).media.rtt.sampleCount, 0);114 assert.throws(() => normalizeNetworkDiagnostics(snapshot({115 media: { ...empty, rtt_p50_ms: 0 },116 })), /require at least one retained sample/);117});118119test('accepts nullable path gauges and represents bounded histogram overflow', () => {120 const overflowed = leg({121 sample_count: 2,122 direct_samples: 0,123 unknown_samples: 2,124 mode: 'unknown',125 rtt_sample_count: 2,126 rtt_current_ms: null,127 rtt_p50_ms: 12,128 rtt_p95_ms: null,129 rtt_max_ms: 6000,130 rtt_overflow_total: 1,131 cwnd_bytes: null,132 mtu: null,133 congestion_events: null,134 black_holes_detected: null,135 complete: false,136 });137 const diagnostics = normalizeNetworkDiagnostics(snapshot({ media: overflowed }));138 assert.equal(diagnostics.media.rtt.p50Ms, 12);139 assert.equal(diagnostics.media.rtt.p95Ms, null);140 assert.equal(diagnostics.media.cwndBytes, null);141 assert.match(142 networkDiagnosticsPresentation(diagnostics).media,143 /RTT current — · history 12\.0 \/ — \/ 6000\.0 ms/,144 );145});146147test('renders legs and ACK health without exposing identifiers or addresses', () => {148 const raw = snapshot({149 peer_id: 'secret-peer',150 remote_address: '192.0.2.1:443',151 media: leg({ endpoint_id: 'secret-endpoint' }),152 });153 const presentation = networkDiagnosticsPresentation(normalizeNetworkDiagnostics(raw));154 assert.match(presentation.media, /^direct · RTT/);155 assert.match(presentation.input, /^relay · RTT/);156 assert.equal(presentation.audio, 'unavailable');157 assert.match(presentation.inputAck, /^negotiated · 9\/10 acknowledged/);158 assert.doesNotMatch(JSON.stringify(presentation), /secret|192\.0\.2\.1|endpoint/i);159});160161test('formats a missing v4 snapshot as explicitly unavailable', () => {162 assert.deepEqual(networkDiagnosticsPresentation(null), {163 session: 'unavailable',164 media: 'unavailable',165 input: 'unavailable',166 audio: 'unavailable',167 inputAck: 'unavailable',168 });169});