aboutsummaryrefslogtreecommitdiff
path: root/src/test/WixToolsetTest.CoreIntegration/BundleFixture.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/WixToolsetTest.CoreIntegration/BundleFixture.cs')
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/BundleFixture.cs478
1 files changed, 0 insertions, 478 deletions
diff --git a/src/test/WixToolsetTest.CoreIntegration/BundleFixture.cs b/src/test/WixToolsetTest.CoreIntegration/BundleFixture.cs
deleted file mode 100644
index ab644080..00000000
--- a/src/test/WixToolsetTest.CoreIntegration/BundleFixture.cs
+++ /dev/null
@@ -1,478 +0,0 @@
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.CoreIntegration
4{
5 using System;
6 using System.Collections.Generic;
7 using System.IO;
8 using System.Linq;
9 using System.Text;
10 using System.Xml;
11 using Example.Extension;
12 using WixBuildTools.TestSupport;
13 using WixToolset.Core;
14 using WixToolset.Core.Burn;
15 using WixToolset.Core.TestPackage;
16 using WixToolset.Data;
17 using WixToolset.Data.Burn;
18 using WixToolset.Data.Symbols;
19 using WixToolset.Dtf.Resources;
20 using Xunit;
21
22 public class BundleFixture
23 {
24 [Fact]
25 public void CanBuildMultiFileBundle()
26 {
27 var folder = TestData.Get(@"TestData\SimpleBundle");
28
29 using (var fs = new DisposableFileSystem())
30 {
31 var baseFolder = fs.GetFolder();
32 var intermediateFolder = Path.Combine(baseFolder, "obj");
33
34 var result = WixRunner.Execute(new[]
35 {
36 "build",
37 Path.Combine(folder, "MultiFileBootstrapperApplication.wxs"),
38 Path.Combine(folder, "MultiFileBundle.wxs"),
39 "-loc", Path.Combine(folder, "Bundle.en-us.wxl"),
40 "-bindpath", Path.Combine(folder, "data"),
41 "-intermediateFolder", intermediateFolder,
42 "-o", Path.Combine(baseFolder, @"bin\test.exe")
43 });
44
45 result.AssertSuccess();
46
47 Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.exe")));
48 Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.wixpdb")));
49 }
50 }
51
52 [Fact]
53 public void CanBuildSimpleBundle()
54 {
55 var folder = TestData.Get(@"TestData\SimpleBundle");
56
57 using (var fs = new DisposableFileSystem())
58 {
59 var baseFolder = fs.GetFolder();
60 var intermediateFolder = Path.Combine(baseFolder, "obj");
61 var exePath = Path.Combine(baseFolder, @"bin\test.exe");
62 var pdbPath = Path.Combine(baseFolder, @"bin\test.wixpdb");
63 var baFolderPath = Path.Combine(baseFolder, "ba");
64 var extractFolderPath = Path.Combine(baseFolder, "extract");
65
66 var result = WixRunner.Execute(new[]
67 {
68 "build",
69 Path.Combine(folder, "Bundle.wxs"),
70 "-loc", Path.Combine(folder, "Bundle.en-us.wxl"),
71 "-bindpath", Path.Combine(folder, "data"),
72 "-intermediateFolder", intermediateFolder,
73 "-o", exePath,
74 });
75
76 result.AssertSuccess();
77 Assert.Empty(result.Messages.Where(m => m.Level == MessageLevel.Warning));
78
79 Assert.True(File.Exists(exePath));
80 Assert.True(File.Exists(pdbPath));
81
82 using (var wixOutput = WixOutput.Read(pdbPath))
83 {
84
85 var intermediate = Intermediate.Load(wixOutput);
86 var section = intermediate.Sections.Single();
87
88 var bundleSymbol = section.Symbols.OfType<WixBundleSymbol>().Single();
89 Assert.Equal("1.0.0.0", bundleSymbol.Version);
90
91 var previousVersion = bundleSymbol.Fields[(int)WixBundleSymbolFields.Version].PreviousValue;
92 Assert.Equal("!(bind.packageVersion.test.msi)", previousVersion.AsString());
93
94 var msiSymbol = section.Symbols.OfType<WixBundlePackageSymbol>().Single();
95 Assert.Equal("test.msi", msiSymbol.Id.Id);
96
97 var extractResult = BundleExtractor.ExtractBAContainer(null, exePath, baFolderPath, extractFolderPath);
98 extractResult.AssertSuccess();
99
100 var burnManifestData = wixOutput.GetData(BurnConstants.BurnManifestWixOutputStreamName);
101 var extractedBurnManifestData = File.ReadAllText(Path.Combine(baFolderPath, "manifest.xml"), Encoding.UTF8);
102 Assert.Equal(extractedBurnManifestData, burnManifestData);
103
104 var baManifestData = wixOutput.GetData(BurnConstants.BootstrapperApplicationDataWixOutputStreamName);
105 var extractedBaManifestData = File.ReadAllText(Path.Combine(baFolderPath, "BootstrapperApplicationData.xml"), Encoding.UTF8);
106 Assert.Equal(extractedBaManifestData, baManifestData);
107
108 var bextManifestData = wixOutput.GetData(BurnConstants.BundleExtensionDataWixOutputStreamName);
109 var extractedBextManifestData = File.ReadAllText(Path.Combine(baFolderPath, "BundleExtensionData.xml"), Encoding.UTF8);
110 Assert.Equal(extractedBextManifestData, bextManifestData);
111
112 var logElements = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Log");
113 var logElement = (XmlNode)Assert.Single(logElements);
114 Assert.Equal("<Log PathVariable='WixBundleLog' Prefix='~TestBundle' Extension='log' />", logElement.GetTestXml());
115
116 var registrationElements = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Registration");
117 var registrationElement = (XmlNode)Assert.Single(registrationElements);
118 Assert.Equal($"<Registration Id='{bundleSymbol.BundleId}' ExecutableName='test.exe' PerMachine='yes' Tag='' Version='1.0.0.0' ProviderKey='{bundleSymbol.BundleId}'>" +
119 "<Arp Register='yes' DisplayName='~TestBundle' DisplayVersion='1.0.0.0' Publisher='Example Corporation' />" +
120 "</Registration>", registrationElement.GetTestXml());
121
122 var msiPayloads = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Payload[@Id='test.msi']");
123 var msiPayload = (XmlNode)Assert.Single(msiPayloads);
124 Assert.Equal("<Payload Id='test.msi' FilePath='test.msi' FileSize='*' Hash='*' Packaging='embedded' SourcePath='a0' Container='WixAttachedContainer' />",
125 msiPayload.GetTestXml(new Dictionary<string, List<string>>() { { "Payload", new List<string> { "FileSize", "Hash" } } }));
126 }
127
128 var manifestResource = new Resource(ResourceType.Manifest, "#1", 1033);
129 manifestResource.Load(exePath);
130 var actualManifestData = Encoding.UTF8.GetString(manifestResource.Data);
131 Assert.Equal("<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
132 "<assembly manifestVersion=\"1.0\" xmlns=\"urn:schemas-microsoft-com:asm.v1\">" +
133 "<assemblyIdentity name=\"test.exe\" version=\"1.0.0.0\" processorArchitecture=\"x86\" type=\"win32\" />" +
134 "<description>~TestBundle</description>" +
135 "<dependency><dependentAssembly><assemblyIdentity name=\"Microsoft.Windows.Common-Controls\" version=\"6.0.0.0\" processorArchitecture=\"x86\" publicKeyToken=\"6595b64144ccf1df\" language=\"*\" type=\"win32\" /></dependentAssembly></dependency>" +
136 "<compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\"><application><supportedOS Id=\"{e2011457-1546-43c5-a5fe-008deee3d3f0}\" /><supportedOS Id=\"{35138b9a-5d96-4fbd-8e2d-a2440225f93a}\" /><supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\" /><supportedOS Id=\"{1f676c76-80e1-4239-95bb-83d0f6d0da78}\" /><supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\" /></application></compatibility>" +
137 "<trustInfo xmlns=\"urn:schemas-microsoft-com:asm.v3\"><security><requestedPrivileges><requestedExecutionLevel level=\"asInvoker\" uiAccess=\"false\" /></requestedPrivileges></security></trustInfo>" +
138 "<application xmlns=\"urn:schemas-microsoft-com:asm.v3\"><windowsSettings><dpiAware xmlns=\"http://schemas.microsoft.com/SMI/2005/WindowsSettings\">true/pm</dpiAware><dpiAwareness xmlns=\"http://schemas.microsoft.com/SMI/2016/WindowsSettings\">PerMonitorV2, PerMonitor</dpiAwareness></windowsSettings></application>" +
139 "</assembly>", actualManifestData);
140 }
141 }
142
143 [Fact]
144 public void CanBuildX64Bundle()
145 {
146 var folder = TestData.Get(@"TestData\SimpleBundle");
147
148 using (var fs = new DisposableFileSystem())
149 {
150 var baseFolder = fs.GetFolder();
151 var intermediateFolder = Path.Combine(baseFolder, "obj");
152 var exePath = Path.Combine(baseFolder, @"bin\test.exe");
153 var pdbPath = Path.Combine(baseFolder, @"bin\test.wixpdb");
154 var baFolderPath = Path.Combine(baseFolder, "ba");
155 var extractFolderPath = Path.Combine(baseFolder, "extract");
156
157 var result = WixRunner.Execute(false, new[] // TODO: go back to elevating warnings as errors.
158 {
159 "build",
160 "-arch", "x64",
161 Path.Combine(folder, "Bundle.wxs"),
162 "-loc", Path.Combine(folder, "Bundle.en-us.wxl"),
163 "-bindpath", Path.Combine(folder, "data"),
164 "-intermediateFolder", intermediateFolder,
165 "-o", exePath,
166 });
167
168 result.AssertSuccess();
169 var warning = Assert.Single(result.Messages.Where(m => m.Level == MessageLevel.Warning));
170 Assert.Equal((int)WarningMessages.Ids.ExperimentalBundlePlatform, warning.Id);
171
172 Assert.True(File.Exists(exePath));
173 Assert.True(File.Exists(pdbPath));
174
175 var manifestResource = new Resource(ResourceType.Manifest, "#1", 1033);
176 manifestResource.Load(exePath);
177 var actualManifestData = Encoding.UTF8.GetString(manifestResource.Data);
178 Assert.Equal("<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
179 "<assembly manifestVersion=\"1.0\" xmlns=\"urn:schemas-microsoft-com:asm.v1\">" +
180 "<assemblyIdentity name=\"test.exe\" version=\"1.0.0.0\" processorArchitecture=\"amd64\" type=\"win32\" />" +
181 "<description>~TestBundle</description>" +
182 "<dependency><dependentAssembly><assemblyIdentity name=\"Microsoft.Windows.Common-Controls\" version=\"6.0.0.0\" processorArchitecture=\"amd64\" publicKeyToken=\"6595b64144ccf1df\" language=\"*\" type=\"win32\" /></dependentAssembly></dependency>" +
183 "<compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\"><application><supportedOS Id=\"{e2011457-1546-43c5-a5fe-008deee3d3f0}\" /><supportedOS Id=\"{35138b9a-5d96-4fbd-8e2d-a2440225f93a}\" /><supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\" /><supportedOS Id=\"{1f676c76-80e1-4239-95bb-83d0f6d0da78}\" /><supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\" /></application></compatibility>" +
184 "<trustInfo xmlns=\"urn:schemas-microsoft-com:asm.v3\"><security><requestedPrivileges><requestedExecutionLevel level=\"asInvoker\" uiAccess=\"false\" /></requestedPrivileges></security></trustInfo>" +
185 "<application xmlns=\"urn:schemas-microsoft-com:asm.v3\"><windowsSettings><dpiAware xmlns=\"http://schemas.microsoft.com/SMI/2005/WindowsSettings\">true/pm</dpiAware><dpiAwareness xmlns=\"http://schemas.microsoft.com/SMI/2016/WindowsSettings\">PerMonitorV2, PerMonitor</dpiAwareness></windowsSettings></application>" +
186 "</assembly>", actualManifestData);
187 }
188 }
189
190 [Fact]
191 public void CanBuildSimpleBundleUsingExtensionBA()
192 {
193 var extensionPath = Path.GetFullPath(new Uri(typeof(ExampleExtensionFactory).Assembly.CodeBase).LocalPath);
194 var folder = TestData.Get(@"TestData\SimpleBundle");
195
196 using (var fs = new DisposableFileSystem())
197 {
198 var baseFolder = fs.GetFolder();
199 var intermediateFolder = Path.Combine(baseFolder, "obj");
200
201 var result = WixRunner.Execute(new[]
202 {
203 "build",
204 Path.Combine(folder, "MultiFileBundle.wxs"),
205 "-loc", Path.Combine(folder, "Bundle.en-us.wxl"),
206 "-ext", extensionPath,
207 "-bindpath", Path.Combine(folder, "data"),
208 "-intermediateFolder", intermediateFolder,
209 "-o", Path.Combine(baseFolder, @"bin\test.exe")
210 });
211
212 result.AssertSuccess();
213
214 Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.exe")));
215 Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.wixpdb")));
216 }
217 }
218
219 [Fact]
220 public void CanBuildSingleExeBundle()
221 {
222 var folder = TestData.Get(@"TestData");
223
224 using (var fs = new DisposableFileSystem())
225 {
226 var baseFolder = fs.GetFolder();
227 var intermediateFolder = Path.Combine(baseFolder, "obj");
228 var exePath = Path.Combine(baseFolder, @"bin\test.exe");
229
230 var result = WixRunner.Execute(new[]
231 {
232 "build",
233 Path.Combine(folder, "SingleExeBundle", "SingleExePackageGroup.wxs"),
234 Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
235 "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
236 "-bindpath", Path.Combine(folder, ".Data"),
237 "-intermediateFolder", intermediateFolder,
238 "-o", exePath,
239 });
240
241 result.AssertSuccess();
242
243 Assert.True(File.Exists(exePath));
244 }
245 }
246
247 [Fact]
248 public void CanBuildSingleExeRemotePayloadBundle()
249 {
250 var folder = TestData.Get(@"TestData");
251
252 using (var fs = new DisposableFileSystem())
253 {
254 var baseFolder = fs.GetFolder();
255 var intermediateFolder = Path.Combine(baseFolder, "obj");
256 var exePath = Path.Combine(baseFolder, @"bin\test.exe");
257 var pdbPath = Path.Combine(baseFolder, @"bin\test.wixpdb");
258
259 var result = WixRunner.Execute(new[]
260 {
261 "build",
262 Path.Combine(folder, "SingleExeBundle", "SingleExeRemotePayload.wxs"),
263 Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
264 "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
265 "-intermediateFolder", intermediateFolder,
266 "-o", exePath,
267 });
268
269 result.AssertSuccess();
270
271 Assert.True(File.Exists(exePath));
272 Assert.True(File.Exists(pdbPath));
273
274 using (var wixOutput = WixOutput.Read(pdbPath))
275 {
276 var intermediate = Intermediate.Load(wixOutput);
277 var section = intermediate.Sections.Single();
278
279 var payloadSymbol = section.Symbols.OfType<WixBundlePayloadSymbol>().Where(x => x.Id.Id == "NetFx462Web").Single();
280 Assert.Equal(Int64.MaxValue, payloadSymbol.FileSize);
281 }
282 }
283 }
284
285 [Fact]
286 public void CantBuildWithDuplicateCacheIds()
287 {
288 var folder = TestData.Get(@"TestData");
289
290 using (var fs = new DisposableFileSystem())
291 {
292 var baseFolder = fs.GetFolder();
293 var intermediateFolder = Path.Combine(baseFolder, "obj");
294 var exePath = Path.Combine(baseFolder, @"bin\test.exe");
295
296 var result = WixRunner.Execute(new[]
297 {
298 "build",
299 Path.Combine(folder, "BadInput", "DuplicateCacheIds.wxs"),
300 Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
301 "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
302 "-bindpath", Path.Combine(folder, ".Data"),
303 "-intermediateFolder", intermediateFolder,
304 "-o", exePath,
305 });
306
307 Assert.Equal(8001, result.ExitCode);
308 }
309 }
310
311 [Fact]
312 public void CantBuildWithDuplicatePayloadNames()
313 {
314 var folder = TestData.Get(@"TestData");
315
316 using (var fs = new DisposableFileSystem())
317 {
318 var baseFolder = fs.GetFolder();
319 var intermediateFolder = Path.Combine(baseFolder, "obj");
320 var exePath = Path.Combine(baseFolder, @"bin\test.exe");
321
322 var result = WixRunner.Execute(new[]
323 {
324 "build",
325 Path.Combine(folder, "BadInput", "DuplicatePayloadNames.wxs"),
326 Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
327 "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
328 "-bindpath", Path.Combine(folder, ".Data"),
329 "-intermediateFolder", intermediateFolder,
330 "-o", exePath,
331 });
332
333 var attachedContainerWarnings = result.Messages.Where(m => m.Id == (int)BurnBackendWarnings.Ids.AttachedContainerPayloadCollision)
334 .Select(m => m.ToString())
335 .ToArray();
336 WixAssert.CompareLineByLine(new string[]
337 {
338 "The Payload 'Auto2' has a duplicate Name 'burn.exe' in the attached container. When extracting the bundle with dark.exe, the file will get overwritten.",
339 }, attachedContainerWarnings);
340
341 var baContainerErrors = result.Messages.Where(m => m.Id == (int)BurnBackendErrors.Ids.BAContainerPayloadCollision)
342 .Select(m => m.ToString())
343 .ToArray();
344 WixAssert.CompareLineByLine(new string[]
345 {
346 "The Payload 'DuplicatePayloadNames.wxs' has a duplicate Name 'fakeba.dll' in the BA container. When extracting the container at runtime, the file will get overwritten.",
347 "The Payload 'uxTxMXPVMXwQrPTMIGa5WGt93w0Ns' has a duplicate Name 'BootstrapperApplicationData.xml' in the BA container. When extracting the container at runtime, the file will get overwritten.",
348 "The Payload 'uxYRbgitOs0K878jn5L_z7LdJ21KI' has a duplicate Name 'BundleExtensionData.xml' in the BA container. When extracting the container at runtime, the file will get overwritten.",
349 }, baContainerErrors);
350
351 var externalErrors = result.Messages.Where(m => m.Id == (int)BurnBackendErrors.Ids.ExternalPayloadCollision)
352 .Select(m => m.ToString())
353 .ToArray();
354 WixAssert.CompareLineByLine(new string[]
355 {
356 "The external Payload 'HiddenPersistedBundleVariable.wxs' has a duplicate Name 'PayloadCollision'. When building the bundle or laying out the bundle, the file will get overwritten.",
357 "The external Container 'MsiPackagesContainer' has a duplicate Name 'ContainerCollision'. When building the bundle or laying out the bundle, the file will get overwritten.",
358 }, externalErrors);
359
360 var packageCacheErrors = result.Messages.Where(m => m.Id == (int)BurnBackendErrors.Ids.PackageCachePayloadCollision)
361 .Select(m => m.ToString())
362 .ToArray();
363 WixAssert.CompareLineByLine(new string[]
364 {
365 "The Payload 'test.msi' has a duplicate Name 'test.msi' in package 'test.msi'. When caching the package, the file will get overwritten.",
366 }, packageCacheErrors);
367
368 Assert.Equal(14, result.Messages.Length);
369 }
370 }
371
372 [Fact]
373 public void CantBuildWithOrphanPayload()
374 {
375 var folder = TestData.Get(@"TestData");
376
377 using (var fs = new DisposableFileSystem())
378 {
379 var baseFolder = fs.GetFolder();
380 var intermediateFolder = Path.Combine(baseFolder, "obj");
381 var exePath = Path.Combine(baseFolder, @"bin\test.exe");
382
383 var result = WixRunner.Execute(new[]
384 {
385 "build",
386 Path.Combine(folder, "BadInput", "OrphanPayload.wxs"),
387 Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
388 Path.Combine(folder, "BundleWithPackageGroupRef", "MinimalPackageGroup.wxs"),
389 "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
390 "-bindpath", Path.Combine(folder, ".Data"),
391 "-intermediateFolder", intermediateFolder,
392 "-o", exePath,
393 });
394
395 Assert.Equal((int)LinkerErrors.Ids.OrphanedPayload, result.ExitCode);
396 }
397 }
398
399 [Fact]
400 public void CantBuildWithPackageInMultipleContainers()
401 {
402 var folder = TestData.Get(@"TestData");
403
404 using (var fs = new DisposableFileSystem())
405 {
406 var baseFolder = fs.GetFolder();
407 var intermediateFolder = Path.Combine(baseFolder, "obj");
408 var exePath = Path.Combine(baseFolder, @"bin\test.exe");
409
410 var result = WixRunner.Execute(new[]
411 {
412 "build",
413 Path.Combine(folder, "BadInput", "PackageInMultipleContainers.wxs"),
414 Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
415 Path.Combine(folder, "BundleWithPackageGroupRef", "MinimalPackageGroup.wxs"),
416 "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
417 "-bindpath", Path.Combine(folder, ".Data"),
418 "-intermediateFolder", intermediateFolder,
419 "-o", exePath,
420 });
421
422 Assert.Equal((int)LinkerErrors.Ids.PackageInMultipleContainers, result.ExitCode);
423 }
424 }
425
426 [Fact]
427 public void CantBuildWithUnscheduledPackage()
428 {
429 var folder = TestData.Get(@"TestData");
430
431 using (var fs = new DisposableFileSystem())
432 {
433 var baseFolder = fs.GetFolder();
434 var intermediateFolder = Path.Combine(baseFolder, "obj");
435 var exePath = Path.Combine(baseFolder, @"bin\test.exe");
436
437 var result = WixRunner.Execute(new[]
438 {
439 "build",
440 Path.Combine(folder, "BadInput", "UnscheduledPackage.wxs"),
441 Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
442 "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
443 "-bindpath", Path.Combine(folder, ".Data"),
444 "-intermediateFolder", intermediateFolder,
445 "-o", exePath,
446 });
447
448 Assert.Equal((int)LinkerErrors.Ids.UnscheduledChainPackage, result.ExitCode);
449 }
450 }
451
452 [Fact]
453 public void CantBuildWithUnscheduledRollbackBoundary()
454 {
455 var folder = TestData.Get(@"TestData");
456
457 using (var fs = new DisposableFileSystem())
458 {
459 var baseFolder = fs.GetFolder();
460 var intermediateFolder = Path.Combine(baseFolder, "obj");
461 var exePath = Path.Combine(baseFolder, @"bin\test.exe");
462
463 var result = WixRunner.Execute(new[]
464 {
465 "build",
466 Path.Combine(folder, "BadInput", "UnscheduledRollbackBoundary.wxs"),
467 Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
468 "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
469 "-bindpath", Path.Combine(folder, ".Data"),
470 "-intermediateFolder", intermediateFolder,
471 "-o", exePath,
472 });
473
474 Assert.Equal((int)LinkerErrors.Ids.UnscheduledRollbackBoundary, result.ExitCode);
475 }
476 }
477 }
478}