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