diff --git a/build/BuildDox.ps1 b/build/BuildDox.ps1 index e41968ebb8..a88025e3d7 100644 --- a/build/BuildDox.ps1 +++ b/build/BuildDox.ps1 @@ -25,6 +25,9 @@ if($publish_dox){ git config user.email "tgstation-server@tgstation13.org" echo '# THIS BRANCH IS AUTO GENERATED BY APPVEYOR CI' > README.md + # Add in the swagger specification + mv C:/swagger.json "$doxdir/swagger.json" + # Need to create a .nojekyll file to allow filenames starting with an underscore # to be seen on the gh-pages site. Therefore creating an empty .nojekyll file. echo "" > .nojekyll diff --git a/tests/Tgstation.Server.Tests/IntegrationTest.cs b/tests/Tgstation.Server.Tests/IntegrationTest.cs index d5b1fe13ef..355d25b031 100644 --- a/tests/Tgstation.Server.Tests/IntegrationTest.cs +++ b/tests/Tgstation.Server.Tests/IntegrationTest.cs @@ -29,7 +29,7 @@ namespace Tgstation.Server.Tests try { var updatePath = Path.Combine(updatePathRoot, Guid.NewGuid().ToString()); - var server = new TestingServer(updatePath); + var server = new TestingServer(clientFactory, updatePath); using (var serverCts = new CancellationTokenSource()) { var cancellationToken = serverCts.Token; @@ -98,7 +98,7 @@ namespace Tgstation.Server.Tests [TestCategory("SkipWhenLiveUnitTesting")] public async Task TestStandardOperation() { - var server = new TestingServer(null); + var server = new TestingServer(clientFactory, null); using (var serverCts = new CancellationTokenSource()) { var cancellationToken = serverCts.Token; diff --git a/tests/Tgstation.Server.Tests/TestingServer.cs b/tests/Tgstation.Server.Tests/TestingServer.cs index f75fbbea6e..17f8ba84b7 100644 --- a/tests/Tgstation.Server.Tests/TestingServer.cs +++ b/tests/Tgstation.Server.Tests/TestingServer.cs @@ -3,8 +3,11 @@ using System; using System.Collections.Generic; using System.Globalization; using System.IO; +using System.Net; using System.Threading; using System.Threading.Tasks; +using Tgstation.Server.Api.Models; +using Tgstation.Server.Client; using Tgstation.Server.Host; using Tgstation.Server.Host.Configuration; @@ -19,8 +22,14 @@ namespace Tgstation.Server.Tests readonly IServer realServer; - public TestingServer(string updatePath) + readonly IServerClientFactory serverClientFactory; + + readonly bool dumpOpenAPISpecpath; + + public TestingServer(IServerClientFactory serverClientFactory, string updatePath) { + this.serverClientFactory = serverClientFactory; + Directory = Path.GetTempFileName(); File.Delete(Directory); System.IO.Directory.CreateDirectory(Directory); @@ -31,6 +40,7 @@ namespace Tgstation.Server.Tests var databaseType = Environment.GetEnvironmentVariable("TGS4_TEST_DATABASE_TYPE"); var connectionString = Environment.GetEnvironmentVariable("TGS4_TEST_CONNECTION_STRING"); var gitHubAccessToken = Environment.GetEnvironmentVariable("TGS4_TEST_GITHUB_TOKEN"); + var dumpOpenAPISpecPathEnvVar = Environment.GetEnvironmentVariable("TGS4_TEST_DUMP_API_SPEC"); if (String.IsNullOrEmpty(databaseType)) Assert.Inconclusive("No database type configured in env var TGS4_TEST_DATABASE_TYPE!"); @@ -40,6 +50,8 @@ namespace Tgstation.Server.Tests if (String.IsNullOrEmpty(gitHubAccessToken)) Console.WriteLine("WARNING: No GitHub access token configured, test may fail due to rate limits!"); + + dumpOpenAPISpecpath = !String.IsNullOrEmpty(dumpOpenAPISpecPathEnvVar); var args = new List() { @@ -53,6 +65,9 @@ namespace Tgstation.Server.Tests if (!String.IsNullOrEmpty(gitHubAccessToken)) args.Add(String.Format(CultureInfo.InvariantCulture, "General:GitHubAccessToken={0}", gitHubAccessToken)); + if (dumpOpenAPISpecpath) + Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development"); + realServer = new ServerFactory().CreateServer(args.ToArray(), updatePath); } @@ -61,6 +76,41 @@ namespace Tgstation.Server.Tests System.IO.Directory.Delete(Directory, true); } - public Task RunAsync(CancellationToken cancellationToken) => realServer.RunAsync(cancellationToken); + public async Task RunAsync(CancellationToken cancellationToken) + { + Task runTask = realServer.RunAsync(cancellationToken); + + if (dumpOpenAPISpecpath) + { + var giveUpAt = DateTimeOffset.Now.AddSeconds(60); + do + { + try + { + var client = await serverClientFactory.CreateServerClient(Url, User.AdminName, User.DefaultAdminPassword).ConfigureAwait(false); + break; + } + catch (ServiceUnavailableException) + { + //migrating, to be expected + if (DateTimeOffset.Now > giveUpAt) + throw; + await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken); + } + } while (true); + + // Dump swagger to disk + // This is purely for CI + var webRequest = WebRequest.Create(Url.ToString() + "swagger/v1/swagger.json"); + using (var response = webRequest.GetResponse()) + using (var content = response.GetResponseStream()) + using (var output = new FileStream(@"C:\swagger.json", FileMode.Create)) + { + await content.CopyToAsync(output); + } + } + + await runTask; + } } }