コード例 #1
0
        public void GenerateCommandList_withAFolderInTheRemoteRootThatIsNotInTheLocalRoot_shouldGenerateADeleteFolderCommand()
        {
            // Given the following local file structure:
            // root
            //    |
            //    +--> (no folder)
            //
            // And given the following remote file structure:
            // root
            //    |
            //    +--> Folder1
            //
            // Then the generated command list should be:
            // DeleteFolder \Folder1

            // Local file structure
            var localRoot  = new FileItem(ItemType.Folder, @"\", 0);
            var localItems = new List <FileItem> {
                localRoot
            };

            // Remote file structure
            // Root
            const string folderName = "Folder1";
            var          mockMegaNzNodeForRemoteRoot = new Mock <INode>(MockBehavior.Strict);
            var          remoteRoot = new MegaNzItem(mockMegaNzNodeForRemoteRoot.Object, @"\", ItemType.Folder, @"\", 0);

            // File1
            var mockMegaNzNodeForFile1 = new Mock <INode>(MockBehavior.Strict);
            var remoteFolder1          = new MegaNzItem(mockMegaNzNodeForFile1.Object, folderName, ItemType.Folder, @"\" + folderName, 0);
            var remoteItems            = new List <MegaNzItem> {
                remoteRoot,
                remoteFolder1
            };

            // Act
            const string localBasePath = "c:\\testing\\";
            var          synchronizer  = new CommandGenerator(localBasePath);
            var          commandList   = synchronizer.GenerateCommandList(localItems, remoteItems);

            // Assert
            commandList.Count.Should().Be(1);

            commandList[0].Should().BeOfType <DeleteFolderCommand>();
            var deleteFolderCommand = (DeleteFolderCommand)commandList[0];

            deleteFolderCommand.PathToDelete.Should().Be(remoteFolder1.Path);

            mockMegaNzNodeForRemoteRoot.VerifyAll();
            mockMegaNzNodeForFile1.VerifyAll();
        }
コード例 #2
0
        public void GenerateCommandList_withAFileInTheRemoteRootThatIsNotInTheLocalRoot_shouldGenerateADeleteCommand()
        {
            // Given the following local file structure:
            // root
            //    |
            //    (no file in the root)
            //
            // And given the following remote file structure:
            // root
            //    |
            //    +--> File1.jpeg - Last Modif 2016-1-1-0-0-0
            //
            // Then the generated command list should be:
            // - Delete \File1.jpeg

            // Local file structure
            var localRoot  = new FileItem(ItemType.Folder, @"\", 0);
            var localItems = new List <FileItem> {
                localRoot
            };

            // Remote file structure
            // Root
            var mockMegaNzNodeForRemoteRoot = new Mock <INode>(MockBehavior.Strict);
            var remoteRoot = new MegaNzItem(mockMegaNzNodeForRemoteRoot.Object, @"\", ItemType.Folder, @"\", 0);
            // File1
            var lastModifiedDate       = new DateTime(2017, 1, 1, 0, 0, 0);
            var mockMegaNzNodeForFile1 = new Mock <INode>(MockBehavior.Strict);
            var remoteFile1            = new MegaNzItem(mockMegaNzNodeForFile1.Object, "File1.jpeg", ItemType.File, @"\\File1.jpeg", 1024, lastModifiedDate);
            var remoteItems            = new List <MegaNzItem> {
                remoteRoot,
                remoteFile1
            };

            // Act
            var localBasePath = "c:\\testing\\";
            var synchronizer  = new CommandGenerator(localBasePath);
            var commandList   = synchronizer.GenerateCommandList(localItems, remoteItems);

            // Assert
            commandList.Count.Should().Be(1);
            commandList[0].Should().BeOfType <DeleteFileCommand>();
            var deleteCommand = (DeleteFileCommand)commandList[0];

            deleteCommand.PathToDelete.Should().Be(remoteFile1.Path);
            deleteCommand.LastModifiedDate.Should().Be(lastModifiedDate);

            mockMegaNzNodeForRemoteRoot.VerifyAll();
            mockMegaNzNodeForFile1.VerifyAll();
        }
コード例 #3
0
        public void GenerateCommandList_withAFileInTheLocalRootThatIsTheSameInTheRemoteRoot_shouldNotGenerateAnyCommand()
        {
            // Given the following local file structure:
            // root
            //    |
            //    +--> File1.jpeg - Last Modif = 2016-1-1-0-0-0 - Size = 1024
            //
            // And given the following remote file structure:
            // root
            //    |
            //    +--> File1.jpeg - Last Modif = 2016-1-1-0-0-0 - Size = 1024
            //
            // Then the generated an empty command list

            const string fileName         = "File1.jpeg";
            const long   size             = 1024;
            var          lastModifiedDate = new DateTime(2016, 1, 1, 0, 0, 0);

            // Local file structure
            var localRoot  = new FileItem(ItemType.Folder, @"\", 0);
            var localFile1 = new FileItem(ItemType.File, @"\" + fileName, size, lastModifiedDate);
            var localItems = new List <FileItem> {
                localRoot,
                localFile1
            };

            // Remote file structure
            // Root
            var mockMegaNzNodeForRemoteRoot = new Mock <INode>(MockBehavior.Strict);
            var remoteRoot = new MegaNzItem(mockMegaNzNodeForRemoteRoot.Object, @"\", ItemType.Folder, @"\", 0);
            // File1
            var mockMegaNzNodeForFile1 = new Mock <INode>(MockBehavior.Strict);
            var remoteFile1            = new MegaNzItem(mockMegaNzNodeForFile1.Object, fileName, ItemType.File, @"\" + fileName, size, lastModifiedDate);
            var remoteItems            = new List <MegaNzItem> {
                remoteRoot,
                remoteFile1
            };

            // Act
            const string localBasePath = "c:\\testing\\";
            var          synchronizer  = new CommandGenerator(localBasePath);
            var          commandList   = synchronizer.GenerateCommandList(localItems, remoteItems);

            // Assert
            commandList.Should().BeEmpty();

            mockMegaNzNodeForRemoteRoot.VerifyAll();
            mockMegaNzNodeForFile1.VerifyAll();
        }
コード例 #4
0
        public void GenerateCommandList_withAFolderInTheLocalRootThatIsInTheRemoteRoot_shouldNotGenerateAnyCommand()
        {
            // Given the following local file structure:
            // root
            //    |
            //    +--> Folder1
            //
            // And given the following remote file structure:
            // root
            //    |
            //    +--> Folder1
            //
            // Then the generated command list should be empty

            // Local file structure
            const string folderName   = "Folder1";
            var          localRoot    = new FileItem(ItemType.Folder, @"\", 0);
            var          localFolder1 = new FileItem(ItemType.Folder, @"\" + folderName, 0);
            var          localItems   = new List <FileItem> {
                localRoot,
                localFolder1
            };

            // Remote file structure
            // Root
            var mockMegaNzNodeForRemoteRoot = new Mock <INode>(MockBehavior.Strict);
            var remoteRoot = new MegaNzItem(mockMegaNzNodeForRemoteRoot.Object, @"\", ItemType.Folder, @"\", 0);

            // Folder1
            var mockMegaNzNodeForFile1 = new Mock <INode>(MockBehavior.Strict);
            var remoteFolder1          = new MegaNzItem(mockMegaNzNodeForFile1.Object, folderName, ItemType.Folder, @"\" + folderName, 0);
            var remoteItems            = new List <MegaNzItem> {
                remoteRoot,
                remoteFolder1
            };

            // Act
            const string localBasePath = "c:\\testing\\";
            var          generator     = new CommandGenerator(localBasePath);
            var          commandList   = generator.GenerateCommandList(localItems, remoteItems);

            // Assert
            commandList.Should().BeEmpty();

            mockMegaNzNodeForRemoteRoot.VerifyAll();
            mockMegaNzNodeForFile1.VerifyAll();
        }
コード例 #5
0
ファイル: Program.cs プロジェクト: krashman/Mirror2MegaNZ
        private static void ProcessAccount(Account account, ILogger logger)
        {
            logger.Trace("Reading nodes from the folder {0}", account.LocalRoot);
            var itemListFromFileSystem = GenerateListFromLocalFolder(account.LocalRoot, account.LocalRoot);

            MegaApiClient client = new MegaApiClient();

            client.Login(account.Username, account.Password);

            var itemListFromMegaNz = GenerateListFromMegaNz(client).ToList();

            var commandGenerator = new CommandGenerator(account.LocalRoot);
            var commandList      = commandGenerator.GenerateCommandList(itemListFromFileSystem, itemListFromMegaNz);

            if (!commandList.Any())
            {
                logger.Trace("Nothing to do here. Exiting.....");
                return;
            }

            // Showing the commands and asking if continue
            ShowCommandList(commandList);
            if (commandList.OfType <DeleteFileCommand>().Any())
            {
                Console.WriteLine("There are some files to delete. Continue? (y/n)");
                var continueAnswer = Console.ReadLine();
                if (continueAnswer.ToLower() != "y")
                {
                    logger.Trace("Exiting...");
                }
            }

            // Executing the commands in the list
            var fileManager      = new FileManager();
            var progressNotifier = new ProgressNotifier(new ConsoleWrapper());
            var executor         = new CommandExecutor(client, logger);

            var megaNzItemCollection = new MegaNzItemCollection(itemListFromMegaNz);

            executor.Execute(commandList, megaNzItemCollection, fileManager, progressNotifier);
        }
コード例 #6
0
        public void GenerateCommandList_withAFileInFolderInTheLocalRootThatIsOlderThanTheSameInTheRemoteFolder_shouldGenerateADeleteCommandAndAnUpdateCommand()
        {
            // Given the following local file structure:
            // root
            //    |
            //    +--> Folder1
            //               |
            //               +--> File1.jpeg - Last Modif = 2015-1-1-0-0-0 - Size = 1024
            //
            // And given the following remote file structure:
            // root
            //    |
            //    +--> Folder1
            //               |
            //               +--> File1.jpeg - Last Modif = 2016-1-1-0-0-0 - Size = 1024
            //
            // Then the generated command list should be:
            // Delete \Folder1\File1.jpeg
            // Upload \Folder1\File1.jpeg

            const string fileName              = "File1.jpeg";
            const long   size                  = 1024;
            const string folderName            = "Folder1";
            var          localLastModifiedDate = new DateTime(2015, 1, 1, 0, 0, 0);

            // Local file structure
            var localRoot    = new FileItem(ItemType.Folder, @"\", 0);
            var localFolder1 = new FileItem(ItemType.Folder, @"\" + folderName, 0);
            var localFile1   = new FileItem(ItemType.File, @"\" + folderName + @"\" + fileName, size, localLastModifiedDate);
            var localItems   = new List <FileItem> {
                localRoot,
                localFolder1,
                localFile1
            };

            // Remote file structure
            // Root
            var mockMegaNzNodeForRemoteRoot = new Mock <INode>(MockBehavior.Strict);
            var remoteRoot = new MegaNzItem(mockMegaNzNodeForRemoteRoot.Object, @"\", ItemType.Folder, @"\", 0);

            // Folder1
            var mockMegaNzNodeForRemoteFolder1 = new Mock <INode>(MockBehavior.Strict);
            var remoteFolder1 = new MegaNzItem(mockMegaNzNodeForRemoteFolder1.Object, folderName, ItemType.Folder, @"\" + folderName, 0);

            // File1
            var mockMegaNzNodeForRemoteFile1 = new Mock <INode>(MockBehavior.Strict);
            var remoteLastModifiedDate       = localLastModifiedDate.AddYears(1);
            var remoteFile1 = new MegaNzItem(mockMegaNzNodeForRemoteFile1.Object, fileName, ItemType.File, @"\" + folderName + @"\" + fileName, size, remoteLastModifiedDate);
            var remoteItems = new List <MegaNzItem> {
                remoteRoot,
                remoteFolder1,
                remoteFile1
            };

            // Act
            const string localBasePath = "c:\\testing\\";
            var          synchronizer  = new CommandGenerator(localBasePath);
            var          commandList   = synchronizer.GenerateCommandList(localItems, remoteItems);

            // Assert
            commandList.Count.Should().Be(2);

            commandList[0].Should().BeOfType <DeleteFileCommand>();
            var deleteFileCommand = (DeleteFileCommand)commandList[0];

            deleteFileCommand.PathToDelete.Should().Be(@"\Folder1\File1.jpeg");
            deleteFileCommand.LastModifiedDate.Should().Be(remoteLastModifiedDate);

            commandList[1].Should().BeOfType <UploadFileCommand>();
            var uploadFileCommand = (UploadFileCommand)commandList[1];

            uploadFileCommand.SourcePath.Should().Be(localBasePath + folderName + @"\" + fileName);
            uploadFileCommand.DestinationPath.Should().Be(@"\" + folderName + @"\");    // Because we need the backslash at the end of the path for a folder
            uploadFileCommand.LastModifiedDate.Should().Be(localLastModifiedDate);

            mockMegaNzNodeForRemoteRoot.VerifyAll();
            mockMegaNzNodeForRemoteFolder1.VerifyAll();
            mockMegaNzNodeForRemoteFile1.VerifyAll();
        }
コード例 #7
0
        public void GenerateCommandList_withAFileInFolderInTheLocalRootThatIsNotInTheRemoteFolder_shouldGenerateAnUploadCommand()
        {
            // Given the following local file structure:
            // root
            //    |
            //    +--> Folder1
            //               |
            //               +--> File1.jpeg - Last Modif 2016-1-1-0-0-0
            //
            // And given the following remote file structure:
            // root
            //    |
            //    +--> Folder1
            //               |
            //               +--> (no file in the root)
            //
            // Then the generated command list should be:
            // - Upload \root\Folder1\File1.jpeg

            // Local file structure
            const string folderName       = "Folder1";
            var          lastModifiedDate = new DateTime(2016, 1, 1, 0, 0, 0);
            var          localRoot        = new FileItem(ItemType.Folder, @"\", 0);
            var          localFolder1     = new FileItem(ItemType.Folder, @"\" + folderName, 0);
            var          localFile1       = new FileItem(ItemType.File, @"\" + folderName + @"\File1.jpeg", 1024, lastModifiedDate);
            var          localItems       = new List <FileItem> {
                localRoot,
                localFolder1,
                localFile1
            };

            // Remote file structure
            // Root
            var mockMegaNzNodeForRemoteRoot = new Mock <INode>(MockBehavior.Strict);
            var remoteRoot = new MegaNzItem(mockMegaNzNodeForRemoteRoot.Object, @"\", ItemType.Folder, @"\", 0);

            // Folder1
            var mockMegaNzNodeForFolder1 = new Mock <INode>(MockBehavior.Strict);
            var remoteFolder1            = new MegaNzItem(mockMegaNzNodeForFolder1.Object, folderName, ItemType.Folder, @"\" + folderName, 0);
            var remoteItems = new List <MegaNzItem> {
                remoteRoot,
                remoteFolder1
            };

            // Act
            const string localBasePath = "c:\\testing\\";
            var          generator     = new CommandGenerator(localBasePath);
            var          commandList   = generator.GenerateCommandList(localItems, remoteItems);

            // Assert
            commandList.Count.Should().Be(1);

            commandList[0].Should().BeOfType <UploadFileCommand>();
            var uploadCommand = (UploadFileCommand)commandList[0];

            uploadCommand.SourcePath.Should().Be(@"c:\testing\Folder1\File1.jpeg");
            uploadCommand.DestinationPath.Should().Be(@"\Folder1\");    // We must have the backslash at the end of the path for a folder
            uploadCommand.LastModifiedDate.Should().Be(lastModifiedDate);

            mockMegaNzNodeForRemoteRoot.VerifyAll();
            mockMegaNzNodeForFolder1.VerifyAll();
        }
コード例 #8
0
        public void GenerateCommandList_withAFileInTheLocalRootThatHasDifferentSizeThanTheSameInTheRemoteRoot_shouldGenerateADeleteCommandAndAnUpdateCommand()
        {
            // Given the following local file structure:
            // root
            //    |
            //    +--> File1.jpeg - Last Modif = 2016-1-1-0-0-0 - Size = 2048
            //
            // And given the following remote file structure:
            // root
            //    |
            //    +--> File1.jpeg - Last Modif = 2016-1-1-0-0-0 - Size = 1024
            //
            // Then the generated command list should be:
            // Delete \File1.jpeg
            // Upload \File1.jpeg

            const string fileName         = "File1.jpeg";
            const long   size             = 1024;
            var          lastModifiedDate = new DateTime(2016, 1, 1, 0, 0, 0);

            // Local file structure
            var localRoot  = new FileItem(ItemType.Folder, @"\", 0);
            var localFile1 = new FileItem(ItemType.File, @"\" + fileName, size, lastModifiedDate);
            var localItems = new List <FileItem> {
                localRoot,
                localFile1
            };

            // Remote file structure
            var mockMegaNzNodeForRemoteRoot = new Mock <INode>(MockBehavior.Strict);
            var remoteRoot = new MegaNzItem(mockMegaNzNodeForRemoteRoot.Object, @"\", ItemType.Folder, @"\", 0);
            // File1
            var mockMegaNzNodeForFile1 = new Mock <INode>(MockBehavior.Strict);
            var remoteFile1            = new MegaNzItem(mockMegaNzNodeForFile1.Object, fileName, ItemType.File, @"\" + fileName, size * 2, lastModifiedDate);
            var remoteItems            = new List <MegaNzItem> {
                remoteRoot,
                remoteFile1
            };

            // Act
            const string localBasePath = "c:\\testing\\";
            var          synchronizer  = new CommandGenerator(localBasePath);
            var          commandList   = synchronizer.GenerateCommandList(localItems, remoteItems);

            // Assert
            commandList.Count.Should().Be(2);

            commandList[0].Should().BeOfType <DeleteFileCommand>();
            var deleteCommand = (DeleteFileCommand)commandList[0];

            deleteCommand.PathToDelete.Should().Be(remoteFile1.Path);
            deleteCommand.LastModifiedDate.Should().Be(lastModifiedDate);

            commandList[1].Should().BeOfType <UploadFileCommand>();
            var uploadCommand = (UploadFileCommand)commandList[1];

            uploadCommand.DestinationPath.Should().Be(remoteRoot.Path);
            uploadCommand.SourcePath.Should().Be(localBasePath.TrimEnd('\\') + localFile1.Path);
            uploadCommand.LastModifiedDate.Should().Be(lastModifiedDate);

            mockMegaNzNodeForRemoteRoot.VerifyAll();
            mockMegaNzNodeForFile1.VerifyAll();
        }