mirror of
https://github.com/4gray/iptvnator.git
synced 2026-10-12 12:06:16 -08:00
* docs: design Linux frame-copy packaging * docs: plan Linux frame-copy packaging * feat(packaging): define Linux frame-copy profiles * fix(packaging): reject inherited profile names * feat(embedded-mpv): validate staged Linux runtime * fix(embedded-mpv): require Linux source packages * fix(embedded-mpv): harden Linux runtime staging * feat(embedded-mpv): build LGPL Linux runtime * fix(embedded-mpv): pin Linux runtime inputs * feat(embedded-mpv): build relocatable Linux helper * fix(embedded-mpv): require bundled Linux runtime * fix(embedded-mpv): make Linux runtime portable * feat(packaging): ship Linux frame-copy artifacts * fix(embedded-mpv): verify Linux helper linkage * fix(packaging): enforce Linux frame-copy isolation * fix(embedded-mpv): pin Linux display data * docs(embedded-mpv): document Linux frame-copy packaging * feat(embedded-mpv): probe Linux frame-copy runtime * test(embedded-mpv): smoke packaged Linux frame-copy * docs(embedded-mpv): clarify Linux system runtime baseline * fix(embedded-mpv): harden Linux runtime capability gate * ci: verify Linux frame-copy packages * test(embedded-mpv): harden packaged Linux smoke * test(embedded-mpv): preserve packaged GL mode * test(packaging): harden Linux package probes * fix(embedded-mpv): enable private Snap shared memory * fix(embedded-mpv): sanitize Linux helper environment * fix(packaging): enforce private Snap memory semantics * fix(packaging): reject ambiguous Snap memory metadata * fix(embedded-mpv): prioritize trusted Snap GL * fix(packaging): reject advanced Snap YAML semantics * fix(packaging): reject arbitrary Snap YAML aliases * feat(packaging): ship Linux runtime license notices * docs(embedded-mpv): document Linux runtime distribution * fix(packaging): parse Snap trailing comments safely * fix(release): gate Snap publish on public source release * fix(packaging): strip VCS metadata from source bundle * docs(packaging): clarify Linux source release gate * test(embedded-mpv): smoke missing bundled libmpv * style(embedded-mpv): format final validation inputs * fix(e2e): satisfy fixture index signature typing * fix(ci): declare fontconfig gperf generator * fix(embedded-mpv): hash runtime cache identities * fix(packaging): harden Linux frame-copy delivery * fix(packaging): tighten runtime delivery gates * fix(ci): decouple Linux runtime matrix * fix(packaging): harden Linux frame-copy delivery * fix(packaging): validate Linux frame-copy runtimes * fix(packaging): scope Snap Electron library checks * feat(packaging): ship Linux frame-copy runtimes * fix(packaging): improve Linux runtime smoke diagnostics * fix(packaging): expose bounded helper probe details * test(packaging): trace Snap EGL probe failures * fix(packaging): prefer core22 ABI in Snap helper * fix(packaging): bound helper probe capture * fix(packaging): harden Linux frame-copy releases * fix(packaging): canonicalize libplacebo submodule identity * fix(packaging): make source archive inspection portable * fix(packaging): harden Snap release verification
151 lines
5.2 KiB
TypeScript
151 lines
5.2 KiB
TypeScript
import {
|
|
cloneManifest,
|
|
createFixture,
|
|
writeManifest,
|
|
} from './runtime-fixtures.test-helpers';
|
|
import {
|
|
createRuntimeTestContext,
|
|
type RuntimeTestContext,
|
|
} from './runtime-harness.test-helpers';
|
|
|
|
describe('embedded-mpv frame-copy source runtime policy', () => {
|
|
let context: RuntimeTestContext;
|
|
|
|
beforeEach(() => {
|
|
context = createRuntimeTestContext();
|
|
});
|
|
|
|
afterEach(() => {
|
|
context.dispose();
|
|
});
|
|
|
|
it.each([
|
|
{
|
|
label: 'pinned source identity',
|
|
mutate(sourceRuntime: Record<string, unknown>) {
|
|
const packages = sourceRuntime.packages as Record<
|
|
string,
|
|
Record<string, unknown>
|
|
>;
|
|
packages.mpv.sourceSha256 = '0'.repeat(64);
|
|
},
|
|
},
|
|
{
|
|
label: 'pinned source URL',
|
|
mutate(sourceRuntime: Record<string, unknown>) {
|
|
const packages = sourceRuntime.packages as Record<
|
|
string,
|
|
Record<string, unknown>
|
|
>;
|
|
packages.freetype.sourceUrl =
|
|
'https://example.invalid/freetype.tar.xz';
|
|
},
|
|
},
|
|
{
|
|
label: 'pinned git tag',
|
|
mutate(sourceRuntime: Record<string, unknown>) {
|
|
const packages = sourceRuntime.packages as Record<
|
|
string,
|
|
Record<string, unknown>
|
|
>;
|
|
packages.libplacebo.sourceTag = 'main';
|
|
},
|
|
},
|
|
{
|
|
label: 'pinned hwdata build input',
|
|
mutate(sourceRuntime: Record<string, unknown>) {
|
|
const packages = sourceRuntime.packages as Record<
|
|
string,
|
|
Record<string, unknown>
|
|
>;
|
|
packages.hwdata.buildInput = {
|
|
consumer: 'libdisplay-info',
|
|
relativePath: '../pnp.ids',
|
|
purpose:
|
|
'PNP vendor lookup table compiled into libdisplay-info.',
|
|
};
|
|
},
|
|
},
|
|
{
|
|
label: 'git submodule record',
|
|
mutate(sourceRuntime: Record<string, unknown>) {
|
|
const packages = sourceRuntime.packages as Record<
|
|
string,
|
|
Record<string, unknown>
|
|
>;
|
|
packages.libplacebo.sourceSubmodules = [
|
|
`${'a'.repeat(40)} ../outside`,
|
|
];
|
|
},
|
|
},
|
|
{
|
|
label: 'duplicate git submodule records',
|
|
mutate(sourceRuntime: Record<string, unknown>) {
|
|
const packages = sourceRuntime.packages as Record<
|
|
string,
|
|
Record<string, unknown>
|
|
>;
|
|
const record = `${'a'.repeat(40)} 3rdparty/example`;
|
|
packages.libplacebo.sourceSubmodules = [record, record];
|
|
},
|
|
},
|
|
{
|
|
label: 'unpinned git submodule commit',
|
|
mutate(sourceRuntime: Record<string, unknown>) {
|
|
const packages = sourceRuntime.packages as Record<
|
|
string,
|
|
Record<string, unknown>
|
|
>;
|
|
packages.libplacebo.sourceSubmodules = [
|
|
`${'f'.repeat(40)} 3rdparty/Vulkan-Headers`,
|
|
`${'e'.repeat(40)} 3rdparty/fast_float`,
|
|
];
|
|
},
|
|
},
|
|
{
|
|
label: 'portable ABI baseline',
|
|
mutate(sourceRuntime: Record<string, unknown>) {
|
|
const runtimeAbi = sourceRuntime.runtimeAbi as {
|
|
baseline: Record<string, unknown>;
|
|
};
|
|
runtimeAbi.baseline.glibcMaximum = '9.99';
|
|
},
|
|
},
|
|
{
|
|
label: 'source-distribution obligation',
|
|
mutate(sourceRuntime: Record<string, unknown>) {
|
|
sourceRuntime.sourceDistribution = 'Sources available.';
|
|
},
|
|
},
|
|
{
|
|
label: 'FFmpeg LGPL flags',
|
|
mutate(sourceRuntime: Record<string, unknown>) {
|
|
const ffmpeg = sourceRuntime.ffmpeg as {
|
|
configureFlags: string[];
|
|
};
|
|
ffmpeg.configureFlags = ['--disable-nonfree', '--enable-gpl'];
|
|
},
|
|
},
|
|
{
|
|
label: 'mpv LGPL flags',
|
|
mutate(sourceRuntime: Record<string, unknown>) {
|
|
const mpv = sourceRuntime.mpv as {
|
|
mesonFlags: string[];
|
|
};
|
|
mpv.mesonFlags = ['-Dgpl=true', '-Dlibmpv=true'];
|
|
},
|
|
},
|
|
])('rejects an invalid $label', ({ mutate }) => {
|
|
const fixture = createFixture(context.rootDir, 'portable');
|
|
const manifest = cloneManifest(fixture.manifest);
|
|
mutate(manifest.sourceRuntime as Record<string, unknown>);
|
|
writeManifest(fixture.manifestPath, manifest);
|
|
|
|
expect(context.createProbe()(fixture.helperPath)).toEqual({
|
|
usable: false,
|
|
reason: 'runtime-manifest-invalid',
|
|
});
|
|
expect(context.spawnRuntimeProbe).not.toHaveBeenCalled();
|
|
});
|
|
});
|