Fix building `ExePackage/@ExitCode` elements.
Sean Hall committed
Aug 25, 2022 at 15:05 UTC
6bd9fb04a9a8c1805a3e909583cca85c54dea7e4
7 files changed
+121
-4
src/api/wix/WixToolset.Data/Symbols/WixBundlePackageExitCodeSymbol.cs
+1
-1
@@ -32,7 +32,7 @@ namespace WixToolset.Data.Symbols
32
public enum ExitCodeBehaviorType
33
{
34
NotSet = -1,
35
- Success,
35
+ Success = 1,
36
Error,
37
ScheduleReboot,
38
ForceReboot,
src/wix/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs
+1
-1
@@ -532,7 +532,7 @@ namespace WixToolset.Core.Burn.Bundles
532
533
if (exitCode.Code.HasValue)
534
{
535
- writer.WriteAttributeString("Code", unchecked((uint)exitCode.Code).ToString(CultureInfo.InvariantCulture));
535
+ writer.WriteAttributeString("Code", exitCode.Code.Value.ToString(CultureInfo.InvariantCulture));
536
}
537
else
538
{
src/wix/WixToolset.Core/Common.cs
+27
@@ -680,6 +680,33 @@ namespace WixToolset.Core
680
return integer;
681
}
682
683
+ /// <summary>
684
+ /// Get an integer attribute value and displays an error for an illegal integer value.
685
+ /// </summary>
686
+ /// <param name="messaging"></param>
687
+ /// <param name="sourceLineNumbers">Source line information about the owner element.</param>
688
+ /// <param name="attribute">The attribute containing the value to get.</param>
689
+ /// <returns>The attribute's integer value or null if an error occurred during conversion.</returns>
690
+ public static int? GetAttributeRawIntegerValue(IMessaging messaging, SourceLineNumber sourceLineNumbers, XAttribute attribute)
691
+ {
692
+ var value = Common.GetAttributeValue(messaging, sourceLineNumbers, attribute, EmptyRule.MustHaveNonWhitespaceCharacters);
693
+ int? integer = null;
694
+
695
+ if (0 < value.Length)
696
+ {
697
+ if (Int32.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture.NumberFormat, out var integerValue))
698
+ {
699
+ integer = integerValue;
700
+ }
701
+ else
702
+ {
703
+ messaging.Write(ErrorMessages.IllegalIntegerValue(sourceLineNumbers, attribute.Parent.Name.LocalName, attribute.Name.LocalName, value));
704
+ }
705
+ }
706
+
707
+ return integer;
708
+ }
709
+
710
/// <summary>
711
/// Gets a yes/no value and displays an error for an illegal yes/no value.
712
/// </summary>
src/wix/WixToolset.Core/CompilerCore.cs
+11
@@ -500,6 +500,17 @@ namespace WixToolset.Core
500
return this.parseHelper.GetAttributeIntegerValue(sourceLineNumbers, attribute, minimum, maximum);
501
}
502
503
+ /// <summary>
504
+ /// Get an integer attribute value and displays an error for an illegal integer value.
505
+ /// </summary>
506
+ /// <param name="sourceLineNumbers">Source line information about the owner element.</param>
507
+ /// <param name="attribute">The attribute containing the value to get.</param>
508
+ /// <returns>The attribute's integer value or null if an error occurred during conversion.</returns>
509
+ public int? GetAttributeRawIntegerValue(SourceLineNumber sourceLineNumbers, XAttribute attribute)
510
+ {
511
+ return Common.GetAttributeRawIntegerValue(this.messaging, sourceLineNumbers, attribute);
512
+ }
513
+
514
/// <summary>
515
/// Get a long integral attribute value and displays an error for an illegal long value.
516
/// </summary>
src/wix/WixToolset.Core/Compiler_Bundle.cs
+2
-2
@@ -1609,7 +1609,7 @@ namespace WixToolset.Core
1609
private void ParseExitCodeElement(XElement node, string packageId)
1610
{
1611
var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
1612
- var value = CompilerConstants.IntegerNotSet;
1612
+ int? value = null;
1613
var behavior = ExitCodeBehaviorType.NotSet;
1614
1615
foreach (var attrib in node.Attributes())
@@ -1619,7 +1619,7 @@ namespace WixToolset.Core
1619
switch (attrib.Name.LocalName)
1620
{
1621
case "Value":
1622
- value = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, Int32.MinValue + 2, Int32.MaxValue);
1622
+ value = this.Core.GetAttributeRawIntegerValue(sourceLineNumbers, attrib);
1623
break;
1624
case "Behavior":
1625
var behaviorString = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
src/wix/test/WixToolsetTest.CoreIntegration/ExePackageFixture.cs
+54
@@ -54,6 +54,60 @@ namespace WixToolsetTest.CoreIntegration
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='3010' Type='2' />" +
97
+ "<ExitCode Code='-2147021886' Type='2' />" +
98
+ "<ExitCode Code='3011' Type='2' />" +
99
+ "<ExitCode Code='-2147021885' Type='2' />" +
100
+ "<ExitCode Code='1641' Type='2' />" +
101
+ "<ExitCode Code='-2147023255' Type='2' />" +
102
+ "<ExitCode Code='-2147483647' Type='2' />" +
103
+ "<ExitCode Code='-2147483648' Type='2' />" +
104
+ "<ExitCode Code='*' Type='1' />" +
105
+ "<PayloadRef Id='burn.exe' />" +
106
+ "</ExePackage>",
107
+ }, exePackages);
108
+ }
109
+ }
110
+
111
[Fact]
112
public void WarningWhenInvalidArpEntryVersion()
113
{
src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/CustomExitCodes.wxs
new
+25
@@ -0,0 +1,25 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3
+ <Fragment>
4
+ <PackageGroup Id="BundlePackages">
5
+ <ExePackage InstallArguments="-install"
6
+ RepairArguments="-repair"
7
+ UninstallArguments="-uninstall"
8
+ DetectCondition="detect"
9
+ SourceFile="burn.exe">
10
+ <ExitCode Value="0" Behavior="error" />
11
+ <ExitCode Value="3" Behavior="scheduleReboot" />
12
+ <ExitCode Value="4" Behavior="forceReboot" />
13
+ <ExitCode Value="3010" Behavior="error" />
14
+ <ExitCode Value="-2147021886" Behavior="error" />
15
+ <ExitCode Value="3011" Behavior="error" />
16
+ <ExitCode Value="-2147021885" Behavior="error" />
17
+ <ExitCode Value="1641" Behavior="error" />
18
+ <ExitCode Value="-2147023255" Behavior="error" />
19
+ <ExitCode Value="-2147483647" Behavior="error" />
20
+ <ExitCode Value="-2147483648" Behavior="error" />
21
+ <ExitCode Behavior="success" />
22
+ </ExePackage>
23
+ </PackageGroup>
24
+ </Fragment>
25
+</Wix>