Beispiel #1
0
        public void EnsureAgentResponsive_AgentDoesNotRespond_LeavesOtherAgentsAlive()
        {
            // Arrange
            var installation      = new GpgInstallationBuilder().Build();
            var runningAgentMocks = new[]
            {
                new Mock <IProcess>(),
                new Mock <IProcess>(),
            };

            runningAgentMocks[0].Setup(p => p.MainModuleName).Returns(installation.GpgAgentExecutable.FullName);
            runningAgentMocks[1].Setup(p => p.MainModuleName).Returns(@"C:\other\gpg-agent.exe");

            processes.Setup(p => p.GetProcessesByName("gpg-agent")).Returns(runningAgentMocks.Select(m => m.Object).ToArray);
            processes.Setup(p => p.GetProcesses()).Returns(runningAgentMocks.Select(m => m.Object).ToArray);
            processes.Setup(p => p.Start(It.IsAny <ProcessStartInfo>())).Returns(CreateProcessWithBlockingStandardOutput);
            var agent = new GpgAgent(processes.Object, installation);

            // Act
            agent.EnsureAgentResponsive();

            // Assert
            runningAgentMocks[0].Verify(m => m.Kill(), Times.Once);
            runningAgentMocks[1].Verify(m => m.Kill(), Times.Never);
        }
Beispiel #2
0
        public void EnsureAgentResponsive_StartConnectAgentThrows_CatchesException()
        {
            AddRunningAgentProcess();
            processes.Setup(p => p.Start(It.IsAny <ProcessStartInfo>())).Throws <Exception>();
            var installation = new GpgInstallationBuilder().Build();
            var agent        = new GpgAgent(processes.Object, installation);

            Should.NotThrow(() => agent.EnsureAgentResponsive());
        }
Beispiel #3
0
        public void EnsureAgentResponsive_ConnectAgentDoesNotExist_DoesNotThrow()
        {
            AddRunningAgentProcess();
            var installation = new GpgInstallationBuilder().Build();
            var agent        = new GpgAgent(processes.Object, installation);

            installation.GpgConnectAgentExecutable.Delete();

            Should.NotThrow(() => agent.EnsureAgentResponsive());
        }
Beispiel #4
0
        public void EnsureAgentResponsive_NoAgentRunning_ReturnsWithoutAction()
        {
            var installation = new GpgInstallationBuilder().Build();
            var agent        = new GpgAgent(processes.Object, installation);

            agent.EnsureAgentResponsive();

            processes.Verify(p => p.GetProcessesByName(It.IsAny <string>()));
            processes.VerifyNoOtherCalls();
        }
Beispiel #5
0
        public void EnsureAgentResponsive_AgentRunning_StartsConnectAgent()
        {
            AddRunningAgentProcess();
            processes.Setup(p => p.Start(It.IsAny <ProcessStartInfo>())).Returns(() => new FakeProcess());
            var installation = new GpgInstallationBuilder().Build();
            var agent        = new GpgAgent(processes.Object, installation);

            agent.EnsureAgentResponsive();

            processes.Verify(p => p.GetProcessesByName(It.IsAny <string>()));
            processes.Verify(p => p.Start(It.Is <ProcessStartInfo>(
                                              info => info.FileName == installation.GpgConnectAgentExecutable.FullName
                                              )));
        }
Beispiel #6
0
        public void EnsureAgentResponsive_ConnectWaitsForAgentAndExits_Returns(string connectAgentOutput)
        {
            AddRunningAgentProcess();
            processes.Setup(p => p.Start(It.IsAny <ProcessStartInfo>()))
            .Returns(() => new FakeProcessBuilder().WithStandardError(connectAgentOutput).Build());
            var installation = new GpgInstallationBuilder().Build();
            var agent        = new GpgAgent(processes.Object, installation);

            agent.EnsureAgentResponsive();

            processes.Verify(p => p.GetProcessesByName(It.IsAny <string>()));
            processes.Verify(p => p.Start(It.Is <ProcessStartInfo>(
                                              info => info.FileName == installation.GpgConnectAgentExecutable.FullName
                                              )));
        }
Beispiel #7
0
        public void EnsureAgentResponsive_AgentDoesNotRespond_KillsConnectAgent()
        {
            // Arrange
            AddRunningAgentProcess();
            var connectAgentProcessMock = new Mock <IProcess>();

            connectAgentProcessMock.Setup(p => p.StandardError).Returns(CreateBlockingStreamReader());

            processes.Setup(p => p.Start(It.IsAny <ProcessStartInfo>()))
            .Returns(() => connectAgentProcessMock.Object);
            var installation = new GpgInstallationBuilder().Build();
            var agent        = new GpgAgent(processes.Object, installation);

            // Act
            agent.EnsureAgentResponsive();

            // Assert
            connectAgentProcessMock.Verify(p => p.Kill(), Times.Once);
        }
Beispiel #8
0
        public void CallGpg_WithInput_WritesToProcessStandardInput()
        {
            var installation = new GpgInstallationBuilder().Build();
            var processes    = new Mock <IProcesses>();
            var inputStream  = new Mock <Stream>();

            inputStream.Setup(s => s.CanWrite).Returns(true);
            processes.Setup(p => p.Start(It.IsAny <ProcessStartInfo>()))
            .Returns(new FakeProcessBuilder()
                     .WithStandardOutput("")
                     .WithStandardError("")
                     .WithStandardInput(inputStream.Object)
                     .Build());
            var transport = new GpgTransport(new StubHomedirResolver(@"C:\gpghome"), installation, processes.Object);

            transport.CallGpg("--encrypt", "input");

            inputStream.Verify(s => s.Write(It.IsAny <byte[]>(), 0, 5));
        }
Beispiel #9
0
        public void EnsureAgentResponsive_ConnectAgentReadsButDoesNotExit_KillsConnectAgent()
        {
            // Arrange
            AddRunningAgentProcess();
            var connectAgentProcessMock = new Mock <IProcess>();

            connectAgentProcessMock.Setup(c => c.WaitForExit(It.IsAny <TimeSpan>())).Returns(false);
            connectAgentProcessMock.Setup(p => p.StandardError).Returns(new StreamReader(new MemoryStream(new byte[] { 10 })));

            processes.Setup(p => p.Start(It.IsAny <ProcessStartInfo>()))
            .Returns(() => connectAgentProcessMock.Object);
            var installation = new GpgInstallationBuilder().Build();
            var agent        = new GpgAgent(processes.Object, installation);

            // Act
            agent.EnsureAgentResponsive();

            // Assert
            connectAgentProcessMock.Verify(p => p.Kill(), Times.Once);
        }
Beispiel #10
0
        public void CallGpg_SetsResultFromProcess()
        {
            var installation = new GpgInstallationBuilder().Build();
            var processes    = new Mock <IProcesses>();

            processes.Setup(p => p.Start(It.IsAny <ProcessStartInfo>()))
            .Returns(new FakeProcessBuilder()
                     .WithStandardOutput("stdout data")
                     .WithStandardError("stderr message 1\r\nstderr message 2")
                     .WithExitCode(10)
                     .Build());
            var transport = new GpgTransport(new StubHomedirResolver(@"C:\gpghome"), installation, processes.Object);

            var result = transport.CallGpg("--decrypt");

            result.ShouldSatisfyAllConditions(
                () => result.Stdout.ShouldBe("stdout data"),
                () => result.StderrMessages.ShouldBe(new[] { "stderr message 1", "stderr message 2" }),
                () => result.ExitCode.ShouldBe(10)
                );
        }
Beispiel #11
0
        public void CallGpg_ProcessOutputsStatusMessages_AddsStatusMessagesToResult()
        {
            var installation = new GpgInstallationBuilder().Build();
            var processes    = new Mock <IProcesses>();

            processes.Setup(p => p.Start(It.IsAny <ProcessStartInfo>()))
            .Returns(new FakeProcessBuilder()
                     .WithStandardOutput("")
                     .WithStandardError("[GNUPG:] ENC_TO keyId\r\n[GNUPG:] DECRYPTION_OKAY")
                     .Build());
            var transport = new GpgTransport(new StubHomedirResolver(@"C:\gpghome"), installation, processes.Object);

            var result = transport.CallGpg("--decrypt");

            result.StatusMessages.Length.ShouldBe(2);
            result.StatusMessages.ShouldSatisfyAllConditions(
                () => result.StatusMessages[0].StatusCode.ShouldBe(GpgStatusCode.ENC_TO),
                () => result.StatusMessages[0].Message.ShouldBe("keyId"),
                () => result.StatusMessages[1].StatusCode.ShouldBe(GpgStatusCode.DECRYPTION_OKAY),
                () => result.StatusMessages[1].Message.ShouldBe(null)
                );
        }