@@ -1253,6 +1253,58 @@ def test_parse_overrides_accepts_known_keys(self):
12531253 self .assertEqual (out , {'libz' : '1.3.1' , 'liboqs' : '0.10.0' })
12541254
12551255
1256+ class TestResolveDepVersionsSingleShot (unittest .TestCase ):
1257+ """Each enabled dependency's version must be resolved exactly once (in
1258+ main, via _resolve_dep_versions), not once per output format. Without
1259+ the precompute, generate_cdx and generate_spdx each call dep_version()
1260+ independently, so a default --with-libz --with-liboqs build would shell
1261+ out to `pkg-config --modversion` four times (2 deps x CDX+SPDX) instead
1262+ of twice -- and the two documents could disagree if pkg-config were ever
1263+ non-deterministic. These tests lock that single-resolution behaviour in."""
1264+
1265+ def test_pkgconfig_called_once_per_dep (self ):
1266+ calls = []
1267+ original = gs .pkgconfig_version
1268+ try :
1269+ gs .pkgconfig_version = lambda pkg : (calls .append (pkg ), '1.2.3' )[1 ]
1270+ overrides = gs ._resolve_dep_versions (['libz' , 'liboqs' ], {})
1271+ self .assertEqual (len (calls ), 2 )
1272+ self .assertEqual (overrides ['libz' ], '1.2.3' )
1273+ self .assertEqual (overrides ['liboqs' ], '1.2.3' )
1274+ # The emitters reuse the cached value: a later dep_version() for
1275+ # an already-resolved key must not re-invoke pkg-config.
1276+ gs .dep_version ('libz' , overrides )
1277+ gs .dep_version ('liboqs' , overrides )
1278+ self .assertEqual (len (calls ), 2 )
1279+ finally :
1280+ gs .pkgconfig_version = original
1281+
1282+ def test_user_override_skips_pkgconfig (self ):
1283+ calls = []
1284+ original = gs .pkgconfig_version
1285+ try :
1286+ gs .pkgconfig_version = lambda pkg : (calls .append (pkg ), '9.9.9' )[1 ]
1287+ overrides = gs ._resolve_dep_versions (['libz' ], {'libz' : '1.3.1' })
1288+ self .assertEqual (overrides ['libz' ], '1.3.1' )
1289+ self .assertEqual (calls , [])
1290+ finally :
1291+ gs .pkgconfig_version = original
1292+
1293+ def test_none_is_cached_when_pkgconfig_missing (self ):
1294+ calls = []
1295+ original = gs .pkgconfig_version
1296+ try :
1297+ gs .pkgconfig_version = lambda pkg : (calls .append (pkg ), None )[1 ]
1298+ overrides = gs ._resolve_dep_versions (['liboqs' ], {})
1299+ self .assertIn ('liboqs' , overrides )
1300+ self .assertIsNone (overrides ['liboqs' ])
1301+ # A cached None must short-circuit later lookups too.
1302+ gs .dep_version ('liboqs' , overrides )
1303+ self .assertEqual (len (calls ), 1 )
1304+ finally :
1305+ gs .pkgconfig_version = original
1306+
1307+
12561308class TestCliMutualExclusion (unittest .TestCase ):
12571309 """The two entry-point shapes (autotools / standalone) must be
12581310 mutually exclusive. Mixing them would produce a hash whose
0 commit comments