public void WhenManagingOneProcess_ReturnsSingleProcessId() { processes = new[] { IFTestHelper.ExecuteWithWait("nop"), }; jobObject.AssignProcessToJob(processes[0]); var processIds = jobObject.GetProcessIds(); Assert.Collection(processIds, x => Assert.Equal(processes[0].Id, x) ); }
public static Process ExecuteInJob(JobObject jobObject, string command, params object[] args) { var process = ExecuteWithWait(command, args); jobObject.AssignProcessToJob(process); ContinueAndWait(process); return process; }
public IContainerHostClient StartContainerHost(string containerId, IContainerDirectory directory, JobObject jobObject, NetworkCredential credentials) { CopyHostToContainer(directory); var hostRunSpec = new ProcessRunSpec { ExecutablePath = directory.MapBinPath(dependencyHelper.ContainerHostExe), Arguments = new[] { containerId }, BufferedInputOutput = true, WorkingDirectory = directory.UserPath, Credentials = credentials, }; // Order here is important. // - Start the process // - Add the process to the job object // - Verify that the process is healthy // - Start the RPC message pump // // We need to ensure that the host process cannot create any new processes before // it's added to the job object. var hostProcess = processRunner.Run(hostRunSpec); jobObject.AssignProcessToJob(hostProcess.Handle); WaitForProcessToStart(hostProcess, HostProcessStartTimeout); var messageTransport = MessageTransport.Create(hostProcess.StandardOutput, hostProcess.StandardInput); var messagingClient = MessagingClient.Create(async message => { await messageTransport.PublishRequestAsync(message); }); messageTransport.SubscribeResponse(message => { messagingClient.PublishResponse(message); return Task.FromResult(0); }); messageTransport.SubscribeEvent(@event => { try { messagingClient.PublishEvent(@event); } catch (Exception e) { log.Log(LogLevel.Error, e.ToString(), e); } return Task.FromResult(0); }); var containerHostClient = new ContainerHostClient(hostProcess, messageTransport, messagingClient, jobObject); messageTransport.Start(); return containerHostClient; }
public void GetQueuedCompletionStatus_ForkBomb_DoesHaveLimitViolation() { using (var jobObject = new JobObject()) { jobObject.SetActiveProcessLimit(2); var process = IFTestHelper.ExecuteWithWait("fork-bomb"); jobObject.AssignProcessToJob(process); IFTestHelper.Continue(process); process.WaitForExit(1000); var msgs = jobObject.GetQueuedCompletionStatus(); Assert.Contains(msgs, x => x == JobObject.CompletionMsg.ActiveProcessLimit); } }
public void CreatingJobObjectBySameNameGivesEquivalentJobObject() { using (var jobObject = new JobObject("TestJobObjectName")) using (var otherJobObject = new JobObject("TestJobObjectName")) using (Process p = Process.Start("cmd.exe")) { jobObject.AssignProcessToJob(p); // Since there is no way to compare two JobObjects directly, we // assume equivalency by their content. var processIds = jobObject.GetProcessIds(); var otherProcessids = otherJobObject.GetProcessIds(); p.Kill(); Assert.Equal(processIds, otherProcessids); } }
public void CanAssignProcessToJobObject() { JobObject jobObject = new JobObject(); Process p = null; try { p = Process.Start("cmd.exe"); jobObject.AssignProcessToJob(p); bool isInJob; NativeMethods.IsProcessInJob(p.Handle, jobObject.Handle, out isInJob); Assert.True(isInJob); } finally { p.Kill(); } }
public void CanAssignProcessToJobObject() { JobObject jobObject = new JobObject(); Process p = null; try { p = Process.Start("cmd.exe"); jobObject.AssignProcessToJob(p); bool isInJob; NativeMethods.IsProcessInJob(p.Handle, jobObject.Handle, out isInJob); Assert.True(isInJob); } finally { p.Kill(); } }
public void CanTerminateAndWaitForObjectsUnderJobObject() { JobObject jobObject = new JobObject(); Process p = null; try { p = IFTestHelper.ExecuteWithWait("nop"); jobObject.AssignProcessToJob(p); jobObject.TerminateProcessesAndWait(1000); IFTestHelper.ContinueAndWait(p, timeout: 1000); Assert.True(p.HasExited); } finally { if (!p.HasExited) p.Kill(); } }
public void SetActiveProcessLimit_StopsForkBomb() { using (var jobObject = new JobObject()) { jobObject.SetActiveProcessLimit(2); var process = IFTestHelper.ExecuteWithWait("fork-bomb"); jobObject.AssignProcessToJob(process); IFTestHelper.Continue(process); process.WaitForExit(1000); var hasExited = process.HasExited; if (!hasExited) { process.Kill(); } if (!hasExited) { Console.WriteLine(process.StandardOutput.ReadToEnd()); Console.Error.WriteLine(process.StandardError.ReadToEnd()); } Assert.True(hasExited, "Active process limit was not enforced"); } }
public void ClosingLastHandleKillsProcess() { JobObject jobObject = new JobObject(); Process p = null; try { p = Process.Start("cmd.exe"); jobObject.AssignProcessToJob(p); jobObject.Dispose(); p.WaitForExit(2000); Assert.True(p.HasExited); } finally { if (!p.HasExited) { p.Kill(); } } }
public void CanTerminateAndWaitForObjectsUnderJobObject() { JobObject jobObject = new JobObject(); Process p = null; try { p = IFTestHelper.ExecuteWithWait("nop"); jobObject.AssignProcessToJob(p); jobObject.TerminateProcessesAndWait(1000); IFTestHelper.ContinueAndWait(p, timeout: 1000); Assert.True(p.HasExited); } finally { if (!p.HasExited) { p.Kill(); } } }
public void ClosingLastHandleKillsProcess() { JobObject jobObject = new JobObject(); Process p = null; try { p = Process.Start("cmd.exe"); jobObject.AssignProcessToJob(p); jobObject.Dispose(); p.WaitForExit(2000); Assert.True(p.HasExited); } finally { if (!p.HasExited) p.Kill(); } }
public void SetActiveProcessLimit_StopsForkBomb() { using (var jobObject = new JobObject()) { jobObject.SetActiveProcessLimit(2); var process = IFTestHelper.ExecuteWithWait("fork-bomb"); jobObject.AssignProcessToJob(process); IFTestHelper.Continue(process); process.WaitForExit(1000); var hasExited = process.HasExited; if(!hasExited) process.Kill(); if (!hasExited) { Console.WriteLine(process.StandardOutput.ReadToEnd()); Console.Error.WriteLine(process.StandardError.ReadToEnd()); } Assert.True(hasExited, "Active process limit was not enforced"); } }
public void CreatingJobObjectBySameNameGivesEquivalentJobObject() { using (var jobObject = new JobObject("TestJobObjectName")) using (var otherJobObject = new JobObject("TestJobObjectName")) using (Process p = Process.Start("cmd.exe")) { jobObject.AssignProcessToJob(p); // Since there is no way to compare two JobObjects directly, we // assume equivalency by their content. var processIds = jobObject.GetProcessIds(); var otherProcessids = otherJobObject.GetProcessIds(); p.Kill(); Assert.Equal(processIds, otherProcessids); } }