public void ExecuteGeneratesDownload()
        {
            var fileName = "nameOfDaFile";
            var label = "daLabel";
            var stream = new MemoryStream(new byte[0]);
            var transfer = new RemotingFileTransfer(stream);
            var farmService = this.mocks.StrictMock<IFarmService>();
            var action = new ProjectFileDownload(farmService);
            var cruiseRequest = this.mocks.StrictMock<ICruiseRequest>();
            var request = this.mocks.StrictMock<IRequest>();
            var projectSpec = this.mocks.StrictMock<IProjectSpecifier>();
            SetupResult.For(cruiseRequest.Request).Return(request);
            SetupResult.For(cruiseRequest.ProjectSpecifier).Return(projectSpec);
            SetupResult.For(cruiseRequest.RetrieveSessionToken()).Return(null);
            SetupResult.For(request.GetText("file")).Return(fileName);
            SetupResult.For(request.GetText("label")).Return(label);
            SetupResult.For(farmService.RetrieveFileTransfer(projectSpec, label + "\\" + fileName, null)).Return(transfer);

            mocks.ReplayAll();
            var response = action.Execute(cruiseRequest);

            mocks.VerifyAll();
            Assert.IsInstanceOf<FileTransferResponse>(response);
            var actual = response as FileTransferResponse;
            Assert.AreEqual(fileName, actual.FileName);
            Assert.AreSame(transfer, actual.FileTransfer);
        }
        /// <summary>
        /// Retrieve a file transfer object.
        /// </summary>
        /// <param name="request"></param>
        public virtual FileTransferResponse RetrieveFileTransfer(FileTransferRequest request)
        {
            var response = new FileTransferResponse(request);
            try
            {
                // Validate that the path is valid
                var sourceProject = GetIntegrator(request.ProjectName).Project;
                var filePath = Path.Combine(sourceProject.ArtifactDirectory, request.FileName);
                var fileInfo = new FileInfo(filePath);
                if (!fileInfo.FullName.StartsWith(sourceProject.ArtifactDirectory, StringComparison.OrdinalIgnoreCase))
                {
                    var message = string.Format(CultureInfo.CurrentCulture, "Files can only be retrieved from the artefact folder - unable to retrieve {0}", request.FileName);
                    Log.Warning(message);
                    throw new CruiseControlException(message);
                }
                else if (fileInfo.FullName.StartsWith(Path.Combine(sourceProject.ArtifactDirectory, "buildlogs"), StringComparison.OrdinalIgnoreCase))
                {
                    var message = string.Format(CultureInfo.CurrentCulture, "Unable to retrieve files from the build logs folder - unable to retrieve {0}", request.FileName);
                    Log.Warning(message);
                    throw new CruiseControlException(message);
                }

                RemotingFileTransfer fileTransfer = null;
                if (fileInfo.Exists)
                {
                    Log.Debug(string.Format(CultureInfo.CurrentCulture, "Retrieving file '{0}' from '{1}'", request.FileName, request.ProjectName));
                    fileTransfer = new RemotingFileTransfer(File.OpenRead(filePath));
                }
                else
                {
                    Log.Warning(string.Format(CultureInfo.CurrentCulture, "Unable to find file '{0}' in '{1}'", request.FileName, request.ProjectName));
                }
                response.FileTransfer = fileTransfer;
                response.Result = ResponseResult.Success;
            }
            catch (Exception error)
            {
                response.Result = ResponseResult.Failure;
                response.ErrorMessages.Add(
                    new ErrorMessage(error.Message));
            }
            return response;
        }