main
cs 282 lines 11.6 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.IO;
6 using System.Linq;
7 using System.Xml;
8 using WixInternal.TestSupport;
9 using WixInternal.Core.TestPackage;
10 using WixToolset.Data;
11 using Xunit;
12
13 public class VersionFixture
14 {
15 [Fact]
16 public void CanBuildMsiWithPrefixedVersion()
17 {
18 var folder = TestData.Get(@"TestData");
19
20 using (var fs = new DisposableFileSystem())
21 {
22 var baseFolder = fs.GetFolder();
23 var intermediateFolder = Path.Combine(baseFolder, "obj");
24 var msiPath = Path.Combine(baseFolder, "bin", "test1.msi");
25
26 var result = WixRunner.Execute(new[]
27 {
28 "build",
29 Path.Combine(folder, "Version", "PackageWithReplaceableVersion.wxs"),
30 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
31 "-intermediateFolder", intermediateFolder,
32 "-d", "Version=v4.3.2.1",
33 "-o", msiPath
34 });
35
36 result.AssertSuccess();
37
38 var productVersion = GetProductVersionFromMsi(msiPath);
39 Assert.Equal("4.3.2.1", productVersion);
40 }
41 }
42
43 [Fact]
44 public void CanBuildMsiWithInsignificantZeroesVersion()
45 {
46 var folder = TestData.Get(@"TestData");
47
48 using (var fs = new DisposableFileSystem())
49 {
50 var baseFolder = fs.GetFolder();
51 var intermediateFolder = Path.Combine(baseFolder, "obj");
52 var msiPath = Path.Combine(baseFolder, "bin", "test1.msi");
53
54 var result = WixRunner.Execute(new[]
55 {
56 "build",
57 Path.Combine(folder, "Version", "PackageWithReplaceableVersion.wxs"),
58 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
59 "-intermediateFolder", intermediateFolder,
60 "-d", "Version=0001.002.0003.04",
61 "-o", msiPath
62 });
63
64 result.AssertSuccess();
65
66 var productVersion = GetProductVersionFromMsi(msiPath);
67 Assert.Equal("0001.002.0003.04", productVersion);
68 }
69 }
70
71 [Fact]
72 public void CanBuildMsiWithPrefixedInsignificantZeroesVersion()
73 {
74 var folder = TestData.Get(@"TestData");
75
76 using (var fs = new DisposableFileSystem())
77 {
78 var baseFolder = fs.GetFolder();
79 var intermediateFolder = Path.Combine(baseFolder, "obj");
80 var msiPath = Path.Combine(baseFolder, "bin", "test1.msi");
81
82 var result = WixRunner.Execute(new[]
83 {
84 "build",
85 Path.Combine(folder, "Version", "PackageWithReplaceableVersion.wxs"),
86 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
87 "-intermediateFolder", intermediateFolder,
88 "-d", "Version=v01.002.0003.000004",
89 "-o", msiPath
90 });
91
92 result.AssertSuccess();
93
94 var productVersion = GetProductVersionFromMsi(msiPath);
95 Assert.Equal("01.002.0003.000004", productVersion);
96 }
97 }
98
99 [Fact]
100 public void CanBuildMsiWithPrefixedVersionBindVariable()
101 {
102 var folder = TestData.Get(@"TestData");
103
104 using (var fs = new DisposableFileSystem())
105 {
106 var baseFolder = fs.GetFolder();
107 var intermediateFolder = Path.Combine(baseFolder, "obj");
108 var msiPath = Path.Combine(baseFolder, "bin", "test1.msi");
109
110 var result = WixRunner.Execute(new[]
111 {
112 "build",
113 Path.Combine(folder, "Version", "PackageWithBindVariableVersion.wxs"),
114 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
115 "-intermediateFolder", intermediateFolder,
116 "-o", msiPath
117 });
118
119 result.AssertSuccess();
120
121 var productVersion = GetProductVersionFromMsi(msiPath);
122 Assert.Equal("9.8.7.6", productVersion);
123
124 var directoryTable = Query.QueryDatabase(msiPath, new[] { "Directory" }).OrderBy(s => s).ToArray();
125 WixAssert.CompareLineByLine(new[]
126 {
127 "Directory:DesktopFolder\tTARGETDIR\tDesktop",
128 "Directory:INSTALLFOLDER\tDesktopFolder\tpja2bznq|MsiPackage v9.8.7.6 and 9.8.7.6",
129 "Directory:TARGETDIR\t\tSourceDir"
130 }, directoryTable);
131 }
132 }
133
134 [Fact]
135 public void CannotBuildMsiWithExtendedVersion()
136 {
137 var folder = TestData.Get(@"TestData");
138
139 using (var fs = new DisposableFileSystem())
140 {
141 var baseFolder = fs.GetFolder();
142 var intermediateFolder = Path.Combine(baseFolder, "obj");
143 var msiPath = Path.Combine(baseFolder, "bin", "test1.msi");
144
145 var result = WixRunner.Execute(new[]
146 {
147 "build",
148 Path.Combine(folder, "Version", "PackageWithReplaceableVersion.wxs"),
149 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
150 "-intermediateFolder", intermediateFolder,
151 "-d", "Version=v4.3.2-preview.1",
152 "-o", msiPath
153 });
154
155 var errorMessages = result.Messages.Where(m => m.Level == MessageLevel.Error)
156 .Select(m => m.ToString())
157 .ToArray();
158 Assert.StartsWith("Invalid MSI package version: 'v4.3.2-preview.1'.", errorMessages.Single());
159 Assert.Equal(1148, result.ExitCode);
160 }
161 }
162
163 [Fact]
164 public void CannotBuildMsiWithInvalidMajorVersion()
165 {
166 var folder = TestData.Get(@"TestData");
167
168 using (var fs = new DisposableFileSystem())
169 {
170 var baseFolder = fs.GetFolder();
171 var intermediateFolder = Path.Combine(baseFolder, "obj");
172 var msiPath = Path.Combine(baseFolder, @"bin\test1.msi");
173
174 var result = WixRunner.Execute(warningsAsErrors: false, new[]
175 {
176 "build",
177 Path.Combine(folder, "Version", "PackageWithReplaceableVersion.wxs"),
178 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
179 "-intermediateFolder", intermediateFolder,
180 "-d", "Version=257.0.0",
181 "-o", msiPath
182 });
183
184 result.AssertSuccess();
185
186 var warningMessages = result.Messages.Where(m => m.Level == MessageLevel.Warning).Select(m => m.ToString()).ToArray();
187 Assert.StartsWith("Invalid MSI package version: '257.0.0'.", warningMessages[0]);
188 Assert.StartsWith("Invalid MSI package version: '257.0.0'.", warningMessages[1]);
189 Assert.StartsWith("Invalid MSI package version: '257.0.0'.", warningMessages[2]);
190 }
191 }
192
193 [Fact]
194 public void CannotBuildMsiWithInvalidBindVariableVersion()
195 {
196 var folder = TestData.Get(@"TestData");
197
198 using (var fs = new DisposableFileSystem())
199 {
200 var baseFolder = fs.GetFolder();
201 var intermediateFolder = Path.Combine(baseFolder, "obj");
202 var msiPath = Path.Combine(baseFolder, @"bin\test1.msi");
203
204 var result = WixRunner.Execute(warningsAsErrors: false, new[]
205 {
206 "build",
207 Path.Combine(folder, "Version", "PackageWithUndefinedBindVariableVersion.wxs"),
208 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
209 "-intermediateFolder", intermediateFolder,
210 "-bindvariable", "Version=257.0.0",
211 "-o", msiPath
212 });
213
214 result.AssertSuccess();
215
216 var warningMessages = result.Messages.Where(m => m.Level == MessageLevel.Warning).Select(m => m.ToString()).ToArray();
217 Assert.StartsWith("Invalid MSI package version: '257.0.0'.", warningMessages[0]);
218 Assert.StartsWith("Invalid MSI package version: '257.0.0'.", warningMessages[1]);
219 Assert.StartsWith("Invalid MSI package version: '257.0.0'.", warningMessages[2]);
220 }
221 }
222
223 [Fact]
224 public void CanBuildBundleWithSemanticVersion()
225 {
226 var folder = TestData.Get(@"TestData");
227
228 using (var fs = new DisposableFileSystem())
229 {
230 var baseFolder = fs.GetFolder();
231 var intermediateFolder = Path.Combine(baseFolder, "obj");
232 var msiPath = Path.Combine(baseFolder, @"bin\test1.msi");
233 var msi2Path = Path.Combine(baseFolder, @"bin\test2.msi");
234 var bundlePath = Path.Combine(baseFolder, @"bin\bundle.exe");
235
236 var result = WixRunner.Execute(new[]
237 {
238 "build",
239 Path.Combine(folder, "Version", "PackageWithReplaceableVersion.wxs"),
240 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
241 "-intermediateFolder", intermediateFolder,
242 "-d", "Version=255.255.65535",
243 "-o", msiPath
244 });
245
246 result.AssertSuccess();
247
248 var result3 = WixRunner.Execute(new[]
249 {
250 "build",
251 Path.Combine(folder, "Version", "Bundle.wxs"),
252 "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
253 "-bindpath", Path.Combine(baseFolder, "bin"),
254 "-intermediateFolder", intermediateFolder,
255 "-d", "Version=2022.3.9-preview.0-build.5+0987654321abcdef1234567890",
256 "-o", bundlePath
257 });
258
259 result3.AssertSuccess();
260
261 var productVersion = GetProductVersionFromMsi(msiPath);
262 WixAssert.StringEqual("255.255.65535", productVersion);
263
264 var extractResult = BundleExtractor.ExtractAllContainers(null, bundlePath, Path.Combine(baseFolder, "ba"), Path.Combine(baseFolder, "attached"), Path.Combine(baseFolder, "extract"));
265 extractResult.AssertSuccess();
266
267 var bundleVersion = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Registration/@Version")
268 .Cast<XmlAttribute>()
269 .Single();
270 WixAssert.StringEqual("2022.3.9-preview.0-build.5+0987654321abcdef1234567890", bundleVersion.Value);
271 }
272 }
273
274 private static string GetProductVersionFromMsi(string msiPath)
275 {
276 var propertyTable = Query.QueryDatabase(msiPath, new[] { "Property" }).Select(r => r.Split('\t')).ToDictionary(r => r[0].Substring("Property:".Length), r => r[1]);
277 Assert.True(propertyTable.TryGetValue("ProductVersion", out var productVersion));
278
279 return productVersion;
280 }
281 }
282 }