test(harness): reorganize regression suites and preserve contract coverage
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
"""Synthetic real-Git delegation evidence builder; no test cases."""
|
||||
import copy
|
||||
import hashlib
|
||||
import json
|
||||
import subprocess
|
||||
from harness.tests._support.data import canonical_digest
|
||||
|
||||
class RealEvidence:
|
||||
def __init__(self, root):
|
||||
self.root = root
|
||||
self.bundle = root / 'bundle'
|
||||
(self.bundle / 'src').mkdir(parents=True)
|
||||
(self.bundle / 'tests').mkdir()
|
||||
(self.bundle / 'evidence').mkdir()
|
||||
(self.bundle / 'src/a.py').write_text('VALUE = 1\n')
|
||||
(self.bundle / 'tests/test_a.py').write_text('def test_value():\n assert 1 == 1\n')
|
||||
(self.bundle / 'evidence/red.txt').write_text('red\n')
|
||||
(self.bundle / 'evidence/green.txt').write_text('green\n')
|
||||
subprocess.run(['/usr/bin/git', 'init', '-q', str(self.root / 'repo')], check=True)
|
||||
repo = self.root / 'repo'
|
||||
(repo / 'src').mkdir(); (repo / 'tests').mkdir()
|
||||
(repo / 'src/a.py').write_text('VALUE = 1\n')
|
||||
(repo / 'tests/test_a.py').write_text('def test_value():\n assert 1 == 1\n')
|
||||
subprocess.run(['/usr/bin/git', '-C', str(repo), 'config', 'user.email', 'test@example.invalid'], check=True)
|
||||
subprocess.run(['/usr/bin/git', '-C', str(repo), 'config', 'user.name', 'Integration'], check=True)
|
||||
subprocess.run(['/usr/bin/git', '-C', str(repo), 'add', '.'], check=True)
|
||||
subprocess.run(['/usr/bin/git', '-C', str(repo), 'commit', '-q', '-m', 'fixture'], check=True)
|
||||
self.revision = subprocess.check_output(['/usr/bin/git', '-C', str(repo), 'rev-parse', 'HEAD'], text=True).strip()
|
||||
self.git_dir = repo / '.git'
|
||||
self.files = {p: hashlib.sha256((self.bundle / p).read_bytes()).hexdigest() for p in ('src/a.py', 'tests/test_a.py')}
|
||||
self.bundle_sha = self.digest(self.files)
|
||||
self.context = {'schema': 'gitea-agent.delegation-evidence-context/v1',
|
||||
'source': {'kind': 'git_tree', 'revision': self.revision},
|
||||
'stage': 'spec-review', 'bundle_sha256': self.bundle_sha,
|
||||
'files': self.files, 'allowed_actions': ['static', 'execute'],
|
||||
'obligations': [{'id': 'static', 'kind': 'static'}, {'id': 'rg', 'kind': 'red_green'}],
|
||||
'executions': [self.execution('red', 1, 'assertion', 'evidence/red.txt'),
|
||||
self.execution('green', 0, 'none', 'evidence/green.txt')]}
|
||||
line_hash = hashlib.sha256(b'VALUE = 1\n').hexdigest()
|
||||
self.result = {'schema': 'gitea-agent.delegation-evidence-result/v1',
|
||||
'source': copy.deepcopy(self.context['source']), 'stage': 'spec-review',
|
||||
'bundle_sha256': self.bundle_sha,
|
||||
'claims': [{'id': 'static', 'status': 'supported', 'anchors': [{'kind': 'lines', 'path': 'src/a.py', 'start_line': 1, 'end_line': 1, 'text_sha256': line_hash}], 'execution_ids': []},
|
||||
{'id': 'rg', 'status': 'supported', 'anchors': [{'kind': 'test', 'path': 'tests/test_a.py', 'symbol': 'test_value'}], 'execution_ids': ['red', 'green']}]}
|
||||
self.context_path = root / 'context.json'; self.result_path = root / 'result.json'
|
||||
self.write()
|
||||
|
||||
digest = staticmethod(canonical_digest)
|
||||
|
||||
def execution(self, eid, code, kind, path):
|
||||
return {'id': eid, 'test_id': 'tests/test_a.py::test_value', 'bundle_sha256': self.bundle_sha,
|
||||
'test_file_sha256': self.files['tests/test_a.py'], 'argv': ['python', '-m', 'pytest'],
|
||||
'exit_code': code, 'failure_kind': kind, 'evidence_path': path,
|
||||
'evidence_sha256': hashlib.sha256((self.bundle / path).read_bytes()).hexdigest(), 'origin': 'direct'}
|
||||
|
||||
def write(self):
|
||||
self.context_path.write_text(json.dumps(self.context))
|
||||
self.result_path.write_text(json.dumps(self.result))
|
||||
|
||||
def declaration(self):
|
||||
return {'mode': 'delegated', 'bundle_root': str(self.bundle), 'context_path': str(self.context_path),
|
||||
'result_path': str(self.result_path), 'git_dir': str(self.git_dir)}
|
||||
|
||||
def set_stage(self, stage):
|
||||
self.context['stage'] = stage; self.result['stage'] = stage; self.write()
|
||||
Reference in New Issue
Block a user