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); }