P08-03: 配置の通常操作受入
This commit is contained in:
@@ -598,7 +598,7 @@ class EvidenceTests(unittest.TestCase):
|
||||
self.reject('operation kind mismatch')
|
||||
|
||||
def test_png_signature_is_not_a_screenshot(self):
|
||||
(self.out/'os-pair/screen.png').write_bytes(b'\x89PNG\r\n\x1a\nFAKE')
|
||||
next((self.out/'os-pair').rglob('screen-before.png')).write_bytes(b'\x89PNG\r\n\x1a\nFAKE')
|
||||
F.repin(self.out)
|
||||
self.reject('invalid OS screenshot')
|
||||
|
||||
@@ -722,6 +722,92 @@ def refresh_images(out, index, measurement):
|
||||
measurement['original_index_sha256'] = hashlib.sha256((out/'index.json').read_bytes()).hexdigest()
|
||||
|
||||
|
||||
class FreshRoutingTests(unittest.TestCase):
|
||||
setUp = EvidenceTests.setUp
|
||||
edit = EvidenceTests.edit
|
||||
reject = EvidenceTests.reject
|
||||
# Reuse the whole synthetic proof, not a boolean checker substitute.
|
||||
def historical(self):
|
||||
F.put(self.root/C.R09_DOCS/'ROOT_NATIVE_R09_COLLECTION_PINS.json', {'synthetic': True})
|
||||
|
||||
def fresh_check(self):
|
||||
commit = C.load(self.out/'index.json')['commit']
|
||||
original_load = C.load
|
||||
def guarded_load(path):
|
||||
self.assertNotEqual(Path(path).name, 'ROOT_R09_READONLY_IMAGE_DIMENSIONS.json')
|
||||
return original_load(path)
|
||||
with contextlib.ExitStack() as stack:
|
||||
stack.enter_context(patch.object(C.subprocess, 'check_output', return_value=commit+'\n'))
|
||||
stack.enter_context(patch.object(C, 'load', side_effect=guarded_load))
|
||||
for name in ('r09_applicability', 'r09_runner_binding', 'r09_collection', 'r09_images'):
|
||||
stack.enter_context(patch.object(C, name, side_effect=AssertionError('fresh used '+name)))
|
||||
return C.check(self.root, self.out)
|
||||
|
||||
def test_historical_pins_fresh_positive(self):
|
||||
self.historical()
|
||||
self.assertEqual([], self.fresh_check())
|
||||
|
||||
def test_historical_pins_stale_commit(self):
|
||||
self.historical()
|
||||
self.edit('index.json', lambda d: d.update(commit='0'*40))
|
||||
with patch.object(C.subprocess, 'check_output', return_value='1'*40+'\n'):
|
||||
self.reject('stale commit')
|
||||
|
||||
def test_historical_pins_stale_source(self):
|
||||
self.historical()
|
||||
self.edit('index.json', lambda d: d['source_map'].update({'project.godot':'0'*64}))
|
||||
self.assertIn('stale source', ' '.join(self.fresh_check()))
|
||||
|
||||
def test_historical_pins_stale_input(self):
|
||||
self.historical()
|
||||
self.edit('index.json', lambda d: d['inputs'].update({'AGENTS.md':'0'*64}))
|
||||
self.assertIn('stale input', ' '.join(self.fresh_check()))
|
||||
|
||||
def test_reuse_missing_pins(self):
|
||||
self.edit('index.json', lambda d: d.update(commit=C.R09_COMMIT))
|
||||
self.reject('R09 reuse candidate')
|
||||
|
||||
def test_reuse_wrong_applicability(self):
|
||||
self.historical()
|
||||
F.put(self.root/C.R09_DOCS/'ROOT_R09_READONLY_IMAGE_DIMENSIONS.json', {'synthetic':True})
|
||||
self.edit('index.json', lambda d: d.update(commit=C.R09_COMMIT))
|
||||
with patch.object(C.subprocess, 'check_output', return_value=C.R09_COMMIT+'\n'), patch.object(
|
||||
C.subprocess, 'run', return_value=SimpleNamespace(returncode=1)):
|
||||
self.reject('R09_COMMIT not an ancestor')
|
||||
|
||||
def screenshots(self, data):
|
||||
for path in self.out.rglob('screen-*.png'):
|
||||
path.write_bytes(data)
|
||||
F.repin(self.out)
|
||||
|
||||
def test_fresh_jpeg_positive(self):
|
||||
self.historical()
|
||||
self.screenshots(negative_jpeg())
|
||||
self.assertEqual([], self.fresh_check())
|
||||
|
||||
def test_fresh_truncated_jpeg(self):
|
||||
self.screenshots(negative_jpeg()[:-2])
|
||||
self.assertIn('invalid JPEG SOI/EOI', ' '.join(self.fresh_check()))
|
||||
|
||||
def test_fresh_garbage(self):
|
||||
self.screenshots(b'garbage')
|
||||
self.assertIn('missing OS screenshot', ' '.join(self.fresh_check()))
|
||||
|
||||
def test_fresh_dimension_mismatch(self):
|
||||
self.screenshots(negative_jpeg())
|
||||
next(self.out.rglob('screen-after.png')).write_bytes(negative_jpeg(width=640))
|
||||
F.repin(self.out)
|
||||
self.assertIn('OS screenshot dimension mismatch', ' '.join(self.fresh_check()))
|
||||
|
||||
def test_fresh_unbound_path(self):
|
||||
ack = next(self.out.rglob('ack.json'))
|
||||
data = C.load(ack)
|
||||
data['screen_before'] = data['screen_after']
|
||||
F.put(ack, data)
|
||||
F.repin(self.out)
|
||||
self.assertIn('R09 screenshot request binding', ' '.join(self.fresh_check()))
|
||||
|
||||
|
||||
class R09ImageTests(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.temp = tempfile.TemporaryDirectory(dir=ROOT/'tests/fixtures/p08-03/.scratch')
|
||||
|
||||
Reference in New Issue
Block a user