mirror of
https://github.com/tgstation/tgstation-server.git
synced 2026-08-23 13:07:07 +01:00
Merge branch 'dev' into V6
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user