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
+}