check.py (1580B)
1 #!/usr/bin/env python3 2 """Compare consumer results against shared independent expectations.""" 3 import argparse 4 import json 5 from pathlib import Path 6 import subprocess 7 8 p=argparse.ArgumentParser(description=__doc__) 9 p.add_argument('--library',required=True) 10 p.add_argument('--source',type=Path,required=True) 11 p.add_argument('--python',required=True) 12 p.add_argument('--node',required=True) 13 p.add_argument('--php',required=True) 14 p.add_argument('--copier',required=True) 15 p.add_argument('--report',type=Path,required=True) 16 a=p.parse_args() 17 spec=a.source/'ext/haskell/bindings/fixtures.json' 18 expected=json.loads(spec.read_text())['expected'] 19 args=[a.library,str(a.source/'test/fixtures'),str(spec),a.copier] 20 commands={ 21 'python':[a.python,str(a.source/'ext/haskell/bindings/python.py')], 22 'js':[a.node,str(a.source/'ext/js/test/runner.mjs')], 23 'php':[a.php,str(a.source/'ext/php/tests/conformance.php')], 24 } 25 reports={} 26 for language,command in commands.items(): 27 try: 28 result=subprocess.run(command+args,check=True,text=True,capture_output=True,timeout=90) 29 except subprocess.CalledProcessError as error: 30 print(error.stdout, error.stderr, flush=True) 31 raise 32 actual=json.loads(result.stdout) 33 assert actual==expected,(language,actual,expected) 34 reports[language]=actual 35 # Each consumer independently asserts IO files/outcomes/resource cleanup before 36 # reporting. Timeouts supervise the complete foreign process. 37 a.report.write_text(json.dumps({'passed':list(reports),'results':reports},indent=2,ensure_ascii=False)+'\n') 38 print('Native binding conformance passed: '+', '.join(reports))