fix: initialize selected runtime for live playout

This commit is contained in:
2026-07-28 20:44:20 +09:00
parent 18d40e892f
commit 818acad646
24 changed files with 906 additions and 391 deletions

View File

@@ -179,7 +179,7 @@ public sealed class LegacyIniDatabaseOptionsLoaderTests
}
[Fact]
public void Runtime_DevelopmentLiveUsesOnlyExactLocalAppDataIni()
public void Runtime_DevelopmentLiveUsesProtectedLocalAppDataIniWhenNoOperatorResIsSelected()
{
using var localApplicationData = TemporaryDirectory.Create();
var resourceDirectory = Path.Combine(
@@ -200,7 +200,8 @@ public sealed class LegacyIniDatabaseOptionsLoaderTests
environmentName,
"stale-environment.invalid");
runtime = DatabaseRuntime.CreateDevelopmentLiveLocalOverride(
localApplicationData.Path);
localApplicationData.Path,
operatorResourceDirectory: null);
}
finally
{
@@ -213,6 +214,170 @@ public sealed class LegacyIniDatabaseOptionsLoaderTests
Assert.Equal("maria.dev.invalid", runtime.Options.MariaDb.Host);
}
[Fact]
public void Runtime_DevelopmentLiveSelectedResIniIsAuthoritativeAndIgnoresEnvironment()
{
using var localApplicationData = TemporaryDirectory.Create();
var protectedResourceDirectory = Path.Combine(
localApplicationData.Path,
"MBN_STOCK_WEBVIEW",
"Res");
Directory.CreateDirectory(protectedResourceDirectory);
File.WriteAllBytes(
Path.Combine(protectedResourceDirectory, "MmoneyCoder.ini"),
TemporaryLegacyIni.ValidUtf8Bytes());
using var selected = TemporaryLegacyIni.Create(Encoding.UTF8.GetBytes(
"""
[Oracle]
ConnectionName=selected.oracle.invalid:1523/SELECTED
ID=selected-oracle-user
Pass=selected-oracle-password
[Maria]
ConnectionName=selected.maria.invalid:3308/selected_stock
ID=selected-maria-user
Pass=selected-maria-password
"""));
var environmentOverrides = new Dictionary<string, string>
{
["MBN_STOCK_ORACLE_HOST"] = "stale-environment.invalid",
["MBN_STOCK_ORACLE_PORT"] = "not-an-integer",
["MBN_STOCK_MARIADB_TLS_MODE"] = "Required"
};
var originalEnvironment = environmentOverrides.Keys.ToDictionary(
static name => name,
Environment.GetEnvironmentVariable,
StringComparer.Ordinal);
DatabaseRuntime runtime;
try
{
foreach (var pair in environmentOverrides)
{
Environment.SetEnvironmentVariable(pair.Key, pair.Value);
}
runtime = DatabaseRuntime.CreateDevelopmentLiveLocalOverride(
localApplicationData.Path,
selected.Directory);
}
finally
{
foreach (var pair in originalEnvironment)
{
Environment.SetEnvironmentVariable(pair.Key, pair.Value);
}
}
Assert.Equal("selected.oracle.invalid", runtime.Options.Oracle.Host);
Assert.Equal(1523, runtime.Options.Oracle.Port);
Assert.Equal("SELECTED", runtime.Options.Oracle.Sid);
Assert.Equal("selected.maria.invalid", runtime.Options.MariaDb.Host);
Assert.Equal(3308, runtime.Options.MariaDb.Port);
Assert.Equal("selected_stock", runtime.Options.MariaDb.Database);
Assert.Equal(MariaDbTlsMode.Disabled, runtime.Options.MariaDb.TlsMode);
}
[Fact]
public void Runtime_DevelopmentLiveReadsSelectedIniOnEveryCreation()
{
using var selected = TemporaryLegacyIni.Create(Encoding.UTF8.GetBytes(
"""
[Oracle]
ConnectionName=first.oracle.invalid:1521/FIRST
ID=oracle-user
Pass=oracle-password
[Maria]
ConnectionName=first.maria.invalid:3306/first_stock
ID=maria-user
Pass=maria-password
"""));
var first = DatabaseRuntime.CreateDevelopmentLiveLocalOverride(selected.Directory);
File.WriteAllBytes(selected.Path, Encoding.UTF8.GetBytes(
"""
[Oracle]
ConnectionName=second.oracle.invalid:1521/SECOND
ID=oracle-user
Pass=oracle-password
[Maria]
ConnectionName=second.maria.invalid:3306/second_stock
ID=maria-user
Pass=maria-password
"""));
var second = DatabaseRuntime.CreateDevelopmentLiveLocalOverride(selected.Directory);
Assert.Equal("first.oracle.invalid", first.Options.Oracle.Host);
Assert.Equal("first.maria.invalid", first.Options.MariaDb.Host);
Assert.Equal("second.oracle.invalid", second.Options.Oracle.Host);
Assert.Equal("second.maria.invalid", second.Options.MariaDb.Host);
}
[Fact]
public void Runtime_DevelopmentLiveSelectedResDoesNotDependOnLocalAppDataRoot()
{
using var selected = TemporaryLegacyIni.CreateValidUtf8();
var runtime = DatabaseRuntime.CreateDevelopmentLiveLocalOverride(
localApplicationData: string.Empty,
operatorResourceDirectory: selected.Directory);
Assert.Equal("oracle.dev.invalid", runtime.Options.Oracle.Host);
Assert.Equal("maria.dev.invalid", runtime.Options.MariaDb.Host);
}
[Fact]
public void Runtime_DevelopmentLiveSelectedResDoesNotFallBackWhenExactIniIsMissing()
{
using var localApplicationData = TemporaryDirectory.Create();
var protectedResourceDirectory = Path.Combine(
localApplicationData.Path,
"MBN_STOCK_WEBVIEW",
"Res");
Directory.CreateDirectory(protectedResourceDirectory);
File.WriteAllBytes(
Path.Combine(protectedResourceDirectory, "MmoneyCoder.ini"),
TemporaryLegacyIni.ValidUtf8Bytes());
using var selectedResourceDirectory = TemporaryDirectory.Create();
File.WriteAllBytes(
Path.Combine(selectedResourceDirectory.Path, "MmoneyCoder.ini.bak"),
TemporaryLegacyIni.ValidUtf8Bytes());
Assert.Throws<DatabaseConfigurationException>(
() => DatabaseRuntime.CreateDevelopmentLiveLocalOverride(
localApplicationData.Path,
selectedResourceDirectory.Path));
}
[Fact]
public void Runtime_DevelopmentLiveSelectedResDoesNotFallBackWhenIniIsInvalid()
{
const string secret = "selected-secret-sentinel";
using var localApplicationData = TemporaryDirectory.Create();
var protectedResourceDirectory = Path.Combine(
localApplicationData.Path,
"MBN_STOCK_WEBVIEW",
"Res");
Directory.CreateDirectory(protectedResourceDirectory);
File.WriteAllBytes(
Path.Combine(protectedResourceDirectory, "MmoneyCoder.ini"),
TemporaryLegacyIni.ValidUtf8Bytes());
using var selected = TemporaryLegacyIni.Create(Encoding.UTF8.GetBytes(
"""
[Oracle]
ConnectionName=invalid
ID=oracle-user
Pass=selected-secret-sentinel
"""));
var exception = Assert.Throws<DatabaseConfigurationException>(
() => DatabaseRuntime.CreateDevelopmentLiveLocalOverride(
localApplicationData.Path,
selected.Directory));
Assert.DoesNotContain(secret, exception.ToString(), StringComparison.Ordinal);
Assert.DoesNotContain(selected.Path, exception.ToString(), StringComparison.Ordinal);
}
[Fact]
public void Runtime_DevelopmentLiveFailsClosedWhenBothProtectedProfilesAreMissing()
{
@@ -224,7 +389,8 @@ public sealed class LegacyIniDatabaseOptionsLoaderTests
Assert.Throws<DatabaseConfigurationException>(
() => DatabaseRuntime.CreateDevelopmentLiveLocalOverride(
localApplicationData.Path));
localApplicationData.Path,
operatorResourceDirectory: null));
}
[Fact]
@@ -260,7 +426,8 @@ public sealed class LegacyIniDatabaseOptionsLoaderTests
""");
var runtime = DatabaseRuntime.CreateDevelopmentLiveLocalOverride(
localApplicationData.Path);
localApplicationData.Path,
operatorResourceDirectory: null);
Assert.Equal("json.oracle.invalid", runtime.Options.Oracle.Host);
Assert.Equal("json.maria.invalid", runtime.Options.MariaDb.Host);
@@ -280,7 +447,8 @@ public sealed class LegacyIniDatabaseOptionsLoaderTests
Assert.Throws<DatabaseConfigurationException>(
() => DatabaseRuntime.CreateDevelopmentLiveLocalOverride(
localApplicationData.Path));
localApplicationData.Path,
operatorResourceDirectory: null));
}
[Fact]
@@ -296,7 +464,8 @@ public sealed class LegacyIniDatabaseOptionsLoaderTests
Assert.Throws<DatabaseConfigurationException>(
() => DatabaseRuntime.CreateDevelopmentLiveLocalOverride(
localApplicationData.Path));
localApplicationData.Path,
operatorResourceDirectory: null));
}
[Fact]