aboutsummaryrefslogtreecommitdiff
path: root/src/wix/test/WixToolsetTest.Sdk/MsbuildFixture.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/wix/test/WixToolsetTest.Sdk/MsbuildFixture.cs')
-rw-r--r--src/wix/test/WixToolsetTest.Sdk/MsbuildFixture.cs442
1 files changed, 442 insertions, 0 deletions
diff --git a/src/wix/test/WixToolsetTest.Sdk/MsbuildFixture.cs b/src/wix/test/WixToolsetTest.Sdk/MsbuildFixture.cs
new file mode 100644
index 00000000..3c8e79e7
--- /dev/null
+++ b/src/wix/test/WixToolsetTest.Sdk/MsbuildFixture.cs
@@ -0,0 +1,442 @@
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
3namespace WixToolsetTest.Sdk
4{
5 using System;
6 using System.Collections.Generic;
7 using System.IO;
8 using System.Linq;
9 using WixBuildTools.TestSupport;
10 using Xunit;
11
12 public class MsbuildFixture
13 {
14 [Theory]
15 [InlineData(BuildSystem.DotNetCoreSdk)]
16 [InlineData(BuildSystem.MSBuild)]
17 [InlineData(BuildSystem.MSBuild64)]
18 public void CanBuildSimpleBundle(BuildSystem buildSystem)
19 {
20 var sourceFolder = TestData.Get(@"TestData\SimpleMsiPackage");
21
22 using (var fs = new TestDataFolderFileSystem())
23 {
24 fs.Initialize(sourceFolder);
25 var baseFolder = Path.Combine(fs.BaseFolder, "SimpleBundle");
26 var binFolder = Path.Combine(baseFolder, @"bin\");
27 var projectPath = Path.Combine(baseFolder, "SimpleBundle.wixproj");
28
29 var result = MsbuildUtilities.BuildProject(buildSystem, projectPath);
30 result.AssertSuccess();
31
32 var warnings = result.Output.Where(line => line.Contains(": warning"));
33 Assert.Empty(warnings);
34
35 var paths = Directory.EnumerateFiles(binFolder, @"*.*", SearchOption.AllDirectories)
36 .Select(s => s.Substring(baseFolder.Length + 1))
37 .OrderBy(s => s)
38 .ToArray();
39 WixAssert.CompareLineByLine(new[]
40 {
41 @"bin\x86\Release\SimpleBundle.exe",
42 @"bin\x86\Release\SimpleBundle.wixpdb",
43 }, paths);
44 }
45 }
46
47 [Theory(Skip = "Test demonstrates failure")]
48 [InlineData(BuildSystem.DotNetCoreSdk)]
49 [InlineData(BuildSystem.MSBuild)]
50 [InlineData(BuildSystem.MSBuild64)]
51 public void CanBuildUncompressedBundle(BuildSystem buildSystem)
52 {
53 var sourceFolder = TestData.Get(@"TestData\SimpleMsiPackage");
54
55 using (var fs = new TestDataFolderFileSystem())
56 {
57 fs.Initialize(sourceFolder);
58 var baseFolder = Path.Combine(fs.BaseFolder, "UncompressedBundle");
59 var binFolder = Path.Combine(baseFolder, @"bin\");
60 var projectPath = Path.Combine(baseFolder, "UncompressedBundle.wixproj");
61
62 var result = MsbuildUtilities.BuildProject(buildSystem, projectPath);
63 result.AssertSuccess();
64
65 var warnings = result.Output.Where(line => line.Contains(": warning"));
66 Assert.Empty(warnings);
67
68 var paths = Directory.EnumerateFiles(binFolder, @"*.*", SearchOption.AllDirectories)
69 .Select(s => s.Substring(baseFolder.Length + 1))
70 .OrderBy(s => s)
71 .ToArray();
72 WixAssert.CompareLineByLine(new[]
73 {
74 @"bin\x86\Release\SimpleBundle.exe",
75 @"bin\x86\Release\SimpleBundle.wixpdb",
76 @"bin\x86\Release\test.txt",
77 }, paths);
78 }
79 }
80
81 [Theory]
82 [InlineData(BuildSystem.DotNetCoreSdk)]
83 [InlineData(BuildSystem.MSBuild)]
84 [InlineData(BuildSystem.MSBuild64)]
85 public void CanBuildSimpleMergeModule(BuildSystem buildSystem)
86 {
87 var sourceFolder = TestData.Get(@"TestData\MergeModule\SimpleMergeModule");
88
89 using (var fs = new TestDataFolderFileSystem())
90 {
91 fs.Initialize(sourceFolder);
92 var baseFolder = fs.BaseFolder;
93 var binFolder = Path.Combine(baseFolder, @"bin\");
94 var projectPath = Path.Combine(baseFolder, "SimpleMergeModule.wixproj");
95
96 var result = MsbuildUtilities.BuildProject(buildSystem, projectPath);
97 result.AssertSuccess();
98
99 var warnings = result.Output.Where(line => line.Contains(": warning"));
100 Assert.Empty(warnings);
101
102 var paths = Directory.EnumerateFiles(binFolder, @"*.*", SearchOption.AllDirectories)
103 .Select(s => s.Substring(baseFolder.Length + 1))
104 .OrderBy(s => s)
105 .ToArray();
106 WixAssert.CompareLineByLine(new[]
107 {
108 @"bin\x86\Release\SimpleMergeModule.msm",
109 @"bin\x86\Release\SimpleMergeModule.wixpdb",
110 }, paths);
111 }
112 }
113
114 [Theory]
115 [InlineData(BuildSystem.DotNetCoreSdk)]
116 [InlineData(BuildSystem.MSBuild)]
117 [InlineData(BuildSystem.MSBuild64)]
118 public void CanBuildSimpleMsiPackage(BuildSystem buildSystem)
119 {
120 var sourceFolder = TestData.Get(@"TestData\SimpleMsiPackage\MsiPackage");
121
122 using (var fs = new TestDataFolderFileSystem())
123 {
124 fs.Initialize(sourceFolder);
125 var baseFolder = fs.BaseFolder;
126 var binFolder = Path.Combine(baseFolder, @"bin\");
127 var projectPath = Path.Combine(baseFolder, "MsiPackage.wixproj");
128
129 var result = MsbuildUtilities.BuildProject(buildSystem, projectPath);
130 result.AssertSuccess();
131
132 var platformSwitches = result.Output.Where(line => line.Contains("-platform x86"));
133 Assert.Single(platformSwitches);
134
135 var warnings = result.Output.Where(line => line.Contains(": warning"));
136 Assert.Equal(4, warnings.Count());
137
138 var paths = Directory.EnumerateFiles(binFolder, @"*.*", SearchOption.AllDirectories)
139 .Select(s => s.Substring(baseFolder.Length + 1))
140 .OrderBy(s => s)
141 .ToArray();
142 WixAssert.CompareLineByLine(new[]
143 {
144 @"bin\x86\Release\en-US\cab1.cab",
145 @"bin\x86\Release\en-US\MsiPackage.msi",
146 @"bin\x86\Release\en-US\MsiPackage.wixpdb",
147 }, paths);
148 }
149 }
150
151 [Theory]
152 [InlineData(BuildSystem.DotNetCoreSdk)]
153 [InlineData(BuildSystem.MSBuild)]
154 [InlineData(BuildSystem.MSBuild64)]
155 public void CanBuildSimpleMsiPackageWithMergeModule(BuildSystem buildSystem)
156 {
157 var sourceFolder = TestData.Get(@"TestData\MergeModule");
158
159 using (var fs = new TestDataFolderFileSystem())
160 {
161 fs.Initialize(sourceFolder);
162 var baseFolder = Path.Combine(fs.BaseFolder, "MergeMsiPackage");
163 var binFolder = Path.Combine(baseFolder, @"bin\");
164 var projectPath = Path.Combine(baseFolder, "MergeMsiPackage.wixproj");
165
166 var result = MsbuildUtilities.BuildProject(buildSystem, projectPath);
167 result.AssertSuccess();
168
169 var warnings = result.Output.Where(line => line.Contains(": warning"));
170 Assert.Empty(warnings);
171
172 var paths = Directory.EnumerateFiles(binFolder, @"*.*", SearchOption.AllDirectories)
173 .Select(s => s.Substring(baseFolder.Length + 1))
174 .OrderBy(s => s)
175 .ToArray();
176 WixAssert.CompareLineByLine(new[]
177 {
178 @"bin\x86\Release\cab1.cab",
179 @"bin\x86\Release\MergeMsiPackage.msi",
180 @"bin\x86\Release\MergeMsiPackage.wixpdb",
181 }, paths);
182 }
183 }
184
185 [Theory]
186 [InlineData(BuildSystem.DotNetCoreSdk)]
187 [InlineData(BuildSystem.MSBuild)]
188 [InlineData(BuildSystem.MSBuild64)]
189 public void CanBuildWithDefaultAndExplicitlyFullWixpdbs(BuildSystem buildSystem)
190 {
191 var expectedOutputs = new[]
192 {
193 @"bin\x86\Release\en-US\cab1.cab",
194 @"bin\x86\Release\en-US\MsiPackage.msi",
195 @"bin\x86\Release\en-US\MsiPackage.wixpdb",
196 };
197
198 this.AssertWixpdb(buildSystem, null, expectedOutputs);
199 this.AssertWixpdb(buildSystem, "Full", expectedOutputs);
200 }
201
202 [Theory]
203 [InlineData(BuildSystem.DotNetCoreSdk)]
204 [InlineData(BuildSystem.MSBuild)]
205 [InlineData(BuildSystem.MSBuild64)]
206 public void CanBuildWithNoWixpdb(BuildSystem buildSystem)
207 {
208 this.AssertWixpdb(buildSystem, "NONE", new[]
209 {
210 @"bin\x86\Release\en-US\cab1.cab",
211 @"bin\x86\Release\en-US\MsiPackage.msi",
212 });
213 }
214
215 private void AssertWixpdb(BuildSystem buildSystem, string wixpdbType, string[] expectedOutputFiles)
216 {
217 var sourceFolder = TestData.Get(@"TestData\SimpleMsiPackage\MsiPackage");
218
219 using (var fs = new TestDataFolderFileSystem())
220 {
221 fs.Initialize(sourceFolder);
222 var baseFolder = fs.BaseFolder;
223 var binFolder = Path.Combine(baseFolder, @"bin\");
224 var projectPath = Path.Combine(baseFolder, "MsiPackage.wixproj");
225
226 var result = MsbuildUtilities.BuildProject(buildSystem, projectPath, new[]
227 {
228 wixpdbType == null ? String.Empty : $"-p:WixPdbType={wixpdbType}",
229 });
230 result.AssertSuccess();
231
232 var paths = Directory.EnumerateFiles(binFolder, @"*.*", SearchOption.AllDirectories)
233 .Select(s => s.Substring(baseFolder.Length + 1))
234 .OrderBy(s => s)
235 .ToArray();
236 WixAssert.CompareLineByLine(expectedOutputFiles, paths);
237 }
238 }
239
240 [Theory]
241 [InlineData(BuildSystem.DotNetCoreSdk)]
242 [InlineData(BuildSystem.MSBuild)]
243 [InlineData(BuildSystem.MSBuild64)]
244 public void CanBuild64BitMsiPackage(BuildSystem buildSystem)
245 {
246 var sourceFolder = TestData.Get(@"TestData\SimpleMsiPackage\MsiPackage");
247
248 using (var fs = new TestDataFolderFileSystem())
249 {
250 fs.Initialize(sourceFolder);
251 var baseFolder = fs.BaseFolder;
252 var binFolder = Path.Combine(baseFolder, @"bin\");
253 var projectPath = Path.Combine(baseFolder, "MsiPackage.wixproj");
254
255 var result = MsbuildUtilities.BuildProject(buildSystem, projectPath, new[]
256 {
257 $"-p:Platform=x64",
258 });
259 result.AssertSuccess();
260
261 var platformSwitches = result.Output.Where(line => line.Contains("-platform x64"));
262 Assert.Single(platformSwitches);
263
264 var paths = Directory.EnumerateFiles(binFolder, @"*.*", SearchOption.AllDirectories)
265 .Select(s => s.Substring(baseFolder.Length + 1))
266 .OrderBy(s => s)
267 .ToArray();
268 WixAssert.CompareLineByLine(new[]
269 {
270 @"bin\x64\Release\en-US\cab1.cab",
271 @"bin\x64\Release\en-US\MsiPackage.msi",
272 @"bin\x64\Release\en-US\MsiPackage.wixpdb",
273 }, paths);
274 }
275 }
276
277 [Theory]
278 [InlineData(BuildSystem.DotNetCoreSdk)]
279 [InlineData(BuildSystem.MSBuild)]
280 [InlineData(BuildSystem.MSBuild64)]
281 public void CanBuildSimpleMsiPackageWithIceSuppressions(BuildSystem buildSystem)
282 {
283 var sourceFolder = TestData.Get(@"TestData\SimpleMsiPackage\MsiPackage");
284
285 using (var fs = new TestDataFolderFileSystem())
286 {
287 fs.Initialize(sourceFolder);
288 var baseFolder = fs.BaseFolder;
289 var binFolder = Path.Combine(baseFolder, @"bin\");
290 var projectPath = Path.Combine(baseFolder, "MsiPackage.wixproj");
291
292 var result = MsbuildUtilities.BuildProject(buildSystem, projectPath, new[]
293 {
294 MsbuildUtilities.GetQuotedPropertySwitch(buildSystem, "SuppressIces", "ICE45;ICE46"),
295 });
296 result.AssertSuccess();
297 }
298 }
299
300 [Theory]
301 [InlineData(BuildSystem.DotNetCoreSdk)]
302 [InlineData(BuildSystem.MSBuild)]
303 [InlineData(BuildSystem.MSBuild64)]
304 public void CanBuildSimpleMsiPackageWithWarningSuppressions(BuildSystem buildSystem)
305 {
306 var sourceFolder = TestData.Get(@"TestData\SimpleMsiPackage\MsiPackage");
307
308 using (var fs = new TestDataFolderFileSystem())
309 {
310 fs.Initialize(sourceFolder);
311 var baseFolder = fs.BaseFolder;
312 var binFolder = Path.Combine(baseFolder, @"bin\");
313 var projectPath = Path.Combine(baseFolder, "MsiPackage.wixproj");
314
315 var result = MsbuildUtilities.BuildProject(buildSystem, projectPath, new[]
316 {
317 MsbuildUtilities.GetQuotedPropertySwitch(buildSystem, "SuppressSpecificWarnings", "1118;1102"),
318 });
319 result.AssertSuccess();
320
321 var warnings = result.Output.Where(line => line.Contains(": warning"));
322 Assert.Empty(warnings);
323 }
324 }
325
326 [Theory]
327 [InlineData(BuildSystem.DotNetCoreSdk, null)]
328 [InlineData(BuildSystem.DotNetCoreSdk, true)]
329 [InlineData(BuildSystem.MSBuild, null)]
330 [InlineData(BuildSystem.MSBuild, true)]
331 [InlineData(BuildSystem.MSBuild64, null)]
332 [InlineData(BuildSystem.MSBuild64, true)]
333 public void CanBuildSimpleMsiPackageAsWixipl(BuildSystem buildSystem, bool? outOfProc)
334 {
335 var sourceFolder = TestData.Get(@"TestData\SimpleMsiPackage\MsiPackage");
336
337 using (var fs = new TestDataFolderFileSystem())
338 {
339 fs.Initialize(sourceFolder);
340 var baseFolder = fs.BaseFolder;
341 var binFolder = Path.Combine(baseFolder, @"bin\");
342 var projectPath = Path.Combine(baseFolder, "MsiPackage.wixproj");
343
344 var result = MsbuildUtilities.BuildProject(buildSystem, projectPath, new[]
345 {
346 "-p:OutputType=IntermediatePostLink",
347 }, outOfProc: outOfProc);
348 result.AssertSuccess();
349
350 var wixBuildCommands = MsbuildUtilities.GetToolCommandLines(result, "wix", "build", buildSystem, outOfProc);
351 Assert.Single(wixBuildCommands);
352
353 var path = Directory.EnumerateFiles(binFolder, @"*.*", SearchOption.AllDirectories)
354 .Select(s => s.Substring(baseFolder.Length + 1))
355 .Single();
356 Assert.Equal(@"bin\x86\Release\MsiPackage.wixipl", path);
357 }
358 }
359
360 [Theory]
361 [InlineData(BuildSystem.DotNetCoreSdk)]
362 [InlineData(BuildSystem.MSBuild)]
363 [InlineData(BuildSystem.MSBuild64)]
364 public void CanBuildAndCleanSimpleMsiPackage(BuildSystem buildSystem)
365 {
366 var sourceFolder = TestData.Get(@"TestData\SimpleMsiPackage\MsiPackage");
367
368 using (var fs = new TestDataFolderFileSystem())
369 {
370 fs.Initialize(sourceFolder);
371 var baseFolder = fs.BaseFolder;
372 var projectPath = Path.Combine(baseFolder, "MsiPackage.wixproj");
373
374 // Build
375 var result = MsbuildUtilities.BuildProject(buildSystem, projectPath, verbosityLevel: "diag");
376 result.AssertSuccess();
377
378 var buildOutput = String.Join("\r\n", result.Output);
379
380 var createdPaths = Directory.EnumerateFiles(baseFolder, @"*.*", SearchOption.AllDirectories)
381 .Select(s => s.Substring(baseFolder.Length + 1))
382 .OrderBy(s => s)
383 .ToArray();
384 Assert.NotEmpty(createdPaths);
385
386 // Clean
387 result = MsbuildUtilities.BuildProject(buildSystem, projectPath, new[]
388 {
389 "-t:Clean",
390 }, verbosityLevel: "diag");
391 result.AssertSuccess();
392
393 var cleanOutput = String.Join("\r\n", result.Output);
394
395 // Clean is only expected to delete the files listed in {Project}.FileListAbsolute.txt,
396 // so this is not quite right but close enough.
397 var allowedFiles = new HashSet<string>
398 {
399 "MsiPackage.wixproj",
400 "Package.en-us.wxl",
401 "Package.wxs",
402 "PackageComponents.wxs",
403 @"data\test.txt",
404 @"obj\x86\Release\MsiPackage.wixproj.FileListAbsolute.txt",
405 };
406
407 var remainingPaths = Directory.EnumerateFiles(baseFolder, @"*.*", SearchOption.AllDirectories)
408 .Select(s => s.Substring(baseFolder.Length + 1))
409 .Where(s => !allowedFiles.Contains(s))
410 .OrderBy(s => s)
411 .ToArray();
412 Assert.Empty(remainingPaths);
413 }
414 }
415
416 [Theory]
417 [InlineData(BuildSystem.DotNetCoreSdk)]
418 [InlineData(BuildSystem.MSBuild)]
419 [InlineData(BuildSystem.MSBuild64)]
420 public void ReportsInnerExceptionForUnexpectedExceptions(BuildSystem buildSystem)
421 {
422 var sourceFolder = TestData.Get(@"TestData\SimpleMsiPackage\MsiPackage");
423
424 using (var fs = new TestDataFolderFileSystem())
425 {
426 fs.Initialize(sourceFolder);
427 var baseFolder = fs.BaseFolder;
428 var binFolder = Path.Combine(baseFolder, @"bin\");
429 var projectPath = Path.Combine(baseFolder, "MsiPackage.wixproj");
430
431 var result = MsbuildUtilities.BuildProject(buildSystem, projectPath, new[]
432 {
433 MsbuildUtilities.GetQuotedPropertySwitch(buildSystem, "WixToolDir", Path.Combine(MsbuildUtilities.WixMsbuildPath, "broken", "net461")),
434 }, outOfProc: true);
435 Assert.Equal(1, result.ExitCode);
436
437 var expectedMessage = "System.PlatformNotSupportedException: Could not find platform specific 'wixnative.exe' ---> System.IO.FileNotFoundException: Could not find internal piece of WiX Toolset from";
438 Assert.Contains(result.Output, m => m.Contains(expectedMessage));
439 }
440 }
441 }
442}