Skip to content

ci(coverage): fix hang by excluding Redis Testcontainers from coverage loop#99

Merged
JerrettDavis merged 4 commits into
mainfrom
fix/ci-redis-testcontainers-hang
May 28, 2026
Merged

ci(coverage): fix hang by excluding Redis Testcontainers from coverage loop#99
JerrettDavis merged 4 commits into
mainfrom
fix/ci-redis-testcontainers-hang

Conversation

@JerrettDavis

Copy link
Copy Markdown
Owner

Summary

  • The Collect coverage (per-project) step iterated through all test projects including ExperimentFramework.Governance.Persistence.Redis.Tests, which uses Testcontainers.Redis
  • Even with --filter excluding integration tests, Testcontainers starts the Redis container in IAsyncLifetime.InitializeAsync before the filter applies, causing indefinite hang waiting for Docker
  • The 60-minute job timeout was being hit on most runs

Fix

  • Remove Redis.Tests from the coverage project list in both pr-checks and release jobs
  • Add a runtime guard skipping any project matching *Redis.Tests*
  • Wrap each dotnet test invocation with timeout 300 as defense-in-depth
  • Surface timeouts as ::warning:: while propagating real failures via exit code (previously all non-zero exits were silently swallowed)

Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com

@github-actions

github-actions Bot commented May 28, 2026

Copy link
Copy Markdown
Contributor

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

Snapshot Warnings

⚠️: No snapshots were found for the head SHA 5629877.
Ensure that dependencies are being submitted on PR branches and consider enabling retry-on-snapshot-warnings. See the documentation for more information and troubleshooting advice.

Scanned Files

None

@JerrettDavis JerrettDavis force-pushed the fix/ci-redis-testcontainers-hang branch from 5e902f7 to 40570d1 Compare May 28, 2026 17:49
@JerrettDavis JerrettDavis changed the title Fix CI hang from Redis Testcontainers in coverage loop ci(coverage): fix hang by excluding Redis Testcontainers from coverage loop May 28, 2026
@JerrettDavis JerrettDavis force-pushed the fix/ci-redis-testcontainers-hang branch from 6141501 to 40570d1 Compare May 28, 2026 19:31
@JerrettDavis

Copy link
Copy Markdown
Owner Author

Reset to original approved commit (40570d1). The two follow-up commits expanded scope by converting the solution-level verify steps to per-project loops, which broke Cli.Tests and Audit.Tests for unrelated reasons. The original hang was only in the coverage loop, which 40570d1 fixes correctly. Re-running CI now.

GitHub Copilot and others added 3 commits May 28, 2026 18:15
…e loop

The 'Collect coverage (per-project)' step iterated through all test
projects including ExperimentFramework.Governance.Persistence.Redis.Tests,
which uses Testcontainers.Redis. Even though integration tests are filtered
out via --filter, Testcontainers starts the Redis container in
IAsyncLifetime.InitializeAsync before the filter applies, causing the
test host to hang indefinitely waiting for Docker. The 60-minute job
timeout was being hit on most runs.

Fix:
- Remove Redis.Tests from the coverage project list in both pr-checks
  and release jobs
- Add a runtime guard skipping any project matching *Redis.Tests*
- Wrap each dotnet test invocation with timeout 300 as defense-in-depth
- Surface timeouts as ::warning:: while propagating real failures via
  exit code (previously all non-zero exits were silently swallowed)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…fy-step hang

xUnit's IAsyncLifetime fires during fixture construction BEFORE
the test filter is applied. Per-class IAsyncLifetime on the three
Redis test classes meant each class instantiated and started a
Testcontainers Redis container regardless of whether any of its
tests passed the Category!=integration filter. On CI runners
this blocked the solution-level dotnet test for the net8.0 and
net9.0 target framework runs indefinitely, hitting the 60-minute
job timeout.

Switching to a shared ICollectionFixture<RedisFixture> means the
fixture is instantiated only when xUnit finds at least one
non-filtered test in the [Collection("Redis")] collection. Since
all tests in these classes are tagged Category=integration, the
filter eliminates them at discovery time and the container never
starts.

Also added --blame-hang-timeout 60s to the verify step's
dotnet test invocations as defense in depth so any future
hang surfaces as a fast, visible failure.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…sink DI cycle

- ConfigurationFileDiscovery now sorts files alphabetically so the
  "last file wins" merge contract holds across filesystems.
- AddExperimentAuditComposite captures sink ServiceDescriptors at
  registration time and resolves them by ImplementationType to avoid
  the circular IAuditSink singleton resolution that caused a 60s
  blame-hang in Audit.Tests.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@JerrettDavis JerrettDavis force-pushed the fix/ci-redis-testcontainers-hang branch from 5e5ef4d to ea2ee84 Compare May 28, 2026 23:15
The tests/ExperimentFramework.Configuration.Tests project does not
exist on this branch (only on feat/coverage-phase-5) and was added
to the coverage loop prematurely in bbab3c6. The previous Redis
Testcontainers hang masked this — now that the hang is fixed, the
coverage step reaches the missing project and fails with MSB1009.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Code Coverage

Summary
  Generated on: 05/28/2026 - 23:37:52
  Coverage date: 05/28/2026 - 23:35:55 - 05/28/2026 - 23:37:32
  Parser: MultiReport (19x Cobertura)
  Assemblies: 29
  Classes: 304
  Files: 266
  Line coverage: 76.5%
  Covered lines: 8061
  Uncovered lines: 2472
  Coverable lines: 10533
  Total lines: 45354
  Branch coverage: 64.5% (3042 of 4712)
  Covered branches: 3042
  Total branches: 4712
  Method coverage: 83.4% (1204 of 1443)
  Full method coverage: 71.1% (1026 of 1443)
  Covered methods: 1204
  Fully covered methods: 1026
  Total methods: 1443

ExperimentFramework                                                                                             77.2%
  ExperimentFramework.Activation.ActivationEvaluator                                                            93.1%
  ExperimentFramework.Activation.SystemTimeProvider                                                              100%
  ExperimentFramework.Decorators.BenchmarkDecoratorFactory                                                      16.6%
  ExperimentFramework.Decorators.DecoratorPipeline                                                              92.8%
  ExperimentFramework.Decorators.ErrorLoggingDecoratorFactory                                                   16.6%
  ExperimentFramework.Decorators.TimeoutDecoratorFactory                                                          25%
  ExperimentFramework.ExperimentBuilder                                                                         81.1%
  ExperimentFramework.ExperimentBuilderExtensions                                                                100%
  ExperimentFramework.ExperimentFrameworkBuilder                                                                 100%
  ExperimentFramework.ExperimentLoggingBuilder                                                                   100%
  ExperimentFramework.ExperimentRegistry                                                                         100%
  ExperimentFramework.KillSwitch.ExperimentDisabledException                                                     100%
  ExperimentFramework.KillSwitch.InMemoryKillSwitchProvider                                                      100%
  ExperimentFramework.KillSwitch.KillSwitchDecoratorFactory                                                     22.7%
  ExperimentFramework.KillSwitch.NoopKillSwitchProvider                                                          100%
  ExperimentFramework.KillSwitch.TrialDisabledException                                                          100%
  ExperimentFramework.Metrics.MetricsDecoratorFactory                                                           13.6%
  ExperimentFramework.Metrics.NoopExperimentMetrics                                                              100%
  ExperimentFramework.Models.BehaviorRule                                                                        100%
  ExperimentFramework.Models.Experiment                                                                          100%
  ExperimentFramework.Models.ExperimentRegistration                                                               75%
  ExperimentFramework.Models.SelectionModeExtensions                                                             100%
  ExperimentFramework.Models.SelectionRule                                                                       100%
  ExperimentFramework.Models.ServiceExperimentDefinition<T>                                                      100%
  ExperimentFramework.Models.Trial                                                                               100%
  ExperimentFramework.Naming.DefaultExperimentNamingConvention                                                   100%
  ExperimentFramework.Naming.ExperimentSelectorName                                                              100%
  ExperimentFramework.RuntimeExperimentProxy<T>                                                                 72.8%
  ExperimentFramework.Selection.Providers.BooleanFeatureFlagProvider                                            12.5%
  ExperimentFramework.Selection.Providers.BooleanFeatureFlagProviderFactory                                      100%
  ExperimentFramework.Selection.Providers.ConfigurationValueProvider                                              80%
  ExperimentFramework.Selection.Providers.ConfigurationValueProviderFactory                                      100%
  ExperimentFramework.Selection.SelectionModeAttribute                                                           100%
  ExperimentFramework.Selection.SelectionModeProviderBase                                                        100%
  ExperimentFramework.Selection.SelectionModeProviderFactory<T>                                                  100%
  ExperimentFramework.Selection.SelectionModeRegistry                                                            100%
  ExperimentFramework.ServiceCollectionExtensions                                                               77.6%
  ExperimentFramework.ServiceExperimentBuilder<T>                                                               94.5%
  ExperimentFramework.ServiceRegistration.OperationMetadata                                                      100%
  ExperimentFramework.ServiceRegistration.OperationResult                                                        100%
  ExperimentFramework.ServiceRegistration.PlanExecutionResult                                                   83.3%
  ExperimentFramework.ServiceRegistration.RegistrationPlan                                                       100%
  ExperimentFramework.ServiceRegistration.RegistrationPlanBuilder                                               97.2%
  ExperimentFramework.ServiceRegistration.RegistrationPlanExecutor                                              62.7%
  ExperimentFramework.ServiceRegistration.RegistrationPlanReport                                                98.1%
  ExperimentFramework.ServiceRegistration.ServiceGraphPatchOperation                                              77%
  ExperimentFramework.ServiceRegistration.ServiceGraphSnapshot                                                   100%
  ExperimentFramework.ServiceRegistration.ValidationFinding                                                      100%
  ExperimentFramework.ServiceRegistration.Validators.AssignabilityValidator                                        0%
  ExperimentFramework.ServiceRegistration.Validators.IdempotencyValidator                                          0%
  ExperimentFramework.ServiceRegistration.Validators.LifetimeSafetyValidator                                    15.7%
  ExperimentFramework.ServiceRegistration.Validators.MultiRegistrationValidator                                    0%
  ExperimentFramework.ServiceRegistration.Validators.OpenGenericValidator                                          0%
  ExperimentFramework.Telemetry.NoopExperimentTelemetry                                                          100%
  ExperimentFramework.Telemetry.OpenTelemetryExperimentTelemetry                                                 100%
  ExperimentFramework.Validation.TrialConflictDetector                                                          98.7%
  ExperimentFramework.Validation.TrialConflictException                                                          100%
  ExperimentFramework.Variants.VariantFeatureManagerAdapter                                                     29.6%

ExperimentFramework.Admin                                                                                        100%
  ExperimentFramework.Admin.ExperimentAdminEndpoints                                                             100%
  ExperimentFramework.Admin.GovernanceAdminEndpoints                                                             100%

ExperimentFramework.Audit                                                                                        100%
  ExperimentFramework.Audit.CompositeAuditSink                                                                   100%
  ExperimentFramework.Audit.LoggingAuditSink                                                                     100%
  ExperimentFramework.Audit.ServiceCollectionExtensions                                                          100%

ExperimentFramework.AutoStop                                                                                     100%
  ExperimentFramework.AutoStop.AutoStopOptions                                                                   100%
  ExperimentFramework.AutoStop.Rules.MinimumSampleSizeRule                                                       100%
  ExperimentFramework.AutoStop.Rules.StatisticalSignificanceRule                                                 100%
  ExperimentFramework.AutoStop.ServiceCollectionExtensions                                                       100%
  ExperimentFramework.AutoStop.VariantData                                                                       100%

ExperimentFramework.Bandit                                                                                      98.8%
  ExperimentFramework.Bandit.Algorithms.EpsilonGreedy                                                            100%
  ExperimentFramework.Bandit.Algorithms.ThompsonSampling                                                        97.3%
  ExperimentFramework.Bandit.Algorithms.UpperConfidenceBound                                                     100%
  ExperimentFramework.Bandit.ArmStatistics                                                                       100%
  ExperimentFramework.Bandit.ServiceCollectionExtensions                                                         100%

ExperimentFramework.Configuration                                                                               68.9%
  ExperimentFramework.Configuration.Building.ConfigurationExperimentBuilder                                     85.3%
  ExperimentFramework.Configuration.Building.TypeResolver                                                         69%
  ExperimentFramework.Configuration.ConfigurationFileWatcher                                                    89.4%
  ExperimentFramework.Configuration.Exceptions.ConfigurationLoadException                                        100%
  ExperimentFramework.Configuration.Exceptions.ExperimentConfigurationException                                  100%
  ExperimentFramework.Configuration.Exceptions.TypeResolutionException                                           100%
  ExperimentFramework.Configuration.Extensions.ConfigurationExtensionRegistry                                   79.1%
  ExperimentFramework.Configuration.Extensions.ConfigurationExtensionServiceCollectionExtensions                92.8%
  ExperimentFramework.Configuration.Extensions.Handlers.ConfigurationKeySelectionModeHandler                     100%
  ExperimentFramework.Configuration.Extensions.Handlers.CustomDecoratorHandler                                  93.7%
  ExperimentFramework.Configuration.Extensions.Handlers.CustomSelectionModeHandler                              66.6%
  ExperimentFramework.Configuration.Extensions.Handlers.FeatureFlagSelectionModeHandler                          100%
  ExperimentFramework.Configuration.Extensions.Handlers.GovernanceConfigurationHandler                            44%
  ExperimentFramework.Configuration.Extensions.Handlers.InMemoryBackplaneConfigurationHandler                   11.1%
  ExperimentFramework.Configuration.Extensions.Handlers.LoggingBackplaneConfigurationHandler                    11.1%
  ExperimentFramework.Configuration.Extensions.Handlers.LoggingDecoratorHandler                                 91.6%
  ExperimentFramework.Configuration.Extensions.Handlers.OpenTelemetryBackplaneConfigurationHandler              11.1%
  ExperimentFramework.Configuration.Extensions.Handlers.TimeoutDecoratorHandler                                  100%
  ExperimentFramework.Configuration.Loading.ConfigurationFileDiscovery                                           100%
  ExperimentFramework.Configuration.Loading.ExperimentConfigurationLoader                                       84.6%
  ExperimentFramework.Configuration.Models.CircuitBreakerDecoratorOptions                                        100%
  ExperimentFramework.Configuration.Models.OutcomeCollectionDecoratorOptions                                     100%
  ExperimentFramework.Configuration.Models.TimeoutDecoratorOptions                                               100%
  ExperimentFramework.Configuration.Schema.Generated.ConfigurationSchema                                           0%
  ExperimentFramework.Configuration.Schema.Generated.SchemaRegistry                                                0%
  ExperimentFramework.Configuration.Schema.SchemaExporter                                                          0%
  ExperimentFramework.Configuration.Schema.SchemaHasher                                                          100%
  ExperimentFramework.Configuration.Schema.SchemaVersionTracker                                                 94.5%
  ExperimentFramework.Configuration.ServiceCollectionExtensions                                                 48.2%
  ExperimentFramework.Configuration.Validation.ConfigurationValidationError                                      100%
  ExperimentFramework.Configuration.Validation.ConfigurationValidationResult                                     100%
  ExperimentFramework.Configuration.Validation.ConfigurationValidator                                           69.5%

ExperimentFramework.Dashboard                                                                                   22.7%
  ExperimentFramework.Dashboard.Authorization.ClaimsPrincipalAuthProvider                                          0%
  ExperimentFramework.Dashboard.DashboardMiddleware                                                                0%
  ExperimentFramework.Dashboard.Data.DefaultDashboardDataProvider                                               35.7%
  ExperimentFramework.Dashboard.EndpointRouteBuilderExtensions                                                  62.5%
  ExperimentFramework.Dashboard.NullTenantResolver                                                                 0%
  ExperimentFramework.Dashboard.Persistence.InMemoryRolloutPersistence                                             0%
  ExperimentFramework.Dashboard.ServiceCollectionExtensions                                                     93.7%
  ExperimentFramework.Dashboard.TenantResolvers.ClaimTenantResolver                                                0%
  ExperimentFramework.Dashboard.TenantResolvers.CompositeTenantResolver                                            0%
  ExperimentFramework.Dashboard.TenantResolvers.HttpHeaderTenantResolver                                           0%
  ExperimentFramework.Dashboard.TenantResolvers.SubdomainTenantResolver                                            0%
  ExperimentFramework.Dashboard.Theming.DefaultThemeProvider                                                       0%

ExperimentFramework.Dashboard.Abstractions                                                                       100%
  ExperimentFramework.Dashboard.Abstractions.TenantContextAccessor                                               100%

ExperimentFramework.Dashboard.Api                                                                               83.8%
  ExperimentFramework.Dashboard.Api.DashboardApiExtensions                                                       100%
  ExperimentFramework.Dashboard.Api.Endpoints.AnalyticsEndpoints                                                72.2%
  ExperimentFramework.Dashboard.Api.Endpoints.AuditEndpoints                                                     100%
  ExperimentFramework.Dashboard.Api.Endpoints.ConfigurationEndpoints                                            81.5%
  ExperimentFramework.Dashboard.Api.Endpoints.ExperimentEndpoints                                               94.2%
  ExperimentFramework.Dashboard.Api.Endpoints.GovernanceEndpoints                                               65.7%
  ExperimentFramework.Dashboard.Api.Endpoints.PluginEndpoints                                                    100%
  ExperimentFramework.Dashboard.Api.Endpoints.RolloutEndpoints                                                  95.6%
  ExperimentFramework.Dashboard.Api.Endpoints.TargetingEndpoints                                                 100%

ExperimentFramework.Dashboard.UI                                                                                52.1%
  ExperimentFramework.Dashboard.UI.Components.Layout.MainLayout                                                  100%
  ExperimentFramework.Dashboard.UI.Components.Pages.Analytics                                                   77.5%
  ExperimentFramework.Dashboard.UI.Components.Pages.Configuration                                                 86%
  ExperimentFramework.Dashboard.UI.Components.Pages.CreateExperiment                                            18.8%
  ExperimentFramework.Dashboard.UI.Components.Pages.DslEditor                                                   45.9%
  ExperimentFramework.Dashboard.UI.Components.Pages.Experiments                                                   50%
  ExperimentFramework.Dashboard.UI.Components.Pages.Governance.Audit                                            33.3%
  ExperimentFramework.Dashboard.UI.Components.Pages.Governance.Lifecycle                                        21.6%
  ExperimentFramework.Dashboard.UI.Components.Pages.Governance.Policies                                         29.4%
  ExperimentFramework.Dashboard.UI.Components.Pages.Governance.Versions                                           22%
  ExperimentFramework.Dashboard.UI.Components.Pages.HypothesisTesting                                           95.8%
  ExperimentFramework.Dashboard.UI.Components.Pages.MinimalTest                                                    0%
  ExperimentFramework.Dashboard.UI.Components.Pages.Plugins                                                     14.9%
  ExperimentFramework.Dashboard.UI.Components.Pages.Rollout                                                     15.6%
  ExperimentFramework.Dashboard.UI.Components.Pages.Targeting                                                     41%
  ExperimentFramework.Dashboard.UI.Components.Shared.MonacoEditor                                               32.8%
  ExperimentFramework.Dashboard.UI.Models.ExperimentWizardModel                                                  100%
  ExperimentFramework.Dashboard.UI.Services.DashboardStateService                                               90.5%
  ExperimentFramework.Dashboard.UI.Services.ExperimentApiClient                                                 97.6%
  ExperimentFramework.Dashboard.UI.Services.ExperimentCodeGenerator                                              100%
  ExperimentFramework.Dashboard.UI.Services.GovernanceListResponse<T>                                              0%
  ExperimentFramework.Dashboard.UI.Services.ThemeService                                                         100%

ExperimentFramework.Data                                                                                        98.1%
  ExperimentFramework.Data.Configuration.OutcomeCollectionDecoratorHandler                                       100%
  ExperimentFramework.Data.Decorators.OutcomeCollectionDecoratorFactory                                          100%
  ExperimentFramework.Data.ExperimentBuilderExtensions                                                           100%
  ExperimentFramework.Data.Models.ExperimentOutcome                                                              100%
  ExperimentFramework.Data.Models.OutcomeAggregation                                                             100%
  ExperimentFramework.Data.Models.OutcomeQuery                                                                   100%
  ExperimentFramework.Data.Recording.OutcomeRecorder                                                             100%
  ExperimentFramework.Data.Recording.OutcomeRecorderOptions                                                      100%
  ExperimentFramework.Data.ServiceCollectionExtensions                                                           100%
  ExperimentFramework.Data.Storage.InMemoryOutcomeStore                                                         93.6%
  ExperimentFramework.Data.Storage.NoopOutcomeStore                                                              100%

ExperimentFramework.DataPlane                                                                                   29.4%
  ExperimentFramework.DataPlane.Decorators.ExposureLoggingDecorator                                                0%
  ExperimentFramework.DataPlane.Decorators.ExposureLoggingDecoratorFactory                                         0%
  ExperimentFramework.DataPlane.ExperimentFrameworkBuilderExtensions                                               0%
  ExperimentFramework.DataPlane.Implementations.CompositeDataBackplane                                             0%
  ExperimentFramework.DataPlane.Implementations.InMemoryDataBackplane                                           66.6%
  ExperimentFramework.DataPlane.Implementations.LoggingDataBackplane                                               0%
  ExperimentFramework.DataPlane.Implementations.OpenTelemetryDataBackplane                                      42.1%
  ExperimentFramework.DataPlane.ServiceCollectionExtensions                                                        0%

ExperimentFramework.DataPlane.Abstractions                                                                      33.3%
  ExperimentFramework.DataPlane.Abstractions.BackplaneHealth                                                      50%
  ExperimentFramework.DataPlane.Abstractions.Configuration.DataPlaneOptions                                        0%

ExperimentFramework.Diagnostics                                                                                 63.4%
  ExperimentFramework.Diagnostics.CompositeExperimentEventSink                                                  84.6%
  ExperimentFramework.Diagnostics.ExperimentDiagnosticsExtensions                                               80.4%
  ExperimentFramework.Diagnostics.ExperimentEventPublisher                                                         0%
  ExperimentFramework.Diagnostics.InMemoryExperimentEventSink                                                    100%
  ExperimentFramework.Diagnostics.LoggerExperimentEventSink                                                     74.3%
  ExperimentFramework.Diagnostics.OpenTelemetryExperimentEventSink                                              93.1%

ExperimentFramework.Distributed                                                                                 94.6%
  ExperimentFramework.Distributed.InMemoryDistributedLockProvider                                               92.5%
  ExperimentFramework.Distributed.InMemoryDistributedState                                                      95.4%
  ExperimentFramework.Distributed.ServiceCollectionExtensions                                                    100%

ExperimentFramework.Distributed.Redis                                                                              0%
  ExperimentFramework.Distributed.Redis.RedisDistributedLockProvider                                               0%
  ExperimentFramework.Distributed.Redis.RedisDistributedState                                                      0%
  ExperimentFramework.Distributed.Redis.ServiceCollectionExtensions                                                0%

ExperimentFramework.FeatureManagement                                                                             80%
  ExperimentFramework.FeatureManagement.ExperimentBuilderExtensions                                               50%
  ExperimentFramework.FeatureManagement.ServiceCollectionExtensions                                              100%
  ExperimentFramework.FeatureManagement.VariantFeatureFlagProvider                                               100%

ExperimentFramework.Governance                                                                                  94.2%
  ExperimentFramework.Governance.Approval.AutomaticApprovalGate                                                  100%
  ExperimentFramework.Governance.Approval.ManualApprovalGate                                                     100%
  ExperimentFramework.Governance.Approval.RoleBasedApprovalGate                                                  100%
  ExperimentFramework.Governance.ApprovalManager                                                                 100%
  ExperimentFramework.Governance.ApprovalResult                                                                  100%
  ExperimentFramework.Governance.GovernanceBuilder                                                              69.5%
  ExperimentFramework.Governance.GovernanceConfiguration                                                           0%
  ExperimentFramework.Governance.LifecycleManager                                                               98.8%
  ExperimentFramework.Governance.Policy.ConflictPreventionPolicy                                                96.4%
  ExperimentFramework.Governance.Policy.ErrorRatePolicy                                                         96.5%
  ExperimentFramework.Governance.Policy.PolicyEvaluator                                                          100%
  ExperimentFramework.Governance.Policy.TimeWindowPolicy                                                        95.6%
  ExperimentFramework.Governance.Policy.TrafficLimitPolicy                                                       100%
  ExperimentFramework.Governance.ServiceCollectionExtensions                                                     100%
  ExperimentFramework.Governance.Versioning.VersionManager                                                      84.4%

ExperimentFramework.Governance.Persistence                                                                      67.8%
  ExperimentFramework.Governance.Persistence.ConcurrencyConflictException                                          0%
  ExperimentFramework.Governance.Persistence.InMemoryGovernancePersistenceBackplane                             71.8%
  ExperimentFramework.Governance.Persistence.PersistenceResult<T>                                               68.4%
  ExperimentFramework.Governance.Persistence.ServiceCollectionExtensions                                           0%

ExperimentFramework.Governance.Persistence.Sql                                                                  95.3%
  ExperimentFramework.Governance.Persistence.Sql.EntityConfigurations.ApprovalRecordEntityConfiguration          100%
  ExperimentFramework.Governance.Persistence.Sql.EntityConfigurations.ConfigurationVersionEntityConfiguration    100%
  ExperimentFramework.Governance.Persistence.Sql.EntityConfigurations.ExperimentStateEntityConfiguration         100%
  ExperimentFramework.Governance.Persistence.Sql.EntityConfigurations.PolicyEvaluationEntityConfiguration        100%
  ExperimentFramework.Governance.Persistence.Sql.EntityConfigurations.StateTransitionEntityConfiguration         100%
  ExperimentFramework.Governance.Persistence.Sql.GovernanceDbContext                                             100%
  ExperimentFramework.Governance.Persistence.Sql.ServiceCollectionExtensions                                       0%
  ExperimentFramework.Governance.Persistence.Sql.SqlGovernancePersistenceBackplane                              95.1%

ExperimentFramework.Metrics.Exporters                                                                            100%
  ExperimentFramework.Metrics.Exporters.OpenTelemetryExperimentMetrics                                           100%
  ExperimentFramework.Metrics.Exporters.PrometheusExperimentMetrics                                              100%

ExperimentFramework.OpenFeature                                                                                   80%
  ExperimentFramework.OpenFeature.ExperimentBuilderExtensions                                                     50%
  ExperimentFramework.OpenFeature.OpenFeatureProvider                                                            100%
  ExperimentFramework.OpenFeature.ServiceCollectionExtensions                                                    100%

ExperimentFramework.Plugins                                                                                       87%
  ExperimentFramework.Plugins.Abstractions.PluginEventArgs                                                       100%
  ExperimentFramework.Plugins.Abstractions.PluginLoadFailedEventArgs                                             100%
  ExperimentFramework.Plugins.Configuration.PluginConfigurationValidator                                         100%
  ExperimentFramework.Plugins.Configuration.PluginDiscoveryService                                               100%
  ExperimentFramework.Plugins.Configuration.PluginsConfig                                                        100%
  ExperimentFramework.Plugins.HotReload.PluginReloadEventArgs                                                    100%
  ExperimentFramework.Plugins.HotReload.PluginReloadFailedEventArgs                                              100%
  ExperimentFramework.Plugins.HotReload.PluginReloadService                                                      100%
  ExperimentFramework.Plugins.HotReload.PluginWatcher                                                           87.8%
  ExperimentFramework.Plugins.Integration.PluginBuilderExtensions                                                100%
  ExperimentFramework.Plugins.Integration.PluginManager                                                         83.3%
  ExperimentFramework.Plugins.Integration.PluginTypeResolver                                                     100%
  ExperimentFramework.Plugins.Loading.PluginContext                                                             55.4%
  ExperimentFramework.Plugins.Loading.PluginLoadContext                                                           72%
  ExperimentFramework.Plugins.Loading.PluginLoader                                                              91.9%
  ExperimentFramework.Plugins.Loading.SharedTypeRegistry                                                        89.1%
  ExperimentFramework.Plugins.Manifest.ManifestLoader                                                             92%
  ExperimentFramework.Plugins.Manifest.ManifestValidationResult                                                   50%
  ExperimentFramework.Plugins.Manifest.ManifestValidator                                                        97.7%
  ExperimentFramework.Plugins.Manifest.PluginManifest                                                            100%
  ExperimentFramework.Plugins.Manifest.PluginManifestAttribute                                                   100%
  ExperimentFramework.Plugins.Manifest.PluginManifestJson                                                        100%
  ExperimentFramework.Plugins.Security.PluginSecurityValidator                                                    73%
  ExperimentFramework.Plugins.ServiceCollectionDecoratorExtensions                                              70.5%
  ExperimentFramework.Plugins.ServiceCollectionExtensions                                                        100%

ExperimentFramework.Resilience                                                                                    99%
  ExperimentFramework.Resilience.CircuitBreakerDecoratorFactory                                                  100%
  ExperimentFramework.Resilience.CircuitBreakerOpenException                                                     100%
  ExperimentFramework.Resilience.CircuitBreakerOptions                                                           100%
  ExperimentFramework.Resilience.Configuration.CircuitBreakerDecoratorHandler                                    100%
  ExperimentFramework.Resilience.ResilienceBuilderExtensions                                                     100%
  ExperimentFramework.Resilience.ResilienceServiceCollectionExtensions                                          85.7%

ExperimentFramework.Rollout                                                                                     98.7%
  ExperimentFramework.Rollout.Configuration.RolloutSelectionModeHandler                                          100%
  ExperimentFramework.Rollout.Configuration.StagedRolloutSelectionModeHandler                                   97.9%
  ExperimentFramework.Rollout.ExperimentBuilderExtensions                                                        100%
  ExperimentFramework.Rollout.RolloutAllocator                                                                    95%
  ExperimentFramework.Rollout.RolloutProvider                                                                    100%
  ExperimentFramework.Rollout.ServiceCollectionExtensions                                                        100%
  ExperimentFramework.Rollout.StagedRolloutOptions                                                               100%
  ExperimentFramework.Rollout.StagedRolloutProvider                                                              100%

ExperimentFramework.Science                                                                                     93.8%
  ExperimentFramework.Science.Analysis.ExperimentAnalyzer                                                       88.3%
  ExperimentFramework.Science.Builders.EndpointBuilder                                                           100%
  ExperimentFramework.Science.Builders.HypothesisBuilder                                                         100%
  ExperimentFramework.Science.Builders.SuccessCriteriaBuilder                                                    100%
  ExperimentFramework.Science.Corrections.BenjaminiHochbergCorrection                                            100%
  ExperimentFramework.Science.Corrections.BonferroniCorrection                                                   100%
  ExperimentFramework.Science.Corrections.HolmBonferroniCorrection                                               100%
  ExperimentFramework.Science.EffectSize.CohensD                                                                 100%
  ExperimentFramework.Science.EffectSize.EffectSizeExtensions                                                    100%
  ExperimentFramework.Science.EffectSize.OddsRatio                                                               100%
  ExperimentFramework.Science.EffectSize.RelativeRisk                                                            100%
  ExperimentFramework.Science.Models.Hypothesis.Endpoint                                                           0%
  ExperimentFramework.Science.Models.Hypothesis.HypothesisDefinition                                               0%
  ExperimentFramework.Science.Models.Results.StatisticalTestResult                                              66.6%
  ExperimentFramework.Science.Models.Snapshots.EnvironmentInfo                                                     0%
  ExperimentFramework.Science.Power.PowerAnalyzer                                                               78.7%
  ExperimentFramework.Science.Reporting.JsonReporter                                                            88.8%
  ExperimentFramework.Science.Reporting.MarkdownReporter                                                        92.6%
  ExperimentFramework.Science.ServiceCollectionExtensions                                                        100%
  ExperimentFramework.Science.Snapshots.InMemorySnapshotStore                                                   90.1%
  ExperimentFramework.Science.Statistics.ChiSquareTest                                                          98.9%
  ExperimentFramework.Science.Statistics.MannWhitneyUTest                                                       97.3%
  ExperimentFramework.Science.Statistics.OneWayAnova                                                            98.4%
  ExperimentFramework.Science.Statistics.PairedTTest                                                            96.9%
  ExperimentFramework.Science.Statistics.TwoSampleTTest                                                         88.4%

ExperimentFramework.Simulation                                                                                  89.5%
  ExperimentFramework.Simulation.Builders.SimulationRunner                                                       100%
  ExperimentFramework.Simulation.Builders.SimulationRunner<T1, T2>                                                74%
  ExperimentFramework.Simulation.Builders.SimulationRunnerBuilder                                                100%
  ExperimentFramework.Simulation.Builders.SimulationServiceBuilder<T>                                            100%
  ExperimentFramework.Simulation.Comparators.EqualityComparator<T>                                               100%
  ExperimentFramework.Simulation.Comparators.JsonComparator<T>                                                  88.4%
  ExperimentFramework.Simulation.Comparators.SimulationComparators                                               100%
  ExperimentFramework.Simulation.Models.ImplementationResult<T>                                                 85.7%
  ExperimentFramework.Simulation.Models.Scenario<T1, T2>                                                         100%
  ExperimentFramework.Simulation.Models.ScenarioResult<T>                                                        100%
  ExperimentFramework.Simulation.Models.SimulationReport                                                         100%
  ExperimentFramework.Simulation.Reporting.SimulationReportExtensions                                           93.4%
  ExperimentFramework.Simulation.ServiceCollectionExtensions                                                       0%

ExperimentFramework.StickyRouting                                                                                100%
  ExperimentFramework.StickyRouting.ExperimentBuilderExtensions                                                  100%
  ExperimentFramework.StickyRouting.ServiceCollectionExtensions                                                  100%
  ExperimentFramework.StickyRouting.StickyRoutingProvider                                                        100%
  ExperimentFramework.StickyRouting.StickyTrialRouter                                                            100%

ExperimentFramework.Targeting                                                                                    100%
  ExperimentFramework.Targeting.Configuration.TargetingSelectionModeHandler                                      100%
  ExperimentFramework.Targeting.InMemoryTargetingConfiguration                                                   100%
  ExperimentFramework.Targeting.ServiceCollectionExtensions                                                      100%
  ExperimentFramework.Targeting.SimpleTargetingContext                                                           100%
  ExperimentFramework.Targeting.TargetingProvider                                                                100%
  ExperimentFramework.Targeting.TargetingRules                                                                   100%

@codecov

codecov Bot commented May 28, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 80.81%. Comparing base (4be4f97) to head (5629877).
⚠️ Report is 20 commits behind head on main.

Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             main      #99      +/-   ##
==========================================
+ Coverage   77.07%   80.81%   +3.74%     
==========================================
  Files         250      264      +14     
  Lines        9888    10494     +606     
  Branches     1634     1837     +203     
==========================================
+ Hits         7621     8481     +860     
+ Misses       2267     2013     -254     
Flag Coverage Δ
unittests 80.81% <100.00%> (+3.74%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
...mentFramework.Audit/ServiceCollectionExtensions.cs 100.00% <100.00%> (+100.00%) ⬆️
...onfiguration/Loading/ConfigurationFileDiscovery.cs 100.00% <100.00%> (ø)

... and 92 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@JerrettDavis JerrettDavis merged commit beb54bb into main May 28, 2026
12 checks passed
@JerrettDavis JerrettDavis deleted the fix/ci-redis-testcontainers-hang branch May 28, 2026 23:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant