public void Process_Should_Return_Correct_Exit_Code()
        {
            var environment = FakeEnvironment.CreateWindowsEnvironment();
            var log = new FakeLog();
            var runner = new AdvProcessRunner(environment, log);

            var settings =
                new AdvProcessSettings().WithArguments(args => args.Append("--exitcode 3"))
                    .UseWorkingDirectory(Environment.CurrentDirectory);


            using (var process = runner.Start(_appExe, settings))
            {
                process.WaitForExit();
                var exitCode = process.GetExitCode();
                Console.WriteLine(string.Join("\r\n", log.Messages));
                exitCode.Should().Be(3);
            }
        }
        public void Process_Should_Return_Correct_StandardError()
        {
            var environment = FakeEnvironment.CreateWindowsEnvironment();
            var log = new FakeLog();
            var runner = new AdvProcessRunner(environment, log);

            var settings =
                new AdvProcessSettings().WithArguments(
                    args => args.Append("--err \"error line1\" \"error line2\" \"error line3\""))
                    .UseWorkingDirectory(Environment.CurrentDirectory)
                    .SetRedirectStandardError(true);

            using (var process = runner.Start(_appExe, settings))
            {
                process.WaitForExit();
                var output = process.GetStandardError().ToArray();

                output.Should().BeEquivalentTo("error line1", "error line2", "error line3");
            }
        }
        public void Process_Can_Be_Killed()
        {
            var environment = FakeEnvironment.CreateWindowsEnvironment();
            var log = new FakeLog();
            var runner = new AdvProcessRunner(environment, log);

            var settings =
                new AdvProcessSettings()
                    .UseWorkingDirectory(Environment.CurrentDirectory)
                    .WithArguments(args => args.Append("--sleep 5000"));

            using (var process = runner.Start(_appExe, settings))
            {
                process.Kill();

                process.HasExited.Should().BeTrue();
            }
        }
            public void Process_Raises_OutputDataReceived_Event()
            {
                var environment = FakeEnvironment.CreateWindowsEnvironment();
                var log = new FakeLog();
                var runner = new AdvProcessRunner(environment, log);

                var settings =
                    new AdvProcessSettings()
                        .WithArguments(args => args.Append("--out OutputLine1"))
                        .UseWorkingDirectory(Environment.CurrentDirectory)
                        .SetRedirectStandardOutput(true);

                string outputDataReceived = null;

                using (var process = runner.Start(_appExe, settings))
                {
                    process.OutputDataReceived +=
                        (sender, args) => { outputDataReceived = args.Output; };

                    process.WaitForExit();

                    outputDataReceived.Should().Be("OutputLine1");
                }
            }
            public void Process_With_Output_Not_Redirected_Will_Throw()
            {
                var environment = FakeEnvironment.CreateWindowsEnvironment();
                var log = new FakeLog();
                var runner = new AdvProcessRunner(environment, log);

                var settings =
                    new AdvProcessSettings()
                        .WithArguments(args => args.Append("--out OutputLine1"))
                        .UseWorkingDirectory(Environment.CurrentDirectory)
                        .SetRedirectStandardOutput(false);

                using (var process = runner.Start(_appExe, settings))
                {
                    process.Invoking(sut => sut.OutputDataReceived += (sender, args) => { })
                        .ShouldThrow<InvalidOperationException>();
                }
            }
            public void Process_Should_Capture_Exited_Event_Added_Before_Start()
            {
                var environment = FakeEnvironment.CreateWindowsEnvironment();
                var log = new FakeLog();
                var runner = new AdvProcessRunner(environment, log);

                var settings =
                    new AdvProcessSettings()
                        .WithArguments(args => args.Append("--exitCode 5"))
                        .UseWorkingDirectory(Environment.CurrentDirectory);

                using (var process = runner.Start(_appExe, settings))
                {
                    var exitedEventWasCaptured = false;

                    process.Exited += (sender, args) => { exitedEventWasCaptured = true; };

                    // process.Start();

                    process.WaitForExit();

                    exitedEventWasCaptured.Should().BeTrue();
                }
            }
            public void Process_Raises_Exited_Event_With_ExitCode()
            {
                var environment = FakeEnvironment.CreateWindowsEnvironment();
                var log = new FakeLog();
                var runner = new AdvProcessRunner(environment, log);

                var settings =
                    new AdvProcessSettings().WithArguments(args => args.Append("--exitcode 3"))
                        .UseWorkingDirectory(Environment.CurrentDirectory);

                var exitCodeUponExit = 0;

                using (var process = runner.Start(_appExe, settings))
                {
                    process.Exited += (sender, args) =>
                    {
                        exitCodeUponExit = args.ExitCode;
                    };

                    process.WaitForExit();

                    exitCodeUponExit.Should().Be(3);
                }
            }
        public void Enumerating_GetStandardError_WillThrowWhenUsingOutputEvents()
        {
            var environment = FakeEnvironment.CreateWindowsEnvironment();
            var log = new FakeLog();
            var runner = new AdvProcessRunner(environment, log);

            var settings =
                new AdvProcessSettings()
                    //.WithArguments(args => args.Append("--out line1 line2 --echoArgs --delay 100"))
                    .UseWorkingDirectory(Environment.CurrentDirectory)
                    .SetRedirectStandardError(true);

            using (var process = runner.Start(_appExe, settings))
            {
                process.ErrorDataReceived +=
                    (sender, args) => { };

                process.WaitForExit();

                process.Invoking(p => p.GetStandardError().ToArray())
                    .ShouldThrow<InvalidOperationException>();
            }
        }
        public void Process_WillNotMissOutputViaEvents()
        {
            var environment = FakeEnvironment.CreateWindowsEnvironment();
            var log = new FakeLog();
            var runner = new AdvProcessRunner(environment, log);

            var settings =
                new AdvProcessSettings()
                    .WithArguments(args => args.Append("--out line1 line2 --echoArgs --delay 100"))
                    .UseWorkingDirectory(Environment.CurrentDirectory)
                    .SetRedirectStandardOutput(true);

            var outputDataReceived = new List<string>();

            using (var process = runner.Start(_appExe, settings))
            {
                process.OutputDataReceived +=
                    (sender, args) => { outputDataReceived.Add(args.Output); };

                process.WaitForExit();

                outputDataReceived.Should()
                    .BeEquivalentTo("Args received: --out line1 line2 --echoArgs --delay 100",
                        "line1", "line2");
            }
        }
        public void Process_Should_Use_Provided_EnvironmentVariables()
        {
            var environment = FakeEnvironment.CreateWindowsEnvironment();
            var log = new FakeLog();
            var runner = new AdvProcessRunner(environment, log);

            var settings =
                new AdvProcessSettings()
                    .WithArguments(args => args.Append("--environmentVariables EnvVar1 EnvVar2"))
                    .UseWorkingDirectory(Environment.CurrentDirectory)
                    .WithEnvironmentVariable("EnvVar1", "Value1")
                    .WithEnvironmentVariable("EnvVar2", "Value2")
                    .SetRedirectStandardOutput(true);

            using (var process = runner.Start(_appExe, settings))
            {
                process.WaitForExit();
                var output = process.GetStandardOutput().ToArray();

                output.Should().BeEquivalentTo("EnvVar1: 'Value1'", "EnvVar2: 'Value2'");
            }
        }
        public void Dispose_Does_Not_Kill_Underlying_Process_If_Still_Running()
        {
            var environment = FakeEnvironment.CreateWindowsEnvironment();
            var log = new FakeLog();
            var runner = new AdvProcessRunner(environment, log);

            var settings =
                new AdvProcessSettings()
                    .UseWorkingDirectory(Environment.CurrentDirectory)
                    .WithArguments(args => args.Append("--sleep 5000"));

            int processId;
            using (var process = runner.Start(_appExe, settings))
            {
                processId = process.ProcessId;
                process.HasExited.Should().BeFalse();
            }

            using (var p2 = System.Diagnostics.Process.GetProcessById(processId))
            {
                p2.HasExited.Should().BeFalse();
                p2.Kill();
            }
        }
        public void Kill_Process_Returns_Minus1_ExitCode()
        {
            var environment = FakeEnvironment.CreateWindowsEnvironment();
            var log = new FakeLog();
            var runner = new AdvProcessRunner(environment, log);

            var settings =
                new AdvProcessSettings()
                    .UseWorkingDirectory(Environment.CurrentDirectory)
                    .WithArguments(args => args.Append("--sleep 5000 --exitcode 3"));

            using (var process = runner.Start(_appExe, settings))
            {
                process.Kill();
                process.GetExitCode().Should().Be(-1);
            }
        }