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 / frame-stats.test.mjs
frame-stats.test.mjs 7.5K
1import test from 'node:test';2import assert from 'node:assert/strict';3import {4 formatVideoDiscardTelemetry,5 isCurrentFrameGeneration,6 normalizeFrameStatsPayload,7} from './frame-stats.mjs';89test('formats each video discard owner in exact frame units', () => {10 assert.deepEqual(formatVideoDiscardTelemetry({11 transportDroppedFrames: 3,12 frontendDroppedFrames: 4,13 decoderDroppedFrames: 5,14 presenterOverwrittenFrames: 6,15 }), {16 total: '18 frames',17 transport: '3 frames',18 frontend: '4 frames',19 decoder: '5 frames',20 presenterOverwrite: '6 frames',21 });2223 assert.equal(formatVideoDiscardTelemetry({24 transportDroppedFrames: 0,25 frontendDroppedFrames: 0,26 decoderDroppedFrames: 0,27 presenterOverwrittenFrames: 1,28 }).presenterOverwrite, '1 frame');29});3031test('rejects inexact video discard counters and totals', () => {32 assert.throws(() => formatVideoDiscardTelemetry({33 transportDroppedFrames: -1,34 frontendDroppedFrames: 0,35 decoderDroppedFrames: 0,36 presenterOverwrittenFrames: 0,37 }), /exact unsigned integers/);3839 assert.throws(() => formatVideoDiscardTelemetry({40 transportDroppedFrames: Number.MAX_SAFE_INTEGER,41 frontendDroppedFrames: 1,42 decoderDroppedFrames: 0,43 presenterOverwrittenFrames: 0,44 }), /exact integer range/);45});4647test('accepts frame stats only for the exact active nonzero generation', () => {48 assert.equal(isCurrentFrameGeneration(7, 7), true);49 assert.equal(isCurrentFrameGeneration(6, 7), false);50 assert.equal(isCurrentFrameGeneration(0, 0), false);51 assert.equal(isCurrentFrameGeneration(undefined, undefined), false);52 assert.equal(isCurrentFrameGeneration(Number.MAX_SAFE_INTEGER + 1, 7), false);53});5455test('normalizes exact v2 drop, queue, timing, and resync units', () => {56 assert.deepEqual(normalizeFrameStatsPayload({57 stats_version: 2,58 sequence_dropped_total: 3,59 frontend_queue_dropped_total: 4,60 frontend_resync_dropped_total: 5,61 frontend_dropped_total: 9,62 frontend_queue_depth: 1,63 frontend_queue_peak: 3,64 frontend_queue_capacity: 4,65 frontend_resync_episode_total: 2,66 frontend_resync_active: true,67 frontend_resync_duration_ms_total: 125.5,68 frontend_resync_duration_ms_current: 25.25,69 frontend_resync_duration_ms_max: 100.25,70 timing_window_ms: 5000,71 timing_sample_capacity: 512,72 transport_interval_sample_count: 3,73 transport_interval_p50_ms: 16.6,74 transport_interval_p95_ms: 25.1,75 transport_interval_max_ms: 40.2,76 frontend_ipc_send_duration_sample_count: 2,77 frontend_ipc_send_duration_p50_ms: 0.1,78 frontend_ipc_send_duration_p95_ms: 0.4,79 frontend_ipc_send_duration_max_ms: 0.4,80 }), {81 statsVersion: 2,82 transportDroppedFrames: 3,83 objectDroppedFrames: null,84 lateObjectDroppedFrames: null,85 frontendDroppedFrames: 9,86 queueDroppedFrames: 4,87 resyncDroppedFrames: 5,88 queue: { depth: 1, peak: 3, capacity: 4 },89 resync: { episodes: 2, active: true, totalMs: 125.5, currentMs: 25.25, maxMs: 100.25 },90 transportIntervals: { count: 3, p50Ms: 16.6, p95Ms: 25.1, maxMs: 40.2 },91 ipcSendDurations: { count: 2, p50Ms: 0.1, p95Ms: 0.4, maxMs: 0.4 },92 timingWindow: { windowMs: 5000, sampleCapacity: 512 },93 networkDiagnostics: null,94 });95});9697test('uses legacy aggregate drop aliases without inventing v2 splits', () => {98 const stats = normalizeFrameStatsPayload({99 host_dropped_frames: 7,100 frontend_dropped_frames: 11,101 });102 assert.equal(stats.statsVersion, 1);103 assert.equal(stats.transportDroppedFrames, 7);104 assert.equal(stats.objectDroppedFrames, null);105 assert.equal(stats.lateObjectDroppedFrames, null);106 assert.equal(stats.frontendDroppedFrames, 11);107 assert.equal(stats.queueDroppedFrames, null);108 assert.equal(stats.resyncDroppedFrames, null);109 assert.equal(stats.queue, null);110 assert.equal(stats.resync, null);111 assert.equal(stats.transportIntervals, null);112 assert.equal(stats.ipcSendDurations, null);113 assert.equal(stats.timingWindow, null);114 assert.equal(stats.networkDiagnostics, null);115});116117test('normalizes v4 network diagnostics without changing v1-v3 behavior', () => {118 const leg = {119 mode: 'direct',120 sample_count: 1,121 direct_samples: 1,122 relay_samples: 0,123 custom_samples: 0,124 unknown_samples: 0,125 path_epoch: 1,126 path_switch_total: 0,127 mode_transition_total: 0,128 rtt_sample_count: 1,129 rtt_current_ms: 0.8,130 rtt_p50_ms: 5,131 rtt_p95_ms: 5,132 rtt_max_ms: 5,133 rtt_overflow_total: 0,134 tx_datagrams: 1,135 tx_bytes: 100,136 rx_datagrams: 1,137 rx_bytes: 100,138 lost_packets: 0,139 lost_bytes: 0,140 cwnd_bytes: 12000,141 mtu: 1200,142 congestion_events: 0,143 black_holes_detected: 0,144 counter_regression_total: 0,145 complete: true,146 };147 const inputAck = {148 negotiated: true,149 sent_total: 1,150 acknowledged_total: 1,151 pending_count: 0,152 pending_capacity: 64,153 duplicate_total: 0,154 untracked_total: 0,155 malformed: false,156 closed: false,157 latency_sample_count: 1,158 latency_p50_ms: 2,159 latency_p95_ms: 2,160 latency_max_ms: 2,161 latency_overflow_total: 0,162 complete: true,163 };164 const raw = {165 version: 1,166 session_elapsed_ms: 1000,167 media: leg,168 input: leg,169 audio: null,170 input_ack: inputAck,171 };172173 const v4 = normalizeFrameStatsPayload({ stats_version: 4, network_diagnostics: raw });174 assert.equal(v4.networkDiagnostics.media.mode, 'direct');175 assert.equal(v4.networkDiagnostics.inputAck.acknowledgedTotal, 1);176177 const v3 = normalizeFrameStatsPayload({ stats_version: 3, network_diagnostics: raw });178 assert.equal(v3.networkDiagnostics, null);179 const malformed = normalizeFrameStatsPayload({180 stats_version: 4,181 network_diagnostics: { ...raw, media: { ...leg, complete: 'yes' } },182 });183 assert.equal(malformed.networkDiagnostics, null);184});185186test('normalizes bounded v3 independent-object discard counters', () => {187 const stats = normalizeFrameStatsPayload({188 stats_version: 3,189 transport_object_dropped_total: 8,190 transport_late_object_dropped_total: 3,191 });192 assert.equal(stats.objectDroppedFrames, 8);193 assert.equal(stats.lateObjectDroppedFrames, 3);194195 const malformed = normalizeFrameStatsPayload({196 stats_version: 3,197 transport_object_dropped_total: 2,198 transport_late_object_dropped_total: 3,199 });200 assert.equal(malformed.objectDroppedFrames, null);201 assert.equal(malformed.lateObjectDroppedFrames, null);202});203204test('does not display malformed or unit-ambiguous v2 diagnostics', () => {205 const stats = normalizeFrameStatsPayload({206 stats_version: 2,207 frontend_queue_dropped_total: 2,208 frontend_resync_dropped_total: 3,209 transport_interval_sample_count: 1,210 transport_interval_p50_ms: 10,211 transport_interval_p95_ms: Number.NaN,212 transport_interval_max_ms: 20,213 frontend_resync_episode_total: 1,214 frontend_resync_active: false,215 frontend_resync_duration_ms_total: 20,216 frontend_resync_duration_ms_current: 4,217 frontend_resync_duration_ms_max: 20,218 });219 assert.equal(stats.frontendDroppedFrames, 5);220 assert.equal(stats.transportIntervals, null);221 assert.equal(stats.resync, null);222});223224test('represents empty timing windows without fabricated percentiles', () => {225 const stats = normalizeFrameStatsPayload({226 stats_version: 2,227 transport_interval_sample_count: 0,228 frontend_ipc_send_duration_sample_count: 0,229 });230 assert.deepEqual(stats.transportIntervals, {231 count: 0, p50Ms: null, p95Ms: null, maxMs: null,232 });233 assert.deepEqual(stats.ipcSendDurations, {234 count: 0, p50Ms: null, p95Ms: null, maxMs: null,235 });236});