main
cs 117 lines 4.64 KB
Raw
1 // 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.
2
3 namespace WixToolsetTest.CoreIntegration
4 {
5 using System;
6 using System.IO;
7 using System.Linq;
8 using WixInternal.TestSupport;
9 using WixInternal.Core.TestPackage;
10 using Xunit;
11
12 public class CabFixture
13 {
14 [Fact]
15 public void CabinetFilesSequencedCorrectly()
16 {
17 var folder = TestData.Get(@"TestData\MultiFileCompressed");
18
19 using (var fs = new DisposableFileSystem())
20 {
21 var baseFolder = fs.GetFolder();
22 var intermediateFolder = Path.Combine(baseFolder, "obj");
23 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
24 var cabPath = Path.Combine(baseFolder, @"bin\cab1.cab");
25
26 var result = WixRunner.Execute(new[]
27 {
28 "build",
29 Path.Combine(folder, "Package.wxs"),
30 Path.Combine(folder, "PackageComponents.wxs"),
31 "-ct", "1000000",
32 "-d", "MediaTemplateCompressionLevel",
33 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
34 "-bindpath", Path.Combine(folder, "data"),
35 "-intermediateFolder", intermediateFolder,
36 "-o", msiPath
37 });
38
39 result.AssertSuccess();
40 Assert.True(File.Exists(cabPath));
41
42 var fileTable = Query.QueryDatabase(msiPath, new[] { "File" });
43 var fileRows = fileTable.Select(r => new FileRow(r)).OrderBy(f => f.Sequence).ToList();
44
45 Assert.Equal(new[] { 1, 2 }, fileRows.Select(f => f.Sequence).ToArray());
46 WixAssert.CompareLineByLine(new[] { "Notepad.exe", "test.txt" }, fileRows.Select(f => f.Name).ToArray());
47
48 var files = Query.GetCabinetFiles(cabPath);
49 WixAssert.CompareLineByLine(fileRows.Select(f => f.Id).ToArray(), files.Select(f => f.Name).ToArray());
50 }
51 }
52
53 [Fact]
54 public void CanCabReallyOldFiles()
55 {
56 var folder = TestData.Get(@"TestData", "SingleFileCompressed");
57
58 using (var fs = new DisposableFileSystem())
59 {
60 var baseFolder = fs.GetFolder(create: true);
61 var intermediateFolder = Path.Combine(baseFolder, "obj");
62 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
63 var cabPath = Path.Combine(baseFolder, @"bin\cab1.cab");
64
65 var old = new DateTime(1980, 1, 1, 0, 0, 0, DateTimeKind.Utc);
66 var oldTxt = Path.Combine(baseFolder, "test.txt");
67 File.Copy(Path.Combine(folder, "data", "test.txt"), oldTxt);
68 File.SetCreationTime(oldTxt, old);
69 File.SetLastWriteTime(oldTxt, old);
70 File.SetLastAccessTime(oldTxt, old);
71
72 var result = WixRunner.Execute(new[]
73 {
74 "build",
75 Path.Combine(folder, "Package.wxs"),
76 Path.Combine(folder, "PackageComponents.wxs"),
77 "-d", "MediaTemplateCompressionLevel",
78 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
79 "-bindpath", baseFolder,
80 "-intermediateFolder", intermediateFolder,
81 "-o", msiPath
82 });
83
84 result.AssertSuccess();
85 Assert.True(File.Exists(cabPath));
86
87 var fileTable = Query.QueryDatabase(msiPath, new[] { "File" });
88 var fileRows = fileTable.Select(r => new FileRow(r)).OrderBy(f => f.Sequence).ToList();
89
90 Assert.Equal(new[] { 1 }, fileRows.Select(f => f.Sequence).ToArray());
91 WixAssert.CompareLineByLine(new[] { "test.txt" }, fileRows.Select(f => f.Name).ToArray());
92
93 var files = Query.GetCabinetFiles(cabPath);
94 WixAssert.CompareLineByLine(fileRows.Select(f => f.Id).ToArray(), files.Select(f => f.Name).ToArray());
95 }
96 }
97
98 private class FileRow
99 {
100 public FileRow(string row)
101 {
102 row = row.Substring("File:".Length);
103
104 var split = row.Split('\t');
105 this.Id = split[0];
106 this.Name = split[2];
107 this.Sequence = Convert.ToInt32(split[7]);
108 }
109
110 public string Id { get; set; }
111
112 public string Name { get; set; }
113
114 public int Sequence { get; set; }
115 }
116 }
117 }