feat: add two-folder first-run playout setup

This commit is contained in:
2026-07-27 01:00:57 +09:00
parent 483b2785a0
commit ee82f0be42
14 changed files with 1753 additions and 278 deletions

View File

@@ -342,11 +342,11 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
sourceOnlyMessage.Attribute("Condition")?.Value,
StringComparison.Ordinal);
Assert.Contains(
"source-only DryRun",
"safe first-run setup app",
sourceOnlyMessage.Attribute("Text")?.Value,
StringComparison.Ordinal);
Assert.Contains(
"Initialize-ExistingDevelopmentPc.ps1",
"select the existing Cuts and Res folders",
sourceOnlyMessage.Attribute("Text")?.Value,
StringComparison.Ordinal);
@@ -434,7 +434,7 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
element => element.Attribute("Condition") is not null);
Assert.Equal("'$(LegacyRuntimeSourceRoot)' == ''", sourceRoot.Attribute("Condition")!.Value);
Assert.Contains("MBN_STOCK_N\\MBN_STOCK_N\\bin\\Debug", sourceRoot.Value,
Assert.Contains(".first-run-runtime-not-configured-0F72B3C8", sourceRoot.Value,
StringComparison.Ordinal);
var target = Assert.Single(
@@ -787,7 +787,19 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
initializer,
StringComparison.Ordinal);
Assert.Contains("& dotnet build $ProjectPath -c Debug '-p:Platform=x64'",
Assert.Contains("& $DotNetPath build $ProjectPath",
initializer,
StringComparison.Ordinal);
Assert.Contains(
"'-p:LegacyRuntimeAssetsMode=Required'",
initializer,
StringComparison.Ordinal);
Assert.Contains(
"$runtimeRootProperty = \"-p:LegacyRuntimeSourceRoot=$ExpectedRuntimeRoot\"",
initializer,
StringComparison.Ordinal);
Assert.Contains(
"Get-Command -Name 'dotnet.exe' -CommandType Application",
initializer,
StringComparison.Ordinal);
Assert.Contains(
@@ -808,23 +820,31 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
var runtimeWrite = initializer.LastIndexOf(
"Set-RuntimeBindingAtomically",
StringComparison.Ordinal);
var pinWrite = initializer.LastIndexOf(
"Write-ProtectedUtf8TextAtomically",
StringComparison.Ordinal);
var databaseWrite = initializer.LastIndexOf(
"Copy-DatabaseProfileAtomically",
StringComparison.Ordinal);
var build = initializer.LastIndexOf(
"Invoke-DebugBuildAndVerify",
StringComparison.Ordinal);
var cleanup = initializer.LastIndexOf(
"-Path $rollbackRoot",
var finalK3dVerification = initializer.LastIndexOf(
"$finalNativeHash = (",
StringComparison.Ordinal);
var liveWrite = initializer.LastIndexOf(
"& $liveInitializerPath @liveArguments",
StringComparison.Ordinal);
Assert.True(runtimeWrite >= 0);
Assert.True(databaseWrite > runtimeWrite);
Assert.True(build > databaseWrite);
Assert.True(cleanup > build);
Assert.True(liveWrite > cleanup);
var cleanup = initializer.LastIndexOf(
"-Path $rollbackRoot",
StringComparison.Ordinal);
Assert.True(pinWrite >= 0);
Assert.True(build > pinWrite);
Assert.True(databaseWrite > build);
Assert.True(finalK3dVerification > databaseWrite);
Assert.True(liveWrite > finalK3dVerification);
Assert.True(runtimeWrite > liveWrite);
Assert.True(cleanup > runtimeWrite);
}
[Fact]
@@ -856,6 +876,26 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
"$Description rollback did not restore the exact bytes and ACL.",
initializer,
StringComparison.Ordinal);
Assert.Contains(
"'Local\\MBN_STOCK_WEBVIEW.ExistingDevelopmentPcInitialization.v1'",
initializer,
StringComparison.Ordinal);
Assert.Contains(
"Another existing-development-PC initialization is already running.",
initializer,
StringComparison.Ordinal);
Assert.Contains(
"Development Live base configuration rollback failed:",
initializer,
StringComparison.Ordinal);
Assert.Contains(
"The durable pin remains at",
initializer,
StringComparison.Ordinal);
Assert.Contains(
"anchor could not be restored:",
initializer,
StringComparison.Ordinal);
Assert.Contains(
"Set-UserOnlyDirectoryAcl -Path $rollbackRoot",
initializer,
@@ -968,8 +1008,11 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
var buildVerification = initializer.LastIndexOf(
"Invoke-DebugBuildAndVerify",
StringComparison.Ordinal);
var setupCleanup = initializer.LastIndexOf(
"-Path $rollbackRoot",
var pinIssue = initializer.LastIndexOf(
"Write-ProtectedUtf8TextAtomically",
StringComparison.Ordinal);
var finalK3dVerification = initializer.LastIndexOf(
"$finalNativeHash = (",
StringComparison.Ordinal);
var liveIssue = initializer.LastIndexOf(
"$liveResults = @(& $liveInitializerPath @liveArguments)",
@@ -977,14 +1020,24 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
var liveJsonVerification = initializer.LastIndexOf(
"-ExpectedJson ([string] $livePreflight.AuthorizationJson)",
StringComparison.Ordinal);
var bindingCommit = initializer.LastIndexOf(
"Set-RuntimeBindingAtomically",
StringComparison.Ordinal);
var setupCleanup = initializer.LastIndexOf(
"-Path $rollbackRoot",
StringComparison.Ordinal);
var failClosedLiveRemoval = initializer.LastIndexOf(
"Remove-DevelopmentLiveAuthorizationFailClosed",
StringComparison.Ordinal);
Assert.True(firstPersistentLiveInvalidation >= 0);
Assert.True(pinIssue >= 0);
Assert.True(pinIssue < firstPersistentLiveInvalidation);
Assert.True(firstPersistentLiveInvalidation < setupDirectoryCreation);
Assert.True(buildVerification < setupCleanup);
Assert.True(setupCleanup < liveIssue);
Assert.True(setupDirectoryCreation < buildVerification);
Assert.True(buildVerification < finalK3dVerification);
Assert.True(finalK3dVerification < liveIssue);
Assert.True(liveIssue < liveJsonVerification);
Assert.True(liveJsonVerification < bindingCommit);
Assert.True(bindingCommit < setupCleanup);
Assert.True(liveJsonVerification < failClosedLiveRemoval);
Assert.Contains(
"Development Live initializer returned unexpected success-stream output.",