public ScenarioBuilder(Guid correlationId, ProcessManagerFactory factory, string name)
                {
                    _correlationId    = correlationId;
                    _processId        = typeof(TProcess).Name + "-" + correlationId;
                    _name             = name;
                    _factory          = factory ?? ((id, cid) => (TProcess)Activator.CreateInstance(typeof(TProcess), id, cid));
                    _given            = new object[0];
                    _expectedCommands = new object[0];
                    _expectedEvents   = new object[0];

                    _runGiven = process => _given.ForEach(process.ApplyEvent);

                    _runWhen = process =>
                    {
                        process.ClearUncommittedEvents();
                        process.ClearUndispatchedCommands();

                        process.ApplyEvent(_when);
                    };

                    _checkCommands = _ => { };
                    _checkEvents   = _ => { };

                    _runThen = process =>
                    {
                        _checkCommands(process);
                        _checkEvents(process);
                    };

                    _timer = new Stopwatch();
                }
예제 #2
0
        protected override async Task <ExitCode> InvokeInternal(ILogger logger)
        {
            var processManager = ProcessManagerFactory.CreateProcessManager();

            var engineBinary = _arguments.Engine switch
            {
                JavaScriptEngine.V8 => "v8",
                JavaScriptEngine.JavaScriptCore => "jsc",
                JavaScriptEngine.SpiderMonkey => "sm",
                _ => throw new ArgumentException()
            };

            var engineArgs = new List <string>();

            if (_arguments.Engine == JavaScriptEngine.V8)
            {
                // v8 needs this flag to enable WASM support
                engineArgs.Add("--expose_wasm");
            }

            engineArgs.AddRange(_arguments.EngineArgs);
            engineArgs.Add(_arguments.JSFile);

            if (_arguments.Engine == JavaScriptEngine.V8 || _arguments.Engine == JavaScriptEngine.JavaScriptCore)
            {
                // v8/jsc want arguments to the script separated by "--", others don't
                engineArgs.Add("--");
            }

            engineArgs.AddRange(PassThroughArguments);

            var xmlResultsFilePath = Path.Combine(_arguments.OutputDirectory, "testResults.xml");

            File.Delete(xmlResultsFilePath);

            try
            {
                var logProcessor = new WasmTestMessagesProcessor(xmlResultsFilePath, logger);
                var result       = await processManager.ExecuteCommandAsync(
                    engineBinary,
                    engineArgs,
                    log : new CallbackLog(m => logger.LogInformation(m)),
                    stdoutLog : new CallbackLog(logProcessor.Invoke)
                {
                    Timestamp = false                                                   /* we need the plain XML string so disable timestamp */
                },
                    stderrLog : new CallbackLog(m => logger.LogError(m)),
                    _arguments.Timeout);

                return(result.Succeeded ? ExitCode.SUCCESS : (result.TimedOut ? ExitCode.TIMED_OUT : ExitCode.GENERAL_FAILURE));
            }
            catch (Win32Exception e) when(e.NativeErrorCode == 2)
            {
                logger.LogCritical($"The engine binary `{engineBinary}` was not found");
                return(ExitCode.APP_LAUNCH_FAILURE);
            }
        }
    }
예제 #3
0
    public async Task ProcessShouldBeKilled()
    {
        var pm = ProcessManagerFactory.CreateProcessManager();

        var process = new Process();

        process.StartInfo.FileName  = "ping";
        process.StartInfo.Arguments = "-t 127.0.0.1";
        var log = new MemoryLog();

        var result = await pm.RunAsync(process, log, TimeSpan.FromSeconds(3));

        Assert.True(result.TimedOut);
    }
        public void ProcessWrapperFactoryCtorTest()
        {
            IProcessManagerFactory factory = null;

            try
            {
                factory = new ProcessManagerFactory(null);
                Assert.True(false, "Should fail on previous statement");
            }
            catch (Exception ex)
            {
                Assert.IsType(typeof(ArgumentNullException), ex);
                Assert.Equal("Value cannot be null.\r\nParameter name: processProxy", ex.Message);
            }

            var proxy = new Mock <IProcessProxy>();

            factory = new ProcessManagerFactory(proxy.Object);
            Assert.NotNull(factory);
        }
        public void ProcessWrapperFactoryCreateTest()
        {
            var proxy = new Mock <IProcessProxy>();
            ProcessStartInfo startInfo = null;
            var process = new Mock <IProcessWrapper>();

            proxy.Setup(s => s.Start(It.IsAny <ProcessStartInfo>()))
            .Callback <ProcessStartInfo>(c => startInfo = c)
            .Returns(() => process.Object);
            IProcessManagerFactory factory = new ProcessManagerFactory(proxy.Object);
            var wrapper = factory.Create("bot.exe", "args");

            Assert.NotNull(wrapper);
            Assert.NotNull(startInfo);
            Assert.Equal("bot.exe", startInfo.FileName);
            Assert.Equal("args", startInfo.Arguments);
            Assert.Equal(true, startInfo.RedirectStandardInput);
            Assert.Equal(true, startInfo.RedirectStandardOutput);
            Assert.Equal(false, startInfo.UseShellExecute);
            Assert.Equal(true, startInfo.CreateNoWindow);
            proxy.VerifyAll();
            process.VerifyAll();
        }
예제 #6
0
        private IMediaInfo SetupInfo()
        {
            IProcessManagerFactory Factory = new ProcessManagerFactory(Properties.Settings.Default.FFmpegPath);

            return(new MediaInfo(Factory));
        }