aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBevan Weiss <bevan.weiss@gmail.com>2024-07-15 20:06:54 +1000
committerRob Mensching <rob@firegiant.com>2024-07-18 09:59:43 -0700
commitce73352b1fa1d4f9cded10a0ee410f2e786bd326 (patch)
tree2f96b17fa23f8433cc3ff0f8e260c90122276358
parent8fb5d579e8cf5eb0f93d07a73bf318a8969c6b10 (diff)
downloadwix-ce73352b1fa1d4f9cded10a0ee410f2e786bd326.tar.gz
wix-ce73352b1fa1d4f9cded10a0ee410f2e786bd326.tar.bz2
wix-ce73352b1fa1d4f9cded10a0ee410f2e786bd326.zip
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>
-rw-r--r--src/ext/Msmq/ca/mqsched.cpp8
-rw-r--r--src/ext/Msmq/ca/precomp.h2
-rw-r--r--src/internal/SetBuildNumber/Directory.Packages.props.pp2
-rw-r--r--src/test/burn/WixTestTools/RuntimePrereqFeatureFactAttribute.cs56
-rw-r--r--src/test/burn/WixTestTools/WixTestTools.csproj1
-rw-r--r--src/test/msi/TestData/MsmqExtensionTests/MsmqInstall/MsmqInstall.wixproj13
-rw-r--r--src/test/msi/TestData/MsmqExtensionTests/MsmqInstall/product.wxs17
-rw-r--r--src/test/msi/WixToolsetTest.MsiE2E/MsmqExtensionTests.cs27
8 files changed, 122 insertions, 4 deletions
diff --git a/src/ext/Msmq/ca/mqsched.cpp b/src/ext/Msmq/ca/mqsched.cpp
index 4c994901..ab5a5ee7 100644
--- a/src/ext/Msmq/ca/mqsched.cpp
+++ b/src/ext/Msmq/ca/mqsched.cpp
@@ -68,7 +68,7 @@ extern "C" UINT __stdcall MessageQueuingInstall(MSIHANDLE hInstall)
68 hr = MqiMessageQueueInstall(&lstMessageQueues, TRUE, &pwzRollbackActionData); 68 hr = MqiMessageQueueInstall(&lstMessageQueues, TRUE, &pwzRollbackActionData);
69 ExitOnFailure(hr, "Failed to add message queues to rollback action data"); 69 ExitOnFailure(hr, "Failed to add message queues to rollback action data");
70 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"); 72 ExitOnFailure(hr, "Failed to schedule MessageQueuingRollbackInstall");
73 73
74 // schedule execute action 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"); 80 ExitOnFailure(hr, "Failed to add message queue permissions to execute action data");
81 iCost += lstMessageQueues.iInstallCount * COST_MESSAGE_QUEUE_PERMISSION_ADD; 81 iCost += lstMessageQueues.iInstallCount * COST_MESSAGE_QUEUE_PERMISSION_ADD;
82 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"); 84 ExitOnFailure(hr, "Failed to schedule MessageQueuingExecuteInstall");
85 } 85 }
86 86
@@ -163,7 +163,7 @@ extern "C" UINT __stdcall MessageQueuingUninstall(MSIHANDLE hInstall)
163 hr = MqiMessageQueuePermissionUninstall(&lstMessageQueuePermissions, &pwzRollbackActionData); 163 hr = MqiMessageQueuePermissionUninstall(&lstMessageQueuePermissions, &pwzRollbackActionData);
164 ExitOnFailure(hr, "Failed to add message queue permissions to rollback action data"); 164 ExitOnFailure(hr, "Failed to add message queue permissions to rollback action data");
165 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"); 167 ExitOnFailure(hr, "Failed to schedule MessageQueuingRollbackUninstall");
168 168
169 // schedule execute action 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"); 174 ExitOnFailure(hr, "Failed to add message queues to execute action data");
175 iCost += lstMessageQueues.iUninstallCount * COST_MESSAGE_QUEUE_DELETE; 175 iCost += lstMessageQueues.iUninstallCount * COST_MESSAGE_QUEUE_DELETE;
176 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"); 178 ExitOnFailure(hr, "Failed to schedule MessageQueuingExecuteUninstall");
179 } 179 }
180 180
diff --git a/src/ext/Msmq/ca/precomp.h b/src/ext/Msmq/ca/precomp.h
index 6fbd418c..7e8f92f6 100644
--- a/src/ext/Msmq/ca/precomp.h
+++ b/src/ext/Msmq/ca/precomp.h
@@ -20,3 +20,5 @@
20#include "mqqueuesched.h" 20#include "mqqueuesched.h"
21#include "mqutilexec.h" 21#include "mqutilexec.h"
22#include "mqqueueexec.h" 22#include "mqqueueexec.h"
23
24#include "..\..\caDecor.h"
diff --git a/src/internal/SetBuildNumber/Directory.Packages.props.pp b/src/internal/SetBuildNumber/Directory.Packages.props.pp
index 24095f36..721771d0 100644
--- a/src/internal/SetBuildNumber/Directory.Packages.props.pp
+++ b/src/internal/SetBuildNumber/Directory.Packages.props.pp
@@ -38,6 +38,7 @@
38 <PackageVersion Include="WixToolset.UI.wixext" Version="{packageversion}" /> 38 <PackageVersion Include="WixToolset.UI.wixext" Version="{packageversion}" />
39 <PackageVersion Include="WixToolset.Util.wixext" Version="{packageversion}" /> 39 <PackageVersion Include="WixToolset.Util.wixext" Version="{packageversion}" />
40 <PackageVersion Include="WixToolset.Firewall.wixext" Version="{packageversion}" /> 40 <PackageVersion Include="WixToolset.Firewall.wixext" Version="{packageversion}" />
41 <PackageVersion Include="WixToolset.Msmq.wixext" Version="{packageversion}" />
41 </ItemGroup> 42 </ItemGroup>
42 43
43 <ItemGroup> 44 <ItemGroup>
@@ -45,6 +46,7 @@
45 <PackageVersion Include="System.Diagnostics.PerformanceCounter" Version="4.7.0" /> 46 <PackageVersion Include="System.Diagnostics.PerformanceCounter" Version="4.7.0" />
46 <PackageVersion Include="System.DirectoryServices" Version="4.7.0" /> 47 <PackageVersion Include="System.DirectoryServices" Version="4.7.0" />
47 <PackageVersion Include="System.DirectoryServices.AccountManagement" Version="4.7.0" /> 48 <PackageVersion Include="System.DirectoryServices.AccountManagement" Version="4.7.0" />
49 <PackageVersion Include="System.Management" Version="4.7.0" />
48 <PackageVersion Include="System.IO.Compression" Version="4.3.0" /> 50 <PackageVersion Include="System.IO.Compression" Version="4.3.0" />
49 <PackageVersion Include="System.IO.FileSystem.AccessControl" Version="4.7.0" /> 51 <PackageVersion Include="System.IO.FileSystem.AccessControl" Version="4.7.0" />
50 <PackageVersion Include="System.Net.NetworkInformation" Version="4.3.0" /> 52 <PackageVersion Include="System.Net.NetworkInformation" Version="4.3.0" />
diff --git a/src/test/burn/WixTestTools/RuntimePrereqFeatureFactAttribute.cs b/src/test/burn/WixTestTools/RuntimePrereqFeatureFactAttribute.cs
new file mode 100644
index 00000000..aa02d5f3
--- /dev/null
+++ b/src/test/burn/WixTestTools/RuntimePrereqFeatureFactAttribute.cs
@@ -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
3namespace 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}
diff --git a/src/test/burn/WixTestTools/WixTestTools.csproj b/src/test/burn/WixTestTools/WixTestTools.csproj
index 19c09294..7a702949 100644
--- a/src/test/burn/WixTestTools/WixTestTools.csproj
+++ b/src/test/burn/WixTestTools/WixTestTools.csproj
@@ -23,6 +23,7 @@
23 <PackageReference Include="Microsoft.Win32.Registry" /> 23 <PackageReference Include="Microsoft.Win32.Registry" />
24 <PackageReference Include="System.DirectoryServices" /> 24 <PackageReference Include="System.DirectoryServices" />
25 <PackageReference Include="System.DirectoryServices.AccountManagement" /> 25 <PackageReference Include="System.DirectoryServices.AccountManagement" />
26 <PackageReference Include="System.Management" />
26 <PackageReference Include="System.Security.Principal.Windows" /> 27 <PackageReference Include="System.Security.Principal.Windows" />
27 <PackageReference Include="WixInternal.TestSupport" /> 28 <PackageReference Include="WixInternal.TestSupport" />
28 <PackageReference Include="WixToolset.Data" /> 29 <PackageReference Include="WixToolset.Data" />
diff --git a/src/test/msi/TestData/MsmqExtensionTests/MsmqInstall/MsmqInstall.wixproj b/src/test/msi/TestData/MsmqExtensionTests/MsmqInstall/MsmqInstall.wixproj
new file mode 100644
index 00000000..41e39944
--- /dev/null
+++ b/src/test/msi/TestData/MsmqExtensionTests/MsmqInstall/MsmqInstall.wixproj
@@ -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>
diff --git a/src/test/msi/TestData/MsmqExtensionTests/MsmqInstall/product.wxs b/src/test/msi/TestData/MsmqExtensionTests/MsmqInstall/product.wxs
new file mode 100644
index 00000000..241b6aed
--- /dev/null
+++ b/src/test/msi/TestData/MsmqExtensionTests/MsmqInstall/product.wxs
@@ -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>
diff --git a/src/test/msi/WixToolsetTest.MsiE2E/MsmqExtensionTests.cs b/src/test/msi/WixToolsetTest.MsiE2E/MsmqExtensionTests.cs
new file mode 100644
index 00000000..41eb8201
--- /dev/null
+++ b/src/test/msi/WixToolsetTest.MsiE2E/MsmqExtensionTests.cs
@@ -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
3namespace 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}