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