9 lines
3.1 KiB
PHP
9 lines
3.1 KiB
PHP
<?php
|
|
require __DIR__.'/sgf-fiscal-obligations-proof-bootstrap.php';$mode=$argv[1]??'';$directory=$argv[2]??'';if($book!=='regression'||!str_starts_with(str_replace('\\','/',$directory),str_replace('\\','/',$s['root']).'/fo-concurrency-'))throw new LogicException('Regression only');
|
|
if($mode==='prepare'){$key=(string)Illuminate\Support\Str::uuid();[$p]=$foCommand(13,$foInput($key,0,$foData));$aKey=(string)Illuminate\Support\Str::uuid();$bKey=(string)Illuminate\Support\Str::uuid();$input=$foInput($key,1,['decision'=>'approved'],'review');$a=$foPreview(14,$input,$aKey);$b=$foPreview(14,$input,$bKey);file_put_contents($directory.'/cuts.json',json_encode(['record_key'=>$key,'first'=>$a['preview'],'second'=>$b['preview'],'first_key'=>$aKey]));exit;}
|
|
if($mode==='inspect'){$pid=json_decode(file_get_contents($directory.'/locked.json'),true)['host_pid'];$rows=$host->select('SELECT pid,wait_event_type,wait_event,pg_blocking_pids(pid) blockers FROM pg_stat_activity WHERE ?=ANY(pg_blocking_pids(pid))',[$pid]);file_put_contents($directory.'/blocking.json',json_encode(['blocker_host_pid'=>$pid,'waiters'=>$rows,'company_for_update'=>true]));exit;}
|
|
$cuts=json_decode(file_get_contents($directory.'/cuts.json'),true);
|
|
if($mode==='first'){$host->beginTransaction();try{$out=$foConfirm(14,$cuts['first']);file_put_contents($directory.'/locked.json',json_encode(['result'=>$out,'host_pid'=>$host->selectOne('SELECT pg_backend_pid() pid')->pid]));$end=microtime(true)+25;while(!is_file($directory.'/release')&µtime(true)<$end)usleep(50000);if(!is_file($directory.'/release'))throw new LogicException('Release missing');$host->commit();}finally{while($host->transactionLevel()>0)$host->rollBack();}exit;}
|
|
if($mode==='second'){$selectFiscal(14,'fo-proof');request()->setMethod('POST');request()->request->replace(['preview'=>$cuts['second']]);$start=microtime(true);$r=app(App\Modules\Services\Http\FiscalObligationsController::class)->confirm(request(),$fo);file_put_contents($directory.'/second.json',json_encode(['status'=>$r->getStatusCode(),'seconds'=>microtime(true)-$start]));exit;}
|
|
if($mode==='recover'){$actual=null;try{$foConfirm(14,$cuts['second']);}catch(Symfony\Component\HttpKernel\Exception\HttpExceptionInterface$e){$actual=$e->getStatusCode();}$again=$foConfirm(14,$cuts['first']);$count=$host->table('fo_versions')->where('record_key',$cuts['record_key'])->count();$passed=$actual===409&&$again['replayed']&&$count===2;$cancel=array_replace($foData,['operation'=>'cancel','evidence'=>'QA cancelamento da fixture permanente de concorrência, sem efeitos externos.']);[$p]=$foCommand(13,$foInput($cuts['record_key'],2,$cancel));[$done]=$foCommand(14,$foInput($cuts['record_key'],3,['decision'=>'approved'],'review'));$proof=['passed'=>$passed&&$done['impact']['after']['effective']['administrative_status']==='cancelled','after_release'=>$actual,'original_replay'=>200,'one_preparation_one_review_for_conflict'=>$count===2,'administrative_cleanup_commands'=>2,'fixture_retained_cancelled'=>true,'regression_only'=>true];file_put_contents($directory.'/recovery.json',json_encode($proof));echo json_encode($proof).PHP_EOL;}
|