public void DoProcessingTest()
        {
            var testUser    = GetTestUser();
            var testCompany = GetTestCompany(testUser, true);

            AddUserToUserGroups(testCompany, testUser);

            CreateTestTransfers(testCompany, testUser);

            // Create a purchase order
            var poh = GetTestPurchaseOrderHeader(testCompany, testUser, 4);

            // Get the test unpack slip data transfer service
            var config = GetDataTransferService(testCompany).FindDataTransferConfigurationModel("Test Transfer:Send-WarehouseUnpackSlip");

            // Create an unpack slip file
            string unpackFile = createUnpackListFile(poh);

            // Upload it to the test location
            FTPService.FTPService ftp = new FTPService.FTPService(config.FTPHost, config.UserId, config.Password, config.Protocol);
            string errorMsg           = "";
            bool   result             = ftp.UploadFile(unpackFile, config.TargetFolder, ref errorMsg);

            Assert.IsTrue(result == false, errorMsg);

            // Get the receive config
            config = GetDataTransferService(testCompany).FindDataTransferConfigurationModel("Test Transfer:Receive-WarehouseUnpackSlip");

            // Now run-up the task processor
            UnpackSlipReceiverTask task = new UnpackSlipReceiverTask(db);

            string[] args = { TaskName.UnpackSlipReceiverTask,
                              config.TransferName };
            task.Run(args);
        }
예제 #2
0
 private FTPService.FTPService FTPService(FTPProtocol protocol)
 {
     FTPService.FTPService ftpService = new FTPService.FTPService(GetAppSetting("Host", "", protocol),
                                                                  GetAppSetting("Login", "", protocol),
                                                                  GetAppSetting("Password", "", protocol),
                                                                  protocol);
     return(ftpService);
 }
예제 #3
0
        private void uploadFileTest(FTPProtocol protocol, int numFiles)
        {
            bool   bError;
            string errorMsg = "",
                   source   = "",
                   target,
                   remoteFolder = GetAppSetting("TargetFolder", "", protocol);

            // Create file(s) to upload
            List <string> sourceFiles = new List <string>();

            for (int i = 0; i < numFiles; i++)
            {
                source = Path.GetTempPath() + "\\" + i.ToString() + ".test";
                db.LogTestFile(source);     // So the cleanup delete it
                sourceFiles.Add(source);

                using (StreamWriter sw = new StreamWriter(source)) {
                    sw.WriteLine(LorumIpsum());
                }
            }

            // Upload the file(s)
            FTPService.FTPService ftpService = FTPService(protocol);
            if (numFiles > 1)
            {
                source = source.FolderName() + "\\*.test";
                target = remoteFolder;
            }
            else
            {
                target = remoteFolder + "/" + source.FileName();
            }
            bError = ftpService.UploadFile(source, target, ref errorMsg);
            Assert.IsTrue(!bError, errorMsg);

            // Delete the original files so that when we download again,
            // we know we have recreated the files
            foreach (var fileName in sourceFiles)
            {
                File.Delete(fileName);
                Assert.IsTrue(!File.Exists(fileName), $"Error: Failed to delete {fileName}");
            }

            // Now try to download the files
            if (numFiles > 1)
            {
                source = remoteFolder;
                target = Path.GetTempFileName().FolderName();
            }
            else
            {
                source = target;
                target = Path.GetTempFileName().FolderName() + "\\" + source.FileName();
                db.LogTestFile(target);     // So the cleanup deletes it
            }
            List <string> downloadedFiles = new List <string>();

            bError = ftpService.DownloadFile(source, target, downloadedFiles, ref errorMsg);
            LogTestFile(downloadedFiles);
            Assert.IsTrue(!bError, errorMsg);

            // Cleanup the host
            foreach (string fileName in sourceFiles)
            {
                bError = ftpService.DeleteFile(remoteFolder + "/" + fileName.FileName(), ref errorMsg);
                Assert.IsTrue(!bError, errorMsg);
            }

            // Check that the file exists
            foreach (string fileName in sourceFiles)
            {
                Assert.IsTrue(File.Exists(fileName), $"Error: Failed to find file {fileName}");
            }
        }
예제 #4
0
        private void moveFileTest(FTPProtocol protocol)
        {
            bool   bError;
            string errorMsg   = "",
                   sourceFile = "",
                   targetFile,
                   remoteFolder = GetAppSetting("TargetFolder", "", protocol);

            // Create file(s) to upload
            sourceFile = Path.GetTempPath() + "\\MoveFile.test";
            db.LogTestFile(sourceFile);     // So the cleanup delete it

            using (StreamWriter sw = new StreamWriter(sourceFile)) {
                sw.WriteLine(LorumIpsum());
            }

            // Upload the file
            FTPService.FTPService ftpService = FTPService(protocol);
            targetFile = remoteFolder + "/" + sourceFile.FileName();

            bError = ftpService.UploadFile(sourceFile, targetFile, ref errorMsg);
            Assert.IsTrue(!bError, errorMsg);
            File.Delete(sourceFile);

            // Now download it to check that it got uploaded
            string temp = targetFile;

            targetFile = sourceFile;
            sourceFile = temp;

            List <string> downloadedFiles = new List <string>();

            bError = ftpService.DownloadFile(sourceFile, targetFile, downloadedFiles, ref errorMsg);
            LogTestFile(downloadedFiles);
            Assert.IsTrue(!bError, errorMsg);
            Assert.IsTrue(downloadedFiles.Count == 1, $"Error: {downloadedFiles.Count} file(s) were downloaded when 1 was expected");

            // Check that the file exists
            Assert.IsTrue(File.Exists(targetFile), $"Error: Failed to find file {targetFile}");

            // Now move it on the host
            targetFile = GetAppSetting("ArchiveFolder", "", protocol) + "/" + sourceFile.FileName();
            bError     = ftpService.MoveFile(sourceFile, targetFile, ref errorMsg, true);
            Assert.IsTrue(!bError, errorMsg);

            // Try to download it from original location (should fail because it has been moved)
            string tempFile = Path.GetTempFileName();

            db.LogTestFile(tempFile);     // So the cleanup delete it

            bError = ftpService.DownloadFile(sourceFile, tempFile, downloadedFiles, ref errorMsg);
            Assert.IsTrue(bError, "Error: Download should have failed because the source file has been moved. This error means that the move failed");

            // Now try to download it from the archive location
            bError = ftpService.DownloadFile(targetFile, tempFile, downloadedFiles, ref errorMsg);
            Assert.IsTrue(!bError, errorMsg);

            // Now delete it in the archive
            bError = ftpService.DeleteFile(targetFile, ref errorMsg);
            Assert.IsTrue(!bError, errorMsg);

            // Finally, try to download the archived file again (should fail)
            bError = ftpService.DownloadFile(targetFile, tempFile, downloadedFiles, ref errorMsg);
            Assert.IsTrue(bError, "Error: Download should have failed because the previous delete should have removed the file. This error means that the delete failed");
        }
예제 #5
0
        void getFTPFileListTest(FTPProtocol protocol)
        {
            int           numFiles   = 10;
            string        errorMsg   = "";
            List <string> sourceList = new List <string>();
            List <string> foundList  = new List <string>();

            FTPService.FTPService ftpService = FTPService(protocol);

            for (int i = 0; i < numFiles; i++)
            {
                var tempFile = GetTempFile(".ftptest2");
                using (var sw = new StreamWriter(tempFile)) {
                    sw.WriteLine(LorumIpsum());
                }
                sourceList.Add(tempFile);
            }
            sourceList = sourceList.OrderBy(sl => sl.Substring(0))
                         .ToList();

            // Upload the test files - this uses GetLocalFileList()
            string remoteFolder = GetAppSetting("TargetFolder", "", protocol);
            bool   bError       = ftpService.UploadFile(sourceList[0].FolderName() + "\\*.ftptest2",
                                                        remoteFolder,
                                                        ref errorMsg);

            if (bError)
            {
                foreach (string fileName in sourceList)
                {
                    ftpService.DeleteFile(remoteFolder + "/" + fileName.FileName(), ref errorMsg);
                }
            }
            Assert.IsTrue(!bError, errorMsg);

            // Now get the FTP file list
            bError = ftpService.GetFTPFileList(remoteFolder, ref foundList, ref errorMsg);
            if (bError)
            {
                foreach (string fileName in sourceList)
                {
                    ftpService.DeleteFile(remoteFolder + "/" + fileName.FileName(), ref errorMsg);
                }
            }
            Assert.IsTrue(!bError, errorMsg);
            Assert.IsTrue(foundList.Count() == numFiles, $"Error: (Protocol: {protocol}) {foundList.Count()} files were returned when {numFiles} were expected");

            foundList = foundList.OrderBy(sl => sl.Substring(0))
                        .ToList();
            string expected = "",
                   actual   = "";

            for (int i = 0; i < numFiles; i++)
            {
                expected = sourceList[i].FileName();
                actual   = foundList[i].FileName();

                if (expected != actual)
                {
                    i = numFiles;
                }
            }

            // Cleanup before the assert so we don't leave files on the server
            foreach (string fileName in sourceList)
            {
                try {
                    File.Delete(fileName);
                } catch { }
                ftpService.DeleteFile(remoteFolder + "/" + fileName.FileName(), ref errorMsg);
            }

            Assert.IsTrue(expected == actual, $"Error: '{actual}' was returned when '{expected}' was expected");
        }
예제 #6
0
        private void sendFiles(FileTransferConfigurationModel config)
        {
            int numFiles   = 0,
                numSuccess = 0,
                numErrors  = 0;
            var error      = new Error();

            WriteTaskLog($"Sending file(s) from '{config.SourceFolder}' to '{config.TargetFolder}'");

            // Start the FTP service
            var ftpService = new FTPService.FTPService(config.FTPHost, config.UserId, config.Password, config.Protocol);

            // Get a list of files on the local folder to send
            FileManagerService.FileManagerService.CreateFolder(config.SourceFolder);

            string[] fileList = null;
            try {
                fileList = Directory.GetFiles(config.SourceFolder);
                numFiles = fileList.Length;
            } catch (Exception e1) {
                WriteTaskLog(e1.Message, LogSeverity.Severe);
            }

            if (fileList != null)
            {
                foreach (var fileName in fileList)
                {
                    WriteTaskLog($"Sending '{fileName}' to '{config.TargetFolder}'");

                    string errorMsg = "";
                    if (ftpService.UploadFile(fileName, config.TargetFolder, ref errorMsg))
                    {
                        // Transfer failed
                        WriteTaskLog(errorMsg, LogSeverity.Severe);
                        numErrors++;

                        // Upon error, delete or archive local file
                        if (!string.IsNullOrEmpty(config.ErrorFolder))
                        {
                            // File is configured to be archived
                            error = FileManagerService.FileManagerService.MoveFile(fileName, config.ErrorFolder, true);
                        }
                        else
                        {
                            // No archive configuration, so just delete the file
                            error = FileManagerService.FileManagerService.DeleteFile(fileName);
                        }
                        if (error.IsError)
                        {
                            WriteTaskLog(error.Message, LogSeverity.Severe);
                        }
                    }
                    else
                    {
                        // Transfer successful
                        WriteTaskLog(errorMsg, LogSeverity.Normal);
                        numSuccess++;

                        // Upon successful send, delete or archive local file
                        if (!string.IsNullOrEmpty(config.ArchiveFolder))
                        {
                            // File is configured to be archived
                            error = FileManagerService.FileManagerService.MoveFile(fileName, config.ArchiveFolder, true);
                        }
                        else
                        {
                            // No archive configuration, so just delete the file
                            error = FileManagerService.FileManagerService.DeleteFile(fileName);
                        }
                        if (error.IsError)
                        {
                            WriteTaskLog(error.Message, LogSeverity.Severe);
                        }
                    }
                }
            }

            WriteTaskLog($"{numFiles} found, {numSuccess} sent successfully, {numErrors} error(s)");
        }
예제 #7
0
        private void receiveFiles(FileTransferConfigurationModel config)
        {
            int numFiles   = 0,
                numSuccess = 0,
                numErrors  = 0;

            WriteTaskLog($"Receiving file(s) from '{config.SourceFolder}' to '{config.TargetFolder}'");

            // Start the FTP service
            var ftpService = new FTPService.FTPService(config.FTPHost, config.UserId, config.Password, config.Protocol);

            // Get a list of files on the remote folder to receive
            string        errorMsg = "";
            List <string> fileList = new List <string>();

            if (ftpService.GetFTPFileList(config.SourceFolder, ref fileList, ref errorMsg))
            {
                WriteTaskLog(errorMsg, LogSeverity.Severe);
            }
            else
            {
                if (fileList != null)
                {
                    numFiles = fileList.Count();

                    string targetFolder = config.TargetFolder;
                    FileManagerService.FileManagerService.CreateFolder(targetFolder);

                    foreach (var fileName in fileList)
                    {
                        // Receiving a file
                        string targetFile = targetFolder + "\\" + fileName.FileName();

                        WriteTaskLog($"Receiving '{fileName}' to '{targetFile}'");

                        if (ftpService.DownloadFile(fileName,
                                                    targetFile,
                                                    null,
                                                    ref errorMsg))
                        {
                            // Failed to perform transfer
                            WriteTaskLog(errorMsg, LogSeverity.Severe);
                            numErrors++;

                            // Upon error, delete or archive remote file
                            bool bError;
                            if (!string.IsNullOrEmpty(config.ErrorFolder))
                            {
                                // File is configured to be archived
                                bError = ftpService.MoveFile(fileName, config.ErrorFolder, ref errorMsg);
                            }
                            else
                            {
                                // No archive configuration, so just delete the file
                                bError = ftpService.DeleteFile(fileName, ref errorMsg);
                            }
                            if (bError)
                            {
                                WriteTaskLog(errorMsg, LogSeverity.Severe);
                            }

                            // Delete the local file so we don't double-up
                            FileManagerService.FileManagerService.DeleteFile(targetFile);
                        }
                        else
                        {
                            // Transfer successful
                            WriteTaskLog(errorMsg, LogSeverity.Normal);
                            numSuccess++;

                            // Upon successful receipt, delete or archive remote file
                            bool bError;
                            if (!string.IsNullOrEmpty(config.ArchiveFolder))
                            {
                                // File is configured to be archived
                                bError = ftpService.MoveFile(fileName, config.ArchiveFolder, ref errorMsg);
                            }
                            else
                            {
                                // No archive configuration, so just delete the file
                                bError = ftpService.DeleteFile(fileName, ref errorMsg);
                            }
                            if (bError)
                            {
                                WriteTaskLog(errorMsg, LogSeverity.Severe);
                            }
                        }
                    }
                }
            }

            WriteTaskLog($"{numFiles} found, {numSuccess} received successfully, {numErrors} error(s)");
        }
        public override int DoProcessing(string[] args)
        {
            // This task retrieves unpack slips from a warehouse.
            // It uses the transfers configured in the task properties.
            // TaskProcessor.exe UNPACKRECEIVER datatransferprofilename
            if (args.Length != 2)
            {
                WriteTaskLog($"Error: Incorrect parameters!\r\nUsage: TaskProcessor.exe UNPACKRECEIVER datatransferprofilename");
            }
            else
            {
                string errorMsg = "";

                user = GetTaskUser();
                if (user != null)
                {
                    DataTransferService.DataTransferService dts = new DataTransferService.DataTransferService(_db);

                    string taskName = args[1];
                    var    config   = dts.FindDataTransferConfigurationModel(taskName);
                    if (config == null)
                    {
                        WriteTaskLog($"Warning: Task {taskName} cound not be found!", LogSeverity.Warning);
                    }
                    else
                    {
                        // Retrieve files from the warehouse
                        WriteTaskLog("Downloading files from: " + config.TransferName);
                        var ftpService = new FTPService.FTPService(config.FTPHost, config.UserId, config.Password, config.Protocol);

                        var fileList = new List <string>();
                        if (ftpService.GetFTPFileList(config.SourceFolder, ref fileList, ref errorMsg))
                        {
                            WriteTaskLog(errorMsg, LogSeverity.Severe);
                        }
                        else
                        {
                            // Download files one at a time and as each is successfully downloaded,
                            // archive of delete it on the FTP host.
                            // This ensures that if we have a comms failure, the local drive and FTP host are in
                            // sync and we prevent repeated loads of the same file.
                            FileManagerService.FileManagerService.CreateFolder(config.TargetFolder.TrimEnd('\\'));

                            foreach (var fileName in fileList)
                            {
                                var downloadedFile = new List <string>();
                                var result         = ftpService.DownloadFile(fileName,
                                                                             config.TargetFolder.TrimEnd('\\') + "\\" + fileName.FileName(),
                                                                             downloadedFile,
                                                                             ref errorMsg);
                                _db.LogTestFile(downloadedFile);
                                if (result)
                                {
                                    WriteTaskLog(errorMsg, LogSeverity.Severe);
                                }
                                else
                                {
                                    // Delete or archive the source files of those which were retrieved
                                    result = ftpService.DeleteFile(fileName, ref errorMsg);
                                    if (result)
                                    {
                                        WriteTaskLog(errorMsg, LogSeverity.Severe);
                                    }
                                }
                            }

                            // Process the files received
                            processFiles(config);
                        }
                    }
                }
            }

            return(0);
        }
예제 #9
0
        public void DoProcessingTest()
        {
            // Get a test company
            var testUser    = GetTestUser();
            var testCompany = GetTestCompany(testUser);
            //CreateTestTransfers(testCompany, testUser);
            var testLocation = LookupService.FindLocationModel(testCompany.DefaultLocationID.Value);

            // Create some test transfers
            var testFolder = Path.GetTempPath() + RandomString();

            LogTestFolder(testFolder);
            Directory.CreateDirectory(testFolder);

            TestFileTransfer config = new TestFileTransfer(FileTransferDataType.WarehousePick, "Warehouse_Picks.xml", "{PICKNO}.{EXTN}");
            var sendConfig          = GetTestTransfer(testCompany, testUser, testLocation, FileTransferType.Send, FTPProtocol.FTP, testFolder, "/test/Evolution/", @"\Development\Evolution\DataTransfers\Test\Archive", @"\Development\Evolution\DataTransfers\Test\Error", config);
            var receiveConfig       = GetTestTransfer(testCompany, testUser, testLocation, FileTransferType.Receive, FTPProtocol.FTP, "/test/Evolution/", testFolder, "", "", config);

            // Create some test files
            int           numFiles = 6;
            List <string> fileList = new List <string>();

            for (int i = 0; i < numFiles; i++)
            {
                var fileName = sendConfig.SourceFolder + "\\" + RandomString() + ".txt";
                File.WriteAllText(fileName, LorumIpsum());
                fileList.Add(fileName);
            }

            // Upload the files
            var task = new DataTransferTask(db);

            string[] args = { TaskName.DataTransferTask,
                              sendConfig.TransferName };
            task.Run(args);

            // Check that the local files have been deleted
            foreach (var fileName in fileList)
            {
                Assert.IsTrue(!File.Exists(fileName), $"Error: File {fileName} was found in {testFolder} when it was expected to be deleted after sending");
            }

            // Download the files
            args = new string[] { TaskName.DataTransferTask,
                                  receiveConfig.TransferName };
            task.Run(args);

            // Check that the files exist
            foreach (var fileName in fileList)
            {
                Assert.IsTrue(File.Exists(fileName), $"Error: File {fileName} was not found in {testFolder} when it was expected to be");
            }

            // Check that the files have been deleted on the FTP site
            FTPService.FTPService ftpService = FTPService(FTPProtocol.FTP);

            List <string> foundList = new List <string>();
            var           errorMsg  = "";

            bool bError = ftpService.GetFTPFileList(receiveConfig.SourceFolder, ref foundList, ref errorMsg);

            if (bError)
            {
                foreach (string fileName in foundList)
                {
                    LogTestFile(fileName);
                    ftpService.DeleteFile(receiveConfig.SourceFolder + "/" + fileName.FileName(), ref errorMsg);
                }
            }
            Assert.IsTrue(!bError, errorMsg);
            Assert.IsTrue(foundList.Count() == 0, $"Error: {foundList.Count()} files were found on the remote server when 0 were expected");
        }