/// <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);
            }
        }
Exemple #3
0
        /// <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);
        }
Exemple #4
0
        /// <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);
        }
Exemple #5
0
 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;
 }