コード例 #1
0
        public async Task TestSwarmSynchronizationAndUpdates()
        {
            // cleanup existing directories
            new TestingServer(null, false).Dispose();

            const string PrivateKey = "adlfj73ywifhks7iwrgfegjs";

            var controllerAddress = new Uri("http://localhost:5011");

            using (var controller = new TestingServer(new SwarmConfiguration
            {
                Address = controllerAddress,
                Identifier = "controller",
                PrivateKey = PrivateKey
            }, false, 5011))
            {
                using var node1 = new TestingServer(new SwarmConfiguration
                {
                    Address           = new Uri("http://localhost:5012"),
                    ControllerAddress = controllerAddress,
                    Identifier        = "node1",
                    PrivateKey        = PrivateKey
                }, false, 5012);
                using var node2 = new TestingServer(new SwarmConfiguration
                {
                    Address           = new Uri("http://localhost:5013"),
                    ControllerAddress = controllerAddress,
                    Identifier        = "node2",
                    PrivateKey        = PrivateKey
                }, false, 5013);
                using var serverCts = new CancellationTokenSource();
                var cancellationToken = serverCts.Token;
                var serverTask        = Task.WhenAll(
                    node1.Run(cancellationToken),
                    node2.Run(cancellationToken),
                    controller.Run(cancellationToken));

                try
                {
                    using var controllerClient = await CreateAdminClient(controller.Url, cancellationToken);

                    using var node1Client = await CreateAdminClient(node1.Url, cancellationToken);

                    using var node2Client = await CreateAdminClient(node2.Url, cancellationToken);

                    var controllerInfo = await controllerClient.ServerInformation(cancellationToken);

                    async Task WaitForSwarmServerUpdate()
                    {
                        ServerInformationResponse serverInformation;

                        do
                        {
                            await Task.Delay(TimeSpan.FromSeconds(10));

                            serverInformation = await node1Client.ServerInformation(cancellationToken);
                        }while (serverInformation.SwarmServers.Count == 1);
                    }
コード例 #2
0
        public async Task TestUpdateProtocol()
        {
            using var server    = new TestingServer();
            using var serverCts = new CancellationTokenSource();
            var cancellationToken = serverCts.Token;
            var serverTask        = server.Run(cancellationToken);

            try
            {
                var testUpdateVersion = new Version(4, 3, 0);
                using (var adminClient = await CreateAdminClient(server.Url, cancellationToken))
                    //attempt to update to stable
                    await adminClient.Administration.Update(new Administration
                    {
                        NewVersion = testUpdateVersion
                    }, cancellationToken).ConfigureAwait(false);

                //wait up to 3 minutes for the dl and install
                await Task.WhenAny(serverTask, Task.Delay(TimeSpan.FromMinutes(3), cancellationToken)).ConfigureAwait(false);

                Assert.IsTrue(serverTask.IsCompleted, "Server still running!");

                Assert.IsTrue(Directory.Exists(server.UpdatePath), "Update directory not present!");

                var updatedAssemblyPath = Path.Combine(server.UpdatePath, "Tgstation.Server.Host.dll");
                Assert.IsTrue(File.Exists(updatedAssemblyPath), "Updated assembly missing!");

                var updatedAssemblyVersion = FileVersionInfo.GetVersionInfo(updatedAssemblyPath);
                Assert.AreEqual(testUpdateVersion, Version.Parse(updatedAssemblyVersion.FileVersion).Semver());
            }
            catch (RateLimitException)
            {
                if (String.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("TGS4_TEST_GITHUB_TOKEN")))
                {
                    throw;
                }

                Assert.Inconclusive("GitHub rate limit hit!");
            }
            finally
            {
                serverCts.Cancel();
                try
                {
                    await serverTask.ConfigureAwait(false);
                }
                catch (OperationCanceledException) { }
                catch (AggregateException ex)
                {
                    if (ex.InnerException is NotSupportedException notSupportedException)
                    {
                        Assert.Inconclusive(notSupportedException.Message);
                    }
                }
            }
            Assert.IsTrue(server.RestartRequested, "Server not requesting restart!");
        }
コード例 #3
0
        public async Task TestUpdateProtocol()
        {
            using var server    = new TestingServer();
            using var serverCts = new CancellationTokenSource();
            var cancellationToken = serverCts.Token;
            var serverTask        = server.Run(cancellationToken);

            try
            {
                IServerClient adminClient;

                var giveUpAt = DateTimeOffset.Now.AddSeconds(60);
                do
                {
                    try
                    {
                        adminClient = await clientFactory.CreateFromLogin(server.Url, User.AdminName, User.DefaultAdminPassword).ConfigureAwait(false);

                        break;
                    }
                    catch (HttpRequestException)
                    {
                        //migrating, to be expected
                        if (DateTimeOffset.Now > giveUpAt)
                        {
                            throw;
                        }
                        await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
                    }
                    catch (ServiceUnavailableException)
                    {
                        //migrating, to be expected
                        if (DateTimeOffset.Now > giveUpAt)
                        {
                            throw;
                        }
                        await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
                    }
                } while (true);

                var testUpdateVersion = new Version(4, 1, 4);
                using (adminClient)
                    //attempt to update to stable
                    await adminClient.Administration.Update(new Administration
                    {
                        NewVersion = testUpdateVersion
                    }, cancellationToken).ConfigureAwait(false);

                //wait up to 3 minutes for the dl and install
                await Task.WhenAny(serverTask, Task.Delay(TimeSpan.FromMinutes(3), cancellationToken)).ConfigureAwait(false);

                Assert.IsTrue(serverTask.IsCompleted, "Sever still running!");

                Assert.IsTrue(Directory.Exists(server.UpdatePath), "Update directory not present!");

                var updatedAssemblyPath = Path.Combine(server.UpdatePath, "Tgstation.Server.Host.dll");
                Assert.IsTrue(File.Exists(updatedAssemblyPath), "Updated assembly missing!");

                var updatedAssemblyVersion = FileVersionInfo.GetVersionInfo(updatedAssemblyPath);
                Assert.AreEqual(testUpdateVersion, Version.Parse(updatedAssemblyVersion.FileVersion).Semver());
            }
            finally
            {
                serverCts.Cancel();
                try
                {
                    await serverTask.ConfigureAwait(false);
                }
                catch (OperationCanceledException) { }
            }
            Assert.IsTrue(server.RestartRequested, "Server not requesting restart!");
        }
コード例 #4
0
        public async Task TestServer()
        {
            var procs = System.Diagnostics.Process.GetProcessesByName("byond");

            if (procs.Any())
            {
                foreach (var proc in procs)
                {
                    proc.Dispose();
                }
                Assert.Inconclusive("Cannot run server test because DreamDaemon will not start headless while the BYOND pager is running!");
            }

            using var server = new TestingServer();

            using var hardTimeoutCts = new CancellationTokenSource();
            hardTimeoutCts.CancelAfter(new TimeSpan(0, 9, 45));
            var hardTimeoutCancellationToken = hardTimeoutCts.Token;

            hardTimeoutCancellationToken.Register(() => Console.WriteLine($"[{DateTimeOffset.Now}] TEST TIMEOUT HARD!"));

            using var softTimeoutCts = CancellationTokenSource.CreateLinkedTokenSource(hardTimeoutCancellationToken);
            softTimeoutCts.CancelAfter(new TimeSpan(0, 9, 15));
            var  softTimeoutCancellationToken = softTimeoutCts.Token;
            bool tooLateForSoftTimeout        = false;

            softTimeoutCancellationToken.Register(() =>
            {
                if (!tooLateForSoftTimeout)
                {
                    Console.WriteLine($"[{DateTimeOffset.Now}] TEST TIMEOUT SOFT!");
                }
            });

            using var serverCts = CancellationTokenSource.CreateLinkedTokenSource(softTimeoutCancellationToken);
            var cancellationToken = serverCts.Token;

            TerminateAllDDs();
            var serverTask = server.Run(cancellationToken);

            try
            {
                async Task <IServerClient> CreateAdminClient()
                {
                    var giveUpAt = DateTimeOffset.Now.AddSeconds(60);

                    do
                    {
                        try
                        {
                            return(await clientFactory.CreateFromLogin(server.Url, User.AdminName, User.DefaultAdminPassword, attemptLoginRefresh : false).ConfigureAwait(false));
                        }
                        catch (HttpRequestException)
                        {
                            //migrating, to be expected
                            if (DateTimeOffset.Now > giveUpAt)
                            {
                                throw;
                            }
                            await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
                        }
                        catch (ServiceUnavailableException)
                        {
                            // migrating, to be expected
                            if (DateTimeOffset.Now > giveUpAt)
                            {
                                throw;
                            }
                            await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
                        }
                    } while (true);
                }

                Api.Models.Instance instance;
                using (var adminClient = await CreateAdminClient())
                {
                    if (server.DumpOpenApiSpecpath)
                    {
                        // Dump swagger to disk
                        // This is purely for CI
                        var webRequest = WebRequest.Create(server.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);
                    }

                    var serverInfo = await adminClient.Version(default).ConfigureAwait(false);
コード例 #5
0
        public async Task TestUpdateProtocolAndDisabledOAuth()
        {
            using var server    = new TestingServer(null, false);
            using var serverCts = new CancellationTokenSource();
            var cancellationToken = serverCts.Token;
            var serverTask        = server.Run(cancellationToken);

            try
            {
                var testUpdateVersion = new Version(4, 3, 0);
                using (var adminClient = await CreateAdminClient(server.Url, cancellationToken))
                {
                    // Disabled OAuth test
                    using (var httpClient = new HttpClient())
                        using (var request = new HttpRequestMessage(HttpMethod.Post, server.Url.ToString()))
                        {
                            request.Headers.Accept.Clear();
                            request.Headers.UserAgent.Add(new ProductInfoHeaderValue("RootTest", "1.0.0"));
                            request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(MediaTypeNames.Application.Json));
                            request.Headers.Add(ApiHeaders.ApiVersionHeader, "Tgstation.Server.Api/" + ApiHeaders.Version);
                            request.Headers.Authorization = new AuthenticationHeaderValue(ApiHeaders.OAuthAuthenticationScheme, adminClient.Token.Bearer);
                            request.Headers.Add(ApiHeaders.OAuthProviderHeader, OAuthProvider.GitHub.ToString());
                            using var response = await httpClient.SendAsync(request, cancellationToken);

                            Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
                            var content = await response.Content.ReadAsStringAsync();

                            var message = JsonConvert.DeserializeObject <ErrorMessageResponse>(content);
                            Assert.AreEqual(ErrorCode.OAuthProviderDisabled, message.ErrorCode);
                        }

                    //attempt to update to stable
                    await adminClient.Administration.Update(new ServerUpdateRequest
                    {
                        NewVersion = testUpdateVersion
                    }, cancellationToken).ConfigureAwait(false);

                    var serverInfo = await adminClient.ServerInformation(cancellationToken);

                    Assert.IsTrue(serverInfo.UpdateInProgress);
                }

                //wait up to 3 minutes for the dl and install
                await Task.WhenAny(serverTask, Task.Delay(TimeSpan.FromMinutes(3), cancellationToken)).ConfigureAwait(false);

                Assert.IsTrue(serverTask.IsCompleted, "Server still running!");

                Assert.IsTrue(Directory.Exists(server.UpdatePath), "Update directory not present!");

                var updatedAssemblyPath = Path.Combine(server.UpdatePath, "Tgstation.Server.Host.dll");
                Assert.IsTrue(File.Exists(updatedAssemblyPath), "Updated assembly missing!");

                var updatedAssemblyVersion = FileVersionInfo.GetVersionInfo(updatedAssemblyPath);
                Assert.AreEqual(testUpdateVersion, Version.Parse(updatedAssemblyVersion.FileVersion).Semver());
            }
            catch (RateLimitException ex)
            {
                if (String.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("TGS4_TEST_GITHUB_TOKEN")))
                {
                    throw;
                }

                Assert.Inconclusive("GitHub rate limit hit: {0}", ex);
            }
            finally
            {
                serverCts.Cancel();
                try
                {
                    await serverTask.ConfigureAwait(false);
                }
                catch (OperationCanceledException) { }
                catch (AggregateException ex)
                {
                    if (ex.InnerException is NotSupportedException notSupportedException)
                    {
                        Assert.Inconclusive(notSupportedException.Message);
                    }
                }
            }
            Assert.IsTrue(server.RestartRequested, "Server not requesting restart!");
        }