fix: order optional feature service bindings
This commit is contained in:
@@ -1629,7 +1629,6 @@ fn build_feature_install_plan(
|
||||
provider_version: declaration.version.clone(),
|
||||
});
|
||||
}
|
||||
if requirement.required {
|
||||
if adjacency[*provider_index].insert(consumer_index) {
|
||||
indegree[consumer_index] += 1;
|
||||
}
|
||||
@@ -1639,7 +1638,6 @@ fn build_feature_install_plan(
|
||||
.insert(requirement.id.clone());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let mut ready = active
|
||||
.iter()
|
||||
@@ -2184,6 +2182,48 @@ mod tests {
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn install_plan_orders_compatible_optional_provider_before_consumer() {
|
||||
let service = ServiceId::builtin("catalog");
|
||||
let consumer = PlannedServiceFeature::new(
|
||||
FeatureDescriptor::builtin("consumer", "Consumer").with_service_requirement(
|
||||
ServiceRequirement::optional(service.clone(), "optional catalog"),
|
||||
),
|
||||
);
|
||||
let provider = PlannedServiceFeature::new(
|
||||
FeatureDescriptor::builtin("provider", "Provider")
|
||||
.with_provided_service(provided_service("catalog", "1")),
|
||||
);
|
||||
let builder = FeatureRegistryBuilder::new()
|
||||
.with_module(consumer)
|
||||
.with_module(provider);
|
||||
|
||||
let plan = builder.plan().expect("optional binding should be valid");
|
||||
assert_eq!(
|
||||
plan.ordered_features(),
|
||||
&[
|
||||
FeatureId::builtin("provider"),
|
||||
FeatureId::builtin("consumer"),
|
||||
]
|
||||
);
|
||||
|
||||
let mut hooks = HookRegistryBuilder::default();
|
||||
let mut pending_tools = Vec::new();
|
||||
let report = builder.install_into_pending(&mut pending_tools, &mut hooks);
|
||||
assert!(!report.has_errors());
|
||||
let consumer = report
|
||||
.reports
|
||||
.iter()
|
||||
.find(|report| report.feature_id == FeatureId::builtin("consumer"))
|
||||
.expect("consumer report");
|
||||
assert!(
|
||||
consumer
|
||||
.resolved_service_requirements
|
||||
.iter()
|
||||
.any(|requirement| requirement.id == service)
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn install_plan_rejects_missing_required_service() {
|
||||
let builder = FeatureRegistryBuilder::new().with_module(PlannedServiceFeature::new(
|
||||
|
||||
Reference in New Issue
Block a user