Files
safetynet/tests/broker-service-package.test.mjs
T

29 lines
3.0 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import {createRequire} from 'node:module';
import {readFile,writeFile,mkdir,mkdtemp,rm} from 'node:fs/promises';
import path from 'node:path';
import os from 'node:os';
import {spawn} from 'node:child_process';
const require=createRequire(import.meta.url),asar=require('@electron/asar');
const {getFileMatchers,copyFiles}=require('app-builder-lib/out/fileMatcher.js');
test('actual builder file matching puts only fixed framing dependency in ASAR and isolated adapter loads',async t=>{
const repo=process.cwd(),root=await mkdtemp(path.join(os.tmpdir(),'safetynet-service-package-'));t.after(()=>rm(root,{recursive:true,force:true}));
const source=path.join(root,'source'),app=path.join(root,'app'),extracted=path.join(root,'isolated');
for(const file of ['apps/browser/broker-service-supervisor.cjs','apps/browser/broker-supervisor.cjs','apps/network-broker/framed-channel.cjs']){const target=path.join(source,file);await mkdir(path.dirname(target),{recursive:true});await writeFile(target,await readFile(path.join(repo,file)));}
await writeFile(path.join(source,'apps/network-broker/unreviewed-extra.cjs'),'throw Error("must not ship inside browser");');
const pkg=JSON.parse(await readFile(path.join(repo,'package.json'),'utf8'));
assert.equal(pkg.build.files.filter(value=>value==='apps/network-broker/framed-channel.cjs').length,1);
assert.ok(!pkg.build.files.some(value=>typeof value==='string'&&value.startsWith('apps/network-broker/')&&value.includes('*')));
const matchers=getFileMatchers(pkg.build,'files',app,{defaultSrc:source,globalOutDir:path.join(root,'out'),macroExpander:value=>value,customBuildOptions:{}});
const normal=matchers.filter(matcher=>matcher.from===source);assert.equal(normal.length,1);await copyFiles(normal,null,false);
const archive=path.join(root,'app.asar');await asar.createPackage(app,archive);
assert.deepEqual(asar.extractFile(archive,path.normalize('apps/network-broker/framed-channel.cjs')),await readFile(path.join(repo,'apps/network-broker/framed-channel.cjs')));
assert.ok(!asar.listPackage(archive).some(value=>value.endsWith('unreviewed-extra.cjs')));
asar.extractAll(archive,extracted);
const script="const value=require('./apps/browser/broker-service-supervisor.cjs');process.stdout.write(JSON.stringify({loaded:typeof value.createServiceBrokerSupervisor==='function'}));";
const env={};for(const key of ['SystemRoot','WINDIR','TEMP','TMP'])if(process.env[key])env[key]=process.env[key];
const output=await new Promise((resolve,reject)=>{const child=spawn(process.execPath,['-e',script],{cwd:extracted,env,windowsHide:true,timeout:5000});let bytes=0,stdout='';child.stdout.on('data',chunk=>{bytes+=chunk.length;if(bytes>4096){child.kill();reject(Error('package-probe-output-limit'));}else stdout+=chunk;});child.stderr.on('data',()=>{});child.once('error',reject);child.once('close',code=>code===0?resolve(stdout):reject(Error('package-probe-failed')));});
assert.deepEqual(JSON.parse(output),{loaded:true});
});