@@ -3235,14 +3235,23 @@ def screenshot_filter(fw_version):
32353235# version-blind set would fail every older-firmware run for a module that
32363236# legitimately cannot exist yet.
32373237MUST_RUN_MODULES = {
3238- 'test_msg_signtx_taproot' : '7.0.0' ,
3239- 'test_msg_getaddress_taproot' : '7.0.0' ,
3238+ # (minimum firmware version, variants that ship the capability)
3239+ 'test_msg_signtx_taproot' : ('7.0.0' , frozenset (('full' , 'bitcoin-only' ))),
3240+ 'test_msg_getaddress_taproot' : ('7.0.0' , frozenset (('full' , 'bitcoin-only' ))),
32403241 # R-4.1. Gated on requires_message('LoadClearsignSigner'), so if provider
32413242 # loading regressed, all four would skip and the report would certify a
32423243 # feature it never exercised.
3243- 'test_msg_solana_lut_attestation' : '7.15.0' ,
3244+ 'test_msg_solana_lut_attestation' : ( '7.15.0' , frozenset (( 'full' ,))) ,
32443245}
32453246
3247+
3248+ def _skip_is_required (module , fw_version , variant ):
3249+ requirement = MUST_RUN_MODULES .get (module )
3250+ if requirement is None :
3251+ return False
3252+ min_version , variants = requirement
3253+ return variant in variants and ver_ge (fw_version , min_version )
3254+
32463255def screenshot_audit (fw_version , screenshot_root , junit_path = None ):
32473256 """Which SECTIONS tests DECLARED screens but captured none?
32483257
@@ -3283,7 +3292,7 @@ def screenshot_audit(fw_version, screenshot_root, junit_path=None):
32833292 return (len (missing ) == 0 , missing )
32843293
32853294
3286- def validate_junit (fw_version , results ):
3295+ def validate_junit (fw_version , results , variant = 'full' ):
32873296 """Check SECTIONS tests against JUnit results. Returns (passed, failed_list).
32883297
32893298 A test is considered failed if it appears in SECTIONS for this firmware version
@@ -3299,7 +3308,7 @@ def validate_junit(fw_version, results):
32993308 status = _lookup (results , mod , meth )
33003309 if status in ('fail' , 'error' ):
33013310 failures .append ((tid , mod , meth , status ))
3302- elif status == 'skip' and ver_ge ( fw_version , MUST_RUN_MODULES . get ( mod , '99.0.0' ) ):
3311+ elif status == 'skip' and _skip_is_required ( mod , fw_version , variant ):
33033312 failures .append ((tid , mod , meth , 'skipped-but-required' ))
33043313 elif not status :
33053314 failures .append ((tid , mod , meth , 'missing' ))
@@ -3320,6 +3329,8 @@ def main():
33203329 help = 'Print pytest -k expression for tests needing screenshots, then exit' )
33213330 p .add_argument ('--validate-junit' , action = 'store_true' ,
33223331 help = 'Validate JUnit results against SECTIONS, exit non-zero on failures' )
3332+ p .add_argument ('--variant' , choices = ('full' , 'bitcoin-only' ), default = 'full' ,
3333+ help = 'Firmware capability set used to evaluate required tests' )
33233334 args = p .parse_args ()
33243335
33253336 fw = args .fw_version
@@ -3347,7 +3358,7 @@ def main():
33473358 print ('ERROR: --validate-junit requires --junit=<path>' , file = sys .stderr )
33483359 sys .exit (2 )
33493360 results = parse_junit (args .junit )
3350- ok , failures = validate_junit (fw , results )
3361+ ok , failures = validate_junit (fw , results , args . variant )
33513362 if ok :
33523363 print (f'SECTIONS validation passed: all tests for fw { fw } are pass or skip' )
33533364 sys .exit (0 )
0 commit comments