/// <summary> /// Runs a test case /// </summary> private static void TestOneCase(string[] srcDirectories, string[] srcFiles, string[] destDirectories, string[] destFiles, InputParams inputParams, SyncResults expectedResults) { // delete base directories in case they were hanging around from a previous failed test DeleteTestDirectory(baseDirSrc); DeleteTestDirectory(baseDirDest); // create source directories and files specified by test CreateTestDirectories(baseDirSrc, srcDirectories); CreateTestFiles(baseDirSrc, null, srcFiles); // create destination directories and files specified by test if (destDirectories != null) { CreateTestDirectories(baseDirDest, destDirectories); } if (destFiles != null) { CreateTestFiles(baseDirDest, baseDirSrc, destFiles); } // perform the directory sync SyncResults results = new SyncResults(); results = new Sync(baseDirSrc, baseDirDest).Start(inputParams); // Assert we have expected results Assert.IsTrue(SyncTools.CompareTo(expectedResults, results)); // If we are deleting extra files from destination, verify we have exactly the same files as filtered source files if (inputParams.DeleteFromDest && (!(inputParams.DeleteExcludeFiles != null) && !(inputParams.DeleteExcludeDirs != null))) { // calc hash of filtered files & directories in source tree byte[] hashSrc = CalcHash(baseDirSrc, inputParams); // calc hash of all files & directories in destination tree byte[] hashDest = CalcHash(baseDirDest, null); // hashes must match bool hashesMatch = SyncTools.CompareByteArrays(hashSrc, hashDest); Assert.IsTrue(hashesMatch); } DeleteTestDirectory(baseDirSrc); DeleteTestDirectory(baseDirDest); }
/// <summary> /// Fill a stream with relevant contents of directory tree for hashing. Directory tree is filtered by /// inputParams if non-null. /// </summary> private static void BuildCRCStream(string directory, InputParams inputParams, ref MemoryStream memoryStream) { DirectoryInfo directoryInfo = new DirectoryInfo(directory); SyncResults results = new SyncResults(); // get filtered list of files in this directory FileInfo[] files = new Sync().GetFiles(directoryInfo, inputParams, ref results); // sort by name for deterministic order Array.Sort(files, new FileInfoComparer()); // write information about each file to stream foreach (FileInfo fileInfo in files) { byte[] bytes = ASCIIEncoding.UTF8.GetBytes(fileInfo.Name); memoryStream.Write(bytes, 0, bytes.Length); bytes = BitConverter.GetBytes(fileInfo.Length); memoryStream.Write(bytes, 0, bytes.Length); bytes = BitConverter.GetBytes(fileInfo.LastWriteTime.ToBinary()); memoryStream.Write(bytes, 0, bytes.Length); bytes = ASCIIEncoding.UTF8.GetBytes(fileInfo.Attributes.ToString()); memoryStream.Write(bytes, 0, bytes.Length); } // get filtered list of subdirectories DirectoryInfo[] subdirs = new Sync().GetDirectories(directoryInfo, inputParams, ref results); // sort by name for deterministic order Array.Sort(subdirs, new DirectoryInfoComparer()); foreach (DirectoryInfo subdir in subdirs) { // write information about each subdirectory to stream byte[] bytes = ASCIIEncoding.UTF8.GetBytes(subdir.Name); memoryStream.Write(bytes, 0, bytes.Length); // recurse BuildCRCStream(Path.Combine(directory, subdir.Name), inputParams, ref memoryStream); } }