Merge branch 'dev' into V6

This commit is contained in:
Jordan Dominion
2023-08-25 10:40:55 -04:00
4 changed files with 20 additions and 64 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<!-- This is in it's own file to help incremental building, changing it causes a complete rebuild of the web panel -->
<TgsControlPanelVersion>4.23.1</TgsControlPanelVersion>
<TgsControlPanelVersion>4.24.0</TgsControlPanelVersion>
</PropertyGroup>
</Project>
+5 -1
View File
@@ -24,6 +24,11 @@ namespace Tgstation.Server.Host
/// </summary>
sealed class ServerFactory : IServerFactory
{
/// <summary>
/// Name of the appsettings file.
/// </summary>
public const string AppSettings = "appsettings";
/// <summary>
/// The <see cref="IAssemblyInformationProvider"/> for the <see cref="ServerFactory"/>.
/// </summary>
@@ -60,7 +65,6 @@ namespace Tgstation.Server.Host
args[oldArgs.Length] = "--hostBuilder:reloadConfigOnChange=false";
}
const string AppSettings = "appsettings";
const string AppSettingsRelocationKey = $"--{AppSettings}-base-path=";
var appsettingsRelativeBasePathArgument = args.FirstOrDefault(arg => arg.StartsWith(AppSettingsRelocationKey, StringComparison.Ordinal));
+4 -28
View File
@@ -12,7 +12,6 @@ using System.Threading.Tasks;
using Microsoft.Data.SqlClient;
using Microsoft.Data.Sqlite;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
@@ -87,11 +86,6 @@ namespace Tgstation.Server.Host.Setup
/// </summary>
readonly InternalConfiguration internalConfiguration;
/// <summary>
/// A <see cref="TaskCompletionSource"/> that will complete when the <see cref="IConfiguration"/> is reloaded.
/// </summary>
TaskCompletionSource reloadTcs;
/// <summary>
/// Initializes a new instance of the <see cref="SetupWizard"/> class.
/// </summary>
@@ -103,7 +97,6 @@ namespace Tgstation.Server.Host.Setup
/// <param name="platformIdentifier">The value of <see cref="platformIdentifier"/>.</param>
/// <param name="asyncDelayer">The value of <see cref="asyncDelayer"/>.</param>
/// <param name="applicationLifetime">The value of <see cref="applicationLifetime"/>.</param>
/// <param name="configuration">The <see cref="IConfiguration"/> in use.</param>
/// <param name="generalConfigurationOptions">The <see cref="IOptions{TOptions}"/> containing the value of <see cref="generalConfiguration"/>.</param>
/// <param name="internalConfigurationOptions">The <see cref="IOptions{TOptions}"/> containing the value of <see cref="internalConfiguration"/>.</param>
public SetupWizard(
@@ -115,7 +108,6 @@ namespace Tgstation.Server.Host.Setup
IPlatformIdentifier platformIdentifier,
IAsyncDelayer asyncDelayer,
IHostApplicationLifetime applicationLifetime,
IConfiguration configuration,
IOptions<GeneralConfiguration> generalConfigurationOptions,
IOptions<InternalConfiguration> internalConfigurationOptions)
{
@@ -127,16 +119,9 @@ namespace Tgstation.Server.Host.Setup
this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
this.applicationLifetime = applicationLifetime ?? throw new ArgumentNullException(nameof(applicationLifetime));
ArgumentNullException.ThrowIfNull(configuration);
generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
internalConfiguration = internalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(internalConfigurationOptions));
configuration
.GetReloadToken()
.RegisterChangeCallback(
state => reloadTcs?.TrySetResult(),
null);
}
/// <inheritdoc />
@@ -578,6 +563,8 @@ namespace Tgstation.Server.Host.Setup
csb.Password = password;
}
csb.Encrypt = encrypt;
CreateTestConnection(csb.ConnectionString);
csb.InitialCatalog = databaseName;
databaseConfiguration.ConnectionString = csb.ConnectionString;
@@ -1015,25 +1002,14 @@ namespace Tgstation.Server.Host.Setup
var configBytes = Encoding.UTF8.GetBytes(serializedYaml);
reloadTcs = new TaskCompletionSource();
try
{
await ioManager.WriteAllBytes(
userConfigFileName,
configBytes,
cancellationToken);
// Ensure the reload
if (generalConfiguration.SetupWizardMode != SetupWizardMode.Only)
using (cancellationToken.Register(() => reloadTcs.TrySetCanceled()))
await reloadTcs.Task;
}
catch (OperationCanceledException)
{
throw;
}
catch (Exception e)
catch (Exception e) when (e is not OperationCanceledException)
{
await console.WriteAsync(e.Message, true, cancellationToken);
await console.WriteAsync(null, true, cancellationToken);
@@ -1109,7 +1085,7 @@ namespace Tgstation.Server.Host.Setup
var userConfigFileName = ioManager.ConcatPath(
internalConfiguration.AppSettingsBasePath,
String.Format(CultureInfo.InvariantCulture, "appsettings.{0}.yml", hostingEnvironment.EnvironmentName));
$"{ServerFactory.AppSettings}.{hostingEnvironment.EnvironmentName}.yml");
async Task HandleSetupCancel()
{
@@ -27,28 +27,25 @@ namespace Tgstation.Server.Host.Setup.Tests
[TestMethod]
public void TestConstructionThrows()
{
Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(null, null, null, null, null, null, null, null, null, null, null));
Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(null, null, null, null, null, null, null, null, null, null));
var mockIOManager = new Mock<IIOManager>();
Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, null, null, null, null, null, null, null, null, null, null));
Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, null, null, null, null, null, null, null, null, null));
var mockConsole = new Mock<IConsole>();
Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, null, null, null, null, null, null, null, null, null));
Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, null, null, null, null, null, null, null, null));
var mockHostingEnvironment = new Mock<IWebHostEnvironment>();
Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, null, null, null, null, null, null, null, null));
Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, null, null, null, null, null, null, null));
var mockAssemblyInfoProvider = new Mock<IAssemblyInformationProvider>();
Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, null, null, null, null, null, null, null));
Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, null, null, null, null, null, null));
var mockDBConnectionFactory = new Mock<IDatabaseConnectionFactory>();
Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, null, null, null, null, null, null));
Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, null, null, null, null, null));
var mockPlatformIdentifier = new Mock<IPlatformIdentifier>();
Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, null, null, null, null, null));
Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, null, null, null, null));
var mockAsyncDelayer = new Mock<IAsyncDelayer>();
Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, null, null, null, null));
Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, null, null, null));
var mockLifetime = new Mock<IHostApplicationLifetime>();
Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, mockLifetime.Object, null, null, null));
var mockConfiguration = new Mock<IConfiguration>();
mockConfiguration.Setup(x => x.GetReloadToken()).Returns(Mock.Of<IChangeToken>());
Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, mockLifetime.Object, mockConfiguration.Object, null, null));
Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, mockLifetime.Object, null, null));
var mockGeneralConfigurationOptions = Options.Create(new GeneralConfiguration());
Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, mockLifetime.Object, mockConfiguration.Object, mockGeneralConfigurationOptions, null));
Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, mockLifetime.Object, mockGeneralConfigurationOptions, null));
}
[TestMethod]
@@ -64,23 +61,6 @@ namespace Tgstation.Server.Host.Setup.Tests
var mockInternalConfigurationOptions = new Mock<IOptions<InternalConfiguration>>();
var mockPlatformIdentifier = new Mock<IPlatformIdentifier>();
var mockAsyncDelayer = new Mock<IAsyncDelayer>();
var mockConfiguration = new Mock<IConfiguration>();
var mockChangeToken = new Mock<IChangeToken>();
object configReloadCallbackState = null;
Action<object> configReloadCallback = null;
mockChangeToken
.Setup(x => x.RegisterChangeCallback(It.IsNotNull<Action<object>>(), null))
.Callback<Action<object>, object>((callback, state) =>
{
configReloadCallback = callback;
configReloadCallbackState = state;
});
mockConfiguration
.Setup(x => x.GetReloadToken())
.Returns(mockChangeToken.Object)
.Verifiable();
var testGeneralConfig = new GeneralConfiguration
{
@@ -103,7 +83,6 @@ namespace Tgstation.Server.Host.Setup.Tests
mockPlatformIdentifier.Object,
mockAsyncDelayer.Object,
mockLifetime.Object,
mockConfiguration.Object,
mockGeneralConfigurationOptions.Object,
mockInternalConfigurationOptions.Object);
@@ -128,7 +107,6 @@ namespace Tgstation.Server.Host.Setup.Tests
mockIOManager.Setup(x => x.ReadAllBytes(It.IsNotNull<string>(), It.IsAny<CancellationToken>())).Returns(Task.FromResult(Encoding.UTF8.GetBytes("less profane"))).Verifiable();
mockIOManager
.Setup(x => x.WriteAllBytes(It.IsNotNull<string>(), It.IsNotNull<byte[]>(), It.IsAny<CancellationToken>()))
.Callback(() => configReloadCallback(configReloadCallbackState))
.Returns(Task.CompletedTask)
.Verifiable();
@@ -369,8 +347,6 @@ namespace Tgstation.Server.Host.Setup.Tests
mockAssemblyInfoProvider.VerifyAll();
mockPlatformIdentifier.VerifyAll();
mockAsyncDelayer.VerifyAll();
mockConfiguration.VerifyAll();
mockChangeToken.VerifyAll();
}
}
}