public void CreateZipShouldSetTimeOnEntriesFromConstructorTimeSetting(TimeSetting timeSetting) { var targetTime = TestTargetTime(timeSetting); var fastZip = new FastZip(timeSetting); var alterTime = (Action <FileInfo>)null; switch (timeSetting) { case TimeSetting.LastWriteTime: alterTime = fi => fi.LastWriteTime = targetTime; break; case TimeSetting.LastWriteTimeUtc: alterTime = fi => fi.LastWriteTimeUtc = targetTime; break; case TimeSetting.CreateTime: alterTime = fi => fi.CreationTime = targetTime; break; case TimeSetting.CreateTimeUtc: alterTime = fi => fi.CreationTimeUtc = targetTime; break; } var target = CreateFastZipTestArchiveWithAnEntry(fastZip, alterTime); // Check that the file contents are correct in both cases var archive = new MemoryStream(target.ToArray()); using (var zf = new ZipFile(archive)) { var expectedTime = TestTargetTime(timeSetting); var actualTime = zf[0].DateTime; // Assert that the time is within +/- 2s of the target time to allow for timing/rounding discrepancies Assert.LessOrEqual(Math.Abs((expectedTime - actualTime).TotalSeconds), 2); } }
private static DateTime TestTargetTime(TimeSetting ts) { var dtk = ts == TimeSetting.CreateTimeUtc || ts == TimeSetting.LastWriteTimeUtc || ts == TimeSetting.LastAccessTimeUtc ? DateTimeKind.Utc : DateTimeKind.Local; return(IsLastAccessTime(ts) // AccessTime will be altered by reading/writing the file entry ? CurrentTime(dtk) : ExpectedFixedTime(dtk)); }
private static DateTime FileTimeFromTimeSetting(FileInfo fi, TimeSetting timeSetting) { switch (timeSetting) { case TimeSetting.LastWriteTime: return(fi.LastWriteTime); case TimeSetting.LastWriteTimeUtc: return(fi.LastWriteTimeUtc); case TimeSetting.CreateTime: return(fi.CreationTime); case TimeSetting.CreateTimeUtc: return(fi.CreationTimeUtc); case TimeSetting.LastAccessTime: return(fi.LastAccessTime); case TimeSetting.LastAccessTimeUtc: return(fi.LastAccessTimeUtc); case TimeSetting.Fixed: return(fi.LastWriteTime); } throw new ArgumentException("Invalid TimeSetting", nameof(timeSetting)); }
public void ExtractZipShouldSetTimeOnFilesFromConstructorTimeSetting(TimeSetting timeSetting) { var targetTime = ExpectedFixedTime(); var archiveStream = CreateFastZipTestArchiveWithAnEntry(new FastZip(targetTime)); if (timeSetting == TimeSetting.Fixed) { Assert.Ignore("Fixed time without specifying a time is undefined"); } var fastZip = new FastZip(timeSetting); using var extractDir = Utils.GetTempDir(); fastZip.ExtractZip(archiveStream, extractDir.FullName, FastZip.Overwrite.Always, _ => true, "", "", restoreDateTime: true, isStreamOwner: true, allowParentTraversal: false); var fi = new FileInfo(Path.Combine(extractDir.FullName, SingleEntryFileName)); var actualTime = FileTimeFromTimeSetting(fi, timeSetting); // Assert that the time is within +/- 2s of the target time to allow for timing/rounding discrepancies Assert.LessOrEqual(Math.Abs((targetTime - actualTime).TotalSeconds), 2); }
private static bool IsLastAccessTime(TimeSetting ts) => ts == TimeSetting.LastAccessTime || ts == TimeSetting.LastAccessTimeUtc;