コード例 #1
0
        async Task RunHeartbeatTest(CancellationToken cancellationToken)
        {
            global::System.Console.WriteLine("TEST: WATCHDOG HEARTBEAT TEST");
            // enable heartbeats
            await instanceClient.DreamDaemon.Update(new DreamDaemon
            {
                HeartbeatSeconds = 1,
            }, cancellationToken);

            var startJob = await instanceClient.DreamDaemon.Start(cancellationToken).ConfigureAwait(false);

            await WaitForJob(startJob, 10, false, cancellationToken);

            // lock on to DD and pause it so it can't heartbeat
            var ddProcs = System.Diagnostics.Process.GetProcessesByName("DreamDaemon").ToList();

            if (ddProcs.Count != 1)
            {
                Assert.Inconclusive($"Incorrect number of DD processes: {ddProcs.Count}");
            }

            using var ddProc            = ddProcs.Single();
            using var ourProcessHandler = new ProcessExecutor(
                      new PlatformIdentifier().IsWindows
                                        ? (IProcessFeatures) new WindowsProcessFeatures(Mock.Of <ILogger <WindowsProcessFeatures> >())
                                        : new PosixProcessFeatures(Mock.Of <IIOManager>(), Mock.Of <ILogger <PosixProcessFeatures> >()),
                      Mock.Of <ILogger <ProcessExecutor> >(),
                      LoggerFactory.Create(x => { }))
                                          .GetProcess(ddProc.Id);

            // Ensure it's responding to heartbeats
            await Task.WhenAny(Task.Delay(20000), ourProcessHandler.Lifetime);

            Assert.IsFalse(ddProc.HasExited);

            await instanceClient.DreamDaemon.Update(new DreamDaemon
            {
                SoftShutdown = true
            }, cancellationToken);

            ourProcessHandler.Suspend();

            await Task.WhenAny(ourProcessHandler.Lifetime, Task.Delay(TimeSpan.FromSeconds(20)));

            var timeout = 10;

            do
            {
                await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);

                var ddStatus = await instanceClient.DreamDaemon.Read(cancellationToken);

                Assert.AreEqual(1U, ddStatus.HeartbeatSeconds.Value);
                if (!ddStatus.Running.Value)
                {
                    break;
                }

                if (--timeout == 0)
                {
                    Assert.Fail("DreamDaemon didn't shutdown within the timeout!");
                }
            }while (timeout > 0);

            // disable heartbeats
            await instanceClient.DreamDaemon.Update(new DreamDaemon
            {
                HeartbeatSeconds = 0,
            }, cancellationToken);
        }