@@ -489,3 +489,42 @@ class SPDX30Check(SPDX3CheckBase, OESelftestTestCase):
r'\d',
f"Version '{version}' for package '{name}' should contain digits"
)
+
+ def test_lifecycle_scope_dependencies(self):
+ """Test that lifecycle scope classification assigns runtime scope."""
+ objset = self.check_recipe_spdx(
+ "acl",
+ "{DEPLOY_DIR_SPDX}/{SSTATE_PKGARCH}/packages/package-acl.spdx.json",
+ )
+
+ # Find runtime-scoped dependency relationships
+ runtime_rels = []
+ for rel in objset.foreach_type(oe.spdx30.LifecycleScopedRelationship):
+ if (rel.relationshipType == oe.spdx30.RelationshipType.dependsOn and
+ rel.scope == oe.spdx30.LifecycleScopeType.runtime):
+ runtime_rels.append(rel)
+
+ self.assertGreater(
+ len(runtime_rels), 0,
+ "Expected runtime-scoped dependency relationships for acl"
+ )
+
+ # Verify dependencies reference other packages via link IDs
+ all_dep_ids = []
+ for rel in runtime_rels:
+ for to_elem in rel.to:
+ dep_id = to_elem._id if hasattr(to_elem, '_id') else str(to_elem)
+ all_dep_ids.append(dep_id)
+
+ self.assertGreater(
+ len(all_dep_ids), 0,
+ "Runtime dependency relationships should reference target packages"
+ )
+
+ # Verify implicit glibc dependency is captured (auto-detected
+ # shared library dependency)
+ has_glibc = any('glibc' in dep_id for dep_id in all_dep_ids)
+ self.assertTrue(
+ has_glibc,
+ f"Expected glibc in runtime dependencies. Found IDs: {all_dep_ids}"
+ )