main
cs 600 lines 26 KB
Raw
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.CoreIntegration
4 {
5 using System.IO;
6 using System.Linq;
7 using WixInternal.Core.TestPackage;
8 using WixInternal.TestSupport;
9 using WixToolset.Data;
10 using WixToolset.Data.Symbols;
11 using WixToolset.Data.WindowsInstaller;
12 using Xunit;
13
14 public class MsiFixture
15 {
16 [Fact]
17 public void CanBuildSingleFile()
18 {
19 var folder = TestData.Get(@"TestData\SingleFile");
20
21 using (var fs = new DisposableFileSystem())
22 {
23 var baseFolder = fs.GetFolder();
24 var intermediateFolder = Path.Combine(baseFolder, "obj");
25
26 var result = WixRunner.Execute(new[]
27 {
28 "build",
29 Path.Combine(folder, "Package.wxs"),
30 Path.Combine(folder, "PackageComponents.wxs"),
31 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
32 "-bindpath", Path.Combine(folder, "data"),
33 "-intermediateFolder", intermediateFolder,
34 "-o", Path.Combine(baseFolder, @"bin\test.msi")
35 });
36
37 result.AssertSuccess();
38
39 Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.msi")));
40 Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.wixpdb")));
41 Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\PFiles\Example Corporation MsiPackage\test.txt")));
42
43 var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb"));
44
45 Assert.False(intermediate.HasLevel(WixToolset.Data.IntermediateLevels.Compiled));
46 Assert.True(intermediate.HasLevel(WixToolset.Data.IntermediateLevels.Linked));
47 Assert.True(intermediate.HasLevel(WixToolset.Data.IntermediateLevels.Resolved));
48 Assert.True(intermediate.HasLevel(WixToolset.Data.WindowsInstaller.IntermediateLevels.FullyBound));
49
50 var section = intermediate.Sections.Single();
51
52 var fileSymbol = section.Symbols.OfType<FileSymbol>().First();
53 WixAssert.StringEqual(Path.Combine(folder, @"data\test.txt"), fileSymbol[FileSymbolFields.Source].AsPath().Path);
54 WixAssert.StringEqual(@"test.txt", fileSymbol[FileSymbolFields.Source].PreviousValue.AsPath().Path);
55 }
56 }
57
58 [Fact]
59 public void CannotBuildMissingFile()
60 {
61 var folder = TestData.Get(@"TestData\SingleFile");
62
63 using (var fs = new DisposableFileSystem())
64 {
65 var baseFolder = fs.GetFolder();
66 var intermediateFolder = Path.Combine(baseFolder, "obj");
67 var binFolder = Path.Combine(baseFolder, "bin");
68
69 var result = WixRunner.Execute(new[]
70 {
71 "build",
72 Path.Combine(folder, "Package.wxs"),
73 Path.Combine(folder, "PackageComponents.wxs"),
74 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
75 "-bindpath", Path.Combine(folder, "does-not-exist"),
76 "-bindpath", Path.Combine(folder, "also-does-not-exist"),
77 "-intermediateFolder", intermediateFolder,
78 "-o", Path.Combine(binFolder, "test.msi")
79 }, out var messages);
80 Assert.Equal(103, result);
81
82 var errorMessages = messages.Select(m => m.ToString().Replace(folder, "<folder>")).ToArray();
83 WixAssert.CompareLineByLine(new[]
84 {
85 @"Cannot find the File file 'test.txt'. The following paths were checked: test.txt, <folder>\does-not-exist\test.txt, <folder>\also-does-not-exist\test.txt",
86 @"Cannot find the File file 'test.txt'. The following paths were checked: test.txt, <folder>\does-not-exist\test.txt, <folder>\also-does-not-exist\test.txt",
87 }, errorMessages);
88
89 var errorMessage = errorMessages.First();
90 var checkedPaths = errorMessage.Substring(errorMessage.IndexOf(':') + 1).Split(new[] { ',' }).Select(s => s.Trim()).ToArray();
91 WixAssert.CompareLineByLine(new[]
92 {
93 "test.txt",
94 Path.Combine("<folder>", "does-not-exist", "test.txt"),
95 Path.Combine("<folder>", "also-does-not-exist", "test.txt"),
96 }, checkedPaths);
97 }
98 }
99
100 [Fact]
101 public void CanBuildWithErrorTable()
102 {
103 var folder = TestData.Get(@"TestData\ErrorsInUI");
104
105 using (var fs = new DisposableFileSystem())
106 {
107 var baseFolder = fs.GetFolder();
108 var intermediateFolder = Path.Combine(baseFolder, "obj");
109
110 var result = WixRunner.Execute(new[]
111 {
112 "build",
113 Path.Combine(folder, "Package.wxs"),
114 Path.Combine(folder, "PackageComponents.wxs"),
115 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
116 "-bindpath", Path.Combine(folder, "data"),
117 "-intermediateFolder", intermediateFolder,
118 "-o", Path.Combine(baseFolder, @"bin\test.msi")
119 });
120
121 result.AssertSuccess();
122
123 Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.msi")));
124 Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.wixpdb")));
125 Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\PFiles\MsiPackage\test.txt")));
126
127 var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb"));
128 var section = intermediate.Sections.Single();
129
130 var errors = section.Symbols.OfType<ErrorSymbol>().ToDictionary(t => t.Id.Id);
131 WixAssert.StringEqual("Category 55 Emergency Doomsday Crisis", errors["1234"].Message.Trim());
132 WixAssert.StringEqual(" ", errors["5678"].Message);
133
134 var customAction1 = section.Symbols.OfType<CustomActionSymbol>().Where(t => t.Id.Id == "CanWeReferenceAnError_YesWeCan").Single();
135 WixAssert.StringEqual("1234", customAction1.Target);
136
137 var customAction2 = section.Symbols.OfType<CustomActionSymbol>().Where(t => t.Id.Id == "TextErrorsWorkOKToo").Single();
138 WixAssert.StringEqual("If you see this, something went wrong.", customAction2.Target);
139 }
140 }
141
142 [Fact]
143 public void CanLoadPdbGeneratedByBuild()
144 {
145 var folder = TestData.Get(@"TestData\MultiFileCompressed");
146
147 using (var fs = new DisposableFileSystem())
148 {
149 var intermediateFolder = fs.GetFolder();
150
151 var result = WixRunner.Execute(new[]
152 {
153 "build",
154 Path.Combine(folder, "Package.wxs"),
155 Path.Combine(folder, "PackageComponents.wxs"),
156 "-d", "MediaTemplateCompressionLevel",
157 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
158 "-bindpath", Path.Combine(folder, "data"),
159 "-intermediateFolder", intermediateFolder,
160 "-o", Path.Combine(intermediateFolder, @"bin\test.msi")
161 });
162
163 result.AssertSuccess();
164
165 Assert.True(File.Exists(Path.Combine(intermediateFolder, @"bin\test.msi")));
166 Assert.True(File.Exists(Path.Combine(intermediateFolder, @"bin\cab1.cab")));
167
168 var pdbPath = Path.Combine(intermediateFolder, @"bin\test.wixpdb");
169 Assert.True(File.Exists(pdbPath));
170
171 var output = WindowsInstallerData.Load(pdbPath, suppressVersionCheck: true);
172 Assert.NotNull(output);
173 }
174 }
175
176 [Fact]
177 public void CanLoadPdbGeneratedByBuildViaWixOutput()
178 {
179 var folder = TestData.Get(@"TestData\MultiFileCompressed");
180
181 using (var fs = new DisposableFileSystem())
182 {
183 var intermediateFolder = fs.GetFolder();
184
185 var result = WixRunner.Execute(new[]
186 {
187 "build",
188 Path.Combine(folder, "Package.wxs"),
189 Path.Combine(folder, "PackageComponents.wxs"),
190 "-d", "MediaTemplateCompressionLevel",
191 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
192 "-bindpath", Path.Combine(folder, "data"),
193 "-intermediateFolder", intermediateFolder,
194 "-o", Path.Combine(intermediateFolder, @"bin\test.msi")
195 });
196
197 result.AssertSuccess();
198
199 Assert.True(File.Exists(Path.Combine(intermediateFolder, @"bin\test.msi")));
200 Assert.True(File.Exists(Path.Combine(intermediateFolder, @"bin\cab1.cab")));
201
202 var pdbPath = Path.Combine(intermediateFolder, @"bin\test.wixpdb");
203 Assert.True(File.Exists(pdbPath));
204
205 var wixOutput = WixOutput.Read(pdbPath);
206 var output = WindowsInstallerData.Load(wixOutput, suppressVersionCheck: true);
207 Assert.NotNull(output);
208 }
209 }
210
211 [Fact]
212 public void CanBuildManualUpgrade()
213 {
214 var folder = TestData.Get(@"TestData\ManualUpgrade");
215
216 using (var fs = new DisposableFileSystem())
217 {
218 var intermediateFolder = fs.GetFolder();
219
220 var result = WixRunner.Execute(new[]
221 {
222 "build",
223 Path.Combine(folder, "Package.wxs"),
224 Path.Combine(folder, "PackageComponents.wxs"),
225 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
226 "-bindpath", Path.Combine(folder, "data"),
227 "-intermediateFolder", intermediateFolder,
228 "-o", Path.Combine(intermediateFolder, @"bin\test.msi")
229 }, out var messages);
230
231 Assert.Equal(0, result);
232
233 var pdbPath = Path.Combine(intermediateFolder, @"bin\test.wixpdb");
234 Assert.True(File.Exists(Path.Combine(intermediateFolder, @"bin\test.msi")));
235 Assert.True(File.Exists(pdbPath));
236 Assert.True(File.Exists(Path.Combine(intermediateFolder, @"bin\PFiles\MsiPackage\test.txt")));
237
238 var intermediate = Intermediate.Load(pdbPath);
239 var section = intermediate.Sections.Single();
240
241 var upgradeSymbol = section.Symbols.OfType<UpgradeSymbol>().Single();
242 Assert.False(upgradeSymbol.ExcludeLanguages);
243 Assert.True(upgradeSymbol.IgnoreRemoveFailures);
244 Assert.False(upgradeSymbol.VersionMaxInclusive);
245 Assert.True(upgradeSymbol.VersionMinInclusive);
246 Assert.Equal("13.0.0", upgradeSymbol.VersionMax);
247 Assert.Equal("12.0.0", upgradeSymbol.VersionMin);
248 Assert.False(upgradeSymbol.OnlyDetect);
249 Assert.Equal("BLAHBLAHBLAH", upgradeSymbol.ActionProperty);
250
251 var pdb = WindowsInstallerData.Load(pdbPath, suppressVersionCheck: false);
252 var secureProperties = pdb.Tables["Property"].Rows.Where(row => row.GetKey() == "SecureCustomProperties").Single();
253 Assert.Contains("BLAHBLAHBLAH", secureProperties.FieldAsString(1));
254 }
255 }
256
257 [Fact]
258 public void CanBuildWixipl()
259 {
260 var folder = TestData.Get(@"TestData\SingleFile");
261
262 using (var fs = new DisposableFileSystem())
263 {
264 var baseFolder = fs.GetFolder();
265 var intermediateFolder = Path.Combine(baseFolder, "obj");
266
267 var result = WixRunner.Execute(new[]
268 {
269 "build",
270 Path.Combine(folder, "Package.wxs"),
271 Path.Combine(folder, "PackageComponents.wxs"),
272 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
273 "-bindpath", Path.Combine(folder, "data"),
274 "-intermediateFolder", intermediateFolder,
275 "-o", Path.Combine(baseFolder, @"bin\test.wixipl")
276 }, out var messages);
277
278 Assert.Equal(0, result);
279
280 var builtFiles = Directory.GetFiles(Path.Combine(baseFolder, @"bin"));
281
282 WixAssert.CompareLineByLine(new[]{
283 "test.wixipl"
284 }, builtFiles.Select(Path.GetFileName).ToArray());
285 }
286 }
287
288 [Fact]
289 public void CanBuildWixlib()
290 {
291 var folder = TestData.Get(@"TestData\SingleFile");
292
293 using (var fs = new DisposableFileSystem())
294 {
295 var baseFolder = fs.GetFolder();
296 var intermediateFolder = Path.Combine(baseFolder, "obj");
297
298 var result = WixRunner.Execute(new[]
299 {
300 "build",
301 Path.Combine(folder, "Package.wxs"),
302 Path.Combine(folder, "PackageComponents.wxs"),
303 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
304 "-bindpath", Path.Combine(folder, "data"),
305 "-intermediateFolder", intermediateFolder,
306 "-o", Path.Combine(baseFolder, @"bin\test.wixlib")
307 }, out var messages);
308
309 Assert.Equal(0, result);
310
311 var builtFiles = Directory.GetFiles(Path.Combine(baseFolder, @"bin"));
312
313 WixAssert.CompareLineByLine(new[]{
314 "test.wixlib"
315 }, builtFiles.Select(Path.GetFileName).ToArray());
316 }
317 }
318
319 [Fact]
320 public void CanBuildBinaryWixlib()
321 {
322 var folder = TestData.Get(@"TestData\SingleFile");
323
324 using (var fs = new DisposableFileSystem())
325 {
326 var baseFolder = fs.GetFolder();
327 var intermediateFolder = Path.Combine(baseFolder, "obj");
328
329 var result = WixRunner.Execute(
330 "build",
331 Path.Combine(folder, "Package.wxs"),
332 Path.Combine(folder, "PackageComponents.wxs"),
333 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
334 "-bindpath", Path.Combine(folder, "data"),
335 "-intermediateFolder", intermediateFolder,
336 "-bindfiles",
337 "-o", Path.Combine(baseFolder, @"bin\test.wixlib"));
338
339 result.AssertSuccess();
340
341 using (var wixout = WixOutput.Read(Path.Combine(baseFolder, @"bin\test.wixlib")))
342 {
343 Assert.NotNull(wixout.GetDataStream("wix-ir.json"));
344
345 var text = wixout.GetData("wix-ir/test.txt");
346 WixAssert.StringEqual("This is test.txt.", text);
347 }
348 }
349 }
350
351 [Fact]
352 public void CanBuildBinaryWixlibWithCollidingFilenames()
353 {
354 var folder = TestData.Get(@"TestData\SameFileFolders");
355
356 using (var fs = new DisposableFileSystem())
357 {
358 var baseFolder = fs.GetFolder();
359 var intermediateFolder = Path.Combine(baseFolder, "obj");
360
361 var result = WixRunner.Execute(
362 "build",
363 Path.Combine(folder, "TestComponents.wxs"),
364 "-bindpath", Path.Combine(folder, "data"),
365 "-intermediateFolder", intermediateFolder,
366 "-bindfiles",
367 "-o", Path.Combine(baseFolder, @"bin\test.wixlib"));
368
369 result.AssertSuccess();
370
371 using (var wixout = WixOutput.Read(Path.Combine(baseFolder, @"bin\test.wixlib")))
372 {
373 Assert.NotNull(wixout.GetDataStream("wix-ir.json"));
374
375 var text = wixout.GetData("wix-ir/test.txt");
376 WixAssert.StringEqual(@"This is a\test.txt.", text);
377
378 var text2 = wixout.GetData("wix-ir/test.txt-1");
379 WixAssert.StringEqual(@"This is b\test.txt.", text2);
380
381 var text3 = wixout.GetData("wix-ir/test.txt-2");
382 WixAssert.StringEqual(@"This is c\test.txt.", text3);
383 }
384 }
385 }
386
387 [Fact]
388 public void CanBuildWithIncludePath()
389 {
390 var folder = TestData.Get(@"TestData\IncludePath");
391 var bindpath = Path.Combine(folder, "data");
392
393 using (var fs = new DisposableFileSystem())
394 {
395 var baseFolder = fs.GetFolder();
396 var intermediateFolder = Path.Combine(baseFolder, "obj");
397
398 var result = WixRunner.Execute(
399 "build",
400 Path.Combine(folder, "Package.wxs"),
401 Path.Combine(folder, "PackageComponents.wxs"),
402 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
403 "-bindpath", bindpath,
404 "-intermediateFolder", intermediateFolder,
405 "-o", Path.Combine(baseFolder, @"bin\test.msi"),
406 "-i", bindpath);
407
408 result.AssertSuccess();
409
410 Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.msi")));
411 Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.wixpdb")));
412 Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\PFiles\MsiPackage\test.txt")));
413
414 var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb"));
415 var section = intermediate.Sections.Single();
416
417 var fileSymbol = section.Symbols.OfType<FileSymbol>().Single();
418 WixAssert.StringEqual(Path.Combine(folder, @"data\test.txt"), fileSymbol[FileSymbolFields.Source].AsPath().Path);
419 WixAssert.StringEqual(@"test.txt", fileSymbol[FileSymbolFields.Source].PreviousValue.AsPath().Path);
420
421 var featureSymbol = Assert.Single(section.Symbols.OfType<FeatureSymbol>());
422 WixAssert.StringEqual("MsiPackage", featureSymbol.Title);
423 }
424 }
425
426 [Fact]
427 public void CanBuild64bit()
428 {
429 var folder = TestData.Get(@"TestData\SingleFile");
430
431 using (var fs = new DisposableFileSystem())
432 {
433 var baseFolder = fs.GetFolder();
434 var intermediateFolder = Path.Combine(baseFolder, "obj");
435
436 var result = WixRunner.Execute(new[]
437 {
438 "build",
439 Path.Combine(folder, "Package.wxs"),
440 Path.Combine(folder, "PackageComponents.wxs"),
441 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
442 "-bindpath", Path.Combine(folder, "data"),
443 "-intermediateFolder", intermediateFolder,
444 "-arch", "x64",
445 "-o", Path.Combine(baseFolder, @"bin\test.msi")
446 });
447
448 result.AssertSuccess();
449
450 var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb"));
451 var section = intermediate.Sections.Single();
452
453 var platformSummary = section.Symbols.OfType<SummaryInformationSymbol>().Single(s => s.PropertyId == SummaryInformationType.PlatformAndLanguage);
454 Assert.Equal("x64;1033", platformSummary.Value);
455 }
456 }
457
458 [Fact]
459 public void CanBuildSharedComponent()
460 {
461 var folder = TestData.Get(@"TestData\SingleFile");
462
463 using (var fs = new DisposableFileSystem())
464 {
465 var baseFolder = fs.GetFolder();
466 var intermediateFolder = Path.Combine(baseFolder, "obj");
467
468 var result = WixRunner.Execute(new[]
469 {
470 "build",
471 Path.Combine(folder, "Package.wxs"),
472 Path.Combine(folder, "PackageComponents.wxs"),
473 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
474 "-bindpath", Path.Combine(folder, "data"),
475 "-intermediateFolder", intermediateFolder,
476 "-arch", "x64",
477 "-o", Path.Combine(baseFolder, @"bin\test.msi")
478 });
479
480 result.AssertSuccess();
481
482 var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb"));
483 var section = intermediate.Sections.Single();
484
485 // Only one component is shared.
486 var sharedComponentSymbols = section.Symbols.OfType<ComponentSymbol>();
487 Assert.Equal(1, sharedComponentSymbols.Sum(t => t.Shared ? 1 : 0));
488
489 // And it is this one.
490 var sharedComponentSymbol = sharedComponentSymbols.Single(t => t.Id.Id == "Shared.dll");
491 Assert.True(sharedComponentSymbol.Shared);
492 }
493 }
494
495 [Fact]
496 public void CannotBuildBadProperty()
497 {
498 var folder = TestData.Get(@"TestData", "Property");
499
500 using (var fs = new DisposableFileSystem())
501 {
502 var baseFolder = fs.GetFolder();
503 var intermediateFolder = Path.Combine(baseFolder, "obj");
504
505 var result = WixRunner.Execute(new[]
506 {
507 "build",
508 Path.Combine(folder, "BadProperty.wxs"),
509 "-intermediateFolder", intermediateFolder,
510 "-o", Path.Combine(baseFolder, "bin", "test.msi")
511 });
512
513 var messages = result.Messages.Select(m => m.ToString()).ToArray();
514 WixAssert.CompareLineByLine(new[]
515 {
516 "The 'Break' Property contains '[X]' in its value which is an illegal reference to another property. If this value is a string literal, not a property reference, please ignore this warning. To set a property with the value of another property, use a CustomAction with Property and Value attributes.",
517 "The 'Break' Property contains '[Y]' in its value which is an illegal reference to another property. If this value is a string literal, not a property reference, please ignore this warning. To set a property with the value of another property, use a CustomAction with Property and Value attributes.",
518 }, messages);
519 }
520 }
521
522 [Fact]
523 public void CanBuildVersionIndependentProgId()
524 {
525 var folder = TestData.Get(@"TestData\ProgId");
526
527 using (var fs = new DisposableFileSystem())
528 {
529 var baseFolder = fs.GetFolder();
530 var intermediateFolder = Path.Combine(baseFolder, "obj");
531
532 var result = WixRunner.Execute(new[]
533 {
534 "build",
535 Path.Combine(folder, "Package.wxs"),
536 Path.Combine(folder, "PackageComponents.wxs"),
537 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
538 "-bindpath", Path.Combine(folder, "data"),
539 "-intermediateFolder", intermediateFolder,
540 "-o", Path.Combine(baseFolder, @"bin\test.msi")
541 });
542
543 result.AssertSuccess();
544
545 Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.msi")));
546 Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.wixpdb")));
547 Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\PFiles\MsiPackage\Foo.exe")));
548
549 var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb"));
550 var section = intermediate.Sections.Single();
551
552 var progids = section.Symbols.OfType<ProgIdSymbol>().OrderBy(symbol => symbol.ProgId).ToList();
553 WixAssert.CompareLineByLine(new[]
554 {
555 "Foo.File.hol",
556 "Foo.File.hol.15"
557 }, progids.Select(p => p.ProgId).ToArray());
558
559 WixAssert.CompareLineByLine(new[]
560 {
561 "Foo.File.hol.15",
562 null
563 }, progids.Select(p => p.ParentProgIdRef).ToArray());
564 }
565 }
566
567 [Fact]
568 public void FailsBuildAtBindTimeForMissingEnsureTable()
569 {
570 var folder = TestData.Get(@"TestData");
571
572 using (var fs = new DisposableFileSystem())
573 {
574 var baseFolder = fs.GetFolder();
575 var intermediateFolder = Path.Combine(baseFolder, "obj");
576 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
577
578 var result = WixRunner.Execute(new[]
579 {
580 "build",
581 Path.Combine(folder, "BadEnsureTable", "BadEnsureTable.wxs"),
582 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
583 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
584 "-ext", ExtensionPaths.ExampleExtensionPath,
585 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
586 "-intermediateFolder", intermediateFolder,
587 "-o", msiPath
588 });
589 Assert.Collection(result.Messages,
590 first =>
591 {
592 Assert.Equal(MessageLevel.Error, first.Level);
593 WixAssert.StringEqual("Cannot find the table definitions for the 'TableDefinitionNotExposedByExtension' table. This is likely due to a typing error or missing extension. Please ensure all the necessary extensions are supplied on the command line with the -ext parameter.", first.ToString());
594 });
595
596 Assert.False(File.Exists(msiPath));
597 }
598 }
599 }
600 }