/// <summary> /// The main method /// </summary> /// <param name="args">Command line arguments. These arguments are expected to be created by <see cref="IChildProcessManager.RunChildProcessAsync{TOutput}"/>.</param> /// <returns>Exit code</returns> public static int Main(string[] args) { IExtendedTracer tracer = null; try { // Inject dependencies container = DependenciesInjector.GetContainer() .InjectAnalysisDependencies(withChildProcessRunner: false) .WithChildProcessRegistrations(args); // Trace tracer = container.Resolve <IExtendedTracer>(); tracer.TraceInformation($"Starting Smart Detector runner process, process ID {Process.GetCurrentProcess().Id}"); // Run the analysis IChildProcessManager childProcessManager = container.Resolve <IChildProcessManager>(); return(childProcessManager.RunAndListenToParentAsync <SmartDetectorExecutionRequest, List <ContractsAlert> >(args, RunSmartDetectorAsync, ConvertExceptionToExitCode).GetAwaiter().GetResult()); } catch (Exception e) { tracer?.ReportException(e); tracer?.TraceError("Unhandled exception in child process: " + e.Message); Console.Error.WriteLine(e.ToString()); return(-1); } }
/// <summary> /// The main method /// </summary> /// <param name="args">Command line arguments. These arguments are expected to be created by <see cref="IChildProcessManager.RunChildProcessAsync{TOutput}"/>.</param> /// <returns>Exit code</returns> public static int Main(string[] args) { ITracer tracer = null; try { // Inject dependencies container = DependenciesInjector.GetContainer() .InjectAnalysisDependencies(withChildProcessRunner: false) .WithChildProcessTracer(args); // Trace tracer = container.Resolve <ITracer>(); tracer.TraceInformation($"Starting signal runner process, process ID {Process.GetCurrentProcess().Id}"); // Run the analysis IChildProcessManager childProcessManager = container.Resolve <IChildProcessManager>(); childProcessManager.RunAndListenToParentAsync <SmartSignalRequest, List <SmartSignalResultItemPresentation> >(args, RunSignalAsync).Wait(); return(0); } catch (Exception e) { tracer?.TraceError("Unhandled exception in child process: " + e.Message); Console.Error.WriteLine(e.ToString()); return(-1); } }
/// <summary> /// Registers a tracer instance for the child process, based on the arguments received from the parent process. /// </summary> /// <param name="container">The unity container</param> /// <param name="args">The command line arguments</param> /// <returns>The unity container, after registering the tracer instance</returns> public static IUnityContainer WithChildProcessTracer(this IUnityContainer container, string[] args) { // We need to use an instance of IChildProcessManager, just to create the tracer. // To overcome the "chicken and egg" problem, we use a child container. ITracer tracer; using (IUnityContainer childContainer = container.CreateChildContainer()) { ITracer childTracer = new ConsoleTracer(string.Empty); childContainer.RegisterInstance(childTracer); IChildProcessManager childProcessManager = childContainer.Resolve <IChildProcessManager>(); tracer = childProcessManager.CreateTracerForChildProcess(args); } // Now register the instance with the parent container container.RegisterInstance(tracer); return(container); }
/// <summary> /// Registers dependencies for the child process, based on the arguments received from the parent process. /// </summary> /// <param name="container">The unity container</param> /// <param name="args">The command line arguments</param> /// <returns>The unity container, after registering the dependencies</returns> public static IUnityContainer WithChildProcessRegistrations(this IUnityContainer container, string[] args) { // We need to use an instance of IChildProcessManager, to parse the arguments. // To overcome the "chicken and egg" problem, we use a child container. IExtendedTracer tracer; ISmartDetectorLoader loader; using (IUnityContainer childContainer = container.CreateChildContainer()) { IExtendedTracer childTracer = new ConsoleTracer(string.Empty); childContainer.RegisterInstance(childTracer); IChildProcessManager childProcessManager = childContainer.Resolve <IChildProcessManager>(); tracer = childProcessManager.CreateTracerForChildProcess(args); loader = childProcessManager.CreateLoaderForChildProcess(args, tracer); } // Now register the instances with the parent container container.RegisterInstance(tracer); container.RegisterInstance(loader); return(container); }
public void TestInitialize() { this.tracerMock = new Mock <IExtendedTracer>(); this.childProcessManager = new ChildProcessManager(this.tracerMock.Object); }
/// <summary> /// Initializes a new instance of the <see cref="SmartSignalRunnerInChildProcess"/> class /// </summary> /// <param name="childProcessManager">The child process manager</param> /// <param name="tracer">The tracer</param> public SmartSignalRunnerInChildProcess(IChildProcessManager childProcessManager, ITracer tracer) { this.childProcessManager = childProcessManager; this.tracer = tracer; }
/// <summary> /// Initializes a new instance of the <see cref="SmartDetectorRunnerInChildProcess"/> class /// </summary> /// <param name="childProcessManager">The child process manager</param> /// <param name="tracer">The tracer</param> public SmartDetectorRunnerInChildProcess(IChildProcessManager childProcessManager, IExtendedTracer tracer) { this.childProcessManager = childProcessManager; this.tracer = tracer; }