From 41723b88901b568b76cfcc5b212be35ed2b44560 Mon Sep 17 00:00:00 2001 From: Mohamed Ibrahim Date: Tue, 12 May 2026 15:43:11 -0400 Subject: [PATCH] fix(nimbus): populate config_slug on mobile --- components/nimbus/src/enrollment.rs | 12 +++++++----- components/nimbus/src/metrics.rs | 9 ++++++++- components/nimbus/src/tests/test_enrollment.rs | 2 +- .../nimbus/src/tests/test_enrollment_bw_compat.rs | 4 ++-- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/components/nimbus/src/enrollment.rs b/components/nimbus/src/enrollment.rs index 5e73f36906..a414ad7ff0 100644 --- a/components/nimbus/src/enrollment.rs +++ b/components/nimbus/src/enrollment.rs @@ -57,7 +57,7 @@ pub enum NotEnrolledReason { /// The experiment enrollment is paused. EnrollmentsPaused, /// The experiment used a feature that was already under experiment. - FeatureConflict, + FeatureConflict { conflict_slug: Option }, /// The evaluator bucketing did not choose us. NotSelected, /// We are not being targeted for this experiment. @@ -73,7 +73,7 @@ impl Display for NotEnrolledReason { NotEnrolledReason::DifferentAppName => "DifferentAppName", NotEnrolledReason::DifferentChannel => "DifferentChannel", NotEnrolledReason::EnrollmentsPaused => "EnrollmentsPaused", - NotEnrolledReason::FeatureConflict => "FeatureConflict", + NotEnrolledReason::FeatureConflict { .. } => "FeatureConflict", NotEnrolledReason::NotSelected => "NotSelected", NotEnrolledReason::NotTargeted => "NotTargeted", NotEnrolledReason::OptOut => "OptOut", @@ -905,7 +905,7 @@ impl<'a> EnrollmentsEvolver<'a> { if matches!( prev_enrollment.status, EnrollmentStatus::NotEnrolled { - reason: NotEnrolledReason::FeatureConflict + reason: NotEnrolledReason::FeatureConflict { .. }, } ) { continue; @@ -985,7 +985,9 @@ impl<'a> EnrollmentsEvolver<'a> { next_enrollments.push(ExperimentEnrollment { slug: slug.clone(), status: EnrollmentStatus::NotEnrolled { - reason: NotEnrolledReason::FeatureConflict, + reason: NotEnrolledReason::FeatureConflict { + conflict_slug: Some(needed_features_in_use[0].slug.clone()), + }, }, }); @@ -1014,7 +1016,7 @@ impl<'a> EnrollmentsEvolver<'a> { || matches!( prev_enrollment.unwrap().status, EnrollmentStatus::NotEnrolled { - reason: NotEnrolledReason::FeatureConflict + reason: NotEnrolledReason::FeatureConflict { .. } } ) { diff --git a/components/nimbus/src/metrics.rs b/components/nimbus/src/metrics.rs index 89d5521ce6..48794197d1 100644 --- a/components/nimbus/src/metrics.rs +++ b/components/nimbus/src/metrics.rs @@ -30,6 +30,7 @@ impl From for EnrollmentStatusExtraDef { let mut branch_value: Option = None; let mut reason_value: Option = None; let mut error_value: Option = None; + let mut conflict_slug_value: Option = None; match &enrollment.status { EnrollmentStatus::Enrolled { reason, branch, .. } => { branch_value = Some(branch.to_owned()); @@ -41,6 +42,12 @@ impl From for EnrollmentStatusExtraDef { } EnrollmentStatus::NotEnrolled { reason } => { reason_value = Some(reason.to_string()); + conflict_slug_value = match reason { + crate::enrollment::NotEnrolledReason::FeatureConflict { conflict_slug } => { + conflict_slug.to_owned() + } + _ => None, + }; } EnrollmentStatus::WasEnrolled { branch, .. } => branch_value = Some(branch.to_owned()), EnrollmentStatus::Error { reason } => { @@ -49,7 +56,7 @@ impl From for EnrollmentStatusExtraDef { } EnrollmentStatusExtraDef { branch: branch_value, - conflict_slug: None, + conflict_slug: conflict_slug_value, error_string: error_value, reason: reason_value, slug: Some(enrollment.slug), diff --git a/components/nimbus/src/tests/test_enrollment.rs b/components/nimbus/src/tests/test_enrollment.rs index 92888177bb..0b776f4943 100644 --- a/components/nimbus/src/tests/test_enrollment.rs +++ b/components/nimbus/src/tests/test_enrollment.rs @@ -1468,7 +1468,7 @@ fn test_evolver_experiment_not_enrolled_feature_conflict() -> Result<()> { matches!( e.status, EnrollmentStatus::NotEnrolled { - reason: NotEnrolledReason::FeatureConflict + reason: NotEnrolledReason::FeatureConflict { .. } } ) }) diff --git a/components/nimbus/src/tests/test_enrollment_bw_compat.rs b/components/nimbus/src/tests/test_enrollment_bw_compat.rs index fd70cc818b..c8ad7e1bfd 100644 --- a/components/nimbus/src/tests/test_enrollment_bw_compat.rs +++ b/components/nimbus/src/tests/test_enrollment_bw_compat.rs @@ -62,12 +62,12 @@ fn test_not_enrolled_reason_schema_with_feature_conflict() { let non_enrollment: ExperimentEnrollment = serde_json::from_value(json!({ "slug": "secure-gold", "status": {"NotEnrolled": { - "reason": "FeatureConflict", + "reason": { "FeatureConflict": { "conflict_slug": Some("conflicting-feature") } }, }} })) .unwrap(); assert!( - matches!(non_enrollment.status, EnrollmentStatus::NotEnrolled{ ref reason, ..} if reason == &NotEnrolledReason::FeatureConflict) + matches!(non_enrollment.status, EnrollmentStatus::NotEnrolled{ ref reason, ..} if reason == &NotEnrolledReason::FeatureConflict { conflict_slug: Some("conflicting-feature".to_string()) }) ); }