2 lines
3.1 KiB
JavaScript
2 lines
3.1 KiB
JavaScript
import assert from 'node:assert/strict';import {createServer} from 'node:https';import {createRequire} from 'node:module';import {mkdtempSync,readFileSync,rmSync} from 'node:fs';import {tmpdir} from 'node:os';import {join,resolve,sep} from 'node:path';import {randomBytes} from 'node:crypto';import {spawn} from 'node:child_process';import {createApp} from '../apps/server/app.mjs';import {openStore,digest} from '../apps/server/store.mjs';import {startTelemetry} from '../apps/server/telemetry.mjs';
|
|||
|
|
const endpoint='http://127.0.0.1:4318';assert.equal((await fetch(endpoint+'/health')).ok,true);process.env.OTEL_EXPORTER_OTLP_ENDPOINT=endpoint;const telemetry=startTelemetry(),temporary=mkdtempSync(join(tmpdir(),'safetynet-public-diagnostics-'));assert.ok(resolve(temporary).startsWith(resolve(tmpdir())+sep)&&temporary.split(/[\\/]/).at(-1).startsWith('safetynet-public-diagnostics-'));const store=openStore(join(temporary,'db')),adminToken=randomBytes(32).toString('base64url'),code=randomBytes(32).toString('base64url'),reviewer=randomBytes(32).toString('base64url');let posts=0;const site=createServer({cert:readFileSync('tests/fixtures/icap/cert.pem'),key:readFileSync('tests/fixtures/icap/key.pem')},(req,res)=>{if(req.method==='POST'){posts++;req.resume();res.end('accepted');}else{res.setHeader('content-type','text/html');res.end('<!doctype html><h1>Public diagnostic fixture</h1>');}}).listen(0,'127.0.0.1');await new Promise(r=>site.once('listening',r));const origin=`https://127.0.0.1:${site.address().port}`,p=store.get('policy');p.browser.homeUrl=origin+'/public';p.agents.enabled=false;p.diagnostics={...p.diagnostics,enabled:true,mode:'debug',endpoint,sampleRate:1,debugSampleRate:1,flushIntervalMs:250};store.put('policy',p);store.db.prepare('INSERT INTO enrollments VALUES(?,?,?)').run(digest(code),Date.now()+600000,'public-diagnostics');store.db.prepare('INSERT INTO sessions VALUES(?,?,?)').run(digest(reviewer),Date.now()+600000,JSON.stringify({sub:'independent-public-reviewer',role:'admin'}));const config={secure:false,publicUrl:'http://127.0.0.1',adminToken,requirePQManagement:true,requireIndependentPolicyApproval:true},server=createApp(store,config).listen(0,'127.0.0.1');await new Promise(r=>server.once('listening',r));config.publicUrl=`http://127.0.0.1:${server.address().port}`;const child=spawn(createRequire(import.meta.url)('electron'),['scripts/native-diagnostics-public.cjs'],{windowsHide:true,stdio:['ignore','pipe','pipe'],env:{...process.env,SAFETYNET_SMOKE_USERDATA:join(temporary,'profile'),SAFETYNET_SMOKE_SERVER:config.publicUrl,SAFETYNET_SMOKE_ORIGIN:origin,SAFETYNET_SMOKE_CODE:code,SAFETYNET_SMOKE_ADMIN:adminToken,SAFETYNET_SMOKE_REVIEWER:reviewer}});child.stdout.on('data',v=>process.stdout.write(v));child.stderr.on('data',v=>process.stderr.write(v));const deadline=setTimeout(()=>child.kill(),120000),exit=await new Promise(r=>{child.once('exit',v=>r(v??1));child.once('error',()=>r(1));});clearTimeout(deadline);for(const s of [site,server])s.closeAllConnections();await Promise.all([site,server].map(s=>new Promise(r=>s.close(r))));store.db.close();await telemetry?.shutdown();rmSync(temporary,{recursive:true,force:true});assert.equal(posts,4);process.exit(exit);
|