main
cs 565 lines 25.8 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.Collections.Generic;
6 using System.IO;
7 using System.Linq;
8 using System.Xml;
9 using WixInternal.TestSupport;
10 using WixInternal.Core.TestPackage;
11 using Xunit;
12
13 public class ExePackageFixture
14 {
15 [Fact]
16 public void CanBuildWithArpEntry()
17 {
18 var folder = TestData.Get(@"TestData");
19
20 using (var fs = new DisposableFileSystem())
21 {
22 var baseFolder = fs.GetFolder();
23 var intermediateFolder = Path.Combine(baseFolder, "obj");
24 var binFolder = Path.Combine(baseFolder, "bin");
25 var bundlePath = Path.Combine(binFolder, "test.exe");
26 var baFolderPath = Path.Combine(baseFolder, "ba");
27 var extractFolderPath = Path.Combine(baseFolder, "extract");
28
29 var result = WixRunner.Execute(new[]
30 {
31 "build",
32 Path.Combine(folder, "ExePackage", "ArpEntry.wxs"),
33 Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
34 "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
35 "-bindpath", Path.Combine(folder, ".Data"),
36 "-intermediateFolder", intermediateFolder,
37 "-o", bundlePath,
38 });
39
40 result.AssertSuccess();
41
42 Assert.True(File.Exists(bundlePath));
43
44 var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath);
45 extractResult.AssertSuccess();
46
47 var exePackages = extractResult.GetManifestTestXmlLines("/burn:BurnManifest/burn:Chain/burn:ExePackage");
48 WixAssert.CompareLineByLine(new string[]
49 {
50 "<ExePackage Id='burn.exe' Cache='keep' CacheId='F6E722518AC3AB7E31C70099368D5770788C179AA23226110DCF07319B1E1964' InstallSize='463360' Size='463360' PerMachine='yes' Permanent='no' Vital='yes' RollbackBoundaryForward='WixDefaultBoundary' RollbackBoundaryBackward='WixDefaultBoundary' LogPathVariable='WixBundleLog_burn.exe' RollbackLogPathVariable='WixBundleRollbackLog_burn.exe' InstallArguments='-install' RepairArguments='-repair' Repairable='yes' DetectionType='arp' ArpId='id' ArpDisplayVersion='1.0.0.0'>" +
51 "<PayloadRef Id='burn.exe' />" +
52 "</ExePackage>",
53 }, exePackages);
54 }
55 }
56
57 [Fact]
58 public void CanBuildWithCustomExitCodes()
59 {
60 var folder = TestData.Get(@"TestData");
61
62 using (var fs = new DisposableFileSystem())
63 {
64 var baseFolder = fs.GetFolder();
65 var intermediateFolder = Path.Combine(baseFolder, "obj");
66 var binFolder = Path.Combine(baseFolder, "bin");
67 var bundlePath = Path.Combine(binFolder, "test.exe");
68 var baFolderPath = Path.Combine(baseFolder, "ba");
69 var extractFolderPath = Path.Combine(baseFolder, "extract");
70
71 var result = WixRunner.Execute(new[]
72 {
73 "build",
74 Path.Combine(folder, "ExePackage", "CustomExitCodes.wxs"),
75 Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
76 "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
77 "-bindpath", Path.Combine(folder, ".Data"),
78 "-intermediateFolder", intermediateFolder,
79 "-o", bundlePath,
80 });
81
82 result.AssertSuccess();
83
84 Assert.True(File.Exists(bundlePath));
85
86 var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath);
87 extractResult.AssertSuccess();
88
89 var exePackages = extractResult.GetManifestTestXmlLines("/burn:BurnManifest/burn:Chain/burn:ExePackage");
90 WixAssert.CompareLineByLine(new string[]
91 {
92 "<ExePackage Id='burn.exe' Cache='keep' CacheId='F6E722518AC3AB7E31C70099368D5770788C179AA23226110DCF07319B1E1964' InstallSize='463360' Size='463360' PerMachine='yes' Permanent='no' Vital='yes' RollbackBoundaryForward='WixDefaultBoundary' RollbackBoundaryBackward='WixDefaultBoundary' LogPathVariable='WixBundleLog_burn.exe' RollbackLogPathVariable='WixBundleRollbackLog_burn.exe' InstallArguments='-install' RepairArguments='-repair' Repairable='yes' DetectionType='condition' DetectCondition='detect' UninstallArguments='-uninstall' Uninstallable='yes'>" +
93 "<ExitCode Code='0' Type='2' />" +
94 "<ExitCode Code='3' Type='3' />" +
95 "<ExitCode Code='4' Type='4' />" +
96 "<ExitCode Code='5' Type='5' />" +
97 "<ExitCode Code='-2147024891' Type='5' />" +
98 "<ExitCode Code='6' Type='6' />" +
99 "<ExitCode Code='-2147024890' Type='6' />" +
100 "<ExitCode Code='3010' Type='2' />" +
101 "<ExitCode Code='-2147021886' Type='2' />" +
102 "<ExitCode Code='3011' Type='2' />" +
103 "<ExitCode Code='-2147021885' Type='2' />" +
104 "<ExitCode Code='1641' Type='2' />" +
105 "<ExitCode Code='-2147023255' Type='2' />" +
106 "<ExitCode Code='3017' Type='2' />" +
107 "<ExitCode Code='-2147021879' Type='2' />" +
108 "<ExitCode Code='3018' Type='2' />" +
109 "<ExitCode Code='-2147021878' Type='2' />" +
110 "<ExitCode Code='-2147483647' Type='2' />" +
111 "<ExitCode Code='-2147483648' Type='2' />" +
112 "<ExitCode Code='*' Type='1' />" +
113 "<PayloadRef Id='burn.exe' />" +
114 "</ExePackage>",
115 }, exePackages);
116 }
117 }
118
119 [Fact]
120 public void WarningWhenInvalidArpEntryVersion()
121 {
122 var folder = TestData.Get(@"TestData");
123
124 using (var fs = new DisposableFileSystem())
125 {
126 var baseFolder = fs.GetFolder();
127 var intermediateFolder = Path.Combine(baseFolder, "obj");
128 var binFolder = Path.Combine(baseFolder, "bin");
129 var bundlePath = Path.Combine(binFolder, "test.exe");
130 var baFolderPath = Path.Combine(baseFolder, "ba");
131 var extractFolderPath = Path.Combine(baseFolder, "extract");
132
133 var result = WixRunner.Execute(false, new[]
134 {
135 "build",
136 Path.Combine(folder, "ExePackage", "InvalidArpEntryVersion.wxs"),
137 Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
138 "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
139 "-bindpath", Path.Combine(folder, ".Data"),
140 "-intermediateFolder", intermediateFolder,
141 "-o", bundlePath,
142 });
143
144 WixAssert.CompareLineByLine(new[]
145 {
146 "Invalid WixVersion '1.0.0.abc' in ArpEntry/@'Version'. Comparisons may yield unexpected results."
147 }, result.Messages.Select(m => m.ToString()).ToArray());
148 result.AssertSuccess();
149
150 Assert.True(File.Exists(bundlePath));
151
152 var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath);
153 extractResult.AssertSuccess();
154
155 var ignoreAttributes = new Dictionary<string, List<string>>
156 {
157 { "ExePackage", new List<string> { "CacheId", "Size" } },
158 };
159 var exePackages = extractResult.GetManifestTestXmlLines("/burn:BurnManifest/burn:Chain/burn:ExePackage", ignoreAttributes);
160 WixAssert.CompareLineByLine(new string[]
161 {
162 "<ExePackage Id='burn.exe' Cache='keep' CacheId='*' InstallSize='463360' Size='*' PerMachine='yes' Permanent='no' Vital='yes' RollbackBoundaryForward='WixDefaultBoundary' RollbackBoundaryBackward='WixDefaultBoundary' LogPathVariable='WixBundleLog_burn.exe' RollbackLogPathVariable='WixBundleRollbackLog_burn.exe' InstallArguments='-install' RepairArguments='' Repairable='no' DetectionType='arp' ArpId='id' ArpDisplayVersion='1.0.0.abc'>" +
163 "<PayloadRef Id='burn.exe' />" +
164 "</ExePackage>",
165 }, exePackages);
166 }
167 }
168
169 [Fact]
170 public void WarningWhenPermanentWithoutDetectConditionOrUninstallArgumentsOrArpEntry()
171 {
172 var folder = TestData.Get(@"TestData");
173
174 using (var fs = new DisposableFileSystem())
175 {
176 var baseFolder = fs.GetFolder();
177 var intermediateFolder = Path.Combine(baseFolder, "obj");
178 var binFolder = Path.Combine(baseFolder, "bin");
179 var bundlePath = Path.Combine(binFolder, "test.exe");
180 var baFolderPath = Path.Combine(baseFolder, "ba");
181 var extractFolderPath = Path.Combine(baseFolder, "extract");
182
183 var result = WixRunner.Execute(false, new[]
184 {
185 "build",
186 Path.Combine(folder, "ExePackage", "PermanentWithoutDetectConditionOrUninstallArgumentsOrArpEntry.wxs"),
187 Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
188 "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
189 "-bindpath", Path.Combine(folder, ".Data"),
190 "-intermediateFolder", intermediateFolder,
191 "-o", bundlePath,
192 });
193
194 WixAssert.CompareLineByLine(new[]
195 {
196 "The ExePackage/@DetectCondition attribute or child element ArpEntry is recommended so the package is only installed when absent."
197 }, result.Messages.Select(m => m.ToString()).ToArray());
198 result.AssertSuccess();
199
200 Assert.True(File.Exists(bundlePath));
201
202 var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath);
203 extractResult.AssertSuccess();
204
205 var ignoreAttributes = new Dictionary<string, List<string>>
206 {
207 { "ExePackage", new List<string> { "CacheId", "Size" } },
208 };
209 var exePackages = extractResult.GetManifestTestXmlLines("/burn:BurnManifest/burn:Chain/burn:ExePackage", ignoreAttributes);
210 WixAssert.CompareLineByLine(new string[]
211 {
212 "<ExePackage Id='burn.exe' Cache='keep' CacheId='*' InstallSize='463360' Size='*' PerMachine='yes' Permanent='yes' Vital='yes' RollbackBoundaryForward='WixDefaultBoundary' RollbackBoundaryBackward='WixDefaultBoundary' LogPathVariable='WixBundleLog_burn.exe' RollbackLogPathVariable='WixBundleRollbackLog_burn.exe' InstallArguments='-install' RepairArguments='' Repairable='no' DetectionType='none'>" +
213 "<PayloadRef Id='burn.exe' />" +
214 "</ExePackage>",
215 }, exePackages);
216 }
217 }
218
219 [Fact]
220 public void NoWarningWhenPermanentWithEmptyDetectCondition()
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 binFolder = Path.Combine(baseFolder, "bin");
229 var bundlePath = Path.Combine(binFolder, "test.exe");
230 var baFolderPath = Path.Combine(baseFolder, "ba");
231 var extractFolderPath = Path.Combine(baseFolder, "extract");
232
233 var result = WixRunner.Execute(new[]
234 {
235 "build",
236 Path.Combine(folder, "ExePackage", "PermanentWithEmptyDetectCondition.wxs"),
237 Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
238 "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
239 "-bindpath", Path.Combine(folder, ".Data"),
240 "-intermediateFolder", intermediateFolder,
241 "-o", bundlePath,
242 });
243
244 result.AssertSuccess();
245
246 Assert.True(File.Exists(bundlePath));
247
248 var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath);
249 extractResult.AssertSuccess();
250
251 var ignoreAttributes = new Dictionary<string, List<string>>
252 {
253 { "ExePackage", new List<string> { "CacheId", "Size" } },
254 };
255 var exePackages = extractResult.GetManifestTestXmlLines("/burn:BurnManifest/burn:Chain/burn:ExePackage", ignoreAttributes);
256 WixAssert.CompareLineByLine(new string[]
257 {
258 "<ExePackage Id='burn.exe' Cache='keep' CacheId='*' InstallSize='463360' Size='*' PerMachine='yes' Permanent='yes' Vital='yes' RollbackBoundaryForward='WixDefaultBoundary' RollbackBoundaryBackward='WixDefaultBoundary' LogPathVariable='WixBundleLog_burn.exe' RollbackLogPathVariable='WixBundleRollbackLog_burn.exe' InstallArguments='-install' RepairArguments='' Repairable='no' DetectionType='none'>" +
259 "<PayloadRef Id='burn.exe' />" +
260 "</ExePackage>",
261 }, exePackages);
262 }
263 }
264
265 [Fact]
266 public void ErrorWhenArpEntryWithDetectCondition()
267 {
268 var folder = TestData.Get(@"TestData", "ExePackage");
269
270 using (var fs = new DisposableFileSystem())
271 {
272 var baseFolder = fs.GetFolder();
273
274 var result = WixRunner.Execute(new[]
275 {
276 "build",
277 Path.Combine(folder, "ArpEntryWithDetectCondition.wxs"),
278 "-o", Path.Combine(baseFolder, "test.wixlib")
279 });
280
281 WixAssert.CompareLineByLine(new[]
282 {
283 "The ExePackage element cannot have a child element 'ArpEntry' when attribute 'DetectCondition' is set.",
284 }, result.Messages.Select(m => m.ToString()).ToArray());
285 Assert.Equal(372, result.ExitCode);
286 }
287 }
288
289 [Fact]
290 public void ErrorWhenArpEntryWithUninstallArguments()
291 {
292 var folder = TestData.Get(@"TestData", "ExePackage");
293
294 using (var fs = new DisposableFileSystem())
295 {
296 var baseFolder = fs.GetFolder();
297
298 var result = WixRunner.Execute(new[]
299 {
300 "build",
301 Path.Combine(folder, "ArpEntryWithUninstallArguments.wxs"),
302 "-o", Path.Combine(baseFolder, "test.wixlib")
303 });
304
305 WixAssert.CompareLineByLine(new[]
306 {
307 "The ExePackage element cannot have a child element 'ArpEntry' when attribute 'UninstallArguments' is set.",
308 }, result.Messages.Select(m => m.ToString()).ToArray());
309 Assert.Equal(372, result.ExitCode);
310 }
311 }
312
313 [Fact]
314 public void ErrorWhenArpEntryWithInvalidId()
315 {
316 var folder = TestData.Get(@"TestData", "ExePackage");
317
318 using (var fs = new DisposableFileSystem())
319 {
320 var baseFolder = fs.GetFolder();
321
322 var result = WixRunner.Execute(new[]
323 {
324 "build",
325 Path.Combine(folder, "InvalidArpEntryId.wxs"),
326 "-o", Path.Combine(baseFolder, "test.wixlib")
327 });
328
329 WixAssert.CompareLineByLine(new[]
330 {
331 "The ArpEntry/@Id attribute's value, '..\\id', is not a valid filename because it contains illegal characters. Legal filenames contain no more than 260 characters and must contain at least one non-period character. Any character except for the follow may be used: \\ ? | > < : / * \".",
332 }, result.Messages.Select(m => m.ToString()).ToArray());
333 Assert.Equal(27, result.ExitCode);
334 }
335 }
336
337 [Fact]
338 public void ErrorWhenNonPermanentWithOnlyDetectCondition()
339 {
340 var folder = TestData.Get(@"TestData", "ExePackage");
341
342 using (var fs = new DisposableFileSystem())
343 {
344 var baseFolder = fs.GetFolder();
345
346 var result = WixRunner.Execute(new[]
347 {
348 "build",
349 Path.Combine(folder, "NonPermanentWithOnlyDetectCondition.wxs"),
350 "-o", Path.Combine(baseFolder, "test.wixlib")
351 });
352
353 WixAssert.CompareLineByLine(new[]
354 {
355 "The ExePackage element's UninstallArguments attribute was not found; it is required without attribute Permanent present.",
356 }, result.Messages.Select(m => m.ToString()).ToArray());
357 Assert.Equal(408, result.ExitCode);
358 }
359 }
360
361 [Fact]
362 public void ErrorWhenNonPermanentWithOnlyUninstallArguments()
363 {
364 var folder = TestData.Get(@"TestData", "ExePackage");
365
366 using (var fs = new DisposableFileSystem())
367 {
368 var baseFolder = fs.GetFolder();
369
370 var result = WixRunner.Execute(new[]
371 {
372 "build",
373 Path.Combine(folder, "NonPermanentWithOnlyUninstallArguments.wxs"),
374 "-o", Path.Combine(baseFolder, "test.wixlib")
375 });
376
377 WixAssert.CompareLineByLine(new[]
378 {
379 "The ExePackage element's DetectCondition attribute was not found; it is required without attribute Permanent present.",
380 }, result.Messages.Select(m => m.ToString()).ToArray());
381 Assert.Equal(408, result.ExitCode);
382 }
383 }
384
385 [Fact]
386 public void ErrorWhenRepairablePermanentWithoutDetectCondition()
387 {
388 var folder = TestData.Get(@"TestData", "ExePackage");
389
390 using (var fs = new DisposableFileSystem())
391 {
392 var baseFolder = fs.GetFolder();
393
394 var result = WixRunner.Execute(new[]
395 {
396 "build",
397 Path.Combine(folder, "RepairablePermanentWithoutDetectCondition.wxs"),
398 "-o", Path.Combine(baseFolder, "test.wixlib")
399 });
400
401 WixAssert.CompareLineByLine(new[]
402 {
403 "The ExePackage/@DetectCondition attribute is required to have a value when attribute RepairArguments is present.",
404 }, result.Messages.Select(m => m.ToString()).ToArray());
405 Assert.Equal(401, result.ExitCode);
406 }
407 }
408
409 [Fact]
410 public void ErrorWhenRepairablePermanentWithoutDetectConditionOrUninstallArgumentsOrArpEntry()
411 {
412 var folder = TestData.Get(@"TestData", "ExePackage");
413
414 using (var fs = new DisposableFileSystem())
415 {
416 var baseFolder = fs.GetFolder();
417
418 var result = WixRunner.Execute(new[]
419 {
420 "build",
421 Path.Combine(folder, "RepairablePermanentWithoutDetectConditionOrUninstallArgumentsOrArpEntry.wxs"),
422 "-o", Path.Combine(baseFolder, "test.wixlib")
423 });
424
425 WixAssert.CompareLineByLine(new[]
426 {
427 "Element 'ExePackage' missing attribute 'DetectCondition' or child element 'ArpEntry'. Exactly one of those is required when attribute 'RepairArguments' is specified.",
428 }, result.Messages.Select(m => m.ToString()).ToArray());
429 Assert.Equal(413, result.ExitCode);
430 }
431 }
432
433 [Fact]
434 public void ErrorWhenNonPermanentWithoutDetectConditionOrUninstallArgumentsOrArpEntry()
435 {
436 var folder = TestData.Get(@"TestData", "ExePackage");
437
438 using (var fs = new DisposableFileSystem())
439 {
440 var baseFolder = fs.GetFolder();
441
442 var result = WixRunner.Execute(new[]
443 {
444 "build",
445 Path.Combine(folder, "NonPermanentWithoutDetectConditionOrUninstallArgumentsOrArpEntry.wxs"),
446 "-o", Path.Combine(baseFolder, "test.wixlib")
447 });
448
449 WixAssert.CompareLineByLine(new[]
450 {
451 "Element 'ExePackage' missing attribute 'DetectCondition' or child element 'ArpEntry'. Exactly one of those is required when attribute 'Permanent' is not specified.",
452 }, result.Messages.Select(m => m.ToString()).ToArray());
453 Assert.Equal(414, result.ExitCode);
454 }
455 }
456
457 [Fact]
458 public void ErrorWhenRepairConditionWithoutRepairArguments()
459 {
460 var folder = TestData.Get(@"TestData", "ExePackage");
461
462 using (var fs = new DisposableFileSystem())
463 {
464 var baseFolder = fs.GetFolder();
465
466 var result = WixRunner.Execute(new[]
467 {
468 "build",
469 Path.Combine(folder, "RepairConditionWithoutRepairArguments.wxs"),
470 "-o", Path.Combine(baseFolder, "test.wixlib")
471 });
472
473 WixAssert.CompareLineByLine(new[]
474 {
475 "The ExePackage/@RepairArguments attribute is required to have a value when attribute RepairCondition is present.",
476 }, result.Messages.Select(m => m.ToString()).ToArray());
477 Assert.Equal(401, result.ExitCode);
478 }
479 }
480
481 [Fact]
482 public void ErrorWhenUninstallArgumentsWithoutDetectCondition()
483 {
484 var folder = TestData.Get(@"TestData", "ExePackage");
485
486 using (var fs = new DisposableFileSystem())
487 {
488 var baseFolder = fs.GetFolder();
489
490 var result = WixRunner.Execute(new[]
491 {
492 "build",
493 Path.Combine(folder, "UninstallArgumentsWithoutDetectCondition.wxs"),
494 "-o", Path.Combine(baseFolder, "test.wixlib")
495 });
496
497 WixAssert.CompareLineByLine(new[]
498 {
499 "The ExePackage/@DetectCondition attribute is required to have a value when attribute UninstallArguments is present.",
500 }, result.Messages.Select(m => m.ToString()).ToArray());
501 Assert.Equal(401, result.ExitCode);
502 }
503 }
504
505 [Fact]
506 public void CannotBuildBundleWithExePackageUsingCertificateVerificationWithoutCacheId()
507 {
508 var dotDatafolder = TestData.Get(@"TestData", ".Data");
509 var folder = TestData.Get(@"TestData", "ExePackage");
510
511 using (var fs = new DisposableFileSystem())
512 {
513 var baseFolder = fs.GetFolder();
514 var intermediateFolder = Path.Combine(baseFolder, "obj");
515
516 var result = WixRunner.Execute(new[]
517 {
518 "build",
519 Path.Combine(folder, "UseCertificateVerificationWithoutCacheId.wxs"),
520 "-bindpath", Path.Combine(folder, "data"),
521 "-bindpath", dotDatafolder,
522 "-intermediateFolder", intermediateFolder,
523 "-o", Path.Combine(baseFolder, "bin", "test.exe")
524 });
525
526 WixAssert.CompareLineByLine(new[]
527 {
528 "The ExePackage/@CacheId attribute was not found; it is required when attribute CertificatePublicKey is specified.",
529 }, result.Messages.Select(m => m.ToString()).ToArray());
530
531 Assert.Equal(10, result.ExitCode);
532 }
533 }
534
535 [Fact]
536 public void CannotBuildBundleWithExePackageWithoutSourceOrHashOrCertificate()
537 {
538 var dotDatafolder = TestData.Get(@"TestData", ".Data");
539 var folder = TestData.Get(@"TestData", "ExePackage");
540
541 using (var fs = new DisposableFileSystem())
542 {
543 var baseFolder = fs.GetFolder();
544 var intermediateFolder = Path.Combine(baseFolder, "obj");
545
546 var result = WixRunner.Execute(new[]
547 {
548 "build",
549 Path.Combine(folder, "ExePackageWithoutSourceHashOrCertificate.wxs"),
550 "-bindpath", Path.Combine(folder, "data"),
551 "-bindpath", dotDatafolder,
552 "-intermediateFolder", intermediateFolder,
553 "-o", Path.Combine(baseFolder, "bin", "test.exe")
554 });
555
556 WixAssert.CompareLineByLine(new[]
557 {
558 "The ExePackagePayload/@Description attribute can only be specified with one of the following attributes: Hash or CertificatePublicKey present.",
559 "The ExePackagePayload/@Size attribute can only be specified with one of the following attributes: Hash or CertificatePublicKey present.",
560 "The ExePackagePayload/@Version attribute can only be specified with one of the following attributes: Hash or CertificatePublicKey present.",
561 }, result.Messages.Select(m => m.ToString()).ToArray());
562 }
563 }
564 }
565 }