public void DirectoryPair_NestedFolders()
        {
            ResetDirectory();
            string password = "******";

            using (var origToEncr = DirectoryPair.Open("1-Orig", "2-Encr", DerivedBytesProvider.FromPassword(password), true, HelixFileVersion.UnitTest))
                using (var encrToDecr = DirectoryPair.Open("3-Decr", "2-Encr", DerivedBytesProvider.FromPassword(password), true, HelixFileVersion.UnitTest))
                {
                    //Creates nested folders
                    Directory.CreateDirectory(Util.Path("1-Orig/Nested/Directory"));
                    File.WriteAllText(Util.Path("1-Orig/Nested/File.txt"), "nested content");

                    //Orig => Encr
                    origToEncr.SyncChanges();
                    Assert.AreEqual(0, origToEncr.FindChanges().Count);


                    //Encr => Decr
                    encrToDecr.SyncChanges();
                    Assert.AreEqual(0, origToEncr.FindChanges().Count);


                    //Verifies nested folders
                    Assert.IsTrue(Directory.Exists(Util.Path("3-Decr/Nested/Directory")), "Directory Exists: 3-Decr/Nested/Directory");
                    Assert.IsTrue(File.Exists(Util.Path("3-Decr/Nested/File.txt")), "File Exists: 3-Decr/Nested/File.txt");
                }
            ResetDirectory();
        }
 public SyncLogEntry[] Decr1AndEncr1SyncLog()
 {
     using var pair = new DirectoryPair(Decr1.DirectoryPath, Encr1.DirectoryPath, DerivedBytesProvider.FromPassword("secret"), true);
     pair.OpenEncr(null);
     pair.OpenDecr(null);
     return(pair.SyncLog.ToArray());
 }
Exemple #3
0
        public static void SyncChanges(this DirectoryPair pair)
        {
            foreach (var change in pair.FindChanges())
            {
                Console.WriteLine(change);

                var syncResult = pair.TrySync(change);
                if (syncResult.SyncStatus != SyncStatus.Success)
                {
                    throw syncResult.Exception;
                }
            }
        }
        public void FindChanges_AddsInOrderParentToChildren()
        {
            Decr1.UpdateTo("file1.txt < aa", "zz/file2.txt");

            using (var pair = DirectoryPair.Open(Decr1.DirectoryPath, Encr1.DirectoryPath, DerivedBytesProvider.FromPassword("password"), true, HelixFileVersion.UnitTest))
            {
                for (int i = 0; i < 100; i++)
                {
                    var changes     = pair.FindChanges();
                    var parentIndex = changes.FindIndex(c => c.DecrFileName == "zz");
                    var childIndex  = changes.FindIndex(c => HelixUtil.PathNative(c.DecrFileName) == HelixUtil.PathNative("zz/file2.txt"));
                    Assert.IsTrue(parentIndex < childIndex, "Parent Directory Add did not come before Child File Add");
                }
            }
        }
        public void FindChanges_ReturtsInRandomOrder()
        {
            Decr1.UpdateTo("file1.txt < aa", "file2.txt", "file3.txt");

            HashSet <int> indexes = new HashSet <int>();

            using (var pair = DirectoryPair.Open(Decr1.DirectoryPath, Encr1.DirectoryPath, DerivedBytesProvider.FromPassword("password"), true, HelixFileVersion.UnitTest))
            {
                for (int i = 0; i < 100; i++)
                {
                    var changes = pair.FindChanges();
                    var index   = changes.FindIndex(c => c.DecrFileName == "file1.txt");
                    indexes.Add(index);
                }

                Assert.IsTrue(indexes.Count == 3, "file1.txt not found in all random spots");
            }
        }
        public void DirectoryPair_RenameCaseOnly()
        {
            string password = "******";

            ResetDirectory();
            Directory.CreateDirectory("1-Orig");
            File.WriteAllText(Util.Path("1-Orig/file.txt"), "hello");
            using (var origToEncr = DirectoryPair.Open("1-Orig", "2-Encr", DerivedBytesProvider.FromPassword(password), true, HelixFileVersion.UnitTest))
                using (var encrToDecr = DirectoryPair.Open("3-Decr", "2-Encr", DerivedBytesProvider.FromPassword(password), true, HelixFileVersion.UnitTest))
                {
                    //Orig => Encr
                    origToEncr.SyncChanges();
                    Assert.AreEqual(0, origToEncr.FindChanges().Count);


                    //Encr => Decr
                    encrToDecr.SyncChanges();
                    Assert.AreEqual(0, origToEncr.FindChanges().Count);
                }

            System.Threading.Thread.Sleep(timeStampPrecision);

            File.Move(Util.Path("1-Orig/file.txt"), Util.Path("1-Orig/FILE1.txt"));
            File.Move(Util.Path("1-Orig/FILE1.txt"), Util.Path("1-Orig/FILE.txt"));

            using (var origToEncr = DirectoryPair.Open("1-Orig", "2-Encr", DerivedBytesProvider.FromPassword(password), true, HelixFileVersion.UnitTest))
                using (var encrToDecr = DirectoryPair.Open("3-Decr", "2-Encr", DerivedBytesProvider.FromPassword(password), true, HelixFileVersion.UnitTest))
                {
                    //Orig => Encr
                    Assert.AreEqual(2, origToEncr.FindChanges().Count); //delete + create
                    origToEncr.SyncChanges();
                    Assert.AreEqual(0, origToEncr.FindChanges().Count);

                    //Encr => Decr
                    Assert.AreEqual(2, encrToDecr.FindChanges().Count); //delete + create
                    Assert.IsTrue(encrToDecr.FindChanges().All(e => e.SyncMode == PreSyncMode.EncryptedSide));
                    encrToDecr.SyncChanges();
                    Assert.AreEqual(0, origToEncr.FindChanges().Count);

                    Assert.AreEqual("FILE.txt", (new DirectoryInfo(@"1-Orig")).GetFileSystemInfos("*.txt").First().Name);
                }

            //Assert.IsTrue(false, "Sometimes fails, sometimes works depending on the order (false until properly fixed)");
        }
        public void DirectoryPair_RandomizedInitialization()
        {
            RandomValue.NewTest(1836678571);

            for (int i = 0; i < 10; i++)
            {
                var dirStruct = RandomValue.GetDirectoryStructure(10)
                                .Where(d => HelixUtil.IsValidPath(d))
                                .ToArray();

                ResetDirectory();

                var setupItems = RandomValue.ChooseMany(dirStruct);
                foreach (var item in setupItems)
                {
                    if (item.EndsWith(Path.DirectorySeparatorChar.ToString()))
                    {
                        Directory.CreateDirectory(Path.GetDirectoryName(Path.Combine("1-Orig", item + "a")));
                    }
                    else
                    {
                        var fileName = Path.Combine("1-Orig", item);
                        //Creates parent directory
                        Directory.CreateDirectory(Path.GetDirectoryName(Path.Combine("1-Orig", item + "a")));
                        File.WriteAllText(fileName, RandomValue.GetValue <string>());
                    }
                }

                string password = RandomValue.GetValue <string>() ?? "";
                using (var origToEncr = DirectoryPair.Open("2-Encr", "1-Orig", DerivedBytesProvider.FromPassword(password), true, HelixFileVersion.UnitTest))
                    using (var encrToDecr = DirectoryPair.Open("2-Encr", "3-Decr", DerivedBytesProvider.FromPassword(password), true, HelixFileVersion.UnitTest))
                    {
                        //Orig => Encr
                        origToEncr.SyncChanges();
                        Assert.AreEqual(0, origToEncr.FindChanges().Count);


                        //Encr => Decr
                        encrToDecr.SyncChanges();
                        Assert.AreEqual(0, origToEncr.FindChanges().Count);
                    }
            }
        }
        public void FindChanges_CaseChangeDeletesBeforeAdds()
        {
            Decr1.UpdateTo("file1.txt");

            using (var pair = DirectoryPair.Open(Decr1.DirectoryPath, Encr1.DirectoryPath, DerivedBytesProvider.FromPassword("password"), true, HelixFileVersion.UnitTest))
            {
                pair.SyncChanges();


                Decr1.UpdateTo("FILE1.txt");


                for (int i = 0; i < 100; i++)
                {
                    var changes     = pair.FindChanges();
                    var deleteIndex = changes.FindIndex(c => c.DecrFileName == "file1.txt");
                    var addIndex    = changes.FindIndex(c => c.DecrFileName == "FILE1.txt");

                    Assert.IsTrue(deleteIndex < addIndex, "Case Rename did not order delete before add");
                }
            }
        }
        public void DirectoryPair_DecrToEncr()
        {
            if (Directory.Exists("Orig"))
            {
                Directory.Delete("Orig", true);
            }
            if (Directory.Exists("Decr"))
            {
                Directory.Delete("Decr", true);
            }
            if (Directory.Exists("Encr"))
            {
                Directory.Delete("Encr", true);
            }

            Directory.CreateDirectory("Orig");
            Directory.CreateDirectory("Encr");
            Directory.CreateDirectory("Decr");

            //New (Orig => Encr)
            Util.WriteTextFile("Orig/test.txt", "hello world");
            using (var origToEncr = DirectoryPair.Open("Orig", "Encr", DerivedBytesProvider.FromPassword("password"), true, HelixFileVersion.UnitTest))
                using (var encrToDecr = DirectoryPair.Open("Decr", "Encr", DerivedBytesProvider.FromPassword("password"), true, HelixFileVersion.UnitTest))
                {
                    var changes = origToEncr.FindChanges(clearCache: false);
                    Assert.AreEqual(1, changes.Count);
                    Assert.AreEqual("test.txt", changes[0].DecrFileName);

                    Assert.AreEqual(SyncStatus.Success, origToEncr.TrySync(changes[0]).SyncStatus);

                    changes = origToEncr.FindChanges(clearCache: true);
                    Assert.IsTrue(0 == changes.Count, "Single file sync still contains changes");

                    //New (Encr => Decr)
                    changes = encrToDecr.FindChanges(clearCache: true);
                    Assert.AreEqual(1, changes.Count);
                    Assert.IsTrue(changes[0].SyncMode == PreSyncMode.EncryptedSide);
                    Assert.IsTrue(changes[0].EncrFileName.EndsWith(".hx"));

                    Assert.AreEqual(SyncStatus.Success, encrToDecr.TrySync(changes[0]).SyncStatus);

                    Assert.AreEqual(0, encrToDecr.FindChanges(clearCache: true).Count);

                    Assert.AreEqual(HelixUtil.TruncateTicks(File.GetLastWriteTimeUtc(Util.Path("Orig/test.txt"))), HelixUtil.TruncateTicks(File.GetLastWriteTimeUtc(Util.Path("Decr/test.txt"))));
                    Assert.AreEqual("hello world", File.ReadAllText(Path.Combine("Decr", "test.txt")));


                    //Add (Orig => Encr)
                    origToEncr.ClearCache();
                    Util.WriteTextFile("Orig/test2.txt", "aa");
                    changes = origToEncr.FindChanges(clearCache: true);
                    Assert.AreEqual(1, changes.Count);
                    Assert.IsTrue(changes[0].SyncMode == PreSyncMode.DecryptedSide);
                    Assert.AreEqual("test2.txt", changes[0].DecrFileName);

                    Assert.AreEqual(SyncStatus.Success, origToEncr.TrySync(changes[0]).SyncStatus);

                    Assert.AreEqual(0, origToEncr.FindChanges(clearCache: true).Count);

                    //Add (Encr => Decr)
                    encrToDecr.ClearCache();
                    changes = encrToDecr.FindChanges(clearCache: true);
                    Assert.AreEqual(1, changes.Count);
                    Assert.IsTrue(changes[0].SyncMode == PreSyncMode.EncryptedSide);
                    Assert.IsTrue(changes[0].EncrFileName.EndsWith(".hx"));

                    Assert.AreEqual(SyncStatus.Success, encrToDecr.TrySync(changes[0]).SyncStatus);

                    Assert.AreEqual(0, encrToDecr.FindChanges().Count);

                    Assert.AreEqual(HelixUtil.TruncateTicks(File.GetLastWriteTimeUtc(Util.Path("Orig/test2.txt"))),
                                    HelixUtil.TruncateTicks(File.GetLastWriteTimeUtc(Util.Path(@"Decr/test2.txt"))));
                    Assert.AreEqual("aa", File.ReadAllText(Util.Path("Decr/test2.txt")));



                    //System.Threading.Thread.Sleep(timeStampPrecision); //ensure the timestap changes

                    //Update (Orig => Encr)
                    origToEncr.ClearCache();
                    Util.WriteTextFile("Orig/test.txt", "hello world2");
                    changes = origToEncr.FindChanges();
                    Assert.AreEqual(1, changes.Count);
                    Assert.IsTrue(changes[0].SyncMode == PreSyncMode.DecryptedSide);
                    Assert.AreEqual("test.txt", changes[0].DecrFileName);

                    Assert.AreEqual(SyncStatus.Success, origToEncr.TrySync(changes[0]).SyncStatus);

                    Assert.AreEqual(0, origToEncr.FindChanges().Count);

                    //Update (Encr => Decr)
                    encrToDecr.ClearCache();
                    changes = encrToDecr.FindChanges();
                    Assert.AreEqual(1, changes.Count);
                    Assert.IsTrue(changes[0].SyncMode == PreSyncMode.EncryptedSide);
                    Assert.IsTrue(changes[0].EncrFileName.EndsWith(".hx"));

                    Assert.AreEqual(SyncStatus.Success, encrToDecr.TrySync(changes[0]).SyncStatus);

                    Assert.AreEqual(0, encrToDecr.FindChanges().Count);
                    Assert.AreEqual(
                        HelixUtil.TruncateTicks(File.GetLastWriteTimeUtc(Util.Path("Orig/test.txt"))),
                        HelixUtil.TruncateTicks(File.GetLastWriteTimeUtc(Util.Path("Decr/test.txt"))));



                    Assert.AreEqual("hello world2", File.ReadAllText(Util.Path("Decr/test.txt")));

                    //Delete (Orig => Encr)
                    origToEncr.ClearCache();
                    File.Delete(Util.Path("Orig/test.txt"));
                    changes = origToEncr.FindChanges();
                    Assert.AreEqual(1, changes.Count);
                    Assert.IsTrue(changes[0].SyncMode == PreSyncMode.DecryptedSide);
                    Assert.AreEqual("test.txt", changes[0].DecrFileName);

                    Assert.AreEqual(SyncStatus.Success, origToEncr.TrySync(changes[0]).SyncStatus);
                    Assert.IsTrue(origToEncr.SyncLog.FindByDecrFileName("test.txt").EntryType == FileEntryType.Removed);
                    Assert.AreEqual(0, origToEncr.FindChanges().Count);


                    //Delete (Encr => Decr)
                    encrToDecr.ClearCache();
                    changes = encrToDecr.FindChanges();
                    Assert.IsTrue(1 == changes.Count, "Delete change did not propigate correctly");
                    Assert.IsTrue(changes[0].SyncMode == PreSyncMode.EncryptedSide);
                    Assert.IsTrue(changes[0].EncrFileName.EndsWith(".hx"));

                    Assert.AreEqual(SyncStatus.Success, encrToDecr.TrySync(changes[0]).SyncStatus);

                    Assert.IsFalse(File.Exists(Util.Path("Decr/test.txt")), "Missing file Decr/test.txt");
                }
        }