public void ShouldTimeoutWhenIISExpressTakesLongerThanSpecifiedWaitTimeToStart(
            [Frozen] ICakeLog log, [Frozen] IAdvProcess process,
            [Frozen] IAdvProcessRunner processRunner, [Frozen] IRegistry registry,
            ConfigBasedIISExpressRunner sut)
        {
            var simulatedStandardOutput = new[]
            { "1", "2", "3", "4", "IIS Express is running.", "5" };

            // hooking into the logging call that occurs previous to waiting is the only place I could
            // think of to send in simulated output to signal IIS Express has started.
            log.When(
                l =>
                l.Write(Arg.Any <Verbosity>(), Arg.Any <LogLevel>(),
                        "Waiting for IIS Express to start (timeout: {0}ms)", Arg.Any <object[]>()))
            .Do(ci =>
            {
                Thread.Sleep(100);
                foreach (var s in simulatedStandardOutput)
                {
                    process.OutputDataReceived += Raise.EventWith(process,
                                                                  new ProcessOutputReceivedEventArgs(s));
                }
            });

            processRunner.Start(Arg.Any <FilePath>(), Arg.Any <AdvProcessSettings>())
            .Returns(ci => process);

            var settings = new ConfigBasedIISExpressSettings {
                WaitForStartup = 50
            };

            sut.Invoking(s => s.StartServer(settings))
            .ShouldThrow <CakeException>()
            .WithMessage("Timed out while waiting for IIS Express to start. (timeout: 50ms)");
        }
                public void Should_Return_Process_Created_By_Runner(ICakeContext context,
                                                                    FilePath filePath, AdvProcessSettings settings, IAdvProcessRunner runner,
                                                                    IAdvProcess expectedResult)
                {
                    runner.Start(filePath, settings).Returns(expectedResult);

                    Func <IAdvProcess> sut =
                        () => context.StartAdvProcess(filePath, settings, runner);

                    var result = sut();

                    result.Should().BeSameAs(expectedResult);
                }
                public void Should_Return_Process_Created_By_Runner(ICakeContext context,
                    FilePath filePath, AdvProcessSettings settings, IAdvProcessRunner runner,
                    IAdvProcess expectedResult)
                {
                    runner.Start(filePath, settings).Returns(expectedResult);

                    Func<IAdvProcess> sut =
                        () => context.StartAdvProcess(filePath, settings, runner);

                    var result = sut();

                    result.Should().BeSameAs(expectedResult);
                }
        public void ShouldThrowWhenIISExpressProcessWritesToErrorStream(
            [Frozen] IAdvProcess process,
            [Frozen] IAdvProcessRunner processRunner, [Frozen] IRegistry registry,
            ConfigBasedIISExpressRunner sut)
        {
            processRunner.Start(Arg.Any <FilePath>(), Arg.Any <AdvProcessSettings>()).Returns(process);

            var settings = new ConfigBasedIISExpressSettings();

            sut.StartServer(settings);

            process.Invoking(
                p =>
                p.ErrorDataReceived +=
                    Raise.EventWith(
                        new ProcessOutputReceivedEventArgs("some dummy error data received")))
            .ShouldThrow <CakeException>()
            .WithMessage(
                "IIS Express returned the following error message: 'some dummy error data received'");
        }
        public void ShouldWaitUntilIISExpressServerIsStarted([Frozen] ICakeLog log,
                                                             [Frozen] IAdvProcess process, IFileSystem fileSystem,
                                                             [Frozen] IAdvProcessRunner processRunner, [Frozen] IRegistry registry,
                                                             AppPathBasedIISExpressRunner sut)
        {
            var simulatedStandardOutput = new[]
            { "1", "2", "3", "4", "IIS Express is running.", "5" };

            // hooking into the logging call that occurs previous to waiting is the only place I could
            // think of to send in simulated output to signal IIS Express has started.
            log.When(
                l =>
                l.Write(Arg.Any <Verbosity>(), Arg.Any <LogLevel>(),
                        "Waiting for IIS Express to start (timeout: {0}ms)", Arg.Any <object[]>()))
            .Do(ci =>
            {
                foreach (var s in simulatedStandardOutput)
                {
                    process.OutputDataReceived += Raise.EventWith(process,
                                                                  new ProcessOutputReceivedEventArgs(s));
                }
            });

            processRunner.Start(Arg.Any <FilePath>(), Arg.Any <AdvProcessSettings>())
            .Returns(ci => process);

            var settings = new AppPathBasedIISExpressSettings(@"c:\MyApp")
            {
                WaitForStartup = 1000
            };

            fileSystem.Exist(settings.AppPath).Returns(true);

            sut.StartServer(settings);

            log.Received()
            .Write(Verbosity.Normal, LogLevel.Information,
                   Arg.Is <string>(s => s.StartsWith("IIS Express is running")), Arg.Any <object[]>());
        }