public CreateProcessHandlerTests() { ProcessRunner = Substitute.For<IProcessRunner>(); ProcessTracker = Substitute.For<IProcessTracker>(); Handler = new CreateProcessHandler(ProcessRunner, ProcessTracker); ExpectedParams = new CreateProcessParams { executablePath = "cmd.exe", arguments = new[] { "/C", "echo Hello" }, key = Guid.NewGuid(), workingDirectory = @"C:\Containers\handle\user", }; ExpectedProcess = Substitute.For<IProcess>(); ProcessRunner.Run(null).ReturnsForAnyArgs(ExpectedProcess); }
static void Main(string[] args) { //Debugger.Launch(); if (args.Length == 0) ExitWithError("Must specify container-id as the first argument.", -1); containerId = args[0]; hostJobObject = new JobObject(null); hostProcess = ProcessHelper.WrapProcess(Process.GetCurrentProcess()); var input = Console.In; var output = Console.Out; using (var transport = MessageTransport.Create(input, output)) { processTracker = new ProcessTracker(transport, hostJobObject, hostProcess, new ProcessHelper()); var createProcessHandler = new CreateProcessHandler(new ProcessRunner(), processTracker); var pingHandler = new PingHandler(); var findProcessByIdHandler = new FindProcessByIdHandler(processTracker); var stopProcessHandler = new StopProcessHandler(processTracker); var stopAllProcessesHandler = new StopAllProcessesHandler(processTracker); var waitForProcessExitHandler = new WaitForProcessExitHandler(processTracker); var dispatcher = new MessageDispatcher(); dispatcher.RegisterMethod<CreateProcessRequest>( CreateProcessRequest.MethodName, async (request) => { var result = await createProcessHandler.ExecuteAsync(request.@params); return new CreateProcessResponse(request.id, result); }); dispatcher.RegisterMethod<PingRequest>( PingRequest.MethodName, async (request) => { await pingHandler.ExecuteAsync(); return new PingResponse(request.id); }); dispatcher.RegisterMethod<FindProcessByIdRequest>( FindProcessByIdRequest.MethodName, async (request) => { var result = await findProcessByIdHandler.ExecuteAsync(request.@params); return new FindProcessByIdResponse(request.id, result); }); dispatcher.RegisterMethod<StopProcessRequest>( StopProcessRequest.MethodName, async (request) => { await stopProcessHandler.ExecuteAsync(request.@params); return new StopProcessResponse(request.id); }); dispatcher.RegisterMethod<StopAllProcessesRequest>( StopAllProcessesRequest.MethodName, async (request) => { await stopAllProcessesHandler.ExecuteAsync(request.@params); return new StopAllProcessesResponse(request.id); }); dispatcher.RegisterMethod<WaitForProcessExitRequest>( WaitForProcessExitRequest.MethodName, async (request) => { var result = await waitForProcessExitHandler.ExecuteAsync(request.@params); return new WaitForProcessExitResponse(request.id, result); }); transport.SubscribeRequest( async (request) => { var response = await dispatcher.DispatchAsync(request); await transport.PublishResponseAsync(response); }); transport.Start(); ReportOk(); exitEvent.WaitOne(); } }