aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2022-01-05 21:51:00 -0600
committerSean Hall <r.sean.hall@gmail.com>2022-01-06 23:02:07 -0600
commitc2b00d75493798d9f2452d5e5014b14afcb14889 (patch)
tree7788e6a9caf38ff1e921112cd893e53cccb8efbf
parent5b48edfd77da6a7f1c499ad30ea95b66f26ee56d (diff)
downloadwix-c2b00d75493798d9f2452d5e5014b14afcb14889.tar.gz
wix-c2b00d75493798d9f2452d5e5014b14afcb14889.tar.bz2
wix-c2b00d75493798d9f2452d5e5014b14afcb14889.zip
Always run upgrade related bundles last.
#5128
-rw-r--r--src/Directory.Build.props1
-rw-r--r--src/burn/engine/registration.cpp2
-rw-r--r--src/burn/engine/relatedbundle.cpp55
-rw-r--r--src/burn/engine/relatedbundle.h3
-rw-r--r--src/test/burn/BurnE2ETests.sln42
-rw-r--r--src/test/burn/Directory.wixproj.props1
-rw-r--r--src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnly.wixext.csproj15
-rw-r--r--src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnlyBurnBackendExtension.cs43
-rw-r--r--src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnlyCompiler.cs77
-rw-r--r--src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnlyExtensionData.cs16
-rw-r--r--src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnlyExtensionFactory.cs18
-rw-r--r--src/test/burn/ForTestingUseOnlyExtension/Symbols/ForTestingUseOnlyBundleSymbol.cs47
-rw-r--r--src/test/burn/ForTestingUseOnlyExtension/Symbols/ForTestingUseOnlySymbolDefinitions.cs43
-rw-r--r--src/test/burn/TestData/DependencyTests/BundleF/BundleF.props10
-rw-r--r--src/test/burn/TestData/DependencyTests/BundleF/BundleF.wixproj8
-rw-r--r--src/test/burn/TestData/DependencyTests/BundleF/BundleF.wxs3
-rw-r--r--src/test/burn/TestData/DependencyTests/BundleF_AddOnA/BundleF_AddOnA.wixproj3
-rw-r--r--src/test/burn/TestData/DependencyTests/BundleF_AddOnA/BundleF_AddOnA.wxs (renamed from src/test/burn/TestData/DependencyTests/BundleF_AddOnA/BundleF_AddOn.wxs)3
-rw-r--r--src/test/burn/TestData/DependencyTests/BundleF_AddOnB/BundleF_AddOnB.wixproj4
-rw-r--r--src/test/burn/TestData/DependencyTests/BundleF_AddOnB/BundleF_AddOnB.wxs23
-rw-r--r--src/test/burn/TestData/DependencyTests/BundleFv2/BundleFv2.wixproj17
-rw-r--r--src/test/burn/TestData/DependencyTests/BundleFv2/BundleFv2.wxs12
-rw-r--r--src/test/burn/WixToolsetTest.BurnE2E/BurnE2ETests.cs7
-rw-r--r--src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs253
24 files changed, 602 insertions, 104 deletions
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index da099c3d..d068e9e8 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -6,6 +6,7 @@
6 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> 6 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
7 <EnableSourceLink Condition=" '$(NCrunch)' == '1' ">false</EnableSourceLink> 7 <EnableSourceLink Condition=" '$(NCrunch)' == '1' ">false</EnableSourceLink>
8 <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally> 8 <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
9 <NoWarn>$(NoWarn);MSB3026</NoWarn>
9 10
10 <ProjectName Condition=" '$(ProjectName)' == '' ">$(MSBuildProjectName)</ProjectName> 11 <ProjectName Condition=" '$(ProjectName)' == '' ">$(MSBuildProjectName)</ProjectName>
11 <RootBuildFolder>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)..\build\))</RootBuildFolder> 12 <RootBuildFolder>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)..\build\))</RootBuildFolder>
diff --git a/src/burn/engine/registration.cpp b/src/burn/engine/registration.cpp
index 9cc4b199..ffeb39d1 100644
--- a/src/burn/engine/registration.cpp
+++ b/src/burn/engine/registration.cpp
@@ -585,6 +585,8 @@ extern "C" HRESULT RegistrationDetectRelatedBundles(
585 hr = RelatedBundlesInitializeForScope(FALSE, pRegistration, &pRegistration->relatedBundles); 585 hr = RelatedBundlesInitializeForScope(FALSE, pRegistration, &pRegistration->relatedBundles);
586 ExitOnFailure(hr, "Failed to initialize per-user related bundles."); 586 ExitOnFailure(hr, "Failed to initialize per-user related bundles.");
587 587
588 RelatedBundlesSort(&pRegistration->relatedBundles);
589
588LExit: 590LExit:
589 return hr; 591 return hr;
590} 592}
diff --git a/src/burn/engine/relatedbundle.cpp b/src/burn/engine/relatedbundle.cpp
index e2380aab..1eafef07 100644
--- a/src/burn/engine/relatedbundle.cpp
+++ b/src/burn/engine/relatedbundle.cpp
@@ -4,6 +4,11 @@
4 4
5// internal function declarations 5// internal function declarations
6 6
7static __callback int __cdecl CompareRelatedBundles(
8 __in void* pvContext,
9 __in const void* pvLeft,
10 __in const void* pvRight
11 );
7static HRESULT LoadIfRelatedBundle( 12static HRESULT LoadIfRelatedBundle(
8 __in BOOL fPerMachine, 13 __in BOOL fPerMachine,
9 __in HKEY hkUninstallKey, 14 __in HKEY hkUninstallKey,
@@ -128,9 +133,59 @@ LExit:
128 return hr; 133 return hr;
129} 134}
130 135
136extern "C" void RelatedBundlesSort(
137 __in BURN_RELATED_BUNDLES* pRelatedBundles
138 )
139{
140 qsort_s(pRelatedBundles->rgRelatedBundles, pRelatedBundles->cRelatedBundles, sizeof(BURN_RELATED_BUNDLE), CompareRelatedBundles, NULL);
141}
142
131 143
132// internal helper functions 144// internal helper functions
133 145
146static __callback int __cdecl CompareRelatedBundles(
147 __in void* /*pvContext*/,
148 __in const void* pvLeft,
149 __in const void* pvRight
150 )
151{
152 int ret = 0;
153 const BURN_RELATED_BUNDLE* pBundleLeft = static_cast<const BURN_RELATED_BUNDLE*>(pvLeft);
154 const BURN_RELATED_BUNDLE* pBundleRight = static_cast<const BURN_RELATED_BUNDLE*>(pvRight);
155
156 // Sort by relation type, then version, then bundle id.
157 if (pBundleLeft->relationType != pBundleRight->relationType)
158 {
159 // Upgrade bundles last, everything else according to the enum.
160 if (BOOTSTRAPPER_RELATION_UPGRADE == pBundleLeft->relationType)
161 {
162 ret = 1;
163 }
164 else if (BOOTSTRAPPER_RELATION_UPGRADE == pBundleRight->relationType)
165 {
166 ret = -1;
167 }
168 else if (pBundleLeft->relationType < pBundleRight->relationType)
169 {
170 ret = -1;
171 }
172 else
173 {
174 ret = 1;
175 }
176 }
177 else
178 {
179 VerCompareParsedVersions(pBundleLeft->pVersion, pBundleRight->pVersion, &ret);
180 if (0 == ret)
181 {
182 ret = ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, pBundleLeft->package.sczId, -1, pBundleRight->package.sczId, -1) - 2;
183 }
184 }
185
186 return ret;
187}
188
134static HRESULT LoadIfRelatedBundle( 189static HRESULT LoadIfRelatedBundle(
135 __in BOOL fPerMachine, 190 __in BOOL fPerMachine,
136 __in HKEY hkUninstallKey, 191 __in HKEY hkUninstallKey,
diff --git a/src/burn/engine/relatedbundle.h b/src/burn/engine/relatedbundle.h
index 0113c8ee..be039421 100644
--- a/src/burn/engine/relatedbundle.h
+++ b/src/burn/engine/relatedbundle.h
@@ -19,6 +19,9 @@ HRESULT RelatedBundleFindById(
19 __in_z LPCWSTR wzId, 19 __in_z LPCWSTR wzId,
20 __out BURN_RELATED_BUNDLE** ppRelatedBundle 20 __out BURN_RELATED_BUNDLE** ppRelatedBundle
21 ); 21 );
22void RelatedBundlesSort(
23 __in BURN_RELATED_BUNDLES* pRelatedBundles
24 );
22 25
23#if defined(__cplusplus) 26#if defined(__cplusplus)
24} 27}
diff --git a/src/test/burn/BurnE2ETests.sln b/src/test/burn/BurnE2ETests.sln
index 5d69855c..98cd3575 100644
--- a/src/test/burn/BurnE2ETests.sln
+++ b/src/test/burn/BurnE2ETests.sln
@@ -1,7 +1,7 @@
1 1
2Microsoft Visual Studio Solution File, Format Version 12.00 2Microsoft Visual Studio Solution File, Format Version 12.00
3# Visual Studio Version 16 3# Visual Studio Version 17
4VisualStudioVersion = 16.0.29503.13 4VisualStudioVersion = 17.0.31919.166
5MinimumVisualStudioVersion = 10.0.40219.1 5MinimumVisualStudioVersion = 10.0.40219.1
6Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestBA", "TestBA\TestBA.csproj", "{04022D35-6D75-49D0-91D2-4208E09DBA6D}" 6Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestBA", "TestBA\TestBA.csproj", "{04022D35-6D75-49D0-91D2-4208E09DBA6D}"
7EndProject 7EndProject
@@ -13,6 +13,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.WixBA", "WixTool
13EndProject 13EndProject
14Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.BurnE2E", "WixToolsetTest.BurnE2E\WixToolsetTest.BurnE2E.csproj", "{FED9D707-E5C3-4867-87B0-FABDB5EB0823}" 14Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.BurnE2E", "WixToolsetTest.BurnE2E\WixToolsetTest.BurnE2E.csproj", "{FED9D707-E5C3-4867-87B0-FABDB5EB0823}"
15EndProject 15EndProject
16Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ForTestingUseOnly.wixext", "ForTestingUseOnlyExtension\ForTestingUseOnly.wixext.csproj", "{0037E6A3-45C6-4AB6-BC8C-1CB0C145E992}"
17EndProject
16Global 18Global
17 GlobalSection(SolutionConfigurationPlatforms) = preSolution 19 GlobalSection(SolutionConfigurationPlatforms) = preSolution
18 Debug|Any CPU = Debug|Any CPU 20 Debug|Any CPU = Debug|Any CPU
@@ -59,18 +61,6 @@ Global
59 {3D3B02F3-79B6-4BD5-AD49-2889DA3849A7}.Release|x64.Build.0 = Release|Any CPU 61 {3D3B02F3-79B6-4BD5-AD49-2889DA3849A7}.Release|x64.Build.0 = Release|Any CPU
60 {3D3B02F3-79B6-4BD5-AD49-2889DA3849A7}.Release|x86.ActiveCfg = Release|Any CPU 62 {3D3B02F3-79B6-4BD5-AD49-2889DA3849A7}.Release|x86.ActiveCfg = Release|Any CPU
61 {3D3B02F3-79B6-4BD5-AD49-2889DA3849A7}.Release|x86.Build.0 = Release|Any CPU 63 {3D3B02F3-79B6-4BD5-AD49-2889DA3849A7}.Release|x86.Build.0 = Release|Any CPU
62 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
63 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Debug|Any CPU.Build.0 = Debug|Any CPU
64 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Debug|x64.ActiveCfg = Debug|Any CPU
65 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Debug|x64.Build.0 = Debug|Any CPU
66 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Debug|x86.ActiveCfg = Debug|Any CPU
67 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Debug|x86.Build.0 = Debug|Any CPU
68 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Release|Any CPU.ActiveCfg = Release|Any CPU
69 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Release|Any CPU.Build.0 = Release|Any CPU
70 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Release|x64.ActiveCfg = Release|Any CPU
71 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Release|x64.Build.0 = Release|Any CPU
72 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Release|x86.ActiveCfg = Release|Any CPU
73 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Release|x86.Build.0 = Release|Any CPU
74 {7C27518B-84AD-4679-8EF4-29DF552CF1AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 64 {7C27518B-84AD-4679-8EF4-29DF552CF1AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
75 {7C27518B-84AD-4679-8EF4-29DF552CF1AC}.Debug|Any CPU.Build.0 = Debug|Any CPU 65 {7C27518B-84AD-4679-8EF4-29DF552CF1AC}.Debug|Any CPU.Build.0 = Debug|Any CPU
76 {7C27518B-84AD-4679-8EF4-29DF552CF1AC}.Debug|x64.ActiveCfg = Debug|Any CPU 66 {7C27518B-84AD-4679-8EF4-29DF552CF1AC}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -83,6 +73,30 @@ Global
83 {7C27518B-84AD-4679-8EF4-29DF552CF1AC}.Release|x64.Build.0 = Release|Any CPU 73 {7C27518B-84AD-4679-8EF4-29DF552CF1AC}.Release|x64.Build.0 = Release|Any CPU
84 {7C27518B-84AD-4679-8EF4-29DF552CF1AC}.Release|x86.ActiveCfg = Release|Any CPU 74 {7C27518B-84AD-4679-8EF4-29DF552CF1AC}.Release|x86.ActiveCfg = Release|Any CPU
85 {7C27518B-84AD-4679-8EF4-29DF552CF1AC}.Release|x86.Build.0 = Release|Any CPU 75 {7C27518B-84AD-4679-8EF4-29DF552CF1AC}.Release|x86.Build.0 = Release|Any CPU
76 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
77 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Debug|Any CPU.Build.0 = Debug|Any CPU
78 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Debug|x64.ActiveCfg = Debug|Any CPU
79 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Debug|x64.Build.0 = Debug|Any CPU
80 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Debug|x86.ActiveCfg = Debug|Any CPU
81 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Debug|x86.Build.0 = Debug|Any CPU
82 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Release|Any CPU.ActiveCfg = Release|Any CPU
83 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Release|Any CPU.Build.0 = Release|Any CPU
84 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Release|x64.ActiveCfg = Release|Any CPU
85 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Release|x64.Build.0 = Release|Any CPU
86 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Release|x86.ActiveCfg = Release|Any CPU
87 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Release|x86.Build.0 = Release|Any CPU
88 {0037E6A3-45C6-4AB6-BC8C-1CB0C145E992}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
89 {0037E6A3-45C6-4AB6-BC8C-1CB0C145E992}.Debug|Any CPU.Build.0 = Debug|Any CPU
90 {0037E6A3-45C6-4AB6-BC8C-1CB0C145E992}.Debug|x64.ActiveCfg = Debug|Any CPU
91 {0037E6A3-45C6-4AB6-BC8C-1CB0C145E992}.Debug|x64.Build.0 = Debug|Any CPU
92 {0037E6A3-45C6-4AB6-BC8C-1CB0C145E992}.Debug|x86.ActiveCfg = Debug|Any CPU
93 {0037E6A3-45C6-4AB6-BC8C-1CB0C145E992}.Debug|x86.Build.0 = Debug|Any CPU
94 {0037E6A3-45C6-4AB6-BC8C-1CB0C145E992}.Release|Any CPU.ActiveCfg = Release|Any CPU
95 {0037E6A3-45C6-4AB6-BC8C-1CB0C145E992}.Release|Any CPU.Build.0 = Release|Any CPU
96 {0037E6A3-45C6-4AB6-BC8C-1CB0C145E992}.Release|x64.ActiveCfg = Release|Any CPU
97 {0037E6A3-45C6-4AB6-BC8C-1CB0C145E992}.Release|x64.Build.0 = Release|Any CPU
98 {0037E6A3-45C6-4AB6-BC8C-1CB0C145E992}.Release|x86.ActiveCfg = Release|Any CPU
99 {0037E6A3-45C6-4AB6-BC8C-1CB0C145E992}.Release|x86.Build.0 = Release|Any CPU
86 EndGlobalSection 100 EndGlobalSection
87 GlobalSection(SolutionProperties) = preSolution 101 GlobalSection(SolutionProperties) = preSolution
88 HideSolutionNode = FALSE 102 HideSolutionNode = FALSE
diff --git a/src/test/burn/Directory.wixproj.props b/src/test/burn/Directory.wixproj.props
index 06cf5b1d..af5ef196 100644
--- a/src/test/burn/Directory.wixproj.props
+++ b/src/test/burn/Directory.wixproj.props
@@ -7,5 +7,6 @@
7 <DefaultCompressionLevel>None</DefaultCompressionLevel> 7 <DefaultCompressionLevel>None</DefaultCompressionLevel>
8 <CompilerAdditionalOptions>-wx</CompilerAdditionalOptions> 8 <CompilerAdditionalOptions>-wx</CompilerAdditionalOptions>
9 <SuppressSpecificWarnings>1154;$(SuppressSpecificWarnings)</SuppressSpecificWarnings> 9 <SuppressSpecificWarnings>1154;$(SuppressSpecificWarnings)</SuppressSpecificWarnings>
10 <ForTestingUseOnlyWixextPath>$(BaseOutputPath)$(Configuration)\netstandard2.0\ForTestingUseOnly.wixext.dll</ForTestingUseOnlyWixextPath>
10 </PropertyGroup> 11 </PropertyGroup>
11</Project> 12</Project>
diff --git a/src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnly.wixext.csproj b/src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnly.wixext.csproj
new file mode 100644
index 00000000..c3861a96
--- /dev/null
+++ b/src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnly.wixext.csproj
@@ -0,0 +1,15 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- 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. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netstandard2.0</TargetFramework>
7 <RootNamespace>ForTestingUseOnly</RootNamespace>
8 <DebugType>embedded</DebugType>
9 <IncludeSymbols>true</IncludeSymbols>
10 </PropertyGroup>
11
12 <ItemGroup>
13 <PackageReference Include="WixToolset.Extensibility" PrivateAssets="all" />
14 </ItemGroup>
15</Project>
diff --git a/src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnlyBurnBackendExtension.cs b/src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnlyBurnBackendExtension.cs
new file mode 100644
index 00000000..fff23274
--- /dev/null
+++ b/src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnlyBurnBackendExtension.cs
@@ -0,0 +1,43 @@
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 ForTestingUseOnly
4{
5 using System.Collections.Generic;
6 using System.Linq;
7 using ForTestingUseOnly.Symbols;
8 using WixToolset.Data;
9 using WixToolset.Data.Symbols;
10 using WixToolset.Extensibility;
11
12 /// <summary>
13 /// Extension for doing completely unsupported things in the name of testing.
14 /// </summary>
15 public class ForTestingUseOnlyBurnBackendExtension : BaseBurnBackendBinderExtension
16 {
17 private static readonly IntermediateSymbolDefinition[] BurnSymbolDefinitions =
18 {
19 ForTestingUseOnlySymbolDefinitions.ForTestingUseOnlyBundle,
20 };
21
22 protected override IReadOnlyCollection<IntermediateSymbolDefinition> SymbolDefinitions => BurnSymbolDefinitions;
23
24 public override void SymbolsFinalized(IntermediateSection section)
25 {
26 base.SymbolsFinalized(section);
27
28 this.FinalizeBundleSymbol(section);
29 }
30
31 private void FinalizeBundleSymbol(IntermediateSection section)
32 {
33 var forTestingUseOnlyBundleSymbol = section.Symbols.OfType<ForTestingUseOnlyBundleSymbol>().SingleOrDefault();
34 if (null == forTestingUseOnlyBundleSymbol)
35 {
36 return;
37 }
38
39 var bundleSymbol = section.Symbols.OfType<WixBundleSymbol>().Single();
40 bundleSymbol.ProviderKey = bundleSymbol.BundleId = forTestingUseOnlyBundleSymbol.BundleId;
41 }
42 }
43}
diff --git a/src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnlyCompiler.cs b/src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnlyCompiler.cs
new file mode 100644
index 00000000..4963c941
--- /dev/null
+++ b/src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnlyCompiler.cs
@@ -0,0 +1,77 @@
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 ForTestingUseOnly
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Xml.Linq;
8 using ForTestingUseOnly.Symbols;
9 using WixToolset.Data;
10 using WixToolset.Extensibility;
11
12 /// <summary>
13 /// Extension for doing completely unsupported things in the name of testing.
14 /// </summary>
15 public sealed class ForTestingUseOnlyCompiler : BaseCompilerExtension
16 {
17 public override XNamespace Namespace => "http://wixtoolset.org/schemas/v4/wxs/fortestinguseonly";
18
19 public override void ParseElement(Intermediate intermediate, IntermediateSection section, XElement parentElement, XElement element, IDictionary<string, string> context)
20 {
21 switch (element.Name.LocalName)
22 {
23 case "ForTestingUseOnlyBundle":
24 this.ParseForTestingUseOnlyBundleElement(intermediate, section, element);
25 break;
26 default:
27 this.ParseHelper.UnexpectedElement(parentElement, element);
28 break;
29 }
30 }
31
32 private void ParseForTestingUseOnlyBundleElement(Intermediate intermediate, IntermediateSection section, XElement element)
33 {
34 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
35 string bundleId = null;
36
37 foreach (var attrib in element.Attributes())
38 {
39 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
40 {
41 switch (attrib.Name.LocalName)
42 {
43 case "Id":
44 bundleId = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
45 break;
46 default:
47 this.ParseHelper.UnexpectedAttribute(element, attrib);
48 break;
49 }
50 }
51 else
52 {
53 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
54 }
55 }
56
57 if (null == bundleId)
58 {
59 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Id"));
60 }
61 else
62 {
63 bundleId = Guid.Parse(bundleId).ToString("B").ToUpperInvariant();
64 }
65
66 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
67
68 if (!this.Messaging.EncounteredError)
69 {
70 section.AddSymbol(new ForTestingUseOnlyBundleSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, "ForTestingUseOnlyBundle"))
71 {
72 BundleId = bundleId,
73 });
74 }
75 }
76 }
77}
diff --git a/src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnlyExtensionData.cs b/src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnlyExtensionData.cs
new file mode 100644
index 00000000..3276b2db
--- /dev/null
+++ b/src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnlyExtensionData.cs
@@ -0,0 +1,16 @@
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 ForTestingUseOnly
4{
5 using WixToolset.Data;
6 using WixToolset.Extensibility;
7
8 public sealed class ForTestingUseOnlyExtensionData : BaseExtensionData
9 {
10 public override bool TryGetSymbolDefinitionByName(string name, out IntermediateSymbolDefinition symbolDefinition)
11 {
12 symbolDefinition = ForTestingUseOnlySymbolDefinitions.ByName(name);
13 return symbolDefinition != null;
14 }
15 }
16}
diff --git a/src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnlyExtensionFactory.cs b/src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnlyExtensionFactory.cs
new file mode 100644
index 00000000..f71a0c2e
--- /dev/null
+++ b/src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnlyExtensionFactory.cs
@@ -0,0 +1,18 @@
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 ForTestingUseOnly
4{
5 using System;
6 using System.Collections.Generic;
7 using WixToolset.Extensibility;
8
9 public class ForTestingUseOnlyExtensionFactory : BaseExtensionFactory
10 {
11 protected override IReadOnlyCollection<Type> ExtensionTypes => new[]
12 {
13 typeof(ForTestingUseOnlyCompiler),
14 typeof(ForTestingUseOnlyExtensionData),
15 typeof(ForTestingUseOnlyBurnBackendExtension),
16 };
17 }
18}
diff --git a/src/test/burn/ForTestingUseOnlyExtension/Symbols/ForTestingUseOnlyBundleSymbol.cs b/src/test/burn/ForTestingUseOnlyExtension/Symbols/ForTestingUseOnlyBundleSymbol.cs
new file mode 100644
index 00000000..a17dfe31
--- /dev/null
+++ b/src/test/burn/ForTestingUseOnlyExtension/Symbols/ForTestingUseOnlyBundleSymbol.cs
@@ -0,0 +1,47 @@
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 ForTestingUseOnly
4{
5 using WixToolset.Data;
6 using ForTestingUseOnly.Symbols;
7
8 public static partial class ForTestingUseOnlySymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ForTestingUseOnlyBundle = new IntermediateSymbolDefinition(
11 ForTestingUseOnlySymbolDefinitionType.ForTestingUseOnlyBundle.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ForTestingUseOnlyBundleSymbolFields.BundleId), IntermediateFieldType.String),
15 },
16 typeof(ForTestingUseOnlyBundleSymbol));
17 }
18}
19
20namespace ForTestingUseOnly.Symbols
21{
22 using WixToolset.Data;
23
24 public enum ForTestingUseOnlyBundleSymbolFields
25 {
26 BundleId,
27 }
28
29 public class ForTestingUseOnlyBundleSymbol : IntermediateSymbol
30 {
31 public ForTestingUseOnlyBundleSymbol() : base(ForTestingUseOnlySymbolDefinitions.ForTestingUseOnlyBundle, null, null)
32 {
33 }
34
35 public ForTestingUseOnlyBundleSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ForTestingUseOnlySymbolDefinitions.ForTestingUseOnlyBundle, sourceLineNumber, id)
36 {
37 }
38
39 public IntermediateField this[ForTestingUseOnlyBundleSymbolFields index] => this.Fields[(int)index];
40
41 public string BundleId
42 {
43 get => this.Fields[(int)ForTestingUseOnlyBundleSymbolFields.BundleId].AsString();
44 set => this.Set((int)ForTestingUseOnlyBundleSymbolFields.BundleId, value);
45 }
46 }
47}
diff --git a/src/test/burn/ForTestingUseOnlyExtension/Symbols/ForTestingUseOnlySymbolDefinitions.cs b/src/test/burn/ForTestingUseOnlyExtension/Symbols/ForTestingUseOnlySymbolDefinitions.cs
new file mode 100644
index 00000000..82c3833e
--- /dev/null
+++ b/src/test/burn/ForTestingUseOnlyExtension/Symbols/ForTestingUseOnlySymbolDefinitions.cs
@@ -0,0 +1,43 @@
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 ForTestingUseOnly
4{
5 using System;
6 using WixToolset.Data;
7 using WixToolset.Data.Burn;
8
9 public enum ForTestingUseOnlySymbolDefinitionType
10 {
11 ForTestingUseOnlyBundle,
12 }
13
14 public static partial class ForTestingUseOnlySymbolDefinitions
15 {
16 public static IntermediateSymbolDefinition ByName(string name)
17 {
18 if (!Enum.TryParse(name, out ForTestingUseOnlySymbolDefinitionType type))
19 {
20 return null;
21 }
22
23 return ByType(type);
24 }
25
26 public static IntermediateSymbolDefinition ByType(ForTestingUseOnlySymbolDefinitionType type)
27 {
28 switch (type)
29 {
30 case ForTestingUseOnlySymbolDefinitionType.ForTestingUseOnlyBundle:
31 return ForTestingUseOnlySymbolDefinitions.ForTestingUseOnlyBundle;
32
33 default:
34 throw new ArgumentOutOfRangeException(nameof(type));
35 }
36 }
37
38 static ForTestingUseOnlySymbolDefinitions()
39 {
40 ForTestingUseOnlyBundle.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag);
41 }
42 }
43}
diff --git a/src/test/burn/TestData/DependencyTests/BundleF/BundleF.props b/src/test/burn/TestData/DependencyTests/BundleF/BundleF.props
new file mode 100644
index 00000000..91fdc82c
--- /dev/null
+++ b/src/test/burn/TestData/DependencyTests/BundleF/BundleF.props
@@ -0,0 +1,10 @@
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>
3 <PropertyGroup>
4 <OutputType>Bundle</OutputType>
5 <UpgradeCode>{EC2B2B3F-E57C-45A4-A0E8-762156DAD99D}</UpgradeCode>
6 </PropertyGroup>
7 <ItemGroup>
8 <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
9 </ItemGroup>
10</Project>
diff --git a/src/test/burn/TestData/DependencyTests/BundleF/BundleF.wixproj b/src/test/burn/TestData/DependencyTests/BundleF/BundleF.wixproj
index 4473657a..75481940 100644
--- a/src/test/burn/TestData/DependencyTests/BundleF/BundleF.wixproj
+++ b/src/test/burn/TestData/DependencyTests/BundleF/BundleF.wixproj
@@ -1,14 +1,11 @@
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. --> 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"> 2<Project Sdk="WixToolset.Sdk">
3 <Import Project="BundleF.props" />
3 <PropertyGroup> 4 <PropertyGroup>
4 <OutputType>Bundle</OutputType> 5 <OutputType>Bundle</OutputType>
5 <UpgradeCode>{EC2B2B3F-E57C-45A4-A0E8-762156DAD99D}</UpgradeCode>
6 <Version>1.0.0.0</Version> 6 <Version>1.0.0.0</Version>
7 </PropertyGroup> 7 </PropertyGroup>
8 <ItemGroup> 8 <ItemGroup>
9 <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
10 </ItemGroup>
11 <ItemGroup>
12 <ProjectReference Include="..\PackageAv1\PackageAv1.wixproj" /> 9 <ProjectReference Include="..\PackageAv1\PackageAv1.wixproj" />
13 <ProjectReference Include="..\PackageB\PackageB.wixproj" /> 10 <ProjectReference Include="..\PackageB\PackageB.wixproj" />
14 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" /> 11 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
@@ -18,4 +15,7 @@
18 <PackageReference Include="WixToolset.NetFx.wixext" /> 15 <PackageReference Include="WixToolset.NetFx.wixext" />
19 <PackageReference Include="WixToolset.Util.wixext" /> 16 <PackageReference Include="WixToolset.Util.wixext" />
20 </ItemGroup> 17 </ItemGroup>
18 <ItemGroup>
19 <WixExtension Include="$(ForTestingUseOnlyWixextPath)" />
20 </ItemGroup>
21</Project> \ No newline at end of file 21</Project> \ No newline at end of file
diff --git a/src/test/burn/TestData/DependencyTests/BundleF/BundleF.wxs b/src/test/burn/TestData/DependencyTests/BundleF/BundleF.wxs
index 1347836a..0f51b00d 100644
--- a/src/test/burn/TestData/DependencyTests/BundleF/BundleF.wxs
+++ b/src/test/burn/TestData/DependencyTests/BundleF/BundleF.wxs
@@ -1,7 +1,8 @@
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. --> 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 2
3<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> 3<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:fortestinguseonly="http://wixtoolset.org/schemas/v4/wxs/fortestinguseonly">
4 <Fragment> 4 <Fragment>
5 <fortestinguseonly:ForTestingUseOnlyBundle Id="{5E9D5B04-41EA-4196-954C-1F7357C31FB0}" />
5 <RelatedBundle Id="583B5ECB-04E6-4837-A30C-A1ADCBE24235" Action="Detect" /> 6 <RelatedBundle Id="583B5ECB-04E6-4837-A30C-A1ADCBE24235" Action="Detect" />
6 7
7 <PackageGroup Id="BundlePackages"> 8 <PackageGroup Id="BundlePackages">
diff --git a/src/test/burn/TestData/DependencyTests/BundleF_AddOnA/BundleF_AddOnA.wixproj b/src/test/burn/TestData/DependencyTests/BundleF_AddOnA/BundleF_AddOnA.wixproj
index 2674b9d6..14072fed 100644
--- a/src/test/burn/TestData/DependencyTests/BundleF_AddOnA/BundleF_AddOnA.wixproj
+++ b/src/test/burn/TestData/DependencyTests/BundleF_AddOnA/BundleF_AddOnA.wixproj
@@ -17,4 +17,7 @@
17 <PackageReference Include="WixToolset.NetFx.wixext" /> 17 <PackageReference Include="WixToolset.NetFx.wixext" />
18 <PackageReference Include="WixToolset.Util.wixext" /> 18 <PackageReference Include="WixToolset.Util.wixext" />
19 </ItemGroup> 19 </ItemGroup>
20 <ItemGroup>
21 <WixExtension Include="$(ForTestingUseOnlyWixextPath)" />
22 </ItemGroup>
20</Project> \ No newline at end of file 23</Project> \ No newline at end of file
diff --git a/src/test/burn/TestData/DependencyTests/BundleF_AddOnA/BundleF_AddOn.wxs b/src/test/burn/TestData/DependencyTests/BundleF_AddOnA/BundleF_AddOnA.wxs
index 30fba657..c1b65656 100644
--- a/src/test/burn/TestData/DependencyTests/BundleF_AddOnA/BundleF_AddOn.wxs
+++ b/src/test/burn/TestData/DependencyTests/BundleF_AddOnA/BundleF_AddOnA.wxs
@@ -2,8 +2,9 @@
2 2
3<?define TestExeRegistryKey = Software\WiX\Tests\$(var.TestGroupName)\ExeA?> 3<?define TestExeRegistryKey = Software\WiX\Tests\$(var.TestGroupName)\ExeA?>
4 4
5<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util"> 5<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util" xmlns:fortestinguseonly="http://wixtoolset.org/schemas/v4/wxs/fortestinguseonly">
6 <Fragment> 6 <Fragment>
7 <fortestinguseonly:ForTestingUseOnlyBundle Id="{FE6B19EC-D52F-4F77-88E5-87FAE11E95D6}" />
7 <RelatedBundle Id="583B5ECB-04E6-4837-A30C-A1ADCBE24235" Action="Addon" /> 8 <RelatedBundle Id="583B5ECB-04E6-4837-A30C-A1ADCBE24235" Action="Addon" />
8 <util:RegistrySearch Root="HKLM" Key="$(var.TestExeRegistryKey)" Value="Version" Variable="ExeA_Version" /> 9 <util:RegistrySearch Root="HKLM" Key="$(var.TestExeRegistryKey)" Value="Version" Variable="ExeA_Version" />
9 10
diff --git a/src/test/burn/TestData/DependencyTests/BundleF_AddOnB/BundleF_AddOnB.wixproj b/src/test/burn/TestData/DependencyTests/BundleF_AddOnB/BundleF_AddOnB.wixproj
index 542f3562..c467222f 100644
--- a/src/test/burn/TestData/DependencyTests/BundleF_AddOnB/BundleF_AddOnB.wixproj
+++ b/src/test/burn/TestData/DependencyTests/BundleF_AddOnB/BundleF_AddOnB.wixproj
@@ -6,7 +6,6 @@
6 <Version>1.0.0.0</Version> 6 <Version>1.0.0.0</Version>
7 </PropertyGroup> 7 </PropertyGroup>
8 <ItemGroup> 8 <ItemGroup>
9 <Compile Include="..\BundleF_AddOnA\BundleF_AddOn.wxs" Link="BundleF_AddOn.wxs" />
10 <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" /> 9 <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
11 </ItemGroup> 10 </ItemGroup>
12 <ItemGroup> 11 <ItemGroup>
@@ -18,4 +17,7 @@
18 <PackageReference Include="WixToolset.NetFx.wixext" /> 17 <PackageReference Include="WixToolset.NetFx.wixext" />
19 <PackageReference Include="WixToolset.Util.wixext" /> 18 <PackageReference Include="WixToolset.Util.wixext" />
20 </ItemGroup> 19 </ItemGroup>
20 <ItemGroup>
21 <WixExtension Include="$(ForTestingUseOnlyWixextPath)" />
22 </ItemGroup>
21</Project> \ No newline at end of file 23</Project> \ No newline at end of file
diff --git a/src/test/burn/TestData/DependencyTests/BundleF_AddOnB/BundleF_AddOnB.wxs b/src/test/burn/TestData/DependencyTests/BundleF_AddOnB/BundleF_AddOnB.wxs
new file mode 100644
index 00000000..8a5722f7
--- /dev/null
+++ b/src/test/burn/TestData/DependencyTests/BundleF_AddOnB/BundleF_AddOnB.wxs
@@ -0,0 +1,23 @@
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<?define TestExeRegistryKey = Software\WiX\Tests\$(var.TestGroupName)\ExeA?>
4
5<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util" xmlns:fortestinguseonly="http://wixtoolset.org/schemas/v4/wxs/fortestinguseonly">
6 <Fragment>
7 <fortestinguseonly:ForTestingUseOnlyBundle Id="{B774BF3B-3E89-4D42-9D29-AFAB27C5772D}" />
8 <RelatedBundle Id="583B5ECB-04E6-4837-A30C-A1ADCBE24235" Action="Addon" />
9 <util:RegistrySearch Root="HKLM" Key="$(var.TestExeRegistryKey)" Value="Version" Variable="ExeA_Version" />
10
11 <PackageGroup Id="BundlePackages">
12 <MsiPackage Id="PackageA" SourceFile="$(var.PackageAv1.TargetPath)" />
13 <ExePackage Id="ExeA" Cache="remove" PerMachine="yes"
14 DetectCondition="ExeA_Version AND ExeA_Version &gt;= v$(var.Version)"
15 InstallArguments="/regw &quot;HKLM\$(var.TestExeRegistryKey),Version,String,$(var.Version)&quot;"
16 RepairArguments="/regw &quot;HKLM\$(var.TestExeRegistryKey),Version,String,$(var.Version)&quot;"
17 UninstallArguments="/regd &quot;HKLM\$(var.TestExeRegistryKey),Version&quot;">
18 <Provides Key="$(var.TestGroupName)_ExeA,v1.0" Version="$(var.Version)" />
19 <PayloadGroupRef Id="TestExePayloads" />
20 </ExePackage>
21 </PackageGroup>
22 </Fragment>
23</Wix>
diff --git a/src/test/burn/TestData/DependencyTests/BundleFv2/BundleFv2.wixproj b/src/test/burn/TestData/DependencyTests/BundleFv2/BundleFv2.wixproj
new file mode 100644
index 00000000..7b6aa9f3
--- /dev/null
+++ b/src/test/burn/TestData/DependencyTests/BundleFv2/BundleFv2.wixproj
@@ -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<Project Sdk="WixToolset.Sdk">
3 <Import Project="..\BundleF\BundleF.props" />
4 <PropertyGroup>
5 <Version>2.0.0.0</Version>
6 </PropertyGroup>
7 <ItemGroup>
8 <ProjectReference Include="..\PackageAv1\PackageAv1.wixproj" />
9 <ProjectReference Include="..\PackageB\PackageB.wixproj" />
10 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
11 </ItemGroup>
12 <ItemGroup>
13 <PackageReference Include="WixToolset.Bal.wixext" />
14 <PackageReference Include="WixToolset.NetFx.wixext" />
15 <PackageReference Include="WixToolset.Util.wixext" />
16 </ItemGroup>
17</Project> \ No newline at end of file
diff --git a/src/test/burn/TestData/DependencyTests/BundleFv2/BundleFv2.wxs b/src/test/burn/TestData/DependencyTests/BundleFv2/BundleFv2.wxs
new file mode 100644
index 00000000..1347836a
--- /dev/null
+++ b/src/test/burn/TestData/DependencyTests/BundleFv2/BundleFv2.wxs
@@ -0,0 +1,12 @@
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<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
4 <Fragment>
5 <RelatedBundle Id="583B5ECB-04E6-4837-A30C-A1ADCBE24235" Action="Detect" />
6
7 <PackageGroup Id="BundlePackages">
8 <MsiPackage Id="PackageA" SourceFile="$(var.PackageAv1.TargetPath)" />
9 <MsiPackage Id="PackageB" SourceFile="$(var.PackageB.TargetPath)" />
10 </PackageGroup>
11 </Fragment>
12</Wix>
diff --git a/src/test/burn/WixToolsetTest.BurnE2E/BurnE2ETests.cs b/src/test/burn/WixToolsetTest.BurnE2E/BurnE2ETests.cs
index 392b675d..a7402d94 100644
--- a/src/test/burn/WixToolsetTest.BurnE2E/BurnE2ETests.cs
+++ b/src/test/burn/WixToolsetTest.BurnE2E/BurnE2ETests.cs
@@ -15,6 +15,13 @@ namespace WixToolsetTest.BurnE2E
15 15
16 private Stack<IDisposable> Installers { get; } = new Stack<IDisposable>(); 16 private Stack<IDisposable> Installers { get; } = new Stack<IDisposable>();
17 17
18 protected bool SupportAddonAndPatchRelatedBundles =>
19#if SUPPORT_ADDON_AND_PATCH_RELATED_BUNDLES
20 true;
21#else
22 false;
23#endif
24
18 protected BundleInstaller CreateBundleInstaller(string name) 25 protected BundleInstaller CreateBundleInstaller(string name)
19 { 26 {
20 var installer = new BundleInstaller(this.TestContext, name); 27 var installer = new BundleInstaller(this.TestContext, name);
diff --git a/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs b/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs
index 309241d9..b08cd54f 100644
--- a/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs
+++ b/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs
@@ -123,11 +123,7 @@ namespace WixToolsetTest.BurnE2E
123 bundleAv1.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.1.0"); 123 bundleAv1.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.1.0");
124 } 124 }
125 125
126#if SUPPORT_ADDON_AND_PATCH_RELATED_BUNDLES
127 [Fact(Skip = "https://github.com/wixtoolset/issues/issues/6401")] 126 [Fact(Skip = "https://github.com/wixtoolset/issues/issues/6401")]
128#else
129 [Fact(Skip = "addon/patch related bundle")]
130#endif
131 public void CanMinorUpgradeDependencyPackageFromPatchBundle() 127 public void CanMinorUpgradeDependencyPackageFromPatchBundle()
132 { 128 {
133 var originalVersion = "1.0.0.0"; 129 var originalVersion = "1.0.0.0";
@@ -145,34 +141,39 @@ namespace WixToolsetTest.BurnE2E
145 packageBv101.VerifyInstalled(false); 141 packageBv101.VerifyInstalled(false);
146 142
147 bundleJ.Install(); 143 bundleJ.Install();
148 bundleJ.VerifyRegisteredAndInPackageCache(); 144 if (this.SupportAddonAndPatchRelatedBundles)
145 {
146 bundleJ.VerifyRegisteredAndInPackageCache();
149 147
150 packageA.VerifyInstalled(true); 148 packageA.VerifyInstalled(true);
151 packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion); 149 packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion);
152 packageBv1.VerifyInstalled(true); 150 packageBv1.VerifyInstalled(true);
151 }
153 152
154 bundleJ_Patch.Install(); 153 bundleJ_Patch.Install();
155 bundleJ_Patch.VerifyRegisteredAndInPackageCache(); 154 if (this.SupportAddonAndPatchRelatedBundles)
155 {
156 bundleJ_Patch.VerifyRegisteredAndInPackageCache();
156 157
157 packageA.VerifyInstalled(true); 158 packageA.VerifyInstalled(true);
158 packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion); 159 packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion);
159 packageBv1.VerifyInstalled(false); 160 packageBv1.VerifyInstalled(false);
160 packageBv101.VerifyInstalled(true); 161 packageBv101.VerifyInstalled(true);
162 }
161 163
162 bundleJ.Uninstall(); 164 bundleJ.Uninstall();
163 bundleJ.VerifyUnregisteredAndRemovedFromPackageCache(); 165 if (this.SupportAddonAndPatchRelatedBundles)
164 bundleJ_Patch.VerifyUnregisteredAndRemovedFromPackageCache(); 166 {
165 167 bundleJ.VerifyUnregisteredAndRemovedFromPackageCache();
166 packageA.VerifyInstalled(false); 168 bundleJ_Patch.VerifyUnregisteredAndRemovedFromPackageCache();
167 packageBv1.VerifyInstalled(false); 169
168 packageBv101.VerifyInstalled(false); 170 packageA.VerifyInstalled(false);
171 packageBv1.VerifyInstalled(false);
172 packageBv101.VerifyInstalled(false);
173 }
169 } 174 }
170 175
171#if SUPPORT_ADDON_AND_PATCH_RELATED_BUNDLES
172 [Fact(Skip = "https://github.com/wixtoolset/issues/issues/6401")] 176 [Fact(Skip = "https://github.com/wixtoolset/issues/issues/6401")]
173#else
174 [Fact(Skip = "addon/patch related bundle")]
175#endif
176 public void CanMinorUpgradeDependencyPackageFromPatchBundleThenUninstallToRestoreBase() 177 public void CanMinorUpgradeDependencyPackageFromPatchBundleThenUninstallToRestoreBase()
177 { 178 {
178 var originalVersion = "1.0.0.0"; 179 var originalVersion = "1.0.0.0";
@@ -190,41 +191,49 @@ namespace WixToolsetTest.BurnE2E
190 packageBv101.VerifyInstalled(false); 191 packageBv101.VerifyInstalled(false);
191 192
192 bundleJ.Install(); 193 bundleJ.Install();
193 bundleJ.VerifyRegisteredAndInPackageCache(); 194 if (this.SupportAddonAndPatchRelatedBundles)
195 {
196 bundleJ.VerifyRegisteredAndInPackageCache();
194 197
195 packageA.VerifyInstalled(true); 198 packageA.VerifyInstalled(true);
196 packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion); 199 packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion);
197 packageBv1.VerifyInstalled(true); 200 packageBv1.VerifyInstalled(true);
201 }
198 202
199 bundleJ_Patch.Install(); 203 bundleJ_Patch.Install();
200 bundleJ_Patch.VerifyRegisteredAndInPackageCache(); 204 if (this.SupportAddonAndPatchRelatedBundles)
205 {
206 bundleJ_Patch.VerifyRegisteredAndInPackageCache();
201 207
202 packageA.VerifyInstalled(true); 208 packageA.VerifyInstalled(true);
203 packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion); 209 packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion);
204 packageBv1.VerifyInstalled(false); 210 packageBv1.VerifyInstalled(false);
205 packageBv101.VerifyInstalled(true); 211 packageBv101.VerifyInstalled(true);
212 }
206 213
207 bundleJ_Patch.Uninstall(); 214 bundleJ_Patch.Uninstall();
208 bundleJ_Patch.VerifyUnregisteredAndRemovedFromPackageCache(); 215 if (this.SupportAddonAndPatchRelatedBundles)
216 {
217 bundleJ_Patch.VerifyUnregisteredAndRemovedFromPackageCache();
209 218
210 packageA.VerifyInstalled(true); 219 packageA.VerifyInstalled(true);
211 packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion); 220 packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion);
212 packageBv1.VerifyInstalled(true); 221 packageBv1.VerifyInstalled(true);
213 packageBv101.VerifyInstalled(false); 222 packageBv101.VerifyInstalled(false);
223 }
214 224
215 bundleJ.Uninstall(); 225 bundleJ.Uninstall();
216 bundleJ.VerifyUnregisteredAndRemovedFromPackageCache(); 226 if (this.SupportAddonAndPatchRelatedBundles)
217 227 {
218 packageA.VerifyInstalled(false); 228 bundleJ.VerifyUnregisteredAndRemovedFromPackageCache();
219 packageBv1.VerifyInstalled(false); 229
220 packageBv101.VerifyInstalled(false); 230 packageA.VerifyInstalled(false);
231 packageBv1.VerifyInstalled(false);
232 packageBv101.VerifyInstalled(false);
233 }
221 } 234 }
222 235
223#if SUPPORT_ADDON_AND_PATCH_RELATED_BUNDLES
224 [Fact] 236 [Fact]
225#else
226 [Fact(Skip = "addon/patch related bundle")]
227#endif
228 public void CanUninstallBaseWithAddOnsWhenAllSharePackages() 237 public void CanUninstallBaseWithAddOnsWhenAllSharePackages()
229 { 238 {
230 var testRegistryValueExe = "ExeA"; 239 var testRegistryValueExe = "ExeA";
@@ -239,33 +248,103 @@ namespace WixToolsetTest.BurnE2E
239 packageB.VerifyInstalled(false); 248 packageB.VerifyInstalled(false);
240 249
241 bundleF.Install(); 250 bundleF.Install();
242 bundleF.VerifyRegisteredAndInPackageCache(); 251 if (this.SupportAddonAndPatchRelatedBundles)
252 {
253 bundleF.VerifyRegisteredAndInPackageCache();
243 254
244 packageA.VerifyInstalled(true); 255 packageA.VerifyInstalled(true);
245 packageB.VerifyInstalled(true); 256 packageB.VerifyInstalled(true);
257 }
246 258
247 bundleF_AddOnA.Install(); 259 bundleF_AddOnA.Install();
248 bundleF_AddOnA.VerifyRegisteredAndInPackageCache(); 260 if (this.SupportAddonAndPatchRelatedBundles)
261 {
262 bundleF_AddOnA.VerifyRegisteredAndInPackageCache();
249 263
250 packageA.VerifyInstalled(true); 264 packageA.VerifyInstalled(true);
251 bundleF.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.0.0"); 265 bundleF.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.0.0");
252 packageB.VerifyInstalled(true); 266 packageB.VerifyInstalled(true);
267 }
253 268
254 bundleF_AddOnB.Install(); 269 bundleF_AddOnB.Install();
255 bundleF_AddOnB.VerifyRegisteredAndInPackageCache(); 270 if (this.SupportAddonAndPatchRelatedBundles)
271 {
272 bundleF_AddOnB.VerifyRegisteredAndInPackageCache();
256 273
257 packageA.VerifyInstalled(true); 274 packageA.VerifyInstalled(true);
258 bundleF.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.0.0"); 275 bundleF.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.0.0");
259 packageB.VerifyInstalled(true); 276 packageB.VerifyInstalled(true);
277 }
260 278
261 bundleF.Uninstall(); 279 bundleF.Uninstall();
262 bundleF.VerifyUnregisteredAndRemovedFromPackageCache(); 280 if (this.SupportAddonAndPatchRelatedBundles)
263 bundleF_AddOnA.VerifyUnregisteredAndRemovedFromPackageCache(); 281 {
264 bundleF_AddOnB.VerifyUnregisteredAndRemovedFromPackageCache(); 282 bundleF.VerifyUnregisteredAndRemovedFromPackageCache();
283 bundleF_AddOnA.VerifyUnregisteredAndRemovedFromPackageCache();
284 bundleF_AddOnB.VerifyUnregisteredAndRemovedFromPackageCache();
285
286 packageA.VerifyInstalled(false);
287 bundleF.VerifyExeTestRegistryRootDeleted(testRegistryValueExe);
288 packageB.VerifyInstalled(false);
289 }
290 }
291
292 [Fact]
293 public void CanUpgradeBaseWithAddOns()
294 {
295 var testRegistryValueExe = "ExeA";
296
297 var packageA = this.CreatePackageInstaller("PackageAv1");
298 var packageB = this.CreatePackageInstaller("PackageB");
299 var bundleF = this.CreateBundleInstaller("BundleF");
300 var bundleF_AddOnA = this.CreateBundleInstaller("BundleF_AddOnA");
301 var bundleF_AddOnB = this.CreateBundleInstaller("BundleF_AddOnB");
302 var bundleFv2 = this.CreateBundleInstaller("BundleFv2");
265 303
266 packageA.VerifyInstalled(false); 304 packageA.VerifyInstalled(false);
267 bundleF.VerifyExeTestRegistryRootDeleted(testRegistryValueExe);
268 packageB.VerifyInstalled(false); 305 packageB.VerifyInstalled(false);
306
307 bundleF.Install();
308 if (this.SupportAddonAndPatchRelatedBundles)
309 {
310 bundleF.VerifyRegisteredAndInPackageCache();
311
312 packageA.VerifyInstalled(true);
313 packageB.VerifyInstalled(true);
314 }
315
316 bundleF_AddOnA.Install();
317 if (this.SupportAddonAndPatchRelatedBundles)
318 {
319 bundleF_AddOnA.VerifyRegisteredAndInPackageCache();
320
321 packageA.VerifyInstalled(true);
322 bundleF.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.0.0");
323 packageB.VerifyInstalled(true);
324 }
325
326 bundleF_AddOnB.Install();
327 if (this.SupportAddonAndPatchRelatedBundles)
328 {
329 bundleF_AddOnB.VerifyRegisteredAndInPackageCache();
330
331 packageA.VerifyInstalled(true);
332 bundleF.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.0.0");
333 packageB.VerifyInstalled(true);
334 }
335
336 bundleFv2.Install();
337 if (this.SupportAddonAndPatchRelatedBundles)
338 {
339 bundleFv2.VerifyRegisteredAndInPackageCache();
340 bundleF.VerifyUnregisteredAndRemovedFromPackageCache();
341 bundleF_AddOnA.VerifyRegisteredAndInPackageCache();
342 bundleF_AddOnB.VerifyRegisteredAndInPackageCache();
343
344 packageA.VerifyInstalled(true);
345 bundleF.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.0.0");
346 packageB.VerifyInstalled(true);
347 }
269 } 348 }
270 349
271 [Fact] 350 [Fact]
@@ -343,11 +422,7 @@ namespace WixToolsetTest.BurnE2E
343 packageB.VerifyInstalled(false); 422 packageB.VerifyInstalled(false);
344 } 423 }
345 424
346#if SUPPORT_ADDON_AND_PATCH_RELATED_BUNDLES
347 [Fact(Skip = "https://github.com/wixtoolset/issues/issues/6401")] 425 [Fact(Skip = "https://github.com/wixtoolset/issues/issues/6401")]
348#else
349 [Fact(Skip = "addon/patch related bundle")]
350#endif
351 public void CanUpgradePatchBundleWithAdditionalPatch() 426 public void CanUpgradePatchBundleWithAdditionalPatch()
352 { 427 {
353 var originalVersion = "1.0.0.0"; 428 var originalVersion = "1.0.0.0";
@@ -365,33 +440,45 @@ namespace WixToolsetTest.BurnE2E
365 packageB.VerifyInstalled(false); 440 packageB.VerifyInstalled(false);
366 441
367 bundleF.Install(); 442 bundleF.Install();
368 bundleF.VerifyRegisteredAndInPackageCache(); 443 if (this.SupportAddonAndPatchRelatedBundles)
444 {
445 bundleF.VerifyRegisteredAndInPackageCache();
369 446
370 packageA.VerifyInstalled(true); 447 packageA.VerifyInstalled(true);
371 packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion); 448 packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion);
372 packageB.VerifyInstalled(true); 449 packageB.VerifyInstalled(true);
450 }
373 451
374 bundleF_PatchAv101.Install(); 452 bundleF_PatchAv101.Install();
375 bundleF_PatchAv101.VerifyRegisteredAndInPackageCache(); 453 if (this.SupportAddonAndPatchRelatedBundles)
454 {
455 bundleF_PatchAv101.VerifyRegisteredAndInPackageCache();
376 456
377 packageA.VerifyInstalled(true); 457 packageA.VerifyInstalled(true);
378 packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion); 458 packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion);
379 packageB.VerifyInstalled(false); 459 packageB.VerifyInstalled(false);
460 }
380 461
381 bundleF_PatchAv102.Install(); 462 bundleF_PatchAv102.Install();
382 bundleF_PatchAv102.VerifyRegisteredAndInPackageCache(); 463 if (this.SupportAddonAndPatchRelatedBundles)
464 {
465 bundleF_PatchAv102.VerifyRegisteredAndInPackageCache();
383 466
384 packageA.VerifyInstalled(true); 467 packageA.VerifyInstalled(true);
385 packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion2); 468 packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion2);
386 packageB.VerifyInstalled(false); 469 packageB.VerifyInstalled(false);
470 }
387 471
388 bundleF.Uninstall(); 472 bundleF.Uninstall();
389 bundleF.VerifyUnregisteredAndRemovedFromPackageCache(); 473 if (this.SupportAddonAndPatchRelatedBundles)
390 bundleF_PatchAv101.VerifyUnregisteredAndRemovedFromPackageCache(); 474 {
391 bundleF_PatchAv102.VerifyUnregisteredAndRemovedFromPackageCache(); 475 bundleF.VerifyUnregisteredAndRemovedFromPackageCache();
392 476 bundleF_PatchAv101.VerifyUnregisteredAndRemovedFromPackageCache();
393 packageA.VerifyInstalled(false); 477 bundleF_PatchAv102.VerifyUnregisteredAndRemovedFromPackageCache();
394 packageB.VerifyInstalled(false); 478
479 packageA.VerifyInstalled(false);
480 packageB.VerifyInstalled(false);
481 }
395 } 482 }
396 483
397 [Fact] 484 [Fact]