68 lines
2.9 KiB
JavaScript
68 lines
2.9 KiB
JavaScript
'use strict';
|
|
|
|
const test = require('node:test');
|
|
const assert = require('node:assert/strict');
|
|
const {
|
|
VERSION, compareVersions, parseChiakiLog, validateArchiveEntries, validateReleaseMetadata,
|
|
} = require('../../remote-play-worker/worker');
|
|
|
|
function releaseFixture(overrides = {}) {
|
|
const name = 'chiaki-ng-win_x64-MSYS2-Release-portable.zip';
|
|
return {
|
|
tag_name: 'v1.10.0', draft: false, prerelease: false,
|
|
assets: [{
|
|
name, size: 101_237_965,
|
|
digest: `sha256:${'ab'.repeat(32)}`,
|
|
browser_download_url: `https://github.com/streetpea/chiaki-ng/releases/download/v1.10.0/${name}`,
|
|
}],
|
|
...overrides,
|
|
};
|
|
}
|
|
|
|
test('Remote Play worker validates only the expected stable upstream portable asset', () => {
|
|
const release = validateReleaseMetadata(releaseFixture(), 'x64');
|
|
assert.equal(release.version, '1.10.0');
|
|
assert.equal(release.size, 101_237_965);
|
|
assert.match(release.sha256, /^[a-f0-9]{64}$/);
|
|
assert.throws(() => validateReleaseMetadata(releaseFixture({ prerelease: true }), 'x64'), /stabiele/);
|
|
const wrongHost = releaseFixture();
|
|
wrongHost.assets[0].browser_download_url = wrongHost.assets[0].browser_download_url.replace('github.com', 'example.test');
|
|
assert.throws(() => validateReleaseMetadata(wrongHost, 'x64'), /officiële releasepad/);
|
|
const noDigest = releaseFixture();
|
|
noDigest.assets[0].digest = null;
|
|
assert.throws(() => validateReleaseMetadata(noDigest, 'x64'), /SHA-256/);
|
|
});
|
|
|
|
test('Remote Play worker rejects archive traversal before extraction', () => {
|
|
assert.deepEqual(validateArchiveEntries('chiaki-ng-Win/\nchiaki-ng-Win/chiaki.exe\n'), ['chiaki-ng-Win/', 'chiaki-ng-Win/chiaki.exe']);
|
|
assert.throws(() => validateArchiveEntries('../outside.exe\n'), /onveilig pad/);
|
|
assert.throws(() => validateArchiveEntries('C:\\Windows\\outside.exe\n'), /onveilig pad/);
|
|
assert.throws(() => validateArchiveEntries('/absolute/outside.exe\n'), /onveilig pad/);
|
|
});
|
|
|
|
test('Remote Play worker reports only aggregate non-secret stream health', () => {
|
|
const health = parseChiakiLog(`
|
|
Using hardware decoder "vulkan" with pix_fmt=vulkan
|
|
Switched to profile 0, resolution: 1920x1080
|
|
Senkusha determined average RTT = 5.602 ms
|
|
Detected missing or corrupt frame(s)
|
|
FEC failed
|
|
Missing unit
|
|
Received duplicate unit
|
|
AVCodec internal buffer is full removing frames before pushing
|
|
AVCodec internal buffer is full removing frames before pushing
|
|
`, 1234);
|
|
assert.deepEqual(health, {
|
|
checkedAt: 1234, resolution: '1920x1080', rttMs: 5.6, decoder: 'vulkan',
|
|
packetErrors: 3, duplicateUnits: 1, decoderDrops: 2, status: 'degraded',
|
|
});
|
|
assert.doesNotMatch(JSON.stringify(health), /account|regist|192\.168\./i);
|
|
});
|
|
|
|
test('Remote Play worker uses semantic client versions', () => {
|
|
assert.equal(VERSION, '1.1.0');
|
|
assert.equal(compareVersions('1.10.0', '1.9.9'), 1);
|
|
assert.equal(compareVersions('1.10.0.0', 'v1.10.0'), 0);
|
|
assert.equal(compareVersions('invalid', '1.10.0'), null);
|
|
});
|