Skip to content

Add persistent container test coverage - #17871

Merged
David Negstad (danegsta) merged 15 commits into
mainfrom
copilot/test-persistent-containers
Jun 3, 2026
Merged

Add persistent container test coverage#17871
David Negstad (danegsta) merged 15 commits into
mainfrom
copilot/test-persistent-containers

Conversation

Copilot AI commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

Description

Adds test coverage for persistent container behavior so the branch can be validated before it is marked ready for review.

This change:

  • Adds a CLI end-to-end test that verifies Redis, PostgreSQL, and Azure Storage emulator data persists across AppHost runs when resources use persistent lifetime.
  • Adds shared functional-test helpers that assert persistent resources reuse the same container across AppHost runs.
  • Adds persistent lifetime container reuse coverage across supported container-backed integrations.
  • Adds Azure RunAsEmulator mode coverage for run vs. publish behavior.

Validation: Not run in this session; opening as draft for validation.

Fixes # (issue)

Checklist

  • Is this feature complete?
    • Yes. Ready to ship.
    • No. Follow-up changes expected.
  • Are you including unit tests for the changes and scenario tests if relevant?
    • Yes
    • No
  • Did you add public API?
    • Yes
      • If yes, did you have an API Review for it?
        • Yes
        • No
      • Did you add <remarks /> and <code /> elements on your triple slash comments?
        • Yes
        • No
    • No
  • Does the change make any security assumptions or guarantees?
    • Yes
      • If yes, have you done a threat model and had a security review?
        • Yes
        • No
    • No

Copilot AI and others added 6 commits June 3, 2026 15:17
Co-authored-by: danegsta <50252651+danegsta@users.noreply.github.com>
Co-authored-by: danegsta <50252651+danegsta@users.noreply.github.com>
Co-authored-by: danegsta <50252651+danegsta@users.noreply.github.com>
Co-authored-by: danegsta <50252651+danegsta@users.noreply.github.com>
Co-authored-by: danegsta <50252651+danegsta@users.noreply.github.com>
Co-authored-by: danegsta <50252651+danegsta@users.noreply.github.com>
@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 17871

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 17871"

David Negstad (danegsta) and others added 2 commits June 3, 2026 10:01
Use an isolated user-secrets store for persistent container test runs so integration defaults can persist generated parameters across AppHost restarts. Avoid the CI container registry override for Azurite because the mirrored tag is unavailable.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Let persistent container tests use the same container registry configuration path as normal TestDistributedApplicationBuilder usage instead of forcing the test mirror from the helper.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@danegsta
David Negstad (danegsta) marked this pull request as ready for review June 3, 2026 17:32
Copilot AI review requested due to automatic review settings June 3, 2026 17:32

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds automated coverage to validate “persistent lifetime” behavior for container-backed resources across AppHost restarts, plus targeted Azure emulator mode assertions, and a CLI end-to-end persistence scenario.

Changes:

  • Introduces a shared test helper to assert persistent resources reuse the same underlying container across AppHost runs.
  • Adds per-integration functional tests covering persistent lifetime container reuse (Redis/Postgres/etc.) and Azure Storage emulator persistence.
  • Adds Azure RunAsEmulator run-vs-publish mode tests and a CLI E2E test that verifies data persists across restarts.

Reviewed changes

Copilot reviewed 19 out of 19 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
tests/Aspire.Hosting.Valkey.Tests/ValkeyFunctionalTests.cs Adds persistent-lifetime container reuse functional test for Valkey.
tests/Aspire.Hosting.Tests/Utils/TestDistributedApplicationBuilder.cs Extends helper to accept args when creating builders with the test container registry override.
tests/Aspire.Hosting.Tests/Utils/PersistentContainerTestHelpers.cs New shared helper for asserting persistent container reuse across AppHost runs.
tests/Aspire.Hosting.SqlServer.Tests/SqlServerFunctionalTests.cs Adds persistent-lifetime container reuse functional test for SQL Server.
tests/Aspire.Hosting.Seq.Tests/SeqFunctionalTests.cs Adds persistent-lifetime container reuse functional test for Seq.
tests/Aspire.Hosting.Redis.Tests/RedisFunctionalTests.cs Adds persistent-lifetime container reuse functional test for Redis.
tests/Aspire.Hosting.RabbitMQ.Tests/RabbitMQFunctionalTests.cs Adds persistent-lifetime container reuse functional test for RabbitMQ.
tests/Aspire.Hosting.Qdrant.Tests/QdrantFunctionalTests.cs Adds persistent-lifetime container reuse functional test for Qdrant.
tests/Aspire.Hosting.PostgreSQL.Tests/PostgresFunctionalTests.cs Adds persistent-lifetime container reuse functional test for PostgreSQL.
tests/Aspire.Hosting.Oracle.Tests/OracleFunctionalTests.cs Adds persistent-lifetime container reuse functional test for Oracle.
tests/Aspire.Hosting.Nats.Tests/NatsFunctionalTests.cs Adds persistent-lifetime container reuse functional test for NATS.
tests/Aspire.Hosting.MySql.Tests/MySqlFunctionalTests.cs Adds persistent-lifetime container reuse functional test for MySQL.
tests/Aspire.Hosting.MongoDB.Tests/MongoDbFunctionalTests.cs Adds persistent-lifetime container reuse functional test for MongoDB.
tests/Aspire.Hosting.Milvus.Tests/MilvusFunctionalTests.cs Adds persistent-lifetime container reuse functional test for Milvus.
tests/Aspire.Hosting.Kafka.Tests/KafkaFunctionalTests.cs Adds persistent-lifetime container reuse functional test for Kafka.
tests/Aspire.Hosting.Garnet.Tests/GarnetFunctionalTests.cs Adds persistent-lifetime container reuse functional test for Garnet.
tests/Aspire.Hosting.Azure.Tests/AzureStorageEmulatorFunctionalTests.cs Adds persistent-lifetime container reuse functional test for Azure Storage emulator.
tests/Aspire.Hosting.Azure.Tests/AzureRunAsEmulatorModeTests.cs New tests validating RunAsEmulator behavior differs correctly between run and publish modes.
tests/Aspire.Cli.EndToEnd.Tests/PersistentContainerEndToEndTests.cs New CLI E2E validating Redis/Postgres/Azurite data persists across aspire start/stop cycles.

Comment thread tests/Aspire.Hosting.Tests/Utils/PersistentContainerTestHelpers.cs
Comment thread tests/Aspire.Hosting.Tests/Utils/PersistentContainerTestHelpers.cs Outdated
Comment thread tests/Aspire.Hosting.Tests/Utils/PersistentContainerTestHelpers.cs
Avoid blocking the test server on dependency health checks in the CLI E2E scenario. The endpoint verification already retries real Redis, PostgreSQL, and Azure Storage operations after the resources have started.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
David Negstad (danegsta) and others added 6 commits June 3, 2026 10:52
Assert persistent container tests observe container.lifetime=Persistent and compare the actual container.id across AppHost runs instead of the stable DCP resource ID.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@danegsta
David Negstad (danegsta) enabled auto-merge (squash) June 3, 2026 20:03
@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

CLI E2E Tests unknown — 113 passed, 0 failed, 2 unknown (commit 9322d65)

View all recordings
- Test Detail
AddPackageInteractiveWhileAppHostRunningDetached Recording · Job · CLI logs
AddPackageWhileAppHostRunningDetached Recording · Job · CLI logs
AgentCommands_AllHelpOutputs_AreCorrect Recording · Job · CLI logs
AgentInitCommand_DefaultSelection_InstallsDefaultSkills Recording · Job · CLI logs
AgentInitCommand_MigratesDeprecatedConfig Recording · Job · CLI logs
AgentInit_NonInteractive_BundleOnlySkillsNotInCatalog Recording · Job · CLI logs
AgentMcpListStructuredLogsReturnsLogsFromStarterApp Recording · Job · CLI logs
AgentMcpListStructuredLogsReturnsLogsFromStarterApp_DevLocalhost Recording · Job · CLI logs
AgentMcpListStructuredLogsReturnsLogsFromStarterApp_Isolated Recording · Job · CLI logs
AllPublishMethodsBuildDockerImages Recording · Job · CLI logs
AspireAddAndStartWorkAgainstLegacyAppHostTs Recording · Job · CLI logs
AspireAddPackageVersionToDirectoryPackagesProps Recording · Job · CLI logs
AspireInitSingleFileAppHostRunsViaDotnetRunAppHost Recording · Job · CLI logs
AspireInit_ExistingAppHostDir_RecreatesNuGetConfigKeepsFiles Recording · Job · CLI logs
AspireInit_SolutionFile_BuildsAgainstChannelHive Recording · Job · CLI logs
AspireStartUpdatesStaleTypeScriptAppHostPath Recording · Job · CLI logs
AspireUpdateRemovesAppHostPackageVersionFromDirectoryPackagesProps Recording · Job · CLI logs
AspireUpdateRemovesOrphanAppHostPackageVersionWhenSdkAlreadyCurrent Recording · Job · CLI logs
Banner_DisplayedOnFirstRun Recording · Job · CLI logs
Banner_DisplayedWithExplicitFlag Recording · Job · CLI logs
Banner_NotDisplayedWithNoLogoFlag Recording · Job · CLI logs
CertificatesClean_RemovesCertificates Recording · Job · CLI logs
CertificatesTrust_WithNoCert_CreatesAndTrustsCertificate Recording · Job · CLI logs
CertificatesTrust_WithUntrustedCert_TrustsCertificate Recording · Job · CLI logs
ConfigSetGet_CreatesNestedJsonFormat Recording · Job · CLI logs
CreateAndRunAspireStarterProject Recording · Job · CLI logs
CreateAndRunAspireStarterProjectWithBundle Recording · Job · CLI logs
CreateAndRunEmptyAppHostProject Recording · Job · CLI logs
CreateAndRunJavaEmptyAppHostProject Recording · Job · CLI logs
CreateAndRunJsReactProject Recording · Job · CLI logs
CreateAndRunPolyglotAppHostWithDevLocalhostUrls Recording · Job · CLI logs
CreateAndRunPythonReactProject Recording · Job · CLI logs
CreateAndRunTypeScriptEmptyAppHostProject Recording · Job · CLI logs
CreateAndRunTypeScriptStarterProject Recording · Job · CLI logs
CreateJavaAppHostWithViteApp Recording · Job · CLI logs
CreateTypeScriptAppHostWithViteApp_UsesConfiguredToolchain Recording · Job · CLI logs
DashboardRunWithAgentMcpListTracesReturnsNoTraces Recording · Job · CLI logs
DashboardRunWithAgentMcpListTracesReturnsNoTraces_DevLocalhost Recording · Job · CLI logs
DashboardRunWithOtelTracesReturnsNoTraces Recording · Job · CLI logs
DashboardRunWithOtelTracesReturnsNoTraces_DevLocalhost Recording · Job · CLI logs
DeployK8sBasicApiService Recording · Job · CLI logs
DeployK8sWithExternalHelmChart Recording · Job · CLI logs
DeployK8sWithGarnet Recording · Job · CLI logs
DeployK8sWithMongoDB Recording · Job · CLI logs
DeployK8sWithMySql Recording · Job · CLI logs
DeployK8sWithPostgres Recording · Job · CLI logs
DeployK8sWithRabbitMQ Recording · Job · CLI logs
DeployK8sWithRedis Recording · Job · CLI logs
DeployK8sWithSqlServer Recording · Job · CLI logs
DeployK8sWithValkey Recording · Job · CLI logs
DeployTypeScriptAppToKubernetes Recording · Job · CLI logs
DescribeCommandResolvesReplicaNames Recording · Job · CLI logs
DescribeCommandShowsRunningResources Recording · Job · CLI logs
DetachFormatJsonProducesValidJson Recording · Job · CLI logs
DetachFormatJsonProducesValidJsonWhenRestartingExistingInstance Recording · Job · CLI logs
DoPublishAndDeployListStepsWork Recording · Job · CLI logs
DocsCommand_RendersInteractiveMarkdownFromLocalSource Recording · Job · CLI logs
DoctorCommand_DetectsDeprecatedAgentConfig Recording · Job · CLI logs
DoctorCommand_TypeScriptAppHostReportsMissingConfiguredToolchain Recording · Job · CLI logs
DoctorCommand_WithSslCertDir_ShowsTrusted Recording · Job · CLI logs
DoctorCommand_WithoutSslCertDir_ShowsPartiallyTrusted Recording · Job · CLI logs
DotNetRunFileBasedAppHostUsesAspireCliBundle Recording · Job · CLI logs
DotNetRunProjectAppHostUsesAspireCliBundle Recording · Job · CLI logs
GatewayWithoutExternalEndpoint_FailsPublishWithGuidance Recording · Job · CLI logs
GeneratedAspireDevScript_StartsWatchMode_WithConfiguredToolchain Recording · Job · CLI logs
GlobalMigration_HandlesCommentsAndTrailingCommas Recording · Job · CLI logs
GlobalMigration_HandlesMalformedLegacyJson Recording · Job · CLI logs
GlobalMigration_PreservesAllValueTypes Recording · Job · CLI logs
GlobalMigration_SkipsWhenNewConfigExists Recording · Job · CLI logs
GlobalSettings_MigratedFromLegacyFormat Recording · Job · CLI logs
IngressWithoutExternalEndpoint_FailsPublishWithGuidance Recording · Job · CLI logs
InitTypeScriptAppHost_AugmentsExistingViteRepoInWorkspaceSubdirectory Recording · Job · CLI logs
InteractiveCSharpInitCreatesExpectedFiles Recording · Job · CLI logs
InvalidAppHostPathWithComments_IsHealedOnRun Recording · Job · CLI logs
JavaScriptHostingApisRunFromTypeScriptAppHost Recording · Job · CLI logs
LatestCliCanStartStableChannelAppHost Recording · Job · CLI logs
LatestCliCanStartStableChannelTypeScriptAppHost Recording · Job · CLI logs
LegacySettingsMigration_AdjustsRelativeAppHostPath Recording · Job · CLI logs
LogsCommandShowsResourceLogs Recording · Job · CLI logs
OtelLogsReturnsStructuredLogsFromStarterApp Recording · Job · CLI logs
OtelLogsReturnsStructuredLogsFromStarterAppIsolated Recording · Job · CLI logs
PersistentContainersPreserveDataAcrossAppHostRuns Recording · Job · CLI logs
PsCommandListsRunningAppHost Recording · Job · CLI logs
PsFormatJsonOutputsOnlyJsonToStdout Recording · Job · CLI logs
PublishJavaScriptPatternsGeneratesExpectedDockerComposeArtifacts Recording · Job · CLI logs
PublishWithConfigureEnvFileUpdatesEnvOutput Recording · Job · CLI logs
PublishWithDockerComposeServiceCallbackSucceeds Recording · Job · CLI logs
PublishWithoutOutputPathUsesAppHostDirectoryDefault Recording · Job · CLI logs
ResourceCommand_FailedExec_ShowsLogPathAndLogHasEntries Recording · Job · CLI logs
ResourceCommand_SetAndDeleteParameterUpdatesDescribeOutput Recording · Job · CLI logs
RestoreGeneratesSdkFiles Recording · Job · CLI logs
RestoreGeneratesSdkFiles_WithConfiguredToolchain Recording · Job · CLI logs
RestoreRefreshesGeneratedSdkAfterAddingIntegration Recording · Job · CLI logs
RestoreSupportsConfigOnlyHelperPackageAndCrossPackageTypes Recording · Job · CLI logs
RunFromParentDirectory_UsesExistingConfigNearAppHost Recording · Job · CLI logs
RunReportsSyntaxErrorsForDotNetAppHost Recording · Job · CLI logs
RunReportsSyntaxErrorsForTypeScriptAppHost Recording · Job · CLI logs
SecretCrudOnDotNetAppHost Recording · Job · CLI logs
SecretCrudOnTypeScriptAppHost Recording · Job · CLI logs
StagingChannel_ConfigureAndVerifySettings_ThenSwitchChannels Recording · Job · CLI logs
StartAndWaitForTypeScriptSqlServerAppHostWithNativeAssets Recording · Job · CLI logs
StartReportsSyntaxErrorsForDotNetAppHost Recording · Job · CLI logs
StartReportsSyntaxErrorsForTypeScriptAppHost Recording · Job · CLI logs
StopAllAppHostsFromAppHostDirectory Recording · Job · CLI logs
StopJavaPolyglotAppHostUsingApphostDirectory Recording · Job · CLI logs
StopNonInteractiveSingleAppHost Recording · Job · CLI logs
StopTypeScriptPolyglotAppHostUsingApphostDirectory Recording · Job · CLI logs
StopWithNoRunningAppHostExitsSuccessfully Recording · Job · CLI logs
TypeScriptAppHostRunDoesNotDeadlockWhenLazyOptionsInvokeAsyncCallback Recording · Job · CLI logs
TypeScriptAppHostWithVite_AllowsDifferentGuestPkgManager Recording · Job · CLI logs
UnAwaitedChainsCompileWithAutoResolvePromises Recording · Job · CLI logs
UpdateToStable_CSharpEmptyAppHost_KeepsConfigChannel Recording · Job · CLI logs
UpdateToStable_CSharpSingleFileInit_KeepsConfigChannel Recording · Job · CLI logs
UpdateToStable_TypeScriptSingleFileInit_KeepsConfigChannel Recording · Job · CLI logs
UpdateToStable_TypeScript_PreviewsStablePkgsAndKeepsChannel Recording · Job · CLI logs

📹 Recordings uploaded automatically from CI run #26907155580

@danegsta

Copy link
Copy Markdown
Member

/backport to release/13.4

@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

Started backporting to release/13.4 (link to workflow run)

Comment thread tests/Aspire.Cli.EndToEnd.Tests/PersistentContainerEndToEndTests.cs
@danegsta
David Negstad (danegsta) merged commit a46c260 into main Jun 3, 2026
660 of 663 checks passed
@danegsta
David Negstad (danegsta) deleted the copilot/test-persistent-containers branch June 3, 2026 20:34
@github-actions github-actions Bot added this to the 13.5 milestone Jun 3, 2026
Mitch Denny (mitchdenny) pushed a commit to mitchdenny/aspire that referenced this pull request Jun 9, 2026
* Add per-integration persistence tests

Co-authored-by: danegsta <50252651+danegsta@users.noreply.github.com>

* Add CLI persistent container E2E test

Co-authored-by: danegsta <50252651+danegsta@users.noreply.github.com>

* Fix persistence test compilation

Co-authored-by: danegsta <50252651+danegsta@users.noreply.github.com>

* Address persistence test review feedback

Co-authored-by: danegsta <50252651+danegsta@users.noreply.github.com>

* Add Azure emulator mode coverage

Co-authored-by: danegsta <50252651+danegsta@users.noreply.github.com>

* Address emulator mode test review feedback

Co-authored-by: danegsta <50252651+danegsta@users.noreply.github.com>

* Stabilize persistent container tests

Use an isolated user-secrets store for persistent container test runs so integration defaults can persist generated parameters across AppHost restarts. Avoid the CI container registry override for Azurite because the mirrored tag is unavailable.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Stop forcing test container registry in persistent helper

Let persistent container tests use the same container registry configuration path as normal TestDistributedApplicationBuilder usage instead of forcing the test mirror from the helper.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Use start waits in persistent container E2E

Avoid blocking the test server on dependency health checks in the CLI E2E scenario. The endpoint verification already retries real Redis, PostgreSQL, and Azure Storage operations after the resources have started.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Compare Docker container IDs in persistent tests

Assert persistent container tests observe container.lifetime=Persistent and compare the actual container.id across AppHost runs instead of the stable DCP resource ID.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Read synthetic user secrets in persistent tests

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Allow persistent tests to opt into test registry

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Make persistent test secrets cleanup best effort

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix persistent container E2E networking

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Propagate CLI E2E start timeout

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: danegsta <50252651+danegsta@users.noreply.github.com>
Co-authored-by: David Negstad <David.Negstad@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions github-actions Bot locked and limited conversation to collaborators Jul 4, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants