From ea3d18595a610ee07b03f07af4f03cf75b5ab420 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Wed, 29 Nov 2017 14:08:08 -0800 Subject: Improved cabinet handling --- .../WixToolsetTest.Core.Native/CabinetFixture.cs | 115 +++++++++++++++++++++ .../WixToolsetTest.Core.Native/TestData/test.cab | Bin 0 -> 115 bytes .../WixToolsetTest.Core.Native/TestData/test.txt | 1 + .../Utility/DisposableFileSystem.cs | 86 +++++++++++++++ .../WixToolsetTest.Core.Native/Utility/Pushd.cs | 46 +++++++++ .../WixToolsetTest.Core.Native/Utility/TestData.cs | 17 +++ .../WixToolsetTest.Core.Native.csproj | 24 +++++ 7 files changed, 289 insertions(+) create mode 100644 src/test/WixToolsetTest.Core.Native/CabinetFixture.cs create mode 100644 src/test/WixToolsetTest.Core.Native/TestData/test.cab create mode 100644 src/test/WixToolsetTest.Core.Native/TestData/test.txt create mode 100644 src/test/WixToolsetTest.Core.Native/Utility/DisposableFileSystem.cs create mode 100644 src/test/WixToolsetTest.Core.Native/Utility/Pushd.cs create mode 100644 src/test/WixToolsetTest.Core.Native/Utility/TestData.cs create mode 100644 src/test/WixToolsetTest.Core.Native/WixToolsetTest.Core.Native.csproj (limited to 'src/test/WixToolsetTest.Core.Native') diff --git a/src/test/WixToolsetTest.Core.Native/CabinetFixture.cs b/src/test/WixToolsetTest.Core.Native/CabinetFixture.cs new file mode 100644 index 00000000..baab3bee --- /dev/null +++ b/src/test/WixToolsetTest.Core.Native/CabinetFixture.cs @@ -0,0 +1,115 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolsetTest.CoreNative +{ + using System; + using System.IO; + using System.Linq; + using WixToolset.Core.Native; + using WixToolsetTest.CoreNative.Utility; + using Xunit; + + public class CabinetFixture + { + [Fact] + public void CanCreateSingleFileCabinet() + { + using (var fs = new DisposableFileSystem()) + { + var intermediateFolder = fs.GetFolder(true); + var cabPath = Path.Combine(intermediateFolder, "testout.cab"); + + var files = new[] { new CabinetCompressFile(TestData.Get(@"TestData\test.txt"), "test.txt") }; + + var cabinet = new Cabinet(cabPath); + cabinet.Compress(files, CabinetCompressionLevel.Low); + + Assert.True(File.Exists(cabPath)); + } + } + + [Fact] + public void CanEnumerateSingleFileCabinet() + { + var cabinetPath = TestData.Get(@"TestData\test.cab"); + + var cabinet = new Cabinet(cabinetPath); + var files = cabinet.Enumerate(); + + var file = files.Single(); + Assert.Equal("test.txt", file.FileId); + Assert.Equal(17, file.Size); + + Assert.Equal(19259, file.Date); + Assert.Equal(47731, file.Time); + Assert.True(file.SameAsDateTime(new DateTime(2017, 9, 28, 0, 19, 38))); + } + + [Fact] + public void CanExtractSingleFileCabinet() + { + var cabinetPath = TestData.Get(@"TestData\test.cab"); + + using (var fs = new DisposableFileSystem()) + { + var extractFolder = fs.GetFolder(true); + + var cabinet = new Cabinet(cabinetPath); + cabinet.Extract(extractFolder); + + var files = Directory.EnumerateFiles(extractFolder); + + var file = new FileInfo(files.Single()); + CabInterop.DateTimeToCabDateAndTime(file.CreationTime, out var date, out var time); + + Assert.Equal("test.txt", file.Name); + Assert.Equal(17, file.Length); + Assert.Equal(19259, date); + Assert.Equal(47731, time); + } + } + + [Fact] + public void IntegrationTest() + { + using (var fs = new DisposableFileSystem()) + { + var intermediateFolder = fs.GetFolder(true); + var cabinetPath = Path.Combine(intermediateFolder, "testout.cab"); + var extractFolder = fs.GetFolder(true); + + // Compress. + { + var files = new[] { new CabinetCompressFile(TestData.Get(@"TestData\test.txt"), "test.txt") }; + + var cabinet = new Cabinet(cabinetPath); + cabinet.Compress(files, CabinetCompressionLevel.Low); + } + + // Extract. + { + var cabinet = new Cabinet(cabinetPath); + cabinet.Extract(extractFolder); + } + + // Enumerate to compare cabinet to extracted files. + { + var cabinet = new Cabinet(cabinetPath); + var enumerated = cabinet.Enumerate().OrderBy(f => f.FileId).ToArray(); + + var files = Directory.EnumerateFiles(extractFolder).OrderBy(f => f).ToArray(); + + for (var i =0; i < enumerated.Length; ++i) + { + var cabFileInfo = enumerated[i]; + var fileInfo = new FileInfo(files[i]); + + Assert.Equal(cabFileInfo.FileId, fileInfo.Name); + Assert.Equal(cabFileInfo.Size, fileInfo.Length); + Assert.True(cabFileInfo.SameAsDateTime(fileInfo.CreationTime)); + } + } + } + } + } +} diff --git a/src/test/WixToolsetTest.Core.Native/TestData/test.cab b/src/test/WixToolsetTest.Core.Native/TestData/test.cab new file mode 100644 index 00000000..ca78f632 Binary files /dev/null and b/src/test/WixToolsetTest.Core.Native/TestData/test.cab differ diff --git a/src/test/WixToolsetTest.Core.Native/TestData/test.txt b/src/test/WixToolsetTest.Core.Native/TestData/test.txt new file mode 100644 index 00000000..cd0db0e1 --- /dev/null +++ b/src/test/WixToolsetTest.Core.Native/TestData/test.txt @@ -0,0 +1 @@ +This is test.txt. \ No newline at end of file diff --git a/src/test/WixToolsetTest.Core.Native/Utility/DisposableFileSystem.cs b/src/test/WixToolsetTest.Core.Native/Utility/DisposableFileSystem.cs new file mode 100644 index 00000000..c9957247 --- /dev/null +++ b/src/test/WixToolsetTest.Core.Native/Utility/DisposableFileSystem.cs @@ -0,0 +1,86 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolsetTest.CoreNative.Utility +{ + using System; + using System.Collections.Generic; + using System.IO; + + public class DisposableFileSystem : IDisposable + { + protected bool Disposed { get; private set; } + + private List CleanupPaths { get; } = new List(); + + public string GetFile(bool create = false) + { + var path = Path.GetTempFileName(); + + if (!create) + { + File.Delete(path); + } + + this.CleanupPaths.Add(path); + + return path; + } + + public string GetFolder(bool create = false) + { + var path = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + + if (create) + { + Directory.CreateDirectory(path); + } + + this.CleanupPaths.Add(path); + + return path; + } + + + #region // IDisposable + + public void Dispose() + { + this.Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (this.Disposed) + { + return; + } + + if (disposing) + { + foreach (var path in this.CleanupPaths) + { + try + { + if (File.Exists(path)) + { + File.Delete(path); + } + else if (Directory.Exists(path)) + { + Directory.Delete(path, true); + } + } + catch + { + // Best effort delete, so ignore any failures. + } + } + } + + this.Disposed = true; + } + + #endregion + } +} diff --git a/src/test/WixToolsetTest.Core.Native/Utility/Pushd.cs b/src/test/WixToolsetTest.Core.Native/Utility/Pushd.cs new file mode 100644 index 00000000..91700c2f --- /dev/null +++ b/src/test/WixToolsetTest.Core.Native/Utility/Pushd.cs @@ -0,0 +1,46 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolsetTest.CoreNative.Utility +{ + using System; + using System.IO; + + public class Pushd : IDisposable + { + protected bool Disposed { get; private set; } + + public Pushd(string path) + { + this.PreviousDirectory = Directory.GetCurrentDirectory(); + + Directory.SetCurrentDirectory(path); + } + + public string PreviousDirectory { get; } + + #region // IDisposable + + public void Dispose() + { + this.Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (this.Disposed) + { + return; + } + + if (disposing) + { + Directory.SetCurrentDirectory(this.PreviousDirectory); + } + + this.Disposed = true; + } + + #endregion + } +} diff --git a/src/test/WixToolsetTest.Core.Native/Utility/TestData.cs b/src/test/WixToolsetTest.Core.Native/Utility/TestData.cs new file mode 100644 index 00000000..cd9c6318 --- /dev/null +++ b/src/test/WixToolsetTest.Core.Native/Utility/TestData.cs @@ -0,0 +1,17 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolsetTest.CoreNative.Utility +{ + using System; + using System.IO; + + public class TestData + { + public static string LocalPath => Path.GetDirectoryName(new Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath); + + public static string Get(params string[] paths) + { + return Path.Combine(LocalPath, Path.Combine(paths)); + } + } +} diff --git a/src/test/WixToolsetTest.Core.Native/WixToolsetTest.Core.Native.csproj b/src/test/WixToolsetTest.Core.Native/WixToolsetTest.Core.Native.csproj new file mode 100644 index 00000000..c7fd89ea --- /dev/null +++ b/src/test/WixToolsetTest.Core.Native/WixToolsetTest.Core.Native.csproj @@ -0,0 +1,24 @@ + + + + + + netcoreapp2.0 + false + + + + + + + + + + + + + + + + + -- cgit v1.2.3-55-g6feb