diff options
Diffstat (limited to 'src/wix/test/WixToolsetTest.Sdk/MsbuildFixture.cs')
-rw-r--r-- | src/wix/test/WixToolsetTest.Sdk/MsbuildFixture.cs | 442 |
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 | |||
3 | namespace 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 | } | ||