From 9a50b6f89412ec95e74c1e0fc33666740dfa92f2 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sun, 29 Dec 2019 11:22:31 -0500 Subject: [PATCH 01/38] Various build cleanups --- .../Models/Internal/ChatBot.cs | 43 +++++++++---------- .../Tgstation.Server.Api.csproj | 15 +------ .../Components/Chat/ProviderFactory.cs | 3 +- 3 files changed, 23 insertions(+), 38 deletions(-) diff --git a/src/Tgstation.Server.Api/Models/Internal/ChatBot.cs b/src/Tgstation.Server.Api/Models/Internal/ChatBot.cs index 577321132d..78434aebca 100644 --- a/src/Tgstation.Server.Api/Models/Internal/ChatBot.cs +++ b/src/Tgstation.Server.Api/Models/Internal/ChatBot.cs @@ -1,6 +1,5 @@ using System; using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; namespace Tgstation.Server.Api.Models.Internal { @@ -37,31 +36,31 @@ namespace Tgstation.Server.Api.Models.Internal public string ConnectionString { get; set; } /// - /// The which maps to the + /// Get the which maps to the . /// - [NotMapped] - public ChatConnectionStringBuilder ConnectionStringBuilder + /// A for the . + public ChatConnectionStringBuilder CreateConnectionStringBuilder() { - get + if (ConnectionString == null) + return null; + switch (Provider) { - if (ConnectionString == null) - return null; - switch (Provider) - { - case ChatProvider.Discord: - return new DiscordConnectionStringBuilder(ConnectionString); - case ChatProvider.Irc: - return new IrcConnectionStringBuilder(ConnectionString); - default: - throw new InvalidOperationException("Invalid Provider!"); - } - } - set - { - if (value?.Valid == false) - throw new InvalidOperationException("Cannot set invalid ChatConnectionStringBuilder!"); - ConnectionString = value?.ToString(); + case ChatProvider.Discord: + return new DiscordConnectionStringBuilder(ConnectionString); + case ChatProvider.Irc: + return new IrcConnectionStringBuilder(ConnectionString); + default: + throw new InvalidOperationException("Invalid Provider!"); } } + + /// + /// Set the for the . Also updates the . + /// + /// The optional . + public void SetConnectionStringBuilder(ChatConnectionStringBuilder stringBuilder) + { + ConnectionString = stringBuilder?.ToString(); + } } } diff --git a/src/Tgstation.Server.Api/Tgstation.Server.Api.csproj b/src/Tgstation.Server.Api/Tgstation.Server.Api.csproj index cc6aea401c..ba131b26ce 100644 --- a/src/Tgstation.Server.Api/Tgstation.Server.Api.csproj +++ b/src/Tgstation.Server.Api/Tgstation.Server.Api.csproj @@ -1,21 +1,8 @@ - + netstandard2.0 Full - true - Cyberboss - /tg/station - API definitions for tgstation-server - https://github.com/tgstation/tgstation-server/blob/master/LICENSE.md - https://tgstation.github.io/tgstation-server - https://raw.githubusercontent.com/tgstation/tgstation-server/master/build/tgs.ico - Git - https://github.com/tgstation/tgstation-server - 2018 - json web api tgstation-server tgstation ss13 byond - Added ApiHeaders.RawUserAgent - 4.0.2.0 ../../build/analyzers.ruleset latest diff --git a/src/Tgstation.Server.Host/Components/Chat/ProviderFactory.cs b/src/Tgstation.Server.Host/Components/Chat/ProviderFactory.cs index 14df6b306c..04a4874cfe 100644 --- a/src/Tgstation.Server.Host/Components/Chat/ProviderFactory.cs +++ b/src/Tgstation.Server.Host/Components/Chat/ProviderFactory.cs @@ -1,6 +1,5 @@ using Microsoft.Extensions.Logging; using System; -using System.Collections.Generic; using System.Globalization; using Tgstation.Server.Api.Models; using Tgstation.Server.Host.Components.Chat.Providers; @@ -44,7 +43,7 @@ namespace Tgstation.Server.Host.Components.Chat { if (settings == null) throw new ArgumentNullException(nameof(settings)); - var builder = settings.ConnectionStringBuilder; + var builder = settings.CreateConnectionStringBuilder(); if (builder == null || !builder.Valid) throw new InvalidOperationException("Invalid ChatConnectionStringBuilder!"); switch (settings.Provider) From e49598a9ce4f8ffc70431fe0c9e5749ff8a856df Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 11:58:07 -0500 Subject: [PATCH 02/38] Build system fixes and cleanups --- build/Version.props | 7 + .../Tgstation.Server.Api.csproj | 24 +++- .../Tgstation.Server.Client.csproj | 13 +- .../Tgstation.Server.Host.Console.csproj | 5 +- .../GlobalSuppressions.cs | Bin 1284 -> 1316 bytes .../Properties/AssemblyInfo.cs | 12 +- .../Tgstation.Server.Host.Service.csproj | 133 ++++-------------- .../Tgstation.Server.Host.Watchdog.csproj | 3 +- .../Watchdog.cs | 52 +++---- .../ClientApp/package.json | 2 +- .../Controllers/AdministrationController.cs | 88 +++++++----- .../Core/TaskExtensions.cs | 52 +++++++ .../Tgstation.Server.Host.csproj | 12 +- .../Properties/AssemblyInfo.cs | 11 -- ...Tgstation.Server.Host.Service.Tests.csproj | 92 +++--------- tgstation-server.sln | 5 +- 16 files changed, 234 insertions(+), 277 deletions(-) create mode 100644 build/Version.props create mode 100644 src/Tgstation.Server.Host/Core/TaskExtensions.cs delete mode 100644 tests/Tgstation.Server.Host.Service.Tests/Properties/AssemblyInfo.cs diff --git a/build/Version.props b/build/Version.props new file mode 100644 index 0000000000..68a795b9da --- /dev/null +++ b/build/Version.props @@ -0,0 +1,7 @@ + + + 4.0.1.4 + 4.0.2 + 4.0.3.0 + + diff --git a/src/Tgstation.Server.Api/Tgstation.Server.Api.csproj b/src/Tgstation.Server.Api/Tgstation.Server.Api.csproj index ba131b26ce..f4a8f71249 100644 --- a/src/Tgstation.Server.Api/Tgstation.Server.Api.csproj +++ b/src/Tgstation.Server.Api/Tgstation.Server.Api.csproj @@ -1,8 +1,22 @@  + netstandard2.0 Full + true + Cyberboss + /tg/station + API definitions for tgstation-server + LICENSE + tgs.ico + https://tgstation.github.io/tgstation-server + Git + https://github.com/tgstation/tgstation-server + 2018 + json web api tgstation-server tgstation ss13 byond + Added ApiHeaders.RawUserAgent + $(TgsApiVersion) ../../build/analyzers.ruleset latest @@ -21,18 +35,16 @@ - - all - compile; build; native; contentfiles; analyzers - - + all runtime; build; native; contentfiles; analyzers - + + + diff --git a/src/Tgstation.Server.Client/Tgstation.Server.Client.csproj b/src/Tgstation.Server.Client/Tgstation.Server.Client.csproj index 647a6ebe46..688664cfb2 100644 --- a/src/Tgstation.Server.Client/Tgstation.Server.Client.csproj +++ b/src/Tgstation.Server.Client/Tgstation.Server.Client.csproj @@ -1,9 +1,10 @@ - + + netstandard2.0 Full - 4.0.3.0 + $(TgsClientVersion) true Cyberboss /tg/station 13 @@ -13,8 +14,8 @@ https://github.com/tgstation/tgstation-server Git en-CA - https://raw.githubusercontent.com/tgstation/tgstation-server/master/build/tgs.ico - https://github.com/tgstation/tgstation-server/blob/master/LICENSE + LICENSE + tgs.ico json web api tgstation-server tgstation ss13 byond client Added the ability to change the Token of IServerClient 2018 @@ -40,7 +41,7 @@ compile; build; native; contentfiles; analyzers - + all runtime; build; native; contentfiles; analyzers @@ -52,5 +53,7 @@ + + diff --git a/src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj b/src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj index c29a5d688d..507129668e 100644 --- a/src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj +++ b/src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj @@ -1,10 +1,11 @@ - + + Exe netcoreapp2.1 Full - 4.0.1.4 + $(TgsCoreVersion) ../../build/analyzers.ruleset latest diff --git a/src/Tgstation.Server.Host.Service/GlobalSuppressions.cs b/src/Tgstation.Server.Host.Service/GlobalSuppressions.cs index dfc5c7f3e33f5b0271aaee89d88c7f717670f142..40d2c0f8474b4042e237e7c8162d9491ae56ea9c 100644 GIT binary patch delta 42 vcmZqSTEex#j8RsHL4hHYp#(@KF%&VRG9)r&GZX`P#S9q?nVXFnFERrFzXS;( delta 12 TcmZ3&)xx#GjB#@q<2hyk8zlq( diff --git a/src/Tgstation.Server.Host.Service/Properties/AssemblyInfo.cs b/src/Tgstation.Server.Host.Service/Properties/AssemblyInfo.cs index 2b77d018db..d7c3dd8a1b 100644 --- a/src/Tgstation.Server.Host.Service/Properties/AssemblyInfo.cs +++ b/src/Tgstation.Server.Host.Service/Properties/AssemblyInfo.cs @@ -1,11 +1,3 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; +using System.Runtime.CompilerServices; -[assembly: AssemblyTitle("Tgstation.Server.Host.Service")] -[assembly: ComVisible(false)] -[assembly: Guid("29927416-3b78-49a7-a560-5ccaa638b6b4")] -[assembly: InternalsVisibleTo("Tgstation.Server.Host.Service.Tests")] - -[assembly: AssemblyVersion("4.0.1.4")] -[assembly: AssemblyFileVersion("4.0.1.4")] +[assembly:InternalsVisibleTo("Tgstation.Server.Host.Service.Tests")] diff --git a/src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj b/src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj index 6bd52c6f69..fc30494bf2 100644 --- a/src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj +++ b/src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj @@ -1,116 +1,45 @@ - - - + + + - Debug - AnyCPU - {29927416-3B78-49A7-A560-5CCAA638B6B4} - WinExe - Tgstation.Server.Host.Service - Tgstation.Server.Host.Service - v4.7.1 - 512 - true - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - latest - 4 + Exe + net471 + win + Full + $(TgsCoreVersion) ../../build/analyzers.ruleset - true - AnyCPU - prompt - + latest + bin\Debug\Tgstation.Server.Host.Console.xml - - true - full - false - bin\Debug\ - DEBUG;TRACE - bin\Debug\Tgstation.Server.Host.Service.xml - SA1101;SA1121;SA1200;SA1202;SA1208;SA1400;SA1413;SA1501;SA1503;SA1519;SA1520;SA1623;SA1629;SA1633;SA1642 - - - pdbonly - true - bin\Release\ - TRACE + + true - bin\Release\Tgstation.Server.Host.Service.xml - SA1101;SA1121;SA1200;SA1202;SA1208;SA1400;SA1413;SA1501;SA1503;SA1519;SA1520;SA1623;SA1629;SA1633;SA1642 + - - Tgstation.Server.Host.Service.Program - - - - ../../build/tgs.ico + + + 1701;1702;SA1652 + - - - - - Component - - - - - False - Microsoft .NET Framework 4.7.1 %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 - false - - - - - - - - - - - {5d2d682c-6bf0-439c-850b-6ab945bbeaea} - Tgstation.Server.Host.Watchdog - - - - - 2.2.5 - - - all - compile; build; native; contentfiles; analyzers - - - 2.1.1 - + + all runtime; build; native; contentfiles; analyzers + - - stylecop.json - + - - \ No newline at end of file + + + + + + + + + + diff --git a/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj b/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj index 6bd413819f..eaf7347e67 100644 --- a/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj +++ b/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj @@ -1,10 +1,11 @@ + netstandard2.0 Full false - 4.0.1.4 + $(TgsCoreVersion) ../../build/analyzers.ruleset latest diff --git a/src/Tgstation.Server.Host.Watchdog/Watchdog.cs b/src/Tgstation.Server.Host.Watchdog/Watchdog.cs index 9fce44bfbf..9f72e17de5 100644 --- a/src/Tgstation.Server.Host.Watchdog/Watchdog.cs +++ b/src/Tgstation.Server.Host.Watchdog/Watchdog.cs @@ -29,6 +29,32 @@ namespace Tgstation.Server.Host.Watchdog this.logger = logger ?? throw new ArgumentNullException(nameof(logger)); } + string GetDotnetPath(bool isWindows) + { + var enviromentPath = Environment.GetEnvironmentVariable("PATH"); + var paths = enviromentPath.Split(';'); + + var exeName = "dotnet"; + IEnumerable enumerator; + if (isWindows) + { + exeName += ".exe"; + enumerator = paths; + } + else + enumerator = paths.Select(x => x.Split(':')).SelectMany(x => x); + + enumerator = enumerator.Select(x => Path.Combine(x, exeName)); + + return enumerator + .Where(x => + { + logger.LogTrace("Checking for dotnet at {0}", x); + return File.Exists(x); + }) + .FirstOrDefault(); + } + /// #pragma warning disable CA1502 // TODO: Decomplexify public async Task RunAsync(bool runConfigure, string[] args, CancellationToken cancellationToken) @@ -38,30 +64,8 @@ namespace Tgstation.Server.Host.Watchdog string updateDirectory = null; try { - var enviromentPath = Environment.GetEnvironmentVariable("PATH"); - var paths = enviromentPath.Split(';'); var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); - - var exeName = "dotnet"; - IEnumerable enumerator; - if (isWindows) - { - exeName += ".exe"; - enumerator = paths; - } - else - enumerator = paths.Select(x => x.Split(':')).SelectMany(x => x); - - enumerator = enumerator.Select(x => Path.Combine(x, exeName)); - - var dotnetPath = enumerator - .Where(x => - { - logger.LogTrace("Checking for dotnet at {0}", x); - return File.Exists(x); - }) - .FirstOrDefault(); - + var dotnetPath = GetDotnetPath(isWindows); if (dotnetPath == default) { logger.LogCritical("Unable to locate dotnet executable in PATH! Please ensure the .NET Core runtime is installed and is in your PATH!"); @@ -126,7 +130,7 @@ namespace Tgstation.Server.Host.Watchdog '"' + updateDirectory + '"' }; - if (Environment.GetCommandLineArgs().Any(x => x == "--attach-host-debugger")) + if (Environment.GetCommandLineArgs().Any(x => x.Equals("--attach-host-debugger", StringComparison.OrdinalIgnoreCase))) arguments.Add("--attach-debugger"); if (runConfigure) diff --git a/src/Tgstation.Server.Host/ClientApp/package.json b/src/Tgstation.Server.Host/ClientApp/package.json index fc8ab6e698..407902f50f 100644 --- a/src/Tgstation.Server.Host/ClientApp/package.json +++ b/src/Tgstation.Server.Host/ClientApp/package.json @@ -5,7 +5,7 @@ "tgstation-server-control-panel": "0.1.6" }, "scripts": { - "build": "npm run clean && tslint -p tsconfig.json && react-scripts build && cp-cli node_modules/tgstation-server-control-panel/build/public/ build/ && cp-cli ../../../build/tgs.ico build/favicon.ico && minify-json build && rimraf ../wwwroot && move-cli build ../wwwroot", + "msbuild": "npm run clean && tslint -p tsconfig.json && react-scripts build && cp-cli node_modules/tgstation-server-control-panel/build/public/ build/ && cp-cli ../../../build/tgs.ico build/favicon.ico && minify-json build && rimraf ../wwwroot && move-cli build ../wwwroot", "clean": "rimraf build" }, "devDependencies": { diff --git a/src/Tgstation.Server.Host/Controllers/AdministrationController.cs b/src/Tgstation.Server.Host/Controllers/AdministrationController.cs index 605be61107..61198121f6 100644 --- a/src/Tgstation.Server.Host/Controllers/AdministrationController.cs +++ b/src/Tgstation.Server.Host/Controllers/AdministrationController.cs @@ -98,6 +98,58 @@ namespace Tgstation.Server.Host.Controllers return StatusCode(429); } + /// + /// Try to download and apply an update with a given . + /// + /// The version of the server to update to. + /// The for the operation. + /// A resulting in the of the operation. + async Task CheckReleasesAndApplyUpdate(Version newVersion, CancellationToken cancellationToken) + { + Logger.LogDebug("Looking for GitHub releases version {0}...", newVersion); + IEnumerable releases; + try + { + var gitHubClient = GetGitHubClient(); + releases = await gitHubClient + .Repository + .Release + .GetAll(updatesConfiguration.GitHubRepositoryId) + .WithToken(cancellationToken) + .ConfigureAwait(false); + } + catch (RateLimitExceededException e) + { + return RateLimit(e); + } + catch (ApiException e) + { + Logger.LogWarning(OctokitException, e); + return StatusCode((int)HttpStatusCode.FailedDependency); + } + + releases = releases.Where(x => x.TagName.StartsWith(updatesConfiguration.GitTagPrefix, StringComparison.InvariantCulture)); + + Logger.LogTrace("Release query complete!"); + + foreach (var release in releases) + if (Version.TryParse(release.TagName.Replace(updatesConfiguration.GitTagPrefix, String.Empty, StringComparison.Ordinal), out var version) && version == newVersion) + { + var asset = release.Assets.Where(x => x.Name.Equals(updatesConfiguration.UpdatePackageAssetName, StringComparison.Ordinal)).FirstOrDefault(); + if (asset == default) + continue; + + if (!serverUpdater.ApplyUpdate(version, new Uri(asset.BrowserDownloadUrl), ioManager)) + return Conflict(new ErrorMessage + { + Message = "An update operation is already in progress!" + }); + return Accepted(); // gtfo of here before all the cancellation tokens fire + } + + return StatusCode((int)HttpStatusCode.Gone); + } + IGitHubClient GetGitHubClient() => String.IsNullOrEmpty(generalConfiguration.GitHubAccessToken) ? gitHubClientFactory.CreateClient() : gitHubClientFactory.CreateClient(generalConfiguration.GitHubAccessToken); /// @@ -163,41 +215,7 @@ namespace Tgstation.Server.Host.Controllers Message = RestartNotSupportedException }); - Logger.LogDebug("Looking for GitHub releases version {0}...", model.NewVersion); - IEnumerable releases; - try - { - var gitHubClient = GetGitHubClient(); - releases = (await gitHubClient.Repository.Release.GetAll(updatesConfiguration.GitHubRepositoryId).ConfigureAwait(false)).Where(x => x.TagName.StartsWith(updatesConfiguration.GitTagPrefix, StringComparison.InvariantCulture)); - cancellationToken.ThrowIfCancellationRequested(); - } - catch (RateLimitExceededException e) - { - return RateLimit(e); - } - catch (ApiException e) - { - Logger.LogWarning(OctokitException, e); - return StatusCode((int)HttpStatusCode.FailedDependency); - } - - Logger.LogTrace("Release query complete!"); - foreach (var release in releases) - if (Version.TryParse(release.TagName.Replace(updatesConfiguration.GitTagPrefix, String.Empty, StringComparison.Ordinal), out var version) && version == model.NewVersion) - { - var asset = release.Assets.Where(x => x.Name == updatesConfiguration.UpdatePackageAssetName).FirstOrDefault(); - if (asset == default) - continue; - - if (!serverUpdater.ApplyUpdate(version, new Uri(asset.BrowserDownloadUrl), ioManager)) - return Conflict(new ErrorMessage - { - Message = "An update operation is already in progress!" - }); - return Accepted(); // gtfo of here before all the cancellation tokens fire - } - - return StatusCode((int)HttpStatusCode.Gone); + return await CheckReleasesAndApplyUpdate(model.NewVersion, cancellationToken).ConfigureAwait(false); } /// diff --git a/src/Tgstation.Server.Host/Core/TaskExtensions.cs b/src/Tgstation.Server.Host/Core/TaskExtensions.cs new file mode 100644 index 0000000000..fb1b825313 --- /dev/null +++ b/src/Tgstation.Server.Host/Core/TaskExtensions.cs @@ -0,0 +1,52 @@ +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace Tgstation.Server.Host.Core +{ + /// + /// Extensions for the . + /// + static class TaskExtensions + { + /// + /// Create a that can be awaited while respecting a given . + /// + /// The to add cancel support to. + /// The for the operation. + /// A representing the running operation. + public static Task WithToken(this Task task, CancellationToken cancellationToken) + { + if (task == null) + throw new ArgumentNullException(nameof(task)); + + async Task Wrap() + { + await task.ConfigureAwait(false); + return null; + } + + return Wrap().WithToken(cancellationToken); + } + + /// + /// Create a that can be awaited while respecting a given . + /// + /// The result of the . + /// The to add cancel support to. + /// The for the operation. + /// A resulting in the result of . + public static async Task WithToken(this Task task, CancellationToken cancellationToken) + { + if (task == null) + throw new ArgumentNullException(nameof(task)); + + var cancelTcs = new TaskCompletionSource(); + using (cancellationToken.Register(() => cancelTcs.SetCanceled())) + await Task.WhenAny(task, cancelTcs.Task).ConfigureAwait(false); + cancellationToken.ThrowIfCancellationRequested(); + + return await task.ConfigureAwait(false); + } + } +} diff --git a/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj b/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj index 199655af18..241f135433 100644 --- a/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj +++ b/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj @@ -1,9 +1,10 @@ - + + netcoreapp2.1 Full - 4.0.1.4 + $(TgsCoreVersion) latest ../../build/analyzers.ruleset @@ -15,7 +16,7 @@ - 1701;1702;SA1652 + 1701;1702;SA1652;CA1063 bin\Debug\netcoreapp2.1\Tgstation.Server.Host.xml @@ -36,11 +37,11 @@ - + - + @@ -97,7 +98,6 @@ - diff --git a/tests/Tgstation.Server.Host.Service.Tests/Properties/AssemblyInfo.cs b/tests/Tgstation.Server.Host.Service.Tests/Properties/AssemblyInfo.cs deleted file mode 100644 index 0158cb9bbb..0000000000 --- a/tests/Tgstation.Server.Host.Service.Tests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("Tgstation.Server.Host.Service.Tests")] -[assembly: ComVisible(false)] - -[assembly: Guid("aa80a190-52e2-4be3-bfeb-1f148d9e9007")] - -[assembly: AssemblyVersion("4.0.0.0")] -[assembly: AssemblyFileVersion("4.0.0.0")] -[assembly: AssemblyInformationalVersion("4.0.0.0")] diff --git a/tests/Tgstation.Server.Host.Service.Tests/Tgstation.Server.Host.Service.Tests.csproj b/tests/Tgstation.Server.Host.Service.Tests/Tgstation.Server.Host.Service.Tests.csproj index a0327b8d0c..0c829771c4 100644 --- a/tests/Tgstation.Server.Host.Service.Tests/Tgstation.Server.Host.Service.Tests.csproj +++ b/tests/Tgstation.Server.Host.Service.Tests/Tgstation.Server.Host.Service.Tests.csproj @@ -1,81 +1,29 @@ - - + + - Debug - AnyCPU - {AA80A190-52E2-4BE3-BFEB-1F148D9E9007} - Library - Properties - Tgstation.Server.Host.Service.Tests - Tgstation.Server.Host.Service.Tests - v4.7.1 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 15.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest + net471 + + false latest - prompt - 4 - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - - - pdbonly - true - bin\Release\ - TRACE + + + false + + + - - - - - - - - - - + + + + + - - + + - - - {29927416-3b78-49a7-a560-5ccaa638b6b4} - Tgstation.Server.Host.Service - - - {5d2d682c-6bf0-439c-850b-6ab945bbeaea} - Tgstation.Server.Host.Watchdog - - - - - 2.1.1 - - - 4.10.0 - - - 1.3.2 - - - 1.3.2 - - - - - \ No newline at end of file + + diff --git a/tgstation-server.sln b/tgstation-server.sln index 6c2a38cc3a..f77e1fe534 100644 --- a/tgstation-server.sln +++ b/tgstation-server.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27130.2036 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29613.14 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{DA32568D-1D8D-4A4C-9943-BFD3CE796B3F}" ProjectSection(SolutionItems) = preProject @@ -31,6 +31,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{6FF654E6 build\tgs.docker.sh = build\tgs.docker.sh build\tgs.ico = build\tgs.ico build\UploadCoverage.ps1 = build\UploadCoverage.ps1 + build\Version.props = build\Version.props EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tgstation.Server.Host", "src\Tgstation.Server.Host\Tgstation.Server.Host.csproj", "{2B69AD6D-2B5A-4023-8EAD-0BD1B18E028A}" From 1c5c620eec31d13a8c92d947d7cdc657231af8f1 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 12:11:35 -0500 Subject: [PATCH 03/38] First pass at fixing CI --- appveyor.yml | 2 +- build/test_core.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index d6362a9ef2..72778a12cd 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -12,7 +12,7 @@ branches: only: - master skip_tags: true -image: Visual Studio 2017 +image: Visual Studio 2019 configuration: - Debug - Release diff --git a/build/test_core.sh b/build/test_core.sh index 3418f12fe4..b398593f36 100755 --- a/build/test_core.sh +++ b/build/test_core.sh @@ -1,7 +1,7 @@ #!/bin/bash set -e -dotnet tool install --global coverlet.console +dotnet tool install --global coverlet.console --version 1.5.3 mkdir TestResults From ea8c6ca99f1519d2217be7e675a2d243560547b3 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 12:20:10 -0500 Subject: [PATCH 04/38] Switch to doxygen.install package --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 72778a12cd..0b8302ba72 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -35,7 +35,7 @@ cache: services: - mssql2017 install: - - choco install doxygen.portable codecov graphviz.portable opencover.portable + - choco install doxygen.install codecov graphviz.portable opencover.portable - nuget restore tgstation-server.sln - ps: Install-Product node 10 build: From d466289423b2778bdc209c8932aec2db48ed0c05 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 12:20:21 -0500 Subject: [PATCH 05/38] Bump travis dotnet version --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 94d49a8e0d..a77207bceb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,7 +26,7 @@ matrix: name: "Test Server Debug" language: csharp mono: none - dotnet: 2.1.300 + dotnet: 2.2.207 services: - mysql cache: @@ -38,7 +38,7 @@ matrix: name: "Test Server Release" language: csharp mono: none - dotnet: 2.1.300 + dotnet: 2.2.207 services: - mysql cache: From 0e25327393ebb7a3e902d8b90932ae0d5dd0a5ac Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 12:21:38 -0500 Subject: [PATCH 06/38] Remove Version.props from the .dockerignore --- .dockerignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.dockerignore b/.dockerignore index 677b545415..c43f0b7592 100644 --- a/.dockerignore +++ b/.dockerignore @@ -14,6 +14,7 @@ build/** !build/tgs.docker.sh !build/tgs.ico !build/stylecop.json +!build/Version.props */bin */obj tests From 01d90214d62d03e96f26af16f4deaca073ebacd7 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 12:24:51 -0500 Subject: [PATCH 07/38] Use relative paths when packing icon and LICENSE --- src/Tgstation.Server.Api/Tgstation.Server.Api.csproj | 4 ++-- src/Tgstation.Server.Client/Tgstation.Server.Client.csproj | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Tgstation.Server.Api/Tgstation.Server.Api.csproj b/src/Tgstation.Server.Api/Tgstation.Server.Api.csproj index f4a8f71249..820212ab00 100644 --- a/src/Tgstation.Server.Api/Tgstation.Server.Api.csproj +++ b/src/Tgstation.Server.Api/Tgstation.Server.Api.csproj @@ -44,7 +44,7 @@ - - + + diff --git a/src/Tgstation.Server.Client/Tgstation.Server.Client.csproj b/src/Tgstation.Server.Client/Tgstation.Server.Client.csproj index 688664cfb2..c82ce6f57f 100644 --- a/src/Tgstation.Server.Client/Tgstation.Server.Client.csproj +++ b/src/Tgstation.Server.Client/Tgstation.Server.Client.csproj @@ -53,7 +53,7 @@ - - + + From b1b4ebd32175f5b28daa169642fdf55819c919e0 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 12:25:32 -0500 Subject: [PATCH 08/38] Revert coverlet version lockdown --- build/test_core.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/test_core.sh b/build/test_core.sh index b398593f36..3418f12fe4 100755 --- a/build/test_core.sh +++ b/build/test_core.sh @@ -1,7 +1,7 @@ #!/bin/bash set -e -dotnet tool install --global coverlet.console --version 1.5.3 +dotnet tool install --global coverlet.console mkdir TestResults From 11837616ead9100ed736270c9929f0a8491e21f3 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 13:33:27 -0500 Subject: [PATCH 09/38] Fix vstest.console paths for 2019 and add proper service dll path --- appveyor.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 0b8302ba72..0b6a843691 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -56,9 +56,9 @@ test_script: - OpenCover.Console.exe -returntargetcode -register:user -target:"C:/Program Files/dotnet/dotnet.exe" -targetargs:"test -c %CONFIGURATION% --logger:trx;LogFileName=results.trx /p:DebugType=full tests/Tgstation.Server.Host.Console.Tests/Tgstation.Server.Host.Console.Tests.csproj" -filter:"+[Tgstation.Server*]* -[Tgstation.Server.Host.Console.Tests*]*" -output:".\console_coverage.xml" -oldstyle - ps: $wc = New-Object 'System.Net.WebClient' - ps: $wc.UploadFile("https://ci.appveyor.com/api/testresults/mstest/$($env:APPVEYOR_JOB_ID)", (Resolve-Path .\tests\Tgstation.Server.Host.Console.Tests\TestResults\results.trx)) - - set path=%ProgramFiles(x86)%\Microsoft Visual Studio\2017\TestAgent\Common7\IDE\CommonExtensions\Microsoft\TestWindow;%path% - - copy "%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\TestWindow\Extensions\appveyor.*" "%ProgramFiles(x86)%\Microsoft Visual Studio\2017\TestAgent\Common7\IDE\CommonExtensions\Microsoft\TestWindow\Extensions" /y - - vstest.console /logger:trx;LogFileName=results.trx "tests\Tgstation.Server.Host.Service.Tests\bin\%CONFIGURATION%\Tgstation.Server.Host.Service.Tests.dll" /Enablecodecoverage /inIsolation /Platform:x64 + - set path=%ProgramFiles(x86)%\Microsoft Visual Studio\2019\TestAgent\Common7\IDE\CommonExtensions\Microsoft\TestWindow;%path% + - copy "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\TestWindow\Extensions\appveyor.*" "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\TestAgent\Common7\IDE\CommonExtensions\Microsoft\TestWindow\Extensions" /y + - vstest.console /logger:trx;LogFileName=results.trx "tests\Tgstation.Server.Host.Service.Tests\bin\%CONFIGURATION%\net471\Tgstation.Server.Host.Service.Tests.dll" /Enablecodecoverage /inIsolation /Platform:x64 - ps: $wc = New-Object 'System.Net.WebClient' - ps: $wc.UploadFile("https://ci.appveyor.com/api/testresults/mstest/$($env:APPVEYOR_JOB_ID)", (Resolve-Path .\TestResults\results.trx)) - OpenCover.Console.exe -returntargetcode -register:user -target:"C:/Program Files/dotnet/dotnet.exe" -targetargs:"test -c %CONFIGURATION% --logger:trx;LogFileName=results.trx /p:DebugType=full tests/Tgstation.Server.Host.Watchdog.Tests/Tgstation.Server.Host.Watchdog.Tests.csproj" -filter:"+[Tgstation.Server*]* -[Tgstation.Server.Host.Watchdog.Tests*]*" -output:".\watchdog_coverage.xml" -oldstyle From a108a7a3c2c1887b1a6664da6db24bbb96d62ed8 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 13:41:59 -0500 Subject: [PATCH 10/38] Try skipping the extension copy. --- appveyor.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 0b6a843691..154e1e5343 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -57,7 +57,6 @@ test_script: - ps: $wc = New-Object 'System.Net.WebClient' - ps: $wc.UploadFile("https://ci.appveyor.com/api/testresults/mstest/$($env:APPVEYOR_JOB_ID)", (Resolve-Path .\tests\Tgstation.Server.Host.Console.Tests\TestResults\results.trx)) - set path=%ProgramFiles(x86)%\Microsoft Visual Studio\2019\TestAgent\Common7\IDE\CommonExtensions\Microsoft\TestWindow;%path% - - copy "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\TestWindow\Extensions\appveyor.*" "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\TestAgent\Common7\IDE\CommonExtensions\Microsoft\TestWindow\Extensions" /y - vstest.console /logger:trx;LogFileName=results.trx "tests\Tgstation.Server.Host.Service.Tests\bin\%CONFIGURATION%\net471\Tgstation.Server.Host.Service.Tests.dll" /Enablecodecoverage /inIsolation /Platform:x64 - ps: $wc = New-Object 'System.Net.WebClient' - ps: $wc.UploadFile("https://ci.appveyor.com/api/testresults/mstest/$($env:APPVEYOR_JOB_ID)", (Resolve-Path .\TestResults\results.trx)) From b5ef2d85e11d982549ad57ddf003b6256ebee34b Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 14:31:35 -0500 Subject: [PATCH 11/38] Fix doxygen path --- build/BuildDox.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/BuildDox.ps1 b/build/BuildDox.ps1 index 62288118ac..e41968ebb8 100644 --- a/build/BuildDox.ps1 +++ b/build/BuildDox.ps1 @@ -16,7 +16,7 @@ if($publish_dox){ Add-Content "$bf\docs\Doxyfile" "`nPROJECT_NUMBER = $version`nINPUT = $bf`nOUTPUT_DIRECTORY = $doxdir`nPROJECT_LOGO = $bf/build/tgs.ico`nHAVE_DOT=YES" } -doxygen.exe "$bf\docs\Doxyfile" +&"C:\Program Files\doxygen\bin\doxygen.exe" "$bf\docs\Doxyfile" if($publish_dox){ cd $doxdir From f7492f02be51412cc5554dcaed4682eb5c436763 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 14:31:46 -0500 Subject: [PATCH 12/38] Fix CodeCoverage.exe path --- build/UploadCoverage.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/UploadCoverage.ps1 b/build/UploadCoverage.ps1 index 61a0bd1069..4876d7c5cf 100644 --- a/build/UploadCoverage.ps1 +++ b/build/UploadCoverage.ps1 @@ -3,7 +3,7 @@ $coverageFilePaths = Get-ChildItem -Path TestResults -Filter *.coverage -Recurse $coverageFilePathList = [string]$coverageFilePaths Write-Host "Running CodeCoverage.exe..." -&"C:\Program Files (x86)\Microsoft Visual Studio\2017\TestAgent\Team Tools\Dynamic Code Coverage Tools\CodeCoverage.exe" analyze /output:service.coveragexml "$coverageFilePathList" +&"C:\Program Files (x86)\Microsoft Visual Studio\2019\TestAgent\Team Tools\Dynamic Code Coverage Tools\CodeCoverage.exe" analyze /output:service.coveragexml "$coverageFilePathList" rm -r TestResults From 9bb57f982a39bf1b87682e0c82e21bf30ef3429a Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 14:34:39 -0500 Subject: [PATCH 13/38] Add docker build to travis --- .travis.yml | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index a77207bceb..4a93935100 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,7 @@ git: matrix: include: - env: + - DockerBuild=false - DMAPI=true - BYOND_MAJOR="511" - BYOND_MINOR="1385" @@ -21,6 +22,7 @@ matrix: - libc6-i386 - libstdc++6:i386 - env: + - DockerBuild=false - DMAPI=false - CONFIG=Debug name: "Test Server Debug" @@ -33,6 +35,7 @@ matrix: directories: - $HOME/.nuget/packages: - env: + - DockerBuild=false - DMAPI=false - CONFIG=Release name: "Test Server Release" @@ -44,11 +47,17 @@ matrix: cache: directories: - $HOME/.nuget/packages: + - env: + - DockerBuild=true + name: "Docker Build" + services: + - docker install: - - if [ $DMAPI = true ]; then build/install_byond.sh; fi - - if [ $DMAPI = false ]; then dotnet restore tgstation-server.sln; fi + - if [ $DockerBuild = false ] && [ $DMAPI = true ]; then build/install_byond.sh; fi + - if [ $DockerBuild = false ] && [ $DMAPI = false ]; then dotnet restore tgstation-server.sln; fi script: - - if [ $DMAPI = true ]; then tests/DMAPI/build_byond.sh || travis_terminate 1; fi - - if [ $DMAPI = false ]; then build/test_core.sh; fi + - if [ $DockerBuild = false ] && [ $DMAPI = true ]; then tests/DMAPI/build_byond.sh || travis_terminate 1; fi + - if [ $DockerBuild = false ] && [ $DMAPI = false ]; then build/test_core.sh; fi + - if [ $DockerBuild = true ]; then docker build . -f build/Dockerfile; fi From 0ec2dc7d02cd5a1a8198e578044ac1a17561da73 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 15:10:05 -0500 Subject: [PATCH 14/38] Stop ignoring LICENSE in docker builds. --- .dockerignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.dockerignore b/.dockerignore index c43f0b7592..4be960f56a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -7,7 +7,6 @@ .travis.yml .codecov.yml appveyor.yml -LICENSE README build/** !build/analyzers.ruleset From eed4e6cefe68a5da6b5f2e0c747a0987e2ec6d42 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 15:12:54 -0500 Subject: [PATCH 15/38] Fix appveyor publish paths --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 154e1e5343..3a6c29a6b4 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -70,9 +70,9 @@ after_test: - ps: build/UploadCoverage.ps1 - ps: build/BuildDox.ps1 #host updater - - dotnet publish src/Tgstation.Server.Host/Tgstation.Server.Host.csproj -o ../../artifacts/ServerHost -c %CONFIGURATION% + - dotnet publish src/Tgstation.Server.Host/Tgstation.Server.Host.csproj -o artifacts/ServerHost -c %CONFIGURATION% #console - - dotnet publish src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj -o ../../artifacts/ServerConsole -c %CONFIGURATION% + - dotnet publish src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj -o artifacts/ServerConsole -c %CONFIGURATION% - ps: Copy-Item -path "artifacts/ServerHost" -destination artifacts/ServerConsole/lib/Default -recurse - ps: Move-Item -path artifacts/ServerConsole/lib/Default/appsettings.json -destination artifacts/ServerConsole/ #service From d5e7f3a85b0095bf881965cb38baa5a5d8327ffa Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 15:19:35 -0500 Subject: [PATCH 16/38] Fix code coverage path again --- build/UploadCoverage.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/UploadCoverage.ps1 b/build/UploadCoverage.ps1 index 4876d7c5cf..2b7a8e0e37 100644 --- a/build/UploadCoverage.ps1 +++ b/build/UploadCoverage.ps1 @@ -3,7 +3,7 @@ $coverageFilePaths = Get-ChildItem -Path TestResults -Filter *.coverage -Recurse $coverageFilePathList = [string]$coverageFilePaths Write-Host "Running CodeCoverage.exe..." -&"C:\Program Files (x86)\Microsoft Visual Studio\2019\TestAgent\Team Tools\Dynamic Code Coverage Tools\CodeCoverage.exe" analyze /output:service.coveragexml "$coverageFilePathList" +&"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools\Dynamic Code Coverage Tools\CodeCoverage.exe" analyze /output:service.coveragexml "$coverageFilePathList" rm -r TestResults From 6c8c5729fd41ab88eac1a702be45f250b0ec656b Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 15:27:48 -0500 Subject: [PATCH 17/38] Prevent .nupkg generation on runner projects --- .../Tgstation.Server.Host.Console.csproj | 1 + .../Tgstation.Server.Host.Service.csproj | 1 + .../Tgstation.Server.Host.Watchdog.csproj | 1 + 3 files changed, 3 insertions(+) diff --git a/src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj b/src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj index 507129668e..5c4034b674 100644 --- a/src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj +++ b/src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj @@ -8,6 +8,7 @@ $(TgsCoreVersion) ../../build/analyzers.ruleset latest + false diff --git a/src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj b/src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj index fc30494bf2..0e3a77f441 100644 --- a/src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj +++ b/src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj @@ -10,6 +10,7 @@ ../../build/analyzers.ruleset latest bin\Debug\Tgstation.Server.Host.Console.xml + false diff --git a/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj b/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj index eaf7347e67..10a6452e25 100644 --- a/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj +++ b/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj @@ -8,6 +8,7 @@ $(TgsCoreVersion) ../../build/analyzers.ruleset latest + false From cfde3c1cbe70df84e3cbda3bf128b3748aa88567 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 15:28:38 -0500 Subject: [PATCH 18/38] Fix another stylecop warning --- .../Components/Compiler/DmbFactory.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Tgstation.Server.Host/Components/Compiler/DmbFactory.cs b/src/Tgstation.Server.Host/Components/Compiler/DmbFactory.cs index c077cab399..bd6b84fddd 100644 --- a/src/Tgstation.Server.Host/Components/Compiler/DmbFactory.cs +++ b/src/Tgstation.Server.Host/Components/Compiler/DmbFactory.cs @@ -54,6 +54,11 @@ namespace Tgstation.Server.Host.Components.Compiler /// readonly CancellationTokenSource cleanupCts; + /// + /// Map of s to locks on them. + /// + readonly IDictionary jobLockCounts; + /// /// representing calls to /// @@ -69,8 +74,6 @@ namespace Tgstation.Server.Host.Components.Compiler /// IDmbProvider nextDmbProvider; - Dictionary jobLockCounts; - /// /// Construct a /// From acdacaa61743f4119cf90bc9fce77f87c68b6c43 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 15:54:02 -0500 Subject: [PATCH 19/38] Enabling appveyor RDP --- appveyor.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index 3a6c29a6b4..0e65597594 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -8,6 +8,11 @@ environment: secure: lJNGAXwiB5HlWdthz3K4PetqpTG5IEAyRgKaiKxFMQ8HW8CcOjRtB97B05op7BsK TGS_RELEASE_NOTES_TOKEN: secure: lJNGAXwiB5HlWdthz3K4PetqpTG5IEAyRgKaiKxFMQ8HW8CcOjRtB97B05op7BsK + APPVEYOR_RDP_PASSWORD: Ascfgf234 + +init: + - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) + branches: only: - master From d8bcefc5720ed41ff394007eda920bbf3d0a9639 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 16:08:42 -0500 Subject: [PATCH 20/38] Use CodeCoverage.exe from nuget --- build/UploadCoverage.ps1 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/build/UploadCoverage.ps1 b/build/UploadCoverage.ps1 index 2b7a8e0e37..89c03a4913 100644 --- a/build/UploadCoverage.ps1 +++ b/build/UploadCoverage.ps1 @@ -3,7 +3,11 @@ $coverageFilePaths = Get-ChildItem -Path TestResults -Filter *.coverage -Recurse $coverageFilePathList = [string]$coverageFilePaths Write-Host "Running CodeCoverage.exe..." -&"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools\Dynamic Code Coverage Tools\CodeCoverage.exe" analyze /output:service.coveragexml "$coverageFilePathList" +mkdir Temp +cd Temp +nuget install Microsoft.CodeCoverage +cd .. +&"Temp\Microsoft.CodeCoverage.16.4.0\build\netstandard1.0\CodeCoverage\CodeCoverage.exe" analyze /output:service.coveragexml "$coverageFilePathList" rm -r TestResults From 80758c9957db4182f712e7fb2011ad1ef70657b1 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 16:09:03 -0500 Subject: [PATCH 21/38] Disable appveyor RDP --- appveyor.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 0e65597594..2b92c719ca 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -8,11 +8,7 @@ environment: secure: lJNGAXwiB5HlWdthz3K4PetqpTG5IEAyRgKaiKxFMQ8HW8CcOjRtB97B05op7BsK TGS_RELEASE_NOTES_TOKEN: secure: lJNGAXwiB5HlWdthz3K4PetqpTG5IEAyRgKaiKxFMQ8HW8CcOjRtB97B05op7BsK - APPVEYOR_RDP_PASSWORD: Ascfgf234 -init: - - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) - branches: only: - master From 4901a03e5af6399dff2cfb2c97ff4031cf5036f7 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 16:27:54 -0500 Subject: [PATCH 22/38] Some coverage script changes --- build/UploadCoverage.ps1 | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/build/UploadCoverage.ps1 b/build/UploadCoverage.ps1 index 89c03a4913..3ad3d03549 100644 --- a/build/UploadCoverage.ps1 +++ b/build/UploadCoverage.ps1 @@ -1,13 +1,14 @@ +mkdir Temp +cd Temp +nuget install Microsoft.CodeCoverage --version 16.4.0 +cd .. + $coverageFilePaths = Get-ChildItem -Path TestResults -Filter *.coverage -Recurse -ErrorAction SilentlyContinue -Force | %{ $_.fullname } $coverageFilePathList = [string]$coverageFilePaths -Write-Host "Running CodeCoverage.exe..." -mkdir Temp -cd Temp -nuget install Microsoft.CodeCoverage -cd .. -&"Temp\Microsoft.CodeCoverage.16.4.0\build\netstandard1.0\CodeCoverage\CodeCoverage.exe" analyze /output:service.coveragexml "$coverageFilePathList" +Write-Host "Running CodeCoverage.exe on: $coverageFilePathList" +&"Temp\Microsoft.CodeCoverage.16.4.0\build\netstandard1.0\CodeCoverage\CodeCoverage.exe" analyze /output:service.coveragexml /verbose "$coverageFilePathList" rm -r TestResults From 48f4a0716f0078f8e87eaa858eadc68528a5239a Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 17:27:35 -0500 Subject: [PATCH 23/38] Update all nuget packages --- src/Tgstation.Server.Api/ApiHeaders.cs | 2 +- .../Tgstation.Server.Api.csproj | 12 ++-- .../Tgstation.Server.Client.csproj | 10 +--- src/Tgstation.Server.Host.Console/Program.cs | 7 ++- .../Tgstation.Server.Host.Console.csproj | 6 +- src/Tgstation.Server.Host.Service/Program.cs | 19 +++++- .../ServerService.cs | 58 ++++++++++--------- .../Tgstation.Server.Host.Service.csproj | 11 +++- .../Tgstation.Server.Host.Watchdog.csproj | 6 +- .../Components/Chat/JsonTrackingContext.cs | 1 + .../Tgstation.Server.Host.csproj | 42 +++++++------- .../Tgstation.Server.Api.Tests.csproj | 8 +-- .../Tgstation.Server.Client.Tests.csproj | 8 +-- ...Tgstation.Server.Host.Console.Tests.csproj | 8 +-- .../TestServerService.cs | 16 ++--- ...Tgstation.Server.Host.Service.Tests.csproj | 11 ++-- .../Tgstation.Server.Host.Tests.csproj | 8 +-- ...gstation.Server.Host.Watchdog.Tests.csproj | 8 +-- .../Tgstation.Server.Tests.csproj | 6 +- tools/ReleaseNotes/ReleaseNotes.csproj | 2 +- 20 files changed, 139 insertions(+), 110 deletions(-) diff --git a/src/Tgstation.Server.Api/ApiHeaders.cs b/src/Tgstation.Server.Api/ApiHeaders.cs index 6128de76be..f7bf788a7e 100644 --- a/src/Tgstation.Server.Api/ApiHeaders.cs +++ b/src/Tgstation.Server.Api/ApiHeaders.cs @@ -100,7 +100,7 @@ namespace Tgstation.Server.Api /// /// The to test /// if the given version is compatible with the API. otherwise - public static bool CheckCompatibility(Version otherVersion) => !(Version.Major != otherVersion.Major || Version.Minor > otherVersion.Minor); + public static bool CheckCompatibility(Version otherVersion) => !(Version.Major != (otherVersion?.Major ?? throw new ArgumentNullException(nameof(otherVersion))) || Version.Minor > otherVersion.Minor); /// /// Construct for JWT authentication diff --git a/src/Tgstation.Server.Api/Tgstation.Server.Api.csproj b/src/Tgstation.Server.Api/Tgstation.Server.Api.csproj index 820212ab00..f052135a97 100644 --- a/src/Tgstation.Server.Api/Tgstation.Server.Api.csproj +++ b/src/Tgstation.Server.Api/Tgstation.Server.Api.csproj @@ -34,17 +34,21 @@ - + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + all runtime; build; native; contentfiles; analyzers - + - - + + diff --git a/src/Tgstation.Server.Client/Tgstation.Server.Client.csproj b/src/Tgstation.Server.Client/Tgstation.Server.Client.csproj index c82ce6f57f..594c5420a0 100644 --- a/src/Tgstation.Server.Client/Tgstation.Server.Client.csproj +++ b/src/Tgstation.Server.Client/Tgstation.Server.Client.csproj @@ -36,11 +36,7 @@ - - all - compile; build; native; contentfiles; analyzers - - + all runtime; build; native; contentfiles; analyzers @@ -53,7 +49,7 @@ - - + + diff --git a/src/Tgstation.Server.Host.Console/Program.cs b/src/Tgstation.Server.Host.Console/Program.cs index 9437569d9f..79af21fae8 100644 --- a/src/Tgstation.Server.Host.Console/Program.cs +++ b/src/Tgstation.Server.Host.Console/Program.cs @@ -24,17 +24,18 @@ namespace Tgstation.Server.Host.Console /// A representing the running operation internal static async Task Main(string[] args) { - using (var loggerFactory = new LoggerFactory()) + using (var loggerFactory = LoggerFactory.Create( + builder => builder.AddConsole())) { var arguments = new List(args); var trace = arguments.Remove("--trace-host-watchdog"); var debug = arguments.Remove("--debug-host-watchdog"); - loggerFactory.AddConsole(trace ? LogLevel.Trace : debug ? LogLevel.Debug : LogLevel.Information, true); - if (trace && debug) { +#pragma warning disable CA1303 // Do not pass literals as localized parameters loggerFactory.CreateLogger(nameof(Program)).LogCritical("Please specify only 1 of --trace-host-watchdog or --debug-host-watchdog!"); +#pragma warning restore CA1303 // Do not pass literals as localized parameters return; } diff --git a/src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj b/src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj index 5c4034b674..2af9fc7bd2 100644 --- a/src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj +++ b/src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj @@ -23,12 +23,12 @@ - + all compile; build; native; contentfiles; analyzers - - + + all runtime; build; native; contentfiles; analyzers diff --git a/src/Tgstation.Server.Host.Service/Program.cs b/src/Tgstation.Server.Host.Service/Program.cs index 6e519cc9d9..ccb458f70d 100644 --- a/src/Tgstation.Server.Host.Service/Program.cs +++ b/src/Tgstation.Server.Host.Service/Program.cs @@ -83,7 +83,9 @@ namespace Tgstation.Server.Host.Service { if (!Install && !Uninstall && !Configure) { +#pragma warning disable CA1303 // Do not pass literals as localized parameters: OH GOD I DONT CARE var result = MessageBox.Show("You are running the TGS windows service executable directly. It should only be run by the service control manager. Would you like to install and configure the service in this location?", "TGS Service", MessageBoxButtons.YesNo); +#pragma warning restore CA1303 // Do not pass literals as localized parameters if (result != DialogResult.Yes) return; Install = true; @@ -108,7 +110,18 @@ namespace Tgstation.Server.Host.Service } } - using (var loggerFactory = new LoggerFactory()) + bool serviceWillRun = !Configure && !Install && !Uninstall; + ServerService service = null; + ILoggerFactory loggerFactory = null; + using (loggerFactory = LoggerFactory.Create(builder => + { + if (serviceWillRun) + { + LogLevel logLevel = Trace ? LogLevel.Trace : Debug ? LogLevel.Debug : LogLevel.Information; + service = new ServerService(WatchdogFactory, builder, () => loggerFactory, logLevel); + } + })) + using(service) { if (Configure) await WatchdogFactory.CreateWatchdog(loggerFactory).RunAsync(true, Array.Empty(), default).ConfigureAwait(false); @@ -142,8 +155,8 @@ namespace Tgstation.Server.Host.Service installer.ServiceName = ServerService.Name; installer.Uninstall(null); } - else if (!Configure) - ServiceBase.Run(new ServerService(WatchdogFactory, loggerFactory, Trace ? LogLevel.Trace : Debug ? LogLevel.Debug : LogLevel.Information)); + else if (serviceWillRun) + ServiceBase.Run(service); } } } diff --git a/src/Tgstation.Server.Host.Service/ServerService.cs b/src/Tgstation.Server.Host.Service/ServerService.cs index a0ff1d7ae5..b95deb083a 100644 --- a/src/Tgstation.Server.Host.Service/ServerService.cs +++ b/src/Tgstation.Server.Host.Service/ServerService.cs @@ -1,6 +1,5 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.EventLog; -using Microsoft.Extensions.Logging.EventLog.Internal; using System; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; @@ -15,7 +14,7 @@ namespace Tgstation.Server.Host.Service /// /// Represents a as a /// - sealed class ServerService : ServiceBase, IEventLog + sealed class ServerService : ServiceBase { /// /// The canonical windows service name @@ -23,12 +22,17 @@ namespace Tgstation.Server.Host.Service public const string Name = "tgstation-server-4"; /// - /// The for the + /// The for the /// - readonly IWatchdog watchdog; + readonly IWatchdogFactory watchdogFactory; /// - /// The recieved from of + /// The used to retrieve a configured . + /// + readonly Func getLoggerFactory; + + /// + /// The recieved from . /// Task watchdogTask; @@ -40,40 +44,38 @@ namespace Tgstation.Server.Host.Service /// /// Construct a /// - /// The to create with - /// The for + /// The value of . + /// The to configure. + /// The used to retrieve a based on the configuration. /// The minimum to record in the event log - public ServerService(IWatchdogFactory watchdogFactory, ILoggerFactory loggerFactory, LogLevel minumumLogLevel) + public ServerService(IWatchdogFactory watchdogFactory, ILoggingBuilder loggingBuilder, Func getLoggerFactory, LogLevel minumumLogLevel) { - if (watchdogFactory == null) - throw new ArgumentNullException(nameof(watchdogFactory)); - if (loggerFactory == null) - throw new ArgumentNullException(nameof(loggerFactory)); - - loggerFactory.AddEventLog(new EventLogSettings - { - EventLog = this, - Filter = (message, logLevel) => logLevel >= minumumLogLevel - }); + this.watchdogFactory = watchdogFactory ?? throw new ArgumentNullException(nameof(watchdogFactory)); + if (loggingBuilder == null) + throw new ArgumentNullException(nameof(loggingBuilder)); + this.getLoggerFactory = getLoggerFactory ?? throw new ArgumentNullException(nameof(getLoggerFactory)); ServiceName = Name; - watchdog = watchdogFactory.CreateWatchdog(loggerFactory); + + loggingBuilder.AddEventLog(new EventLogSettings + { + LogName = EventLog.Log, + MachineName = Environment.MachineName, + SourceName = EventLog.Source, + Filter = (message, logLevel) => logLevel >= minumumLogLevel + }); } - /// - public int MaxMessageSize => (int)EventLog.MaximumKilobytes * 1024; - - /// - public void WriteEntry(string message, EventLogEntryType type, int eventID, short category) => EventLog.WriteEntry(message, type, eventID, category); - /// - /// Executes the , stopping the service if it exits + /// Creates and executes the watchdog stopping the service if it exits /// - /// The arguments for the + /// The arguments for the watchdog. /// The for the operation /// A representing the running operation async Task RunWatchdog(string[] args, CancellationToken cancellationToken) { + var watchdog = watchdogFactory.CreateWatchdog(getLoggerFactory()); + await watchdog.RunAsync(false, args, cancellationToken).ConfigureAwait(false); void StopServiceAsync() @@ -83,7 +85,9 @@ namespace Tgstation.Server.Host.Service Task.Run(Stop, cancellationToken); } catch (OperationCanceledException) { } +#pragma warning disable CA1031 // Do not catch general exception types catch (Exception e) +#pragma warning restore CA1031 // Do not catch general exception types { EventLog.WriteEntry(String.Format(CultureInfo.InvariantCulture, "Error stopping service! Exception: {0}", e)); } diff --git a/src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj b/src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj index 0e3a77f441..626248bcdf 100644 --- a/src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj +++ b/src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj @@ -23,9 +23,13 @@ - - - + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all runtime; build; native; contentfiles; analyzers @@ -41,6 +45,7 @@ + diff --git a/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj b/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj index 10a6452e25..38cce74426 100644 --- a/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj +++ b/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj @@ -23,12 +23,12 @@ - + all compile; build; native; contentfiles; analyzers - - + + all runtime; build; native; contentfiles; analyzers diff --git a/src/Tgstation.Server.Host/Components/Chat/JsonTrackingContext.cs b/src/Tgstation.Server.Host/Components/Chat/JsonTrackingContext.cs index 41646c7813..f551c3046f 100644 --- a/src/Tgstation.Server.Host/Components/Chat/JsonTrackingContext.cs +++ b/src/Tgstation.Server.Host/Components/Chat/JsonTrackingContext.cs @@ -66,6 +66,7 @@ namespace Tgstation.Server.Host.Components.Chat public void Dispose() { logger.LogTrace("Disposing..."); + channelsSemaphore.Dispose(); onDispose(); } diff --git a/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj b/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj index 241f135433..e7b5bfac57 100644 --- a/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj +++ b/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj @@ -49,39 +49,39 @@ - - - + + + - - - - + + + + all runtime; build; native; contentfiles; analyzers - - - - + + + + all runtime; build; native; contentfiles; analyzers - - - - + + + + - + all runtime; build; native; contentfiles; analyzers - - - - - + + + + + diff --git a/tests/Tgstation.Server.Api.Tests/Tgstation.Server.Api.Tests.csproj b/tests/Tgstation.Server.Api.Tests/Tgstation.Server.Api.Tests.csproj index 8d6c705910..96f5271bd2 100644 --- a/tests/Tgstation.Server.Api.Tests/Tgstation.Server.Api.Tests.csproj +++ b/tests/Tgstation.Server.Api.Tests/Tgstation.Server.Api.Tests.csproj @@ -9,10 +9,10 @@ - - - - + + + + diff --git a/tests/Tgstation.Server.Client.Tests/Tgstation.Server.Client.Tests.csproj b/tests/Tgstation.Server.Client.Tests/Tgstation.Server.Client.Tests.csproj index 11ea8e7a81..630454e342 100644 --- a/tests/Tgstation.Server.Client.Tests/Tgstation.Server.Client.Tests.csproj +++ b/tests/Tgstation.Server.Client.Tests/Tgstation.Server.Client.Tests.csproj @@ -9,10 +9,10 @@ - - - - + + + + diff --git a/tests/Tgstation.Server.Host.Console.Tests/Tgstation.Server.Host.Console.Tests.csproj b/tests/Tgstation.Server.Host.Console.Tests/Tgstation.Server.Host.Console.Tests.csproj index 0c63398912..f4b36fb2ca 100644 --- a/tests/Tgstation.Server.Host.Console.Tests/Tgstation.Server.Host.Console.Tests.csproj +++ b/tests/Tgstation.Server.Host.Console.Tests/Tgstation.Server.Host.Console.Tests.csproj @@ -9,10 +9,10 @@ - - - - + + + + diff --git a/tests/Tgstation.Server.Host.Service.Tests/TestServerService.cs b/tests/Tgstation.Server.Host.Service.Tests/TestServerService.cs index d4e4545111..ce4f7fc2c0 100644 --- a/tests/Tgstation.Server.Host.Service.Tests/TestServerService.cs +++ b/tests/Tgstation.Server.Host.Service.Tests/TestServerService.cs @@ -18,11 +18,11 @@ namespace Tgstation.Server.Host.Service.Tests [TestMethod] public void TestConstructionAndDisposal() { - Assert.ThrowsException(() => new ServerService(null, null, default)); + Assert.ThrowsException(() => new ServerService(null, null, null, default)); var mockWatchdogFactory = new Mock(); - Assert.ThrowsException(() => new ServerService(mockWatchdogFactory.Object, null, default)); - var mockLoggerFactory = new LoggerFactory(); - new ServerService(mockWatchdogFactory.Object, mockLoggerFactory, default).Dispose(); + Assert.ThrowsException(() => new ServerService(mockWatchdogFactory.Object, null, null, default)); + LoggerFactory.Create(builder => Assert.ThrowsException(() => new ServerService(mockWatchdogFactory.Object, builder, null, default))); + LoggerFactory.Create(builder => { new ServerService(mockWatchdogFactory.Object, builder, () => null, default).Dispose(); }); } [TestMethod] @@ -44,11 +44,13 @@ namespace Tgstation.Server.Host.Service.Tests mockWatchdog.Setup(x => x.RunAsync(false, args, It.IsAny())).Callback((bool x, string[] _, CancellationToken token) => token.Register(() => cancelled = true)).Returns(Task.CompletedTask).Verifiable(); var mockWatchdogFactory = new Mock(); - var mockLoggerFactory = new LoggerFactory(); - mockWatchdogFactory.Setup(x => x.CreateWatchdog(mockLoggerFactory)).Returns(mockWatchdog.Object).Verifiable(); - using (var service = new ServerService(mockWatchdogFactory.Object, mockLoggerFactory, default)) + ServerService service = null; + ILoggerFactory loggerFactory = null; + using (loggerFactory = LoggerFactory.Create(builder => service = new ServerService(mockWatchdogFactory.Object, builder, () => loggerFactory, default))) + using (service) { + mockWatchdogFactory.Setup(x => x.CreateWatchdog(loggerFactory)).Returns(mockWatchdog.Object).Verifiable(); Assert.IsFalse(cancelled); onStart.Invoke(service, new object[] { args }); mockWatchdog.VerifyAll(); diff --git a/tests/Tgstation.Server.Host.Service.Tests/Tgstation.Server.Host.Service.Tests.csproj b/tests/Tgstation.Server.Host.Service.Tests/Tgstation.Server.Host.Service.Tests.csproj index 0c829771c4..289ae70367 100644 --- a/tests/Tgstation.Server.Host.Service.Tests/Tgstation.Server.Host.Service.Tests.csproj +++ b/tests/Tgstation.Server.Host.Service.Tests/Tgstation.Server.Host.Service.Tests.csproj @@ -15,10 +15,9 @@ - - - - + + + @@ -26,4 +25,8 @@ + + + + diff --git a/tests/Tgstation.Server.Host.Tests/Tgstation.Server.Host.Tests.csproj b/tests/Tgstation.Server.Host.Tests/Tgstation.Server.Host.Tests.csproj index 844e394ba6..33b5e80774 100644 --- a/tests/Tgstation.Server.Host.Tests/Tgstation.Server.Host.Tests.csproj +++ b/tests/Tgstation.Server.Host.Tests/Tgstation.Server.Host.Tests.csproj @@ -9,10 +9,10 @@ - - - - + + + + diff --git a/tests/Tgstation.Server.Host.Watchdog.Tests/Tgstation.Server.Host.Watchdog.Tests.csproj b/tests/Tgstation.Server.Host.Watchdog.Tests/Tgstation.Server.Host.Watchdog.Tests.csproj index 1199030286..9ea94c013c 100644 --- a/tests/Tgstation.Server.Host.Watchdog.Tests/Tgstation.Server.Host.Watchdog.Tests.csproj +++ b/tests/Tgstation.Server.Host.Watchdog.Tests/Tgstation.Server.Host.Watchdog.Tests.csproj @@ -15,10 +15,10 @@ - - - - + + + + diff --git a/tests/Tgstation.Server.Tests/Tgstation.Server.Tests.csproj b/tests/Tgstation.Server.Tests/Tgstation.Server.Tests.csproj index 75eb3f7096..1e79b7ab42 100644 --- a/tests/Tgstation.Server.Tests/Tgstation.Server.Tests.csproj +++ b/tests/Tgstation.Server.Tests/Tgstation.Server.Tests.csproj @@ -9,9 +9,9 @@ - - - + + + diff --git a/tools/ReleaseNotes/ReleaseNotes.csproj b/tools/ReleaseNotes/ReleaseNotes.csproj index 64c79d0620..cbffccd3ec 100644 --- a/tools/ReleaseNotes/ReleaseNotes.csproj +++ b/tools/ReleaseNotes/ReleaseNotes.csproj @@ -7,7 +7,7 @@ - + From 3fd1cc54194fe0cf38d2516e6983667645399a1a Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 17:59:27 -0500 Subject: [PATCH 24/38] Try to globally install code coverage --- appveyor.yml | 1 + build/InstallCodeCoverage.ps1 | 8 ++++++++ build/UploadCoverage.ps1 | 9 ++------- 3 files changed, 11 insertions(+), 7 deletions(-) create mode 100644 build/InstallCodeCoverage.ps1 diff --git a/appveyor.yml b/appveyor.yml index 2b92c719ca..5a35dfbf1e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -38,6 +38,7 @@ services: install: - choco install doxygen.install codecov graphviz.portable opencover.portable - nuget restore tgstation-server.sln + - ps: build/InstallCodeCoverage.ps1 - ps: Install-Product node 10 build: project: tgstation-server.sln diff --git a/build/InstallCodeCoverage.ps1 b/build/InstallCodeCoverage.ps1 new file mode 100644 index 0000000000..2f1325a3ec --- /dev/null +++ b/build/InstallCodeCoverage.ps1 @@ -0,0 +1,8 @@ +mkdir Temp +cd Temp +nuget install Microsoft.CodeCoverage --version 16.4.0 +cd .. + +New-Item -Type Directory -Force -Path "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools" +Move-Item -Path "Microsoft.CodeCoverage.16.4.0\build\netstandard1.0\CodeCoverage" -Destination "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools\Dynamic Code Coverage Tools" +Remove-Item -Recurse -Force Temp diff --git a/build/UploadCoverage.ps1 b/build/UploadCoverage.ps1 index 3ad3d03549..762bcc5081 100644 --- a/build/UploadCoverage.ps1 +++ b/build/UploadCoverage.ps1 @@ -1,14 +1,9 @@ -mkdir Temp -cd Temp -nuget install Microsoft.CodeCoverage --version 16.4.0 -cd .. - $coverageFilePaths = Get-ChildItem -Path TestResults -Filter *.coverage -Recurse -ErrorAction SilentlyContinue -Force | %{ $_.fullname } $coverageFilePathList = [string]$coverageFilePaths -Write-Host "Running CodeCoverage.exe on: $coverageFilePathList" -&"Temp\Microsoft.CodeCoverage.16.4.0\build\netstandard1.0\CodeCoverage\CodeCoverage.exe" analyze /output:service.coveragexml /verbose "$coverageFilePathList" +Write-Host "Running CodeCoverage.exe on $coverageFilePathList" +&"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools\Dynamic Code Coverage Tools\CodeCoverage.exe" analyze /output:service.coveragexml "$coverageFilePathList" rm -r TestResults From 07633f31c498fe2c0eb6388df2790f4d3dae5208 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 18:06:34 -0500 Subject: [PATCH 25/38] Various minor cleanups --- build/analyzers.ruleset | 2 +- src/Tgstation.Server.Host.Console/Program.cs | 2 -- src/Tgstation.Server.Host.Service/Program.cs | 2 -- src/Tgstation.Server.Host.Service/ServerService.cs | 2 +- tgstation-server.sln | 5 +++-- 5 files changed, 5 insertions(+), 8 deletions(-) diff --git a/build/analyzers.ruleset b/build/analyzers.ruleset index 75495a4ace..9d8283bffa 100644 --- a/build/analyzers.ruleset +++ b/build/analyzers.ruleset @@ -66,7 +66,7 @@ - + diff --git a/src/Tgstation.Server.Host.Console/Program.cs b/src/Tgstation.Server.Host.Console/Program.cs index 79af21fae8..88dddf9abe 100644 --- a/src/Tgstation.Server.Host.Console/Program.cs +++ b/src/Tgstation.Server.Host.Console/Program.cs @@ -33,9 +33,7 @@ namespace Tgstation.Server.Host.Console if (trace && debug) { -#pragma warning disable CA1303 // Do not pass literals as localized parameters loggerFactory.CreateLogger(nameof(Program)).LogCritical("Please specify only 1 of --trace-host-watchdog or --debug-host-watchdog!"); -#pragma warning restore CA1303 // Do not pass literals as localized parameters return; } diff --git a/src/Tgstation.Server.Host.Service/Program.cs b/src/Tgstation.Server.Host.Service/Program.cs index ccb458f70d..4d9b81d8cc 100644 --- a/src/Tgstation.Server.Host.Service/Program.cs +++ b/src/Tgstation.Server.Host.Service/Program.cs @@ -83,9 +83,7 @@ namespace Tgstation.Server.Host.Service { if (!Install && !Uninstall && !Configure) { -#pragma warning disable CA1303 // Do not pass literals as localized parameters: OH GOD I DONT CARE var result = MessageBox.Show("You are running the TGS windows service executable directly. It should only be run by the service control manager. Would you like to install and configure the service in this location?", "TGS Service", MessageBoxButtons.YesNo); -#pragma warning restore CA1303 // Do not pass literals as localized parameters if (result != DialogResult.Yes) return; Install = true; diff --git a/src/Tgstation.Server.Host.Service/ServerService.cs b/src/Tgstation.Server.Host.Service/ServerService.cs index b95deb083a..b82dd1de65 100644 --- a/src/Tgstation.Server.Host.Service/ServerService.cs +++ b/src/Tgstation.Server.Host.Service/ServerService.cs @@ -60,7 +60,7 @@ namespace Tgstation.Server.Host.Service loggingBuilder.AddEventLog(new EventLogSettings { LogName = EventLog.Log, - MachineName = Environment.MachineName, + MachineName = EventLog.MachineName, SourceName = EventLog.Source, Filter = (message, logLevel) => logLevel >= minumumLogLevel }); diff --git a/tgstation-server.sln b/tgstation-server.sln index f77e1fe534..74735abe47 100644 --- a/tgstation-server.sln +++ b/tgstation-server.sln @@ -25,6 +25,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{6FF654E6 build\BuildDox.ps1 = build\BuildDox.ps1 build\Dockerfile = build\Dockerfile build\install_byond.sh = build\install_byond.sh + build\InstallCodeCoverage.ps1 = build\InstallCodeCoverage.ps1 build\prep_deployment.ps1 = build\prep_deployment.ps1 build\stylecop.json = build\stylecop.json build\test_core.sh = build\test_core.sh @@ -38,7 +39,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tgstation.Server.Host", "sr EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tgstation.Server.Api", "src\Tgstation.Server.Api\Tgstation.Server.Api.csproj", "{8B4A208D-A48A-4A5D-8B94-E2661138865D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tgstation.Server.Host.Service", "src\Tgstation.Server.Host.Service\Tgstation.Server.Host.Service.csproj", "{29927416-3B78-49A7-A560-5CCAA638B6B4}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tgstation.Server.Host.Service", "src\Tgstation.Server.Host.Service\Tgstation.Server.Host.Service.csproj", "{29927416-3B78-49A7-A560-5CCAA638B6B4}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tgstation.Server.Client", "src\Tgstation.Server.Client\Tgstation.Server.Client.csproj", "{E0AC911F-7675-4A91-9499-D8A2E2390AAD}" EndProject @@ -55,7 +56,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tgstation.Server.Host.Watch EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tgstation.Server.Host.Watchdog.Tests", "tests\Tgstation.Server.Host.Watchdog.Tests\Tgstation.Server.Host.Watchdog.Tests.csproj", "{7500F776-4384-4B5F-A8D8-22461CAD108B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tgstation.Server.Host.Service.Tests", "tests\Tgstation.Server.Host.Service.Tests\Tgstation.Server.Host.Service.Tests.csproj", "{AA80A190-52E2-4BE3-BFEB-1F148D9E9007}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tgstation.Server.Host.Service.Tests", "tests\Tgstation.Server.Host.Service.Tests\Tgstation.Server.Host.Service.Tests.csproj", "{AA80A190-52E2-4BE3-BFEB-1F148D9E9007}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DMAPI", "DMAPI", "{7E4E7CF6-A48D-410E-8191-C49C6B5AB9CC}" EndProject From 3a321819752fc82a857f00fa67db39c54a94b4ba Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 18:30:32 -0500 Subject: [PATCH 26/38] More FxCop cleanups --- build/analyzers.ruleset | 2 +- src/Tgstation.Server.Api/ApiHeaders.cs | 3 +++ .../Internal/DreamDaemonLaunchParameters.cs | 5 +++-- .../ServerService.cs | 4 ---- .../Components/Compiler/DreamMaker.cs | 4 ++-- .../Watchdog/SessionControllerFactory.cs | 17 +++++++++-------- .../Components/Watchdog/Watchdog.cs | 5 +++++ src/Tgstation.Server.Host/Core/SetupWizard.cs | 6 ++++-- .../20180906135553_MSInitialCreate.cs | 6 ++++++ .../20180906143029_MYInitialCreate.cs | 6 ++++++ .../20180918020726_MYAddMinimumSecurity.cs | 7 +++++++ .../20180918021228_MSAddMinimumSecurity.cs | 7 +++++++ ...0918204520_MYNullableAndForeignKeyCleanup.cs | 6 ++++++ ...0918205224_MSNullableAndForeignKeyCleanup.cs | 6 ++++++ ...180926033145_MSReattachCompileJobRequired.cs | 7 +++++++ ...180926034014_MYReattachCompileJobRequired.cs | 7 +++++++ .../20181124231534_MSToggleTestmergeComments.cs | 7 +++++++ .../20181124231549_MYToggleTestmergeComments.cs | 7 +++++++ .../20190219041825_MSFixRevInfoIndex.cs | 7 +++++++ .../20190219042440_MYFixRevInfoIndex.cs | 7 +++++++ .../DesignTimeDbContextFactoryHelpers.cs | 2 +- .../MySqlDesignTimeDbContextFactory.cs | 8 +++++++- .../SqlServerDesignTimeDbContextFactory.cs | 8 +++++++- .../Tgstation.Server.Host.csproj | 6 +++++- 24 files changed, 127 insertions(+), 23 deletions(-) diff --git a/build/analyzers.ruleset b/build/analyzers.ruleset index 9d8283bffa..bbf7b12dab 100644 --- a/build/analyzers.ruleset +++ b/build/analyzers.ruleset @@ -30,7 +30,7 @@ - + diff --git a/src/Tgstation.Server.Api/ApiHeaders.cs b/src/Tgstation.Server.Api/ApiHeaders.cs index f7bf788a7e..b1be91ff6f 100644 --- a/src/Tgstation.Server.Api/ApiHeaders.cs +++ b/src/Tgstation.Server.Api/ApiHeaders.cs @@ -137,6 +137,9 @@ namespace Tgstation.Server.Api /// The containing the public ApiHeaders(RequestHeaders requestHeaders) { + if (requestHeaders == null) + throw new ArgumentNullException(nameof(requestHeaders)); + var jsonAccept = new Microsoft.Net.Http.Headers.MediaTypeHeaderValue(ApplicationJson); if (!requestHeaders.Accept.Any(x => x.MediaType == jsonAccept.MediaType)) throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Client does not accept {0}!", ApplicationJson)); diff --git a/src/Tgstation.Server.Api/Models/Internal/DreamDaemonLaunchParameters.cs b/src/Tgstation.Server.Api/Models/Internal/DreamDaemonLaunchParameters.cs index 34054f4487..43999fb783 100644 --- a/src/Tgstation.Server.Api/Models/Internal/DreamDaemonLaunchParameters.cs +++ b/src/Tgstation.Server.Api/Models/Internal/DreamDaemonLaunchParameters.cs @@ -1,4 +1,5 @@ -using System.ComponentModel.DataAnnotations; +using System; +using System.ComponentModel.DataAnnotations; namespace Tgstation.Server.Api.Models.Internal { @@ -43,7 +44,7 @@ namespace Tgstation.Server.Api.Models.Internal /// The to compare against /// if they match, otherwise public bool Match(DreamDaemonLaunchParameters otherParameters) => - AllowWebClient == otherParameters.AllowWebClient + AllowWebClient == (otherParameters?.AllowWebClient ?? throw new ArgumentNullException(nameof(otherParameters))) && SecurityLevel == otherParameters.SecurityLevel && PrimaryPort == otherParameters.PrimaryPort && SecondaryPort == otherParameters.SecondaryPort diff --git a/src/Tgstation.Server.Host.Service/ServerService.cs b/src/Tgstation.Server.Host.Service/ServerService.cs index b82dd1de65..42bb08041f 100644 --- a/src/Tgstation.Server.Host.Service/ServerService.cs +++ b/src/Tgstation.Server.Host.Service/ServerService.cs @@ -2,7 +2,6 @@ using Microsoft.Extensions.Logging.EventLog; using System; using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.ServiceProcess; using System.Threading; @@ -85,9 +84,7 @@ namespace Tgstation.Server.Host.Service Task.Run(Stop, cancellationToken); } catch (OperationCanceledException) { } -#pragma warning disable CA1031 // Do not catch general exception types catch (Exception e) -#pragma warning restore CA1031 // Do not catch general exception types { EventLog.WriteEntry(String.Format(CultureInfo.InvariantCulture, "Error stopping service! Exception: {0}", e)); } @@ -97,7 +94,6 @@ namespace Tgstation.Server.Host.Service } /// - [SuppressMessage("Microsoft.Usage", "CA2213:DisposableFieldsShouldBeDisposed", MessageId = "cancellationTokenSource", Justification = "IT'S DISPOSED RIGHT THERE YOU FUCCBOI!")] protected override void Dispose(bool disposing) { cancellationTokenSource?.Dispose(); diff --git a/src/Tgstation.Server.Host/Components/Compiler/DreamMaker.cs b/src/Tgstation.Server.Host/Components/Compiler/DreamMaker.cs index b4b52bf9ba..318243c064 100644 --- a/src/Tgstation.Server.Host/Components/Compiler/DreamMaker.cs +++ b/src/Tgstation.Server.Host/Components/Compiler/DreamMaker.cs @@ -176,9 +176,9 @@ namespace Tgstation.Server.Host.Components.Compiler var dirA = ioManager.ConcatPath(job.DirectoryName.ToString(), ADirectoryName); job.MinimumSecurityLevel = securityLevel; // needed for the TempDmbProvider - var provider = new TemporaryDmbProvider(ioManager.ResolvePath(dirA), String.Concat(job.DmeName, DmbExtension), job); - var timeoutAt = DateTimeOffset.Now.AddSeconds(timeout); + + using (var provider = new TemporaryDmbProvider(ioManager.ResolvePath(dirA), String.Concat(job.DmeName, DmbExtension), job)) using (var controller = await sessionControllerFactory.LaunchNew(launchParameters, provider, byondLock, true, true, true, cancellationToken).ConfigureAwait(false)) { var launchResult = await controller.LaunchResult.ConfigureAwait(false); diff --git a/src/Tgstation.Server.Host/Components/Watchdog/SessionControllerFactory.cs b/src/Tgstation.Server.Host/Components/Watchdog/SessionControllerFactory.cs index 997f463571..cfa7c81c0d 100644 --- a/src/Tgstation.Server.Host/Components/Watchdog/SessionControllerFactory.cs +++ b/src/Tgstation.Server.Host/Components/Watchdog/SessionControllerFactory.cs @@ -296,29 +296,30 @@ namespace Tgstation.Server.Host.Components.Watchdog { networkPromptReaper.RegisterProcess(process); result = new SessionController(reattachInformation, process, byondLock, byondTopicSender, chatJsonTrackingContext, context, chat, loggerFactory.CreateLogger(), null, null); + + process = null; + context = null; + byondLock = null; + chatJsonTrackingContext = null; } finally { - if (result == null) - process.Dispose(); + process?.Dispose(); } } finally { - if (result == null) - context.Dispose(); + context?.Dispose(); } } finally { - if (result == null) - byondLock.Dispose(); + byondLock?.Dispose(); } } finally { - if (result == null) - chatJsonTrackingContext.Dispose(); + chatJsonTrackingContext?.Dispose(); } return result; diff --git a/src/Tgstation.Server.Host/Components/Watchdog/Watchdog.cs b/src/Tgstation.Server.Host/Components/Watchdog/Watchdog.cs index 0aa84f2601..84ea3fb90d 100644 --- a/src/Tgstation.Server.Host/Components/Watchdog/Watchdog.cs +++ b/src/Tgstation.Server.Host/Components/Watchdog/Watchdog.cs @@ -208,6 +208,10 @@ namespace Tgstation.Server.Host.Components.Watchdog DisposeAndNullControllers(); semaphore.Dispose(); restartRegistration.Dispose(); + + // mostly here to please fxcop, but it definitely should be disposed already + Debug.Assert(monitorCts == null, "We reached Disposes() an monitorCts is not null!"); + monitorCts?.Dispose(); } /// @@ -679,6 +683,7 @@ namespace Tgstation.Server.Host.Components.Watchdog monitorCts.Cancel(); await monitorTask.ConfigureAwait(false); monitorCts.Dispose(); + monitorCts = null; monitorTask = null; return true; } diff --git a/src/Tgstation.Server.Host/Core/SetupWizard.cs b/src/Tgstation.Server.Host/Core/SetupWizard.cs index 44fc7eb3ff..ed782260ff 100644 --- a/src/Tgstation.Server.Host/Core/SetupWizard.cs +++ b/src/Tgstation.Server.Host/Core/SetupWizard.cs @@ -274,7 +274,8 @@ namespace Tgstation.Server.Host.Core await console.WriteAsync("Testing create DB permission...", true, cancellationToken).ConfigureAwait(false); using (var command = testConnection.CreateCommand()) { - command.CommandText = String.Format(CultureInfo.InvariantCulture, "CREATE DATABASE {0}", databaseName); + command.CommandText = "CREATE DATABASE ?"; + command.Parameters.Add(databaseName); await command.ExecuteNonQueryAsync(cancellationToken).ConfigureAwait(false); } @@ -282,7 +283,8 @@ namespace Tgstation.Server.Host.Core await console.WriteAsync("Dropping test database...", true, cancellationToken).ConfigureAwait(false); using (var command = testConnection.CreateCommand()) { - command.CommandText = String.Format(CultureInfo.InvariantCulture, "DROP DATABASE {0}", databaseName); + command.CommandText = "DROP DATABASE ?"; + command.Parameters.Add(databaseName); try { await command.ExecuteNonQueryAsync(cancellationToken).ConfigureAwait(false); diff --git a/src/Tgstation.Server.Host/Models/Migrations/20180906135553_MSInitialCreate.cs b/src/Tgstation.Server.Host/Models/Migrations/20180906135553_MSInitialCreate.cs index c796a12444..cb61dfd5cc 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/20180906135553_MSInitialCreate.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/20180906135553_MSInitialCreate.cs @@ -16,6 +16,9 @@ namespace Tgstation.Server.Host.Models.Migrations /// The to use protected override void Up(MigrationBuilder migrationBuilder) { + if (migrationBuilder == null) + throw new ArgumentNullException(nameof(migrationBuilder)); + migrationBuilder.CreateTable( name: "Users", columns: table => new @@ -596,6 +599,9 @@ namespace Tgstation.Server.Host.Models.Migrations /// The to use protected override void Down(MigrationBuilder migrationBuilder) { + if (migrationBuilder == null) + throw new ArgumentNullException(nameof(migrationBuilder)); + migrationBuilder.DropForeignKey( name: "FK_Jobs_Instances_InstanceId", table: "Jobs"); diff --git a/src/Tgstation.Server.Host/Models/Migrations/20180906143029_MYInitialCreate.cs b/src/Tgstation.Server.Host/Models/Migrations/20180906143029_MYInitialCreate.cs index 2da9d98878..7ceb691436 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/20180906143029_MYInitialCreate.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/20180906143029_MYInitialCreate.cs @@ -16,6 +16,9 @@ namespace Tgstation.Server.Host.Models.Migrations /// The to use protected override void Up(MigrationBuilder migrationBuilder) { + if (migrationBuilder == null) + throw new ArgumentNullException(nameof(migrationBuilder)); + migrationBuilder.CreateTable( name: "Users", columns: table => new @@ -593,6 +596,9 @@ namespace Tgstation.Server.Host.Models.Migrations /// The to use protected override void Down(MigrationBuilder migrationBuilder) { + if (migrationBuilder == null) + throw new ArgumentNullException(nameof(migrationBuilder)); + migrationBuilder.DropForeignKey( name: "FK_Jobs_Instances_InstanceId", table: "Jobs"); diff --git a/src/Tgstation.Server.Host/Models/Migrations/20180918020726_MYAddMinimumSecurity.cs b/src/Tgstation.Server.Host/Models/Migrations/20180918020726_MYAddMinimumSecurity.cs index 95950e251f..d2d3149416 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/20180918020726_MYAddMinimumSecurity.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/20180918020726_MYAddMinimumSecurity.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore.Migrations; +using System; using Tgstation.Server.Api.Models; namespace Tgstation.Server.Host.Models.Migrations @@ -14,6 +15,9 @@ namespace Tgstation.Server.Host.Models.Migrations /// The to use protected override void Up(MigrationBuilder migrationBuilder) { + if (migrationBuilder == null) + throw new ArgumentNullException(nameof(migrationBuilder)); + migrationBuilder.AddColumn( name: "ApiValidationSecurityLevel", table: "DreamMakerSettings", @@ -33,6 +37,9 @@ namespace Tgstation.Server.Host.Models.Migrations /// The to use protected override void Down(MigrationBuilder migrationBuilder) { + if (migrationBuilder == null) + throw new ArgumentNullException(nameof(migrationBuilder)); + migrationBuilder.DropColumn( name: "ApiValidationSecurityLevel", table: "DreamMakerSettings"); diff --git a/src/Tgstation.Server.Host/Models/Migrations/20180918021228_MSAddMinimumSecurity.cs b/src/Tgstation.Server.Host/Models/Migrations/20180918021228_MSAddMinimumSecurity.cs index 9ac5b22b9f..67abc2ea84 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/20180918021228_MSAddMinimumSecurity.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/20180918021228_MSAddMinimumSecurity.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore.Migrations; +using System; using Tgstation.Server.Api.Models; namespace Tgstation.Server.Host.Models.Migrations @@ -14,6 +15,9 @@ namespace Tgstation.Server.Host.Models.Migrations /// The to use protected override void Up(MigrationBuilder migrationBuilder) { + if (migrationBuilder == null) + throw new ArgumentNullException(nameof(migrationBuilder)); + migrationBuilder.AddColumn( name: "ApiValidationSecurityLevel", table: "DreamMakerSettings", @@ -33,6 +37,9 @@ namespace Tgstation.Server.Host.Models.Migrations /// The to use protected override void Down(MigrationBuilder migrationBuilder) { + if (migrationBuilder == null) + throw new ArgumentNullException(nameof(migrationBuilder)); + migrationBuilder.DropColumn( name: "ApiValidationSecurityLevel", table: "DreamMakerSettings"); diff --git a/src/Tgstation.Server.Host/Models/Migrations/20180918204520_MYNullableAndForeignKeyCleanup.cs b/src/Tgstation.Server.Host/Models/Migrations/20180918204520_MYNullableAndForeignKeyCleanup.cs index c5bf5fa166..2bb9547f3e 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/20180918204520_MYNullableAndForeignKeyCleanup.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/20180918204520_MYNullableAndForeignKeyCleanup.cs @@ -14,6 +14,9 @@ namespace Tgstation.Server.Host.Models.Migrations /// The to use protected override void Up(MigrationBuilder migrationBuilder) { + if (migrationBuilder == null) + throw new ArgumentNullException(nameof(migrationBuilder)); + migrationBuilder.DropForeignKey( name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInfor~", table: "Instances"); @@ -122,6 +125,9 @@ namespace Tgstation.Server.Host.Models.Migrations /// The to use protected override void Down(MigrationBuilder migrationBuilder) { + if (migrationBuilder == null) + throw new ArgumentNullException(nameof(migrationBuilder)); + migrationBuilder.DropForeignKey( name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId", table: "TestMerges"); diff --git a/src/Tgstation.Server.Host/Models/Migrations/20180918205224_MSNullableAndForeignKeyCleanup.cs b/src/Tgstation.Server.Host/Models/Migrations/20180918205224_MSNullableAndForeignKeyCleanup.cs index 3cc60483d6..ec767c8e53 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/20180918205224_MSNullableAndForeignKeyCleanup.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/20180918205224_MSNullableAndForeignKeyCleanup.cs @@ -14,6 +14,9 @@ namespace Tgstation.Server.Host.Models.Migrations /// The to use protected override void Up(MigrationBuilder migrationBuilder) { + if (migrationBuilder == null) + throw new ArgumentNullException(nameof(migrationBuilder)); + migrationBuilder.DropForeignKey( name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInformationId", table: "Instances"); @@ -120,6 +123,9 @@ namespace Tgstation.Server.Host.Models.Migrations /// The to use protected override void Down(MigrationBuilder migrationBuilder) { + if (migrationBuilder == null) + throw new ArgumentNullException(nameof(migrationBuilder)); + migrationBuilder.DropForeignKey( name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId", table: "TestMerges"); diff --git a/src/Tgstation.Server.Host/Models/Migrations/20180926033145_MSReattachCompileJobRequired.cs b/src/Tgstation.Server.Host/Models/Migrations/20180926033145_MSReattachCompileJobRequired.cs index 1de3ab48ca..8bed2d3671 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/20180926033145_MSReattachCompileJobRequired.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/20180926033145_MSReattachCompileJobRequired.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore.Migrations; +using System; namespace Tgstation.Server.Host.Models.Migrations { @@ -13,6 +14,9 @@ namespace Tgstation.Server.Host.Models.Migrations /// The to use protected override void Up(MigrationBuilder migrationBuilder) { + if (migrationBuilder == null) + throw new ArgumentNullException(nameof(migrationBuilder)); + migrationBuilder.DropForeignKey( name: "FK_ReattachInformations_CompileJobs_CompileJobId", table: "ReattachInformations"); @@ -39,6 +43,9 @@ namespace Tgstation.Server.Host.Models.Migrations /// The to use protected override void Down(MigrationBuilder migrationBuilder) { + if (migrationBuilder == null) + throw new ArgumentNullException(nameof(migrationBuilder)); + migrationBuilder.DropForeignKey( name: "FK_ReattachInformations_CompileJobs_CompileJobId", table: "ReattachInformations"); diff --git a/src/Tgstation.Server.Host/Models/Migrations/20180926034014_MYReattachCompileJobRequired.cs b/src/Tgstation.Server.Host/Models/Migrations/20180926034014_MYReattachCompileJobRequired.cs index 6eb1596cc8..b51167b1a3 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/20180926034014_MYReattachCompileJobRequired.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/20180926034014_MYReattachCompileJobRequired.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore.Migrations; +using System; namespace Tgstation.Server.Host.Models.Migrations { @@ -13,6 +14,9 @@ namespace Tgstation.Server.Host.Models.Migrations /// The to use protected override void Up(MigrationBuilder migrationBuilder) { + if (migrationBuilder == null) + throw new ArgumentNullException(nameof(migrationBuilder)); + migrationBuilder.DropForeignKey( name: "FK_ReattachInformations_CompileJobs_CompileJobId", table: "ReattachInformations"); @@ -39,6 +43,9 @@ namespace Tgstation.Server.Host.Models.Migrations /// The to use protected override void Down(MigrationBuilder migrationBuilder) { + if (migrationBuilder == null) + throw new ArgumentNullException(nameof(migrationBuilder)); + migrationBuilder.DropForeignKey( name: "FK_ReattachInformations_CompileJobs_CompileJobId", table: "ReattachInformations"); diff --git a/src/Tgstation.Server.Host/Models/Migrations/20181124231534_MSToggleTestmergeComments.cs b/src/Tgstation.Server.Host/Models/Migrations/20181124231534_MSToggleTestmergeComments.cs index 752755e8c1..8ec93a1f6b 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/20181124231534_MSToggleTestmergeComments.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/20181124231534_MSToggleTestmergeComments.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore.Migrations; +using System; namespace Tgstation.Server.Host.Models.Migrations { @@ -13,6 +14,9 @@ namespace Tgstation.Server.Host.Models.Migrations /// The to use protected override void Up(MigrationBuilder migrationBuilder) { + if (migrationBuilder == null) + throw new ArgumentNullException(nameof(migrationBuilder)); + migrationBuilder.AddColumn( name: "PostTestMergeComment", table: "RepositorySettings", @@ -26,6 +30,9 @@ namespace Tgstation.Server.Host.Models.Migrations /// The to use protected override void Down(MigrationBuilder migrationBuilder) { + if (migrationBuilder == null) + throw new ArgumentNullException(nameof(migrationBuilder)); + migrationBuilder.DropColumn( name: "PostTestMergeComment", table: "RepositorySettings"); diff --git a/src/Tgstation.Server.Host/Models/Migrations/20181124231549_MYToggleTestmergeComments.cs b/src/Tgstation.Server.Host/Models/Migrations/20181124231549_MYToggleTestmergeComments.cs index e34f586448..dddde6535d 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/20181124231549_MYToggleTestmergeComments.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/20181124231549_MYToggleTestmergeComments.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore.Migrations; +using System; namespace Tgstation.Server.Host.Models.Migrations { @@ -13,6 +14,9 @@ namespace Tgstation.Server.Host.Models.Migrations /// The to use protected override void Up(MigrationBuilder migrationBuilder) { + if (migrationBuilder == null) + throw new ArgumentNullException(nameof(migrationBuilder)); + migrationBuilder.AddColumn( name: "PostTestMergeComment", table: "RepositorySettings", @@ -26,6 +30,9 @@ namespace Tgstation.Server.Host.Models.Migrations /// The to use protected override void Down(MigrationBuilder migrationBuilder) { + if (migrationBuilder == null) + throw new ArgumentNullException(nameof(migrationBuilder)); + migrationBuilder.DropColumn( name: "PostTestMergeComment", table: "RepositorySettings"); diff --git a/src/Tgstation.Server.Host/Models/Migrations/20190219041825_MSFixRevInfoIndex.cs b/src/Tgstation.Server.Host/Models/Migrations/20190219041825_MSFixRevInfoIndex.cs index 3f24dd001a..622f0cc147 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/20190219041825_MSFixRevInfoIndex.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/20190219041825_MSFixRevInfoIndex.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore.Migrations; +using System; namespace Tgstation.Server.Host.Models.Migrations { @@ -13,6 +14,9 @@ namespace Tgstation.Server.Host.Models.Migrations /// The to use protected override void Up(MigrationBuilder migrationBuilder) { + if (migrationBuilder == null) + throw new ArgumentNullException(nameof(migrationBuilder)); + migrationBuilder.DropIndex( name: "IX_RevisionInformations_CommitSha", table: "RevisionInformations"); @@ -34,6 +38,9 @@ namespace Tgstation.Server.Host.Models.Migrations /// The to use protected override void Down(MigrationBuilder migrationBuilder) { + if (migrationBuilder == null) + throw new ArgumentNullException(nameof(migrationBuilder)); + migrationBuilder.DropIndex( name: "IX_RevisionInformations_InstanceId_CommitSha", table: "RevisionInformations"); diff --git a/src/Tgstation.Server.Host/Models/Migrations/20190219042440_MYFixRevInfoIndex.cs b/src/Tgstation.Server.Host/Models/Migrations/20190219042440_MYFixRevInfoIndex.cs index dab01e982b..a76290268a 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/20190219042440_MYFixRevInfoIndex.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/20190219042440_MYFixRevInfoIndex.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore.Migrations; +using System; namespace Tgstation.Server.Host.Models.Migrations { @@ -13,6 +14,9 @@ namespace Tgstation.Server.Host.Models.Migrations /// The to use protected override void Up(MigrationBuilder migrationBuilder) { + if (migrationBuilder == null) + throw new ArgumentNullException(nameof(migrationBuilder)); + migrationBuilder.DropForeignKey( name: "FK_RevisionInformations_Instances_InstanceId", table: "RevisionInformations"); @@ -46,6 +50,9 @@ namespace Tgstation.Server.Host.Models.Migrations /// The to use protected override void Down(MigrationBuilder migrationBuilder) { + if (migrationBuilder == null) + throw new ArgumentNullException(nameof(migrationBuilder)); + migrationBuilder.DropForeignKey( name: "FK_RevisionInformations_Instances_InstanceId", table: "RevisionInformations"); diff --git a/src/Tgstation.Server.Host/Models/Migrations/DesignTimeDbContextFactoryHelpers.cs b/src/Tgstation.Server.Host/Models/Migrations/DesignTimeDbContextFactoryHelpers.cs index 98af100f86..cb4e730d1e 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/DesignTimeDbContextFactoryHelpers.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/DesignTimeDbContextFactoryHelpers.cs @@ -7,7 +7,7 @@ using Tgstation.Server.Host.Configuration; namespace Tgstation.Server.Host.Models.Migrations { /// - /// Contains helpers for creating design time s + /// Contains helpers for creating design time s /// static class DesignTimeDbContextFactoryHelpers { diff --git a/src/Tgstation.Server.Host/Models/Migrations/MySqlDesignTimeDbContextFactory.cs b/src/Tgstation.Server.Host/Models/Migrations/MySqlDesignTimeDbContextFactory.cs index 14aafaca46..8bc131c39b 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/MySqlDesignTimeDbContextFactory.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/MySqlDesignTimeDbContextFactory.cs @@ -10,6 +10,12 @@ namespace Tgstation.Server.Host.Models.Migrations sealed class MySqlDesignTimeDbContextFactory : IDesignTimeDbContextFactory { /// - public MySqlDatabaseContext CreateDbContext(string[] args) => new MySqlDatabaseContext(new DbContextOptions(), DesignTimeDbContextFactoryHelpers.GetDbContextOptions(), new DatabaseSeeder(new CryptographySuite(new PasswordHasher())), new LoggerFactory().CreateLogger()); + public MySqlDatabaseContext CreateDbContext(string[] args) + { + using (var loggerFactory = LoggerFactory.Create(builder => { })) + { + return new MySqlDatabaseContext(new DbContextOptions(), DesignTimeDbContextFactoryHelpers.GetDbContextOptions(), new DatabaseSeeder(new CryptographySuite(new PasswordHasher())), loggerFactory.CreateLogger()); + } + } } } diff --git a/src/Tgstation.Server.Host/Models/Migrations/SqlServerDesignTimeDbContextFactory.cs b/src/Tgstation.Server.Host/Models/Migrations/SqlServerDesignTimeDbContextFactory.cs index bf903b09c8..4ae89b26f1 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/SqlServerDesignTimeDbContextFactory.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/SqlServerDesignTimeDbContextFactory.cs @@ -10,6 +10,12 @@ namespace Tgstation.Server.Host.Models.Migrations sealed class SqlServerDesignTimeDbContextFactory : IDesignTimeDbContextFactory { /// - public SqlServerDatabaseContext CreateDbContext(string[] args) => new SqlServerDatabaseContext(new DbContextOptions(), DesignTimeDbContextFactoryHelpers.GetDbContextOptions(), new DatabaseSeeder(new CryptographySuite(new PasswordHasher())), new LoggerFactory().CreateLogger()); + public SqlServerDatabaseContext CreateDbContext(string[] args) + { + using (var loggerFactory = LoggerFactory.Create(builder => { })) + { + return new SqlServerDatabaseContext(new DbContextOptions(), DesignTimeDbContextFactoryHelpers.GetDbContextOptions(), new DatabaseSeeder(new CryptographySuite(new PasswordHasher())), loggerFactory.CreateLogger()); + } + } } } diff --git a/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj b/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj index e7b5bfac57..f42cd119c1 100644 --- a/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj +++ b/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj @@ -39,10 +39,14 @@ - + + + + + From ab55d1f75dc8b1149df7643606a94243aebb71a0 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 20:58:29 -0500 Subject: [PATCH 27/38] Post package upgrade fixes --- src/Tgstation.Server.Host.Console/Program.cs | 7 ++- .../Tgstation.Server.Host.Console.csproj | 2 +- src/Tgstation.Server.Host.Service/Program.cs | 16 ++----- .../ServerService.cs | 43 ++++++++----------- .../Tgstation.Server.Host.Service.csproj | 2 +- .../Tgstation.Server.Host.Watchdog.csproj | 2 +- .../Controllers/ApiController.cs | 1 - src/Tgstation.Server.Host/Core/Application.cs | 19 ++++---- src/Tgstation.Server.Host/Core/SetupWizard.cs | 11 +++-- .../MySqlDesignTimeDbContextFactory.cs | 2 +- .../SqlServerDesignTimeDbContextFactory.cs | 2 +- .../Tgstation.Server.Host.csproj | 14 +++--- .../Tgstation.Server.Api.Tests.csproj | 4 +- .../Tgstation.Server.Client.Tests.csproj | 4 +- ...Tgstation.Server.Host.Console.Tests.csproj | 4 +- .../TestServerService.cs | 35 ++++++--------- .../Core/TestSetupWizard.cs | 12 +++++- .../Tgstation.Server.Host.Tests.csproj | 2 +- ...gstation.Server.Host.Watchdog.Tests.csproj | 4 +- .../Tgstation.Server.Tests/IntegrationTest.cs | 2 +- .../Tgstation.Server.Tests.csproj | 4 +- 21 files changed, 93 insertions(+), 99 deletions(-) diff --git a/src/Tgstation.Server.Host.Console/Program.cs b/src/Tgstation.Server.Host.Console/Program.cs index 88dddf9abe..54cdad151b 100644 --- a/src/Tgstation.Server.Host.Console/Program.cs +++ b/src/Tgstation.Server.Host.Console/Program.cs @@ -24,13 +24,16 @@ namespace Tgstation.Server.Host.Console /// A representing the running operation internal static async Task Main(string[] args) { - using (var loggerFactory = LoggerFactory.Create( - builder => builder.AddConsole())) + using (var loggerFactory = new LoggerFactory()) { var arguments = new List(args); var trace = arguments.Remove("--trace-host-watchdog"); var debug = arguments.Remove("--debug-host-watchdog"); +#pragma warning disable CS0618 // Type or member is obsolete + loggerFactory.AddConsole(trace ? LogLevel.Trace : debug ? LogLevel.Debug : LogLevel.Information, true); +#pragma warning restore CS0618 // Type or member is obsolete + if (trace && debug) { loggerFactory.CreateLogger(nameof(Program)).LogCritical("Please specify only 1 of --trace-host-watchdog or --debug-host-watchdog!"); diff --git a/src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj b/src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj index 2af9fc7bd2..86cbf78c30 100644 --- a/src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj +++ b/src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj @@ -27,7 +27,7 @@ all compile; build; native; contentfiles; analyzers - + all runtime; build; native; contentfiles; analyzers diff --git a/src/Tgstation.Server.Host.Service/Program.cs b/src/Tgstation.Server.Host.Service/Program.cs index 4d9b81d8cc..1ec0f9eae2 100644 --- a/src/Tgstation.Server.Host.Service/Program.cs +++ b/src/Tgstation.Server.Host.Service/Program.cs @@ -108,18 +108,7 @@ namespace Tgstation.Server.Host.Service } } - bool serviceWillRun = !Configure && !Install && !Uninstall; - ServerService service = null; - ILoggerFactory loggerFactory = null; - using (loggerFactory = LoggerFactory.Create(builder => - { - if (serviceWillRun) - { - LogLevel logLevel = Trace ? LogLevel.Trace : Debug ? LogLevel.Debug : LogLevel.Information; - service = new ServerService(WatchdogFactory, builder, () => loggerFactory, logLevel); - } - })) - using(service) + using (var loggerFactory = new LoggerFactory()) { if (Configure) await WatchdogFactory.CreateWatchdog(loggerFactory).RunAsync(true, Array.Empty(), default).ConfigureAwait(false); @@ -153,7 +142,8 @@ namespace Tgstation.Server.Host.Service installer.ServiceName = ServerService.Name; installer.Uninstall(null); } - else if (serviceWillRun) + else if (!Configure) + using (var service = new ServerService(WatchdogFactory, loggerFactory, Trace ? LogLevel.Trace : Debug ? LogLevel.Debug : LogLevel.Information)) ServiceBase.Run(service); } } diff --git a/src/Tgstation.Server.Host.Service/ServerService.cs b/src/Tgstation.Server.Host.Service/ServerService.cs index 42bb08041f..f94ed5fdcb 100644 --- a/src/Tgstation.Server.Host.Service/ServerService.cs +++ b/src/Tgstation.Server.Host.Service/ServerService.cs @@ -21,17 +21,12 @@ namespace Tgstation.Server.Host.Service public const string Name = "tgstation-server-4"; /// - /// The for the + /// The for the /// - readonly IWatchdogFactory watchdogFactory; + readonly IWatchdog watchdog; /// - /// The used to retrieve a configured . - /// - readonly Func getLoggerFactory; - - /// - /// The recieved from . + /// The recieved from of /// Task watchdogTask; @@ -43,39 +38,39 @@ namespace Tgstation.Server.Host.Service /// /// Construct a /// - /// The value of . - /// The to configure. - /// The used to retrieve a based on the configuration. + /// The to create with + /// The for /// The minimum to record in the event log - public ServerService(IWatchdogFactory watchdogFactory, ILoggingBuilder loggingBuilder, Func getLoggerFactory, LogLevel minumumLogLevel) + public ServerService(IWatchdogFactory watchdogFactory, ILoggerFactory loggerFactory, LogLevel minumumLogLevel) { - this.watchdogFactory = watchdogFactory ?? throw new ArgumentNullException(nameof(watchdogFactory)); - if (loggingBuilder == null) - throw new ArgumentNullException(nameof(loggingBuilder)); - this.getLoggerFactory = getLoggerFactory ?? throw new ArgumentNullException(nameof(getLoggerFactory)); + if (watchdogFactory == null) + throw new ArgumentNullException(nameof(watchdogFactory)); + if (loggerFactory == null) + throw new ArgumentNullException(nameof(loggerFactory)); - ServiceName = Name; - - loggingBuilder.AddEventLog(new EventLogSettings +#pragma warning disable CS0618 // Type or member is obsolete + loggerFactory.AddEventLog(new EventLogSettings { LogName = EventLog.Log, MachineName = EventLog.MachineName, SourceName = EventLog.Source, Filter = (message, logLevel) => logLevel >= minumumLogLevel }); +#pragma warning restore CS0618 // Type or member is obsolete + + ServiceName = Name; + watchdog = watchdogFactory.CreateWatchdog(loggerFactory); } /// - /// Creates and executes the watchdog stopping the service if it exits + /// Executes the , stopping the service if it exits /// - /// The arguments for the watchdog. + /// The arguments for the /// The for the operation /// A representing the running operation async Task RunWatchdog(string[] args, CancellationToken cancellationToken) { - var watchdog = watchdogFactory.CreateWatchdog(getLoggerFactory()); - - await watchdog.RunAsync(false, args, cancellationToken).ConfigureAwait(false); + await watchdog.RunAsync(false, args, cancellationTokenSource.Token).ConfigureAwait(false); void StopServiceAsync() { diff --git a/src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj b/src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj index 626248bcdf..479e6d6b87 100644 --- a/src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj +++ b/src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj @@ -28,7 +28,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers diff --git a/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj b/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj index 38cce74426..b25f01246a 100644 --- a/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj +++ b/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj @@ -27,7 +27,7 @@ all compile; build; native; contentfiles; analyzers - + all runtime; build; native; contentfiles; analyzers diff --git a/src/Tgstation.Server.Host/Controllers/ApiController.cs b/src/Tgstation.Server.Host/Controllers/ApiController.cs index f937018e41..9565072343 100644 --- a/src/Tgstation.Server.Host/Controllers/ApiController.cs +++ b/src/Tgstation.Server.Host/Controllers/ApiController.cs @@ -18,7 +18,6 @@ namespace Tgstation.Server.Host.Controllers /// A for API functions /// [Produces(ApiHeaders.ApplicationJson)] - [Consumes(ApiHeaders.ApplicationJson)] public abstract class ApiController : Controller { /// diff --git a/src/Tgstation.Server.Host/Core/Application.cs b/src/Tgstation.Server.Host/Core/Application.cs index fa37e32823..4f5438ca5f 100644 --- a/src/Tgstation.Server.Host/Core/Application.cs +++ b/src/Tgstation.Server.Host/Core/Application.cs @@ -104,6 +104,9 @@ namespace Tgstation.Server.Host.Core // enable options which give us config reloading services.AddOptions(); + // this is needful for the setup wizard + services.AddLogging(); + // other stuff needed for for setup wizard and configuration services.AddSingleton(); services.AddSingleton(); @@ -231,9 +234,8 @@ namespace Tgstation.Server.Host.Core // enable browser detection services.AddDetectionCore().AddBrowser(); - // enable CORS if necessary - if (controlPanelConfiguration.AllowAnyOrigin || controlPanelConfiguration.AllowedOrigins?.Count > 0) - services.AddCors(); + // CORS conditionally enabled later + services.AddCors(); void AddTypedContext() where TContext : DatabaseContext { @@ -369,12 +371,13 @@ namespace Tgstation.Server.Host.Core corsBuilder = builder => builder.WithOrigins(controlPanelConfiguration.AllowedOrigins.ToArray()); } - if (corsBuilder != null) + var originalBuilder = corsBuilder; + corsBuilder = builder => { - var originalBuilder = corsBuilder; - corsBuilder = builder => originalBuilder(builder.AllowAnyHeader().AllowAnyMethod()); - applicationBuilder.UseCors(corsBuilder); - } + builder.AllowAnyHeader().AllowAnyMethod(); + originalBuilder?.Invoke(builder); + }; + applicationBuilder.UseCors(corsBuilder); // Do not service requests until Ready is called, this will return 503 until that point applicationBuilder.UseAsyncInitialization(async cancellationToken => diff --git a/src/Tgstation.Server.Host/Core/SetupWizard.cs b/src/Tgstation.Server.Host/Core/SetupWizard.cs index ed782260ff..b7ef8aa1db 100644 --- a/src/Tgstation.Server.Host/Core/SetupWizard.cs +++ b/src/Tgstation.Server.Host/Core/SetupWizard.cs @@ -274,8 +274,10 @@ namespace Tgstation.Server.Host.Core await console.WriteAsync("Testing create DB permission...", true, cancellationToken).ConfigureAwait(false); using (var command = testConnection.CreateCommand()) { - command.CommandText = "CREATE DATABASE ?"; - command.Parameters.Add(databaseName); + // I really don't care about user sanitization here, they want to fuck their own DB? so be it +#pragma warning disable CA2100 // Review SQL queries for security vulnerabilities + command.CommandText = $"CREATE DATABASE {databaseName}"; +#pragma warning restore CA2100 // Review SQL queries for security vulnerabilities await command.ExecuteNonQueryAsync(cancellationToken).ConfigureAwait(false); } @@ -283,8 +285,9 @@ namespace Tgstation.Server.Host.Core await console.WriteAsync("Dropping test database...", true, cancellationToken).ConfigureAwait(false); using (var command = testConnection.CreateCommand()) { - command.CommandText = "DROP DATABASE ?"; - command.Parameters.Add(databaseName); +#pragma warning disable CA2100 // Review SQL queries for security vulnerabilities + command.CommandText = $"DROP DATABASE {databaseName}"; +#pragma warning restore CA2100 // Review SQL queries for security vulnerabilities try { await command.ExecuteNonQueryAsync(cancellationToken).ConfigureAwait(false); diff --git a/src/Tgstation.Server.Host/Models/Migrations/MySqlDesignTimeDbContextFactory.cs b/src/Tgstation.Server.Host/Models/Migrations/MySqlDesignTimeDbContextFactory.cs index 8bc131c39b..45cbec1e27 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/MySqlDesignTimeDbContextFactory.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/MySqlDesignTimeDbContextFactory.cs @@ -12,7 +12,7 @@ namespace Tgstation.Server.Host.Models.Migrations /// public MySqlDatabaseContext CreateDbContext(string[] args) { - using (var loggerFactory = LoggerFactory.Create(builder => { })) + using (var loggerFactory = new LoggerFactory()) { return new MySqlDatabaseContext(new DbContextOptions(), DesignTimeDbContextFactoryHelpers.GetDbContextOptions(), new DatabaseSeeder(new CryptographySuite(new PasswordHasher())), loggerFactory.CreateLogger()); } diff --git a/src/Tgstation.Server.Host/Models/Migrations/SqlServerDesignTimeDbContextFactory.cs b/src/Tgstation.Server.Host/Models/Migrations/SqlServerDesignTimeDbContextFactory.cs index 4ae89b26f1..413bfbc5aa 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/SqlServerDesignTimeDbContextFactory.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/SqlServerDesignTimeDbContextFactory.cs @@ -12,7 +12,7 @@ namespace Tgstation.Server.Host.Models.Migrations /// public SqlServerDatabaseContext CreateDbContext(string[] args) { - using (var loggerFactory = LoggerFactory.Create(builder => { })) + using (var loggerFactory = new LoggerFactory()) { return new SqlServerDatabaseContext(new DbContextOptions(), DesignTimeDbContextFactoryHelpers.GetDbContextOptions(), new DatabaseSeeder(new CryptographySuite(new PasswordHasher())), loggerFactory.CreateLogger()); } diff --git a/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj b/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj index f42cd119c1..10e2edcd18 100644 --- a/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj +++ b/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj @@ -56,7 +56,7 @@ - + @@ -64,16 +64,16 @@ all runtime; build; native; contentfiles; analyzers - - - - + + + + all runtime; build; native; contentfiles; analyzers - + @@ -85,7 +85,7 @@ - + diff --git a/tests/Tgstation.Server.Api.Tests/Tgstation.Server.Api.Tests.csproj b/tests/Tgstation.Server.Api.Tests/Tgstation.Server.Api.Tests.csproj index 96f5271bd2..437b828ee5 100644 --- a/tests/Tgstation.Server.Api.Tests/Tgstation.Server.Api.Tests.csproj +++ b/tests/Tgstation.Server.Api.Tests/Tgstation.Server.Api.Tests.csproj @@ -1,4 +1,4 @@ - + netcoreapp2.1 @@ -10,7 +10,7 @@ - + diff --git a/tests/Tgstation.Server.Client.Tests/Tgstation.Server.Client.Tests.csproj b/tests/Tgstation.Server.Client.Tests/Tgstation.Server.Client.Tests.csproj index 630454e342..aea9a97479 100644 --- a/tests/Tgstation.Server.Client.Tests/Tgstation.Server.Client.Tests.csproj +++ b/tests/Tgstation.Server.Client.Tests/Tgstation.Server.Client.Tests.csproj @@ -1,4 +1,4 @@ - + netcoreapp2.1 @@ -9,7 +9,7 @@ - + diff --git a/tests/Tgstation.Server.Host.Console.Tests/Tgstation.Server.Host.Console.Tests.csproj b/tests/Tgstation.Server.Host.Console.Tests/Tgstation.Server.Host.Console.Tests.csproj index f4b36fb2ca..0164631270 100644 --- a/tests/Tgstation.Server.Host.Console.Tests/Tgstation.Server.Host.Console.Tests.csproj +++ b/tests/Tgstation.Server.Host.Console.Tests/Tgstation.Server.Host.Console.Tests.csproj @@ -1,4 +1,4 @@ - + netcoreapp2.1 @@ -9,7 +9,7 @@ - + diff --git a/tests/Tgstation.Server.Host.Service.Tests/TestServerService.cs b/tests/Tgstation.Server.Host.Service.Tests/TestServerService.cs index ce4f7fc2c0..4cbfc16d8e 100644 --- a/tests/Tgstation.Server.Host.Service.Tests/TestServerService.cs +++ b/tests/Tgstation.Server.Host.Service.Tests/TestServerService.cs @@ -18,11 +18,11 @@ namespace Tgstation.Server.Host.Service.Tests [TestMethod] public void TestConstructionAndDisposal() { - Assert.ThrowsException(() => new ServerService(null, null, null, default)); + Assert.ThrowsException(() => new ServerService(null, null, default)); var mockWatchdogFactory = new Mock(); - Assert.ThrowsException(() => new ServerService(mockWatchdogFactory.Object, null, null, default)); - LoggerFactory.Create(builder => Assert.ThrowsException(() => new ServerService(mockWatchdogFactory.Object, builder, null, default))); - LoggerFactory.Create(builder => { new ServerService(mockWatchdogFactory.Object, builder, () => null, default).Dispose(); }); + Assert.ThrowsException(() => new ServerService(mockWatchdogFactory.Object, null, default)); + var mockLoggerFactory = new LoggerFactory(); + new ServerService(mockWatchdogFactory.Object, mockLoggerFactory, default).Dispose(); } [TestMethod] @@ -34,32 +34,23 @@ namespace Tgstation.Server.Host.Service.Tests var mockWatchdog = new Mock(); var args = Array.Empty(); - CancellationToken cancellationToken, originalToken; - using(var cts = new CancellationTokenSource()) - { - originalToken = cts.Token; - cancellationToken = originalToken; - } - var cancelled = false; - - mockWatchdog.Setup(x => x.RunAsync(false, args, It.IsAny())).Callback((bool x, string[] _, CancellationToken token) => token.Register(() => cancelled = true)).Returns(Task.CompletedTask).Verifiable(); + CancellationToken cancellationToken; + mockWatchdog.Setup(x => x.RunAsync(false, args, It.IsAny())).Callback((bool x, string[] _, CancellationToken token) => cancellationToken = token).Returns(Task.CompletedTask).Verifiable(); var mockWatchdogFactory = new Mock(); + var mockLoggerFactory = new LoggerFactory(); + mockWatchdogFactory.Setup(x => x.CreateWatchdog(mockLoggerFactory)).Returns(mockWatchdog.Object).Verifiable(); - ServerService service = null; - ILoggerFactory loggerFactory = null; - using (loggerFactory = LoggerFactory.Create(builder => service = new ServerService(mockWatchdogFactory.Object, builder, () => loggerFactory, default))) - using (service) + using (var service = new ServerService(mockWatchdogFactory.Object, mockLoggerFactory, default)) { - mockWatchdogFactory.Setup(x => x.CreateWatchdog(loggerFactory)).Returns(mockWatchdog.Object).Verifiable(); - Assert.IsFalse(cancelled); onStart.Invoke(service, new object[] { args }); - mockWatchdog.VerifyAll(); - Assert.AreNotSame(cancellationToken, originalToken); + Assert.IsFalse(cancellationToken.IsCancellationRequested); onStop.Invoke(service, Array.Empty()); - Assert.IsTrue(cancelled); + Assert.IsTrue(cancellationToken.IsCancellationRequested); + mockWatchdog.VerifyAll(); } + mockWatchdogFactory.VerifyAll(); } } diff --git a/tests/Tgstation.Server.Host.Tests/Core/TestSetupWizard.cs b/tests/Tgstation.Server.Host.Tests/Core/TestSetupWizard.cs index 8dbe49f363..5104fd0696 100644 --- a/tests/Tgstation.Server.Host.Tests/Core/TestSetupWizard.cs +++ b/tests/Tgstation.Server.Host.Tests/Core/TestSetupWizard.cs @@ -202,15 +202,25 @@ namespace Tgstation.Server.Host.Core.Tests mockApplication.SetupGet(x => x.VersionPrefix).Returns("sumfuk").Verifiable(); + + // This list is here for ease of debugging. + var consolePlayback = new List(); + mockConsole.Setup(x => x.PressAnyKeyAsync(It.IsAny())).Returns(Task.CompletedTask).Verifiable(); mockConsole.Setup(x => x.ReadLineAsync(It.IsAny(), It.IsAny())).Returns(() => { if (inputPos == finalInputSequence.Count) Assert.Fail("Exhausted input sequence!"); var res = finalInputSequence[inputPos++]; + consolePlayback.Add($"Input: {res}"); return Task.FromResult(res); }).Verifiable(); - mockConsole.Setup(x => x.WriteAsync(It.IsAny(), It.IsAny(), It.IsAny())).Returns(Task.CompletedTask).Verifiable(); + + mockConsole + .Setup(x => x.WriteAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .Callback((message, error, token) => consolePlayback.Add($"Output: {message}")) + .Returns(Task.CompletedTask) + .Verifiable(); Assert.IsFalse(await wizard.CheckRunWizard(default).ConfigureAwait(false)); //first real run diff --git a/tests/Tgstation.Server.Host.Tests/Tgstation.Server.Host.Tests.csproj b/tests/Tgstation.Server.Host.Tests/Tgstation.Server.Host.Tests.csproj index 33b5e80774..dcf77140ac 100644 --- a/tests/Tgstation.Server.Host.Tests/Tgstation.Server.Host.Tests.csproj +++ b/tests/Tgstation.Server.Host.Tests/Tgstation.Server.Host.Tests.csproj @@ -9,7 +9,7 @@ - + diff --git a/tests/Tgstation.Server.Host.Watchdog.Tests/Tgstation.Server.Host.Watchdog.Tests.csproj b/tests/Tgstation.Server.Host.Watchdog.Tests/Tgstation.Server.Host.Watchdog.Tests.csproj index 9ea94c013c..8eec7201d2 100644 --- a/tests/Tgstation.Server.Host.Watchdog.Tests/Tgstation.Server.Host.Watchdog.Tests.csproj +++ b/tests/Tgstation.Server.Host.Watchdog.Tests/Tgstation.Server.Host.Watchdog.Tests.csproj @@ -1,4 +1,4 @@ - + netcoreapp2.1 @@ -15,7 +15,7 @@ - + diff --git a/tests/Tgstation.Server.Tests/IntegrationTest.cs b/tests/Tgstation.Server.Tests/IntegrationTest.cs index a77962acd1..d5b1fe13ef 100644 --- a/tests/Tgstation.Server.Tests/IntegrationTest.cs +++ b/tests/Tgstation.Server.Tests/IntegrationTest.cs @@ -117,7 +117,7 @@ namespace Tgstation.Server.Tests } catch (ServiceUnavailableException) { - //migrating, to be expected + // migrating, to be expected if (DateTimeOffset.Now > giveUpAt) throw; await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken); diff --git a/tests/Tgstation.Server.Tests/Tgstation.Server.Tests.csproj b/tests/Tgstation.Server.Tests/Tgstation.Server.Tests.csproj index 1e79b7ab42..2b58b04e27 100644 --- a/tests/Tgstation.Server.Tests/Tgstation.Server.Tests.csproj +++ b/tests/Tgstation.Server.Tests/Tgstation.Server.Tests.csproj @@ -1,4 +1,4 @@ - + netcoreapp2.1 @@ -9,7 +9,7 @@ - + From 1b35a4f0423e4b3933172e6cc153cf6dd85fa84f Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 21:31:17 -0500 Subject: [PATCH 28/38] Fix nuget call --- build/InstallCodeCoverage.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/InstallCodeCoverage.ps1 b/build/InstallCodeCoverage.ps1 index 2f1325a3ec..9bc75348a2 100644 --- a/build/InstallCodeCoverage.ps1 +++ b/build/InstallCodeCoverage.ps1 @@ -1,6 +1,6 @@ mkdir Temp cd Temp -nuget install Microsoft.CodeCoverage --version 16.4.0 +nuget install Microsoft.CodeCoverage -Version 16.4.0 cd .. New-Item -Type Directory -Force -Path "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools" From c8913d3af766e20bf6358df563e7601436446433 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 22:14:38 -0500 Subject: [PATCH 29/38] Use correct install path for CodeCoverage.exe --- build/InstallCodeCoverage.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/InstallCodeCoverage.ps1 b/build/InstallCodeCoverage.ps1 index 9bc75348a2..15a5a6b487 100644 --- a/build/InstallCodeCoverage.ps1 +++ b/build/InstallCodeCoverage.ps1 @@ -4,5 +4,5 @@ nuget install Microsoft.CodeCoverage -Version 16.4.0 cd .. New-Item -Type Directory -Force -Path "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools" -Move-Item -Path "Microsoft.CodeCoverage.16.4.0\build\netstandard1.0\CodeCoverage" -Destination "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools\Dynamic Code Coverage Tools" +Move-Item -Path "Temp\Microsoft.CodeCoverage.16.4.0\build\netstandard1.0\CodeCoverage" -Destination "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools\Dynamic Code Coverage Tools" Remove-Item -Recurse -Force Temp From 3211164dd8179ebcd2fdc06a40f884649bd0c361 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 31 Dec 2019 09:53:57 -0500 Subject: [PATCH 30/38] Try including the CodeCoverage shim dll --- build/InstallCodeCoverage.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/build/InstallCodeCoverage.ps1 b/build/InstallCodeCoverage.ps1 index 15a5a6b487..cd6bf7b2ba 100644 --- a/build/InstallCodeCoverage.ps1 +++ b/build/InstallCodeCoverage.ps1 @@ -5,4 +5,5 @@ cd .. New-Item -Type Directory -Force -Path "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools" Move-Item -Path "Temp\Microsoft.CodeCoverage.16.4.0\build\netstandard1.0\CodeCoverage" -Destination "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools\Dynamic Code Coverage Tools" +Move-Item -Path "Temp\Microsoft.CodeCoverage.16.4.0\lib\net45\Microsoft.VisualStudio.CodeCoverage.Shim.dll" -Destination "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools\Dynamic Code Coverage Tools" Remove-Item -Recurse -Force Temp From e36284f1efd5b4a49be210a4bbbbf0919a595e8d Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 31 Dec 2019 09:54:06 -0500 Subject: [PATCH 31/38] Add web control panel build messages --- src/Tgstation.Server.Host/Tgstation.Server.Host.csproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj b/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj index 10e2edcd18..47f1ede45b 100644 --- a/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj +++ b/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj @@ -41,10 +41,12 @@ + + From 2529b11d1f54a527ad6fb9cc5ee27d545a30e1e2 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 31 Dec 2019 10:01:18 -0500 Subject: [PATCH 32/38] Let's be less direct? --- build/InstallCodeCoverage.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/InstallCodeCoverage.ps1 b/build/InstallCodeCoverage.ps1 index cd6bf7b2ba..49b8df65dc 100644 --- a/build/InstallCodeCoverage.ps1 +++ b/build/InstallCodeCoverage.ps1 @@ -5,5 +5,5 @@ cd .. New-Item -Type Directory -Force -Path "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools" Move-Item -Path "Temp\Microsoft.CodeCoverage.16.4.0\build\netstandard1.0\CodeCoverage" -Destination "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools\Dynamic Code Coverage Tools" -Move-Item -Path "Temp\Microsoft.CodeCoverage.16.4.0\lib\net45\Microsoft.VisualStudio.CodeCoverage.Shim.dll" -Destination "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools\Dynamic Code Coverage Tools" +Move-Item -Path "Temp\Microsoft.CodeCoverage.16.4.0\lib" -Destination "C:\Program Files (x86)\Microsoft Visual Studio\2019\lib" Remove-Item -Recurse -Force Temp From bfc9a90aabac7d4e35fd38c0deb94480246fc5be Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 31 Dec 2019 10:13:22 -0500 Subject: [PATCH 33/38] Use symlinks for CodeCoverage.exe --- build/InstallCodeCoverage.ps1 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/build/InstallCodeCoverage.ps1 b/build/InstallCodeCoverage.ps1 index 49b8df65dc..2c968b6d94 100644 --- a/build/InstallCodeCoverage.ps1 +++ b/build/InstallCodeCoverage.ps1 @@ -1,9 +1,9 @@ -mkdir Temp -cd Temp -nuget install Microsoft.CodeCoverage -Version 16.4.0 -cd .. +New-Item -Type Directory -Force -Path "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools\Dynamic Code Coverage Tools" + +mkdir C:\CodeCoverage +pushd C:\CodeCoverage +nuget install Microsoft.CodeCoverage -Version 16.4.0 +cmd /c mklink "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools\Dynamic Code Coverage Tools\CodeCoverage.exe" "Microsoft.CodeCoverage.16.4.0\build\netstandard1.0\CodeCoverage\CodeCoverage.exe" +mklink c:\path\to\symlink c:\target\file +popd -New-Item -Type Directory -Force -Path "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools" -Move-Item -Path "Temp\Microsoft.CodeCoverage.16.4.0\build\netstandard1.0\CodeCoverage" -Destination "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools\Dynamic Code Coverage Tools" -Move-Item -Path "Temp\Microsoft.CodeCoverage.16.4.0\lib" -Destination "C:\Program Files (x86)\Microsoft Visual Studio\2019\lib" -Remove-Item -Recurse -Force Temp From 725d3043fd9671815387936498138478a3ce2eda Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 31 Dec 2019 10:13:40 -0500 Subject: [PATCH 34/38] Some HomeController logging and code cleanup --- .../Controllers/HomeController.cs | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/Tgstation.Server.Host/Controllers/HomeController.cs b/src/Tgstation.Server.Host/Controllers/HomeController.cs index 1c31b949b4..c45b51dac7 100644 --- a/src/Tgstation.Server.Host/Controllers/HomeController.cs +++ b/src/Tgstation.Server.Host/Controllers/HomeController.cs @@ -123,24 +123,24 @@ namespace Tgstation.Server.Host.Controllers if (ApiHeaders.IsTokenAuthentication) return BadRequest(new Api.Models.ErrorMessage { Message = "Cannot create a token using another token!" }); - ISystemIdentity identity; + ISystemIdentity systemIdentity; try { // trust the system over the database because a user's name can change while still having the same SID - identity = await systemIdentityFactory.CreateSystemIdentity(ApiHeaders.Username, ApiHeaders.Password, cancellationToken).ConfigureAwait(false); + systemIdentity = await systemIdentityFactory.CreateSystemIdentity(ApiHeaders.Username, ApiHeaders.Password, cancellationToken).ConfigureAwait(false); } catch (NotImplementedException) { - identity = null; + systemIdentity = null; } - using (identity) + using (systemIdentity) { IQueryable query; - if (identity == null) + if (systemIdentity == null) query = DatabaseContext.Users.Where(x => x.CanonicalName == ApiHeaders.Username.ToUpperInvariant()); else - query = DatabaseContext.Users.Where(x => x.SystemIdentifier == identity.Uid); + query = DatabaseContext.Users.Where(x => x.SystemIdentifier == systemIdentity.Uid); var user = await query.Select(x => new User { Id = x.Id, @@ -152,13 +152,14 @@ namespace Tgstation.Server.Host.Controllers if (user == null) return Unauthorized(); - if (identity == null) + if (systemIdentity == null) { var originalHash = user.PasswordHash; if (!cryptographySuite.CheckUserPassword(user, ApiHeaders.Password)) return Unauthorized(); if (user.PasswordHash != originalHash) { + Logger.LogDebug("User ID {0}'s password hash needs a refresh, updating database.", user.Id); var updatedUser = new User { Id = user.Id @@ -170,25 +171,27 @@ namespace Tgstation.Server.Host.Controllers } // check if the name changed and updoot accordingly - else if (identity.Username != user.Name) + else if (systemIdentity.Username != user.Name) { + Logger.LogDebug("User ID {0}'s system identity needs a refresh, updating database.", user.Id); DatabaseContext.Users.Attach(user); - user.Name = identity.Username; + user.Name = systemIdentity.Username; user.CanonicalName = user.Name.ToUpperInvariant(); await DatabaseContext.Save(cancellationToken).ConfigureAwait(false); } + // Now that the bookeeping is done, tell them to fuck off if necessary if (!user.Enabled.Value) return Forbid(); var token = await tokenFactory.CreateToken(user, cancellationToken).ConfigureAwait(false); - if (identity != null) + if (systemIdentity != null) { // expire the identity slightly after the auth token in case of lag var identExpiry = token.ExpiresAt.Value; identExpiry += tokenFactory.ValidationParameters.ClockSkew; identExpiry += TimeSpan.FromSeconds(15); - identityCache.CacheSystemIdentity(user, identity, identExpiry); + identityCache.CacheSystemIdentity(user, systemIdentity, identExpiry); } Logger.LogDebug("Successfully logged in user {0}!", user.Id); From 18f05f60a1f56a8a64f9941010fa9b75caa91c26 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 31 Dec 2019 10:21:25 -0500 Subject: [PATCH 35/38] Enable RDP again --- appveyor.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index 5a35dfbf1e..1bc42fd17f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -8,7 +8,10 @@ environment: secure: lJNGAXwiB5HlWdthz3K4PetqpTG5IEAyRgKaiKxFMQ8HW8CcOjRtB97B05op7BsK TGS_RELEASE_NOTES_TOKEN: secure: lJNGAXwiB5HlWdthz3K4PetqpTG5IEAyRgKaiKxFMQ8HW8CcOjRtB97B05op7BsK + APPVEYOR_RDP_PASSWORD: Asdf1234 +init: + - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) branches: only: - master From 9f3a0756ad28d3a418bae62367017c79f8584ba6 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 31 Dec 2019 10:32:53 -0500 Subject: [PATCH 36/38] Remove the stupid cleanup --- build/UploadCoverage.ps1 | 2 -- 1 file changed, 2 deletions(-) diff --git a/build/UploadCoverage.ps1 b/build/UploadCoverage.ps1 index 762bcc5081..34823a65d7 100644 --- a/build/UploadCoverage.ps1 +++ b/build/UploadCoverage.ps1 @@ -5,8 +5,6 @@ $coverageFilePathList = [string]$coverageFilePaths Write-Host "Running CodeCoverage.exe on $coverageFilePathList" &"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools\Dynamic Code Coverage Tools\CodeCoverage.exe" analyze /output:service.coveragexml "$coverageFilePathList" -rm -r TestResults - codecov -f api_coverage.xml --flag unittests codecov -f client_coverage.xml --flag unittests codecov -f host_coverage.xml --flag unittests From a9ab589ad2cf532eddd1d89bcea079aa7d9171b8 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 31 Dec 2019 10:35:43 -0500 Subject: [PATCH 37/38] Remove spurious line --- build/InstallCodeCoverage.ps1 | 1 - 1 file changed, 1 deletion(-) diff --git a/build/InstallCodeCoverage.ps1 b/build/InstallCodeCoverage.ps1 index 2c968b6d94..ba8d78779c 100644 --- a/build/InstallCodeCoverage.ps1 +++ b/build/InstallCodeCoverage.ps1 @@ -4,6 +4,5 @@ mkdir C:\CodeCoverage pushd C:\CodeCoverage nuget install Microsoft.CodeCoverage -Version 16.4.0 cmd /c mklink "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools\Dynamic Code Coverage Tools\CodeCoverage.exe" "Microsoft.CodeCoverage.16.4.0\build\netstandard1.0\CodeCoverage\CodeCoverage.exe" -mklink c:\path\to\symlink c:\target\file popd From 38abbb10ef6bd0926c9e7cbb526c85d7f612c211 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 31 Dec 2019 10:43:15 -0500 Subject: [PATCH 38/38] Fuck it, who needs coverage on a service? --- appveyor.yml | 6 +----- build/InstallCodeCoverage.ps1 | 8 -------- build/UploadCoverage.ps1 | 9 +-------- 3 files changed, 2 insertions(+), 21 deletions(-) delete mode 100644 build/InstallCodeCoverage.ps1 diff --git a/appveyor.yml b/appveyor.yml index 1bc42fd17f..963fced591 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -8,10 +8,7 @@ environment: secure: lJNGAXwiB5HlWdthz3K4PetqpTG5IEAyRgKaiKxFMQ8HW8CcOjRtB97B05op7BsK TGS_RELEASE_NOTES_TOKEN: secure: lJNGAXwiB5HlWdthz3K4PetqpTG5IEAyRgKaiKxFMQ8HW8CcOjRtB97B05op7BsK - APPVEYOR_RDP_PASSWORD: Asdf1234 -init: - - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) branches: only: - master @@ -41,7 +38,6 @@ services: install: - choco install doxygen.install codecov graphviz.portable opencover.portable - nuget restore tgstation-server.sln - - ps: build/InstallCodeCoverage.ps1 - ps: Install-Product node 10 build: project: tgstation-server.sln @@ -62,7 +58,7 @@ test_script: - ps: $wc = New-Object 'System.Net.WebClient' - ps: $wc.UploadFile("https://ci.appveyor.com/api/testresults/mstest/$($env:APPVEYOR_JOB_ID)", (Resolve-Path .\tests\Tgstation.Server.Host.Console.Tests\TestResults\results.trx)) - set path=%ProgramFiles(x86)%\Microsoft Visual Studio\2019\TestAgent\Common7\IDE\CommonExtensions\Microsoft\TestWindow;%path% - - vstest.console /logger:trx;LogFileName=results.trx "tests\Tgstation.Server.Host.Service.Tests\bin\%CONFIGURATION%\net471\Tgstation.Server.Host.Service.Tests.dll" /Enablecodecoverage /inIsolation /Platform:x64 + - vstest.console /logger:trx;LogFileName=results.trx "tests\Tgstation.Server.Host.Service.Tests\bin\%CONFIGURATION%\net471\Tgstation.Server.Host.Service.Tests.dll" /inIsolation /Platform:x64 - ps: $wc = New-Object 'System.Net.WebClient' - ps: $wc.UploadFile("https://ci.appveyor.com/api/testresults/mstest/$($env:APPVEYOR_JOB_ID)", (Resolve-Path .\TestResults\results.trx)) - OpenCover.Console.exe -returntargetcode -register:user -target:"C:/Program Files/dotnet/dotnet.exe" -targetargs:"test -c %CONFIGURATION% --logger:trx;LogFileName=results.trx /p:DebugType=full tests/Tgstation.Server.Host.Watchdog.Tests/Tgstation.Server.Host.Watchdog.Tests.csproj" -filter:"+[Tgstation.Server*]* -[Tgstation.Server.Host.Watchdog.Tests*]*" -output:".\watchdog_coverage.xml" -oldstyle diff --git a/build/InstallCodeCoverage.ps1 b/build/InstallCodeCoverage.ps1 deleted file mode 100644 index ba8d78779c..0000000000 --- a/build/InstallCodeCoverage.ps1 +++ /dev/null @@ -1,8 +0,0 @@ -New-Item -Type Directory -Force -Path "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools\Dynamic Code Coverage Tools" - -mkdir C:\CodeCoverage -pushd C:\CodeCoverage -nuget install Microsoft.CodeCoverage -Version 16.4.0 -cmd /c mklink "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools\Dynamic Code Coverage Tools\CodeCoverage.exe" "Microsoft.CodeCoverage.16.4.0\build\netstandard1.0\CodeCoverage\CodeCoverage.exe" -popd - diff --git a/build/UploadCoverage.ps1 b/build/UploadCoverage.ps1 index 34823a65d7..a74244feee 100644 --- a/build/UploadCoverage.ps1 +++ b/build/UploadCoverage.ps1 @@ -1,14 +1,7 @@ -$coverageFilePaths = Get-ChildItem -Path TestResults -Filter *.coverage -Recurse -ErrorAction SilentlyContinue -Force | %{ $_.fullname } - -$coverageFilePathList = [string]$coverageFilePaths - -Write-Host "Running CodeCoverage.exe on $coverageFilePathList" -&"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools\Dynamic Code Coverage Tools\CodeCoverage.exe" analyze /output:service.coveragexml "$coverageFilePathList" - codecov -f api_coverage.xml --flag unittests codecov -f client_coverage.xml --flag unittests codecov -f host_coverage.xml --flag unittests codecov -f console_coverage.xml --flag unittests codecov -f watchdog_coverage.xml --flag unittests -codecov -f service.coveragexml --flag unittests +#codecov -f service.coveragexml --flag unittests codecov -f server_coverage.xml --flag integration