Files
SGF/scripts/module-association-compare.mjs
T
2026-11-02 20:29:34 +02:00

32 lines
3.3 KiB
JavaScript

import fs from 'node:fs';
import path from 'node:path';
import crypto from 'node:crypto';
import {spawnSync} from 'node:child_process';
const root='C:/laragon/data/sgf-tempo/run';
if(process.argv[2] && !['plans','access','fanout','concurrency','release','http-lock'].includes(process.argv[2]))throw Error('Use no argument, plans, access, fanout, concurrency, release or http-lock');
const plans=process.argv[2]==='plans';
const access=process.argv[2]==='access';
const fanout=process.argv[2]==='fanout';
const concurrency=process.argv[2]==='concurrency';
const release=process.argv[2]==='release';
const httpLock=process.argv[2]==='http-lock';
const state=JSON.parse(fs.readFileSync(path.join(root,'modular-regression-current.json'),'utf8'));
if(!/^[a-f0-9]{12}$/.test(state.id)||path.resolve(state.root)!==path.resolve(root,'modular-regression-'+state.id)||path.resolve(state.app)!==path.resolve(state.root,'app')||state.port!==55439)throw Error('Unexpected isolated host');
if(fanout){
const before=fs.readFileSync(path.join(state.root,'pre-projection-review.php'),'utf8');
const expected=fs.readFileSync(path.join(state.root,'pre-projection-sha256.txt'),'utf8').trim();
const recovered=before.replace('final class PreProjectionModuleAssociationReview','final class ModuleAssociationReview');
if(!before.includes('final class PreProjectionModuleAssociationReview')||crypto.createHash('sha256').update(recovered).digest('hex')!==expected)throw Error('Pre-projection baseline integrity mismatch');
}
const old=spawnSync('git',['show','340f3bb:app/Modules/Identity/Services/ModuleAssociationReview.php'],{encoding:'utf8',windowsHide:true});
if(old.status!==0||!old.stdout.includes('final class ModuleAssociationReview'))throw Error('Cannot recover the accepted baseline');
const baselineSha=crypto.createHash('sha256').update(old.stdout).digest('hex');
const optimizedSha=crypto.createHash('sha256').update(fs.readFileSync(path.join(state.app,'app/Modules/Identity/Services/ModuleAssociationReview.php'))).digest('hex');
fs.writeFileSync(path.join(state.root,'baseline-review.php'),old.stdout.replace('final class ModuleAssociationReview','final class BaselineModuleAssociationReview'));
const output=path.join(state.root,(plans?'association-index-plans-':access?'association-access-parity-':fanout?'association-fanout-':concurrency?'association-concurrency-':release?'association-release-':httpLock?'association-http-lock-':'association-compare-')+Date.now()+'.json');
const test=plans?'ModuleAssociationIndexPlanTest.php':access?'ModuleAssociationAccessParityTest.php':fanout?'ModuleAssociationFanoutTest.php':concurrency?'ModuleAssociationConcurrencyTest.php':release?'ModuleAssociationReleaseTest.php':httpLock?'ModuleAssociationHttpLockTest.php':'ModuleAssociationCompareTest.php';
const result=spawnSync('C:/laragon/tools/sgf-tempo/php-8.4.27/php.exe',['vendor/phpunit/phpunit/phpunit','scripts/benchmarks/'+test,'--log-junit',output.replace('.json','.xml')],{
cwd:state.app,stdio:'inherit',windowsHide:true,env:{...process.env,SGF_ISOLATED_REGRESSION_RUN:state.id,SGF_ASSOCIATION_LOAD_OUTPUT:output,SGF_ASSOCIATION_BASELINE_SHA:baselineSha,SGF_ASSOCIATION_OPTIMIZED_SHA:optimizedSha},
});
console.log(JSON.stringify({exit_code:result.status,report:output,baseline_sha256:baselineSha}));process.exitCode=result.status??1;