Files
ARCADIA-Studio/harness/experiments/contextual-prerelease-20260911/native/helpers/contextual-prerelease-gui-20260911.py
T

105 lines
5.5 KiB
Python

"""Launch/check the independently extracted package; native input is separate."""
import argparse
import datetime
import hashlib
import json
import os
from pathlib import Path
import shutil
import subprocess
root = Path(__file__).resolve().parents[1]
trial = root / '.local/contextual-prerelease-gui-20260911'
base = root / 'harness/fixtures/staged-source-authoring/base'
oracle = root / '.local/staged-source-oracle-20260911/staged-source-authoring-contract.exe'
expected = {
'arcadia-studio.exe': '5657bab5c841939b66f901efe6c0ffb2d7cbbe8cc5f111a0ca3de8073d3846ce',
'arcadia-server.exe': 'efeeb89c0d2e0f93df4472cb3e9f48b2b722a37ae1043c90a5a56f2e845fe665',
'libunwind.dll': 'f45604a12e8bcd839fd86f667c1be1cc7c4f9da2b3c69ff381ac708f0e1ae7d4',
}
def sha(p):
return hashlib.sha256(p.read_bytes()).hexdigest()
def inventory(folder):
found = {}
for p in folder.rglob('*'):
assert not p.is_symlink() and not (getattr(p.lstat(), 'st_file_attributes', 0) & 0x400), str(p)
if p.is_file():
found[p.relative_to(folder).as_posix()] = sha(p)
return found
def record(path, value):
with path.open('x', encoding='utf-8', newline='\n') as f:
json.dump(value, f, indent=2)
f.write('\n')
def now():
return datetime.datetime.now(datetime.timezone.utc).isoformat()
def minimal_environment(package):
system = next(v for k, v in os.environ.items() if k.upper() == 'SYSTEMROOT')
return {'SystemRoot': system, 'WINDIR': system,
'PATH': system + '\\System32;' + system,
'USERPROFILE': str(trial / 'profile'),
'LOCALAPPDATA': str(trial / 'profile/local'),
'APPDATA': str(trial / 'profile/roaming'),
'TEMP': str(trial / 'tmp'), 'TMP': str(trial / 'tmp')}
def run_oracle(package, args, label):
assert sha(oracle) == '967d9ba3c6fb3a7efb410833903ec94556ca2d48a67d5072c8bb160f40a00f9c'
env = minimal_environment(package)
env['PATH'] = str(package) + ';' + env['PATH']
result = subprocess.run([str(oracle), *args], env=env, capture_output=True)
(trial / (label + '.stdout.log')).write_bytes(result.stdout)
(trial / (label + '.stderr.log')).write_bytes(result.stderr)
record(trial / (label + '.json'), {'atUtc': now(), 'args': args, 'exitCode': result.returncode,
'oracleSha256': sha(oracle)})
assert result.returncode == 0, result.stdout.decode(errors='replace') + result.stderr.decode(errors='replace')
parser = argparse.ArgumentParser()
parser.add_argument('action', choices=['launch', 'saved', 'closed'])
parser.add_argument('--package', type=Path)
args = parser.parse_args()
if args.action == 'launch':
assert args.package and args.package.is_dir()
package = args.package.resolve()
assert package.name == 'ArcadiaStudio-0.2.0-preview.contextual.20260911-x86_64-pc-windows-gnullvm'
assert 'contextual-prerelease-review-20260911' in package.parts
review_path = root / '.local/contextual-prerelease-review-20260911/artifact-result.json'
review = json.loads(review_path.read_bytes())
assert review['status'] == 'PASS'
before = inventory(package)
assert before == review['archive']['files']
assert all(before[p] == h for p, h in expected.items())
trial.mkdir(exist_ok=False)
for folder in ('profile/local', 'profile/roaming', 'tmp'):
(trial / folder).mkdir(parents=True)
assert inventory(base) == {
'project.arcadia': 'aa844950ec4fb86f262a257e1fc370a26557ea7978d8a4cab78265037660234c',
'notes.arcadia': 'ad9de02963c20d1f43856455a797deb05ca674659e45f2c4b96b52783024f8bd'}
shutil.copytree(base, trial / 'work')
run_oracle(package, ['same', str(base / 'project.arcadia'), str(trial / 'work/project.arcadia')], 'baseline')
env = minimal_environment(package)
startup = subprocess.STARTUPINFO()
startup.dwFlags |= subprocess.STARTF_USESHOWWINDOW
startup.wShowWindow = 0
with (trial / 'stdout.log').open('xb') as out, (trial / 'stderr.log').open('xb') as err:
process = subprocess.Popen([str(package / 'arcadia-studio.exe')], cwd=package,
env=env, stdout=out, stderr=err, startupinfo=startup)
record(trial / 'package-before.json', before)
launch = {'atUtc': now(), 'pid': process.pid, 'package': str(package), 'environment': env,
'reviewSha256': sha(review_path), 'archiveSha256': review['archive']['sha256'],
'source': str(trial / 'work/project.arcadia'), 'scope': 'Fresh extracted package; native acceptance pending'}
record(trial / 'launch.json', launch)
print(json.dumps(launch, indent=2))
else:
launch = json.loads((trial / 'launch.json').read_bytes())
package = Path(launch['package'])
assert inventory(package) == json.loads((trial / 'package-before.json').read_bytes())
if args.action == 'saved':
destination = trial / 'checkpoint-first'
assert not destination.exists()
shutil.copytree(trial / 'work', destination)
run_oracle(package, ['check', 'lifeline', str(base / 'project.arcadia'),
str(destination / 'project.arcadia'), str(destination / 'project.arcadia')], 'saved')
record(trial / 'saved-files.json', inventory(destination))
else:
record(trial / 'package-after-close.json', {'atUtc': now(), 'files': len(inventory(package)),
'completeInventoryUnchanged': True})
print(json.dumps({'action': args.action, 'result': 'PASS', 'packageFiles': len(inventory(package))}))