@joebigelow / wix-1 / commits / ce73352b

Add basic test for Msmq install/uninstall. Fix up lack of WIX CUSTOM_ACTION_DECORATION wrappers

Add basic test for Msmq install/uninstall. Fix up lack of WIX CUSTOM_ACTION_DECORATION wrappers Add new RuntimeTest skipper for Server Features / Optional Features. Signed-off-by: Bevan Weiss <bevan.weiss@gmail.com>

Bevan Weiss committed Jul 15, 2024 at 20:06 UTC ce73352b1fa1d4f9cded10a0ee410f2e786bd326
8 files changed +122 -4
src/ext/Msmq/ca/mqsched.cpp
+4 -4
@@ -68,7 +68,7 @@ extern "C" UINT __stdcall MessageQueuingInstall(MSIHANDLE hInstall)
68 hr = MqiMessageQueueInstall(&lstMessageQueues, TRUE, &pwzRollbackActionData);
69 ExitOnFailure(hr, "Failed to add message queues to rollback action data");
70
71 - hr = WcaDoDeferredAction(L"MessageQueuingRollbackInstall", pwzRollbackActionData, 0);
71 + hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"MessageQueuingRollbackInstall"), pwzRollbackActionData, 0);
72 ExitOnFailure(hr, "Failed to schedule MessageQueuingRollbackInstall");
73
74 // schedule execute action
@@ -80,7 +80,7 @@ extern "C" UINT __stdcall MessageQueuingInstall(MSIHANDLE hInstall)
80 ExitOnFailure(hr, "Failed to add message queue permissions to execute action data");
81 iCost += lstMessageQueues.iInstallCount * COST_MESSAGE_QUEUE_PERMISSION_ADD;
82
83 - hr = WcaDoDeferredAction(L"MessageQueuingExecuteInstall", pwzExecuteActionData, iCost);
83 + hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"MessageQueuingExecuteInstall"), pwzExecuteActionData, iCost);
84 ExitOnFailure(hr, "Failed to schedule MessageQueuingExecuteInstall");
85 }
86
@@ -163,7 +163,7 @@ extern "C" UINT __stdcall MessageQueuingUninstall(MSIHANDLE hInstall)
163 hr = MqiMessageQueuePermissionUninstall(&lstMessageQueuePermissions, &pwzRollbackActionData);
164 ExitOnFailure(hr, "Failed to add message queue permissions to rollback action data");
165
166 - hr = WcaDoDeferredAction(L"MessageQueuingRollbackUninstall", pwzRollbackActionData, 0);
166 + hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"MessageQueuingRollbackUninstall"), pwzRollbackActionData, 0);
167 ExitOnFailure(hr, "Failed to schedule MessageQueuingRollbackUninstall");
168
169 // schedule execute action
@@ -174,7 +174,7 @@ extern "C" UINT __stdcall MessageQueuingUninstall(MSIHANDLE hInstall)
174 ExitOnFailure(hr, "Failed to add message queues to execute action data");
175 iCost += lstMessageQueues.iUninstallCount * COST_MESSAGE_QUEUE_DELETE;
176
177 - hr = WcaDoDeferredAction(L"MessageQueuingExecuteUninstall", pwzExecuteActionData, iCost);
177 + hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"MessageQueuingExecuteUninstall"), pwzExecuteActionData, iCost);
178 ExitOnFailure(hr, "Failed to schedule MessageQueuingExecuteUninstall");
179 }
180
src/ext/Msmq/ca/precomp.h
+2
@@ -20,3 +20,5 @@
20 #include "mqqueuesched.h"
21 #include "mqutilexec.h"
22 #include "mqqueueexec.h"
23 +
24 +#include "..\..\caDecor.h"
src/internal/SetBuildNumber/Directory.Packages.props.pp
+2
@@ -38,6 +38,7 @@
38 <PackageVersion Include="WixToolset.UI.wixext" Version="{packageversion}" />
39 <PackageVersion Include="WixToolset.Util.wixext" Version="{packageversion}" />
40 <PackageVersion Include="WixToolset.Firewall.wixext" Version="{packageversion}" />
41 + <PackageVersion Include="WixToolset.Msmq.wixext" Version="{packageversion}" />
42 </ItemGroup>
43
44 <ItemGroup>
@@ -45,6 +46,7 @@
46 <PackageVersion Include="System.Diagnostics.PerformanceCounter" Version="4.7.0" />
47 <PackageVersion Include="System.DirectoryServices" Version="4.7.0" />
48 <PackageVersion Include="System.DirectoryServices.AccountManagement" Version="4.7.0" />
49 + <PackageVersion Include="System.Management" Version="4.7.0" />
50 <PackageVersion Include="System.IO.Compression" Version="4.3.0" />
51 <PackageVersion Include="System.IO.FileSystem.AccessControl" Version="4.7.0" />
52 <PackageVersion Include="System.Net.NetworkInformation" Version="4.3.0" />
src/test/burn/WixTestTools/RuntimePrereqFeatureFactAttribute.cs new
+56
@@ -0,0 +1,56 @@
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 WixTestTools
4 +{
5 + using System;
6 + using System.Globalization;
7 + using System.Linq;
8 + using System.Management;
9 + using System.Collections.Generic;
10 + using System.Security.Principal;
11 + using WixInternal.TestSupport.XunitExtensions;
12 +
13 + public class RuntimePrereqFeatureFactAttribute : RuntimeFactAttribute
14 + {
15 + public static HashSet<string> OptionalFeatures = new(StringComparer.OrdinalIgnoreCase);
16 + public static HashSet<string> ServerFeatures = new(StringComparer.OrdinalIgnoreCase);
17 + static RuntimePrereqFeatureFactAttribute()
18 + {
19 + AddFeaturesToSet(ServerFeatures, "Win32_ServerFeature");
20 + AddFeaturesToSet(OptionalFeatures, "Win32_OptionalFeature");
21 + }
22 +
23 + private static void AddFeaturesToSet(HashSet<string> featureSet, string featureSetName)
24 + {
25 + try
26 + {
27 + var objMC = new ManagementClass(featureSetName);
28 + var objMOC = objMC?.GetInstances();
29 + if (objMOC is not null)
30 + {
31 + foreach (var objMO in objMOC)
32 + {
33 + string featureName = (string)objMO.Properties["Name"].Value;
34 + if ((uint)objMO.Properties["InstallState"].Value == 1)
35 + {
36 + featureSet.Add(featureName);
37 + }
38 + }
39 + }
40 + }
41 + catch
42 + {
43 + }
44 + }
45 +
46 + public RuntimePrereqFeatureFactAttribute(params string[] prerequisiteFeatures) : base()
47 + {
48 + var missingRequirements = prerequisiteFeatures.Select(x => x).Where(x => !ServerFeatures.Contains(x) && !OptionalFeatures.Contains(x));
49 +
50 + if (missingRequirements.Any())
51 + {
52 + this.Skip = "This test is missing the following Feature pre-requisites: " + String.Join(", ", missingRequirements);
53 + }
54 + }
55 + }
56 +}
src/test/burn/WixTestTools/WixTestTools.csproj
+1
@@ -23,6 +23,7 @@
23 <PackageReference Include="Microsoft.Win32.Registry" />
24 <PackageReference Include="System.DirectoryServices" />
25 <PackageReference Include="System.DirectoryServices.AccountManagement" />
26 + <PackageReference Include="System.Management" />
27 <PackageReference Include="System.Security.Principal.Windows" />
28 <PackageReference Include="WixInternal.TestSupport" />
29 <PackageReference Include="WixToolset.Data" />
src/test/msi/TestData/MsmqExtensionTests/MsmqInstall/MsmqInstall.wixproj new
+13
@@ -0,0 +1,13 @@
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 +<Project Sdk="WixToolset.Sdk">
3 + <PropertyGroup>
4 + <UpgradeCode>{A75B81F4-3335-4B4D-B766-303E136ED374}</UpgradeCode>
5 + <ProductComponentsRef>true</ProductComponentsRef>
6 + </PropertyGroup>
7 + <ItemGroup>
8 + <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 + </ItemGroup>
10 + <ItemGroup>
11 + <PackageReference Include="WixToolset.Msmq.wixext" />
12 + </ItemGroup>
13 +</Project>
src/test/msi/TestData/MsmqExtensionTests/MsmqInstall/product.wxs new
+17
@@ -0,0 +1,17 @@
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 +
4 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:msmq="http://wixtoolset.org/schemas/v4/wxs/msmq">
5 + <Fragment>
6 + <ComponentGroup Id="ProductComponents">
7 + <ComponentRef Id="Component1" />
8 + </ComponentGroup>
9 + </Fragment>
10 +
11 + <Fragment>
12 + <Component Id="Component1">
13 + <File Source="$(sys.SOURCEFILEPATH)" KeyPath="yes" />
14 + <msmq:MessageQueue Id="ExampleQueue" PathName=".\private$\example-queue" Label="Example Queue" Transactional="yes" />
15 + </Component>
16 + </Fragment>
17 +</Wix>
src/test/msi/WixToolsetTest.MsiE2E/MsmqExtensionTests.cs new
+27
@@ -0,0 +1,27 @@
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.MsiE2E
4 +{
5 + using System;
6 + using System.Collections.Generic;
7 + using System.Linq;
8 + using System.Text;
9 + using System.Threading.Tasks;
10 + using WixTestTools;
11 + using Xunit.Abstractions;
12 +
13 + public class MsmqExtensionTests : MsiE2ETests
14 + {
15 + public MsmqExtensionTests(ITestOutputHelper testOutputHelper) : base(testOutputHelper)
16 + {
17 + }
18 +
19 + [RuntimePrereqFeatureFact("MSMQ-Container", "MSMQ-Server")]
20 + public void CanInstallAndUninstallMsmq()
21 + {
22 + var product = this.CreatePackageInstaller("MsmqInstall");
23 + product.InstallProduct(MSIExec.MSIExecReturnCode.SUCCESS);
24 + product.UninstallProduct(MSIExec.MSIExecReturnCode.SUCCESS);
25 + }
26 + }
27 +}