Always run upgrade related bundles last.
#5128
Sean Hall committed
Jan 5, 2022 at 21:51 UTC
c2b00d75493798d9f2452d5e5014b14afcb14889
24 files changed
+602
-104
src/Directory.Build.props
+1
@@ -6,6 +6,7 @@
6
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
7
<EnableSourceLink Condition=" '$(NCrunch)' == '1' ">false</EnableSourceLink>
8
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
9
+ <NoWarn>$(NoWarn);MSB3026</NoWarn>
10
11
<ProjectName Condition=" '$(ProjectName)' == '' ">$(MSBuildProjectName)</ProjectName>
12
<RootBuildFolder>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)..\build\))</RootBuildFolder>
src/burn/engine/registration.cpp
+2
@@ -585,6 +585,8 @@ extern "C" HRESULT RegistrationDetectRelatedBundles(
585
hr = RelatedBundlesInitializeForScope(FALSE, pRegistration, &pRegistration->relatedBundles);
586
ExitOnFailure(hr, "Failed to initialize per-user related bundles.");
587
588
+ RelatedBundlesSort(&pRegistration->relatedBundles);
589
+
590
LExit:
591
return hr;
592
}
src/burn/engine/relatedbundle.cpp
+55
@@ -4,6 +4,11 @@
4
5
// internal function declarations
6
7
+static __callback int __cdecl CompareRelatedBundles(
8
+ __in void* pvContext,
9
+ __in const void* pvLeft,
10
+ __in const void* pvRight
11
+ );
12
static HRESULT LoadIfRelatedBundle(
13
__in BOOL fPerMachine,
14
__in HKEY hkUninstallKey,
@@ -128,9 +133,59 @@ LExit:
133
return hr;
134
}
135
136
+extern "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
+
143
144
// internal helper functions
145
146
+static __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
+
189
static HRESULT LoadIfRelatedBundle(
190
__in BOOL fPerMachine,
191
__in HKEY hkUninstallKey,
src/burn/engine/relatedbundle.h
+3
@@ -19,6 +19,9 @@ HRESULT RelatedBundleFindById(
19
__in_z LPCWSTR wzId,
20
__out BURN_RELATED_BUNDLE** ppRelatedBundle
21
);
22
+void RelatedBundlesSort(
23
+ __in BURN_RELATED_BUNDLES* pRelatedBundles
24
+ );
25
26
#if defined(__cplusplus)
27
}
src/test/burn/BurnE2ETests.sln
+28
-14
@@ -1,7 +1,7 @@
1
2
Microsoft Visual Studio Solution File, Format Version 12.00
3
-# Visual Studio Version 16
4
-VisualStudioVersion = 16.0.29503.13
3
+# Visual Studio Version 17
4
+VisualStudioVersion = 17.0.31919.166
5
MinimumVisualStudioVersion = 10.0.40219.1
6
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestBA", "TestBA\TestBA.csproj", "{04022D35-6D75-49D0-91D2-4208E09DBA6D}"
7
EndProject
@@ -13,6 +13,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.WixBA", "WixTool
13
EndProject
14
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.BurnE2E", "WixToolsetTest.BurnE2E\WixToolsetTest.BurnE2E.csproj", "{FED9D707-E5C3-4867-87B0-FABDB5EB0823}"
15
EndProject
16
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ForTestingUseOnly.wixext", "ForTestingUseOnlyExtension\ForTestingUseOnly.wixext.csproj", "{0037E6A3-45C6-4AB6-BC8C-1CB0C145E992}"
17
+EndProject
18
Global
19
GlobalSection(SolutionConfigurationPlatforms) = preSolution
20
Debug|Any CPU = Debug|Any CPU
@@ -59,18 +61,6 @@ Global
61
{3D3B02F3-79B6-4BD5-AD49-2889DA3849A7}.Release|x64.Build.0 = Release|Any CPU
62
{3D3B02F3-79B6-4BD5-AD49-2889DA3849A7}.Release|x86.ActiveCfg = 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
64
{7C27518B-84AD-4679-8EF4-29DF552CF1AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
65
{7C27518B-84AD-4679-8EF4-29DF552CF1AC}.Debug|Any CPU.Build.0 = Debug|Any CPU
66
{7C27518B-84AD-4679-8EF4-29DF552CF1AC}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -83,6 +73,30 @@ Global
73
{7C27518B-84AD-4679-8EF4-29DF552CF1AC}.Release|x64.Build.0 = Release|Any CPU
74
{7C27518B-84AD-4679-8EF4-29DF552CF1AC}.Release|x86.ActiveCfg = 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
100
EndGlobalSection
101
GlobalSection(SolutionProperties) = preSolution
102
HideSolutionNode = FALSE
src/test/burn/Directory.wixproj.props
+1
@@ -7,5 +7,6 @@
7
<DefaultCompressionLevel>None</DefaultCompressionLevel>
8
<CompilerAdditionalOptions>-wx</CompilerAdditionalOptions>
9
<SuppressSpecificWarnings>1154;$(SuppressSpecificWarnings)</SuppressSpecificWarnings>
10
+ <ForTestingUseOnlyWixextPath>$(BaseOutputPath)$(Configuration)\netstandard2.0\ForTestingUseOnly.wixext.dll</ForTestingUseOnlyWixextPath>
11
</PropertyGroup>
12
</Project>
src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnly.wixext.csproj
new
+15
@@ -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>
src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnlyBurnBackendExtension.cs
new
+43
@@ -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
+
3
+namespace 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
+}
src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnlyCompiler.cs
new
+77
@@ -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
+
3
+namespace 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
+}
src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnlyExtensionData.cs
new
+16
@@ -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
+
3
+namespace 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
+}
src/test/burn/ForTestingUseOnlyExtension/ForTestingUseOnlyExtensionFactory.cs
new
+18
@@ -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
+
3
+namespace 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
+}
src/test/burn/ForTestingUseOnlyExtension/Symbols/ForTestingUseOnlyBundleSymbol.cs
new
+47
@@ -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
+
3
+namespace 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
+
20
+namespace 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
+}
src/test/burn/ForTestingUseOnlyExtension/Symbols/ForTestingUseOnlySymbolDefinitions.cs
new
+43
@@ -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
+
3
+namespace 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
+}
src/test/burn/TestData/DependencyTests/BundleF/BundleF.props
new
+10
@@ -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>
src/test/burn/TestData/DependencyTests/BundleF/BundleF.wixproj
+4
-4
@@ -1,13 +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 Sdk="WixToolset.Sdk">
3
+ <Import Project="BundleF.props" />
4
<PropertyGroup>
5
<OutputType>Bundle</OutputType>
5
- <UpgradeCode>{EC2B2B3F-E57C-45A4-A0E8-762156DAD99D}</UpgradeCode>
6
<Version>1.0.0.0</Version>
7
</PropertyGroup>
8
- <ItemGroup>
9
- <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
10
- </ItemGroup>
8
<ItemGroup>
9
<ProjectReference Include="..\PackageAv1\PackageAv1.wixproj" />
10
<ProjectReference Include="..\PackageB\PackageB.wixproj" />
@@ -18,4 +15,7 @@
15
<PackageReference Include="WixToolset.NetFx.wixext" />
16
<PackageReference Include="WixToolset.Util.wixext" />
17
</ItemGroup>
18
+ <ItemGroup>
19
+ <WixExtension Include="$(ForTestingUseOnlyWixextPath)" />
20
+ </ItemGroup>
21
</Project>
\ No newline at end of file
src/test/burn/TestData/DependencyTests/BundleF/BundleF.wxs
+2
-1
@@ -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. -->
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>
5
+ <fortestinguseonly:ForTestingUseOnlyBundle Id="{5E9D5B04-41EA-4196-954C-1F7357C31FB0}" />
6
<RelatedBundle Id="583B5ECB-04E6-4837-A30C-A1ADCBE24235" Action="Detect" />
7
8
<PackageGroup Id="BundlePackages">
src/test/burn/TestData/DependencyTests/BundleF_AddOnA/BundleF_AddOnA.wixproj
+3
@@ -17,4 +17,7 @@
17
<PackageReference Include="WixToolset.NetFx.wixext" />
18
<PackageReference Include="WixToolset.Util.wixext" />
19
</ItemGroup>
20
+ <ItemGroup>
21
+ <WixExtension Include="$(ForTestingUseOnlyWixextPath)" />
22
+ </ItemGroup>
23
</Project>
\ No newline at end of file
src/test/burn/TestData/DependencyTests/BundleF_AddOnA/BundleF_AddOnA.wxs
renamed
+2
-1
@@ -2,8 +2,9 @@
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">
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="{FE6B19EC-D52F-4F77-88E5-87FAE11E95D6}" />
8
<RelatedBundle Id="583B5ECB-04E6-4837-A30C-A1ADCBE24235" Action="Addon" />
9
<util:RegistrySearch Root="HKLM" Key="$(var.TestExeRegistryKey)" Value="Version" Variable="ExeA_Version" />
10
src/test/burn/TestData/DependencyTests/BundleF_AddOnB/BundleF_AddOnB.wixproj
+3
-1
@@ -6,7 +6,6 @@
6
<Version>1.0.0.0</Version>
7
</PropertyGroup>
8
<ItemGroup>
9
- <Compile Include="..\BundleF_AddOnA\BundleF_AddOn.wxs" Link="BundleF_AddOn.wxs" />
9
<Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
10
</ItemGroup>
11
<ItemGroup>
@@ -18,4 +17,7 @@
17
<PackageReference Include="WixToolset.NetFx.wixext" />
18
<PackageReference Include="WixToolset.Util.wixext" />
19
</ItemGroup>
20
+ <ItemGroup>
21
+ <WixExtension Include="$(ForTestingUseOnlyWixextPath)" />
22
+ </ItemGroup>
23
</Project>
\ No newline at end of file
src/test/burn/TestData/DependencyTests/BundleF_AddOnB/BundleF_AddOnB.wxs
new
+23
@@ -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 >= v$(var.Version)"
15
+ InstallArguments="/regw "HKLM\$(var.TestExeRegistryKey),Version,String,$(var.Version)""
16
+ RepairArguments="/regw "HKLM\$(var.TestExeRegistryKey),Version,String,$(var.Version)""
17
+ UninstallArguments="/regd "HKLM\$(var.TestExeRegistryKey),Version"">
18
+ <Provides Key="$(var.TestGroupName)_ExeA,v1.0" Version="$(var.Version)" />
19
+ <PayloadGroupRef Id="TestExePayloads" />
20
+ </ExePackage>
21
+ </PackageGroup>
22
+ </Fragment>
23
+</Wix>
src/test/burn/TestData/DependencyTests/BundleFv2/BundleFv2.wixproj
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
+<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
src/test/burn/TestData/DependencyTests/BundleFv2/BundleFv2.wxs
new
+12
@@ -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>
src/test/burn/WixToolsetTest.BurnE2E/BurnE2ETests.cs
+7
@@ -15,6 +15,13 @@ namespace WixToolsetTest.BurnE2E
15
16
private Stack<IDisposable> Installers { get; } = new Stack<IDisposable>();
17
18
+ protected bool SupportAddonAndPatchRelatedBundles =>
19
+#if SUPPORT_ADDON_AND_PATCH_RELATED_BUNDLES
20
+ true;
21
+#else
22
+ false;
23
+#endif
24
+
25
protected BundleInstaller CreateBundleInstaller(string name)
26
{
27
var installer = new BundleInstaller(this.TestContext, name);
src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs
+170
-83
@@ -123,11 +123,7 @@ namespace WixToolsetTest.BurnE2E
123
bundleAv1.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.1.0");
124
}
125
126
-#if SUPPORT_ADDON_AND_PATCH_RELATED_BUNDLES
126
[Fact(Skip = "https://github.com/wixtoolset/issues/issues/6401")]
128
-#else
129
- [Fact(Skip = "addon/patch related bundle")]
130
-#endif
127
public void CanMinorUpgradeDependencyPackageFromPatchBundle()
128
{
129
var originalVersion = "1.0.0.0";
@@ -145,34 +141,39 @@ namespace WixToolsetTest.BurnE2E
141
packageBv101.VerifyInstalled(false);
142
143
bundleJ.Install();
148
- bundleJ.VerifyRegisteredAndInPackageCache();
144
+ if (this.SupportAddonAndPatchRelatedBundles)
145
+ {
146
+ bundleJ.VerifyRegisteredAndInPackageCache();
147
150
- packageA.VerifyInstalled(true);
151
- packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion);
152
- packageBv1.VerifyInstalled(true);
148
+ packageA.VerifyInstalled(true);
149
+ packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion);
150
+ packageBv1.VerifyInstalled(true);
151
+ }
152
153
bundleJ_Patch.Install();
155
- bundleJ_Patch.VerifyRegisteredAndInPackageCache();
154
+ if (this.SupportAddonAndPatchRelatedBundles)
155
+ {
156
+ bundleJ_Patch.VerifyRegisteredAndInPackageCache();
157
157
- packageA.VerifyInstalled(true);
158
- packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion);
159
- packageBv1.VerifyInstalled(false);
160
- packageBv101.VerifyInstalled(true);
158
+ packageA.VerifyInstalled(true);
159
+ packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion);
160
+ packageBv1.VerifyInstalled(false);
161
+ packageBv101.VerifyInstalled(true);
162
+ }
163
164
bundleJ.Uninstall();
163
- bundleJ.VerifyUnregisteredAndRemovedFromPackageCache();
164
- bundleJ_Patch.VerifyUnregisteredAndRemovedFromPackageCache();
165
-
166
- packageA.VerifyInstalled(false);
167
- packageBv1.VerifyInstalled(false);
168
- packageBv101.VerifyInstalled(false);
165
+ if (this.SupportAddonAndPatchRelatedBundles)
166
+ {
167
+ bundleJ.VerifyUnregisteredAndRemovedFromPackageCache();
168
+ bundleJ_Patch.VerifyUnregisteredAndRemovedFromPackageCache();
169
+
170
+ packageA.VerifyInstalled(false);
171
+ packageBv1.VerifyInstalled(false);
172
+ packageBv101.VerifyInstalled(false);
173
+ }
174
}
175
171
-#if SUPPORT_ADDON_AND_PATCH_RELATED_BUNDLES
176
[Fact(Skip = "https://github.com/wixtoolset/issues/issues/6401")]
173
-#else
174
- [Fact(Skip = "addon/patch related bundle")]
175
-#endif
177
public void CanMinorUpgradeDependencyPackageFromPatchBundleThenUninstallToRestoreBase()
178
{
179
var originalVersion = "1.0.0.0";
@@ -190,41 +191,49 @@ namespace WixToolsetTest.BurnE2E
191
packageBv101.VerifyInstalled(false);
192
193
bundleJ.Install();
193
- bundleJ.VerifyRegisteredAndInPackageCache();
194
+ if (this.SupportAddonAndPatchRelatedBundles)
195
+ {
196
+ bundleJ.VerifyRegisteredAndInPackageCache();
197
195
- packageA.VerifyInstalled(true);
196
- packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion);
197
- packageBv1.VerifyInstalled(true);
198
+ packageA.VerifyInstalled(true);
199
+ packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion);
200
+ packageBv1.VerifyInstalled(true);
201
+ }
202
203
bundleJ_Patch.Install();
200
- bundleJ_Patch.VerifyRegisteredAndInPackageCache();
204
+ if (this.SupportAddonAndPatchRelatedBundles)
205
+ {
206
+ bundleJ_Patch.VerifyRegisteredAndInPackageCache();
207
202
- packageA.VerifyInstalled(true);
203
- packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion);
204
- packageBv1.VerifyInstalled(false);
205
- packageBv101.VerifyInstalled(true);
208
+ packageA.VerifyInstalled(true);
209
+ packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion);
210
+ packageBv1.VerifyInstalled(false);
211
+ packageBv101.VerifyInstalled(true);
212
+ }
213
214
bundleJ_Patch.Uninstall();
208
- bundleJ_Patch.VerifyUnregisteredAndRemovedFromPackageCache();
215
+ if (this.SupportAddonAndPatchRelatedBundles)
216
+ {
217
+ bundleJ_Patch.VerifyUnregisteredAndRemovedFromPackageCache();
218
210
- packageA.VerifyInstalled(true);
211
- packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion);
212
- packageBv1.VerifyInstalled(true);
213
- packageBv101.VerifyInstalled(false);
219
+ packageA.VerifyInstalled(true);
220
+ packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion);
221
+ packageBv1.VerifyInstalled(true);
222
+ packageBv101.VerifyInstalled(false);
223
+ }
224
225
bundleJ.Uninstall();
216
- bundleJ.VerifyUnregisteredAndRemovedFromPackageCache();
217
-
218
- packageA.VerifyInstalled(false);
219
- packageBv1.VerifyInstalled(false);
220
- packageBv101.VerifyInstalled(false);
226
+ if (this.SupportAddonAndPatchRelatedBundles)
227
+ {
228
+ bundleJ.VerifyUnregisteredAndRemovedFromPackageCache();
229
+
230
+ packageA.VerifyInstalled(false);
231
+ packageBv1.VerifyInstalled(false);
232
+ packageBv101.VerifyInstalled(false);
233
+ }
234
}
235
223
-#if SUPPORT_ADDON_AND_PATCH_RELATED_BUNDLES
236
[Fact]
225
-#else
226
- [Fact(Skip = "addon/patch related bundle")]
227
-#endif
237
public void CanUninstallBaseWithAddOnsWhenAllSharePackages()
238
{
239
var testRegistryValueExe = "ExeA";
@@ -239,33 +248,103 @@ namespace WixToolsetTest.BurnE2E
248
packageB.VerifyInstalled(false);
249
250
bundleF.Install();
242
- bundleF.VerifyRegisteredAndInPackageCache();
251
+ if (this.SupportAddonAndPatchRelatedBundles)
252
+ {
253
+ bundleF.VerifyRegisteredAndInPackageCache();
254
244
- packageA.VerifyInstalled(true);
245
- packageB.VerifyInstalled(true);
255
+ packageA.VerifyInstalled(true);
256
+ packageB.VerifyInstalled(true);
257
+ }
258
259
bundleF_AddOnA.Install();
248
- bundleF_AddOnA.VerifyRegisteredAndInPackageCache();
260
+ if (this.SupportAddonAndPatchRelatedBundles)
261
+ {
262
+ bundleF_AddOnA.VerifyRegisteredAndInPackageCache();
263
250
- packageA.VerifyInstalled(true);
251
- bundleF.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.0.0");
252
- packageB.VerifyInstalled(true);
264
+ packageA.VerifyInstalled(true);
265
+ bundleF.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.0.0");
266
+ packageB.VerifyInstalled(true);
267
+ }
268
269
bundleF_AddOnB.Install();
255
- bundleF_AddOnB.VerifyRegisteredAndInPackageCache();
270
+ if (this.SupportAddonAndPatchRelatedBundles)
271
+ {
272
+ bundleF_AddOnB.VerifyRegisteredAndInPackageCache();
273
257
- packageA.VerifyInstalled(true);
258
- bundleF.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.0.0");
259
- packageB.VerifyInstalled(true);
274
+ packageA.VerifyInstalled(true);
275
+ bundleF.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.0.0");
276
+ packageB.VerifyInstalled(true);
277
+ }
278
279
bundleF.Uninstall();
262
- bundleF.VerifyUnregisteredAndRemovedFromPackageCache();
263
- bundleF_AddOnA.VerifyUnregisteredAndRemovedFromPackageCache();
264
- bundleF_AddOnB.VerifyUnregisteredAndRemovedFromPackageCache();
280
+ if (this.SupportAddonAndPatchRelatedBundles)
281
+ {
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");
303
304
packageA.VerifyInstalled(false);
267
- bundleF.VerifyExeTestRegistryRootDeleted(testRegistryValueExe);
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
+ }
348
}
349
350
[Fact]
@@ -343,11 +422,7 @@ namespace WixToolsetTest.BurnE2E
422
packageB.VerifyInstalled(false);
423
}
424
346
-#if SUPPORT_ADDON_AND_PATCH_RELATED_BUNDLES
425
[Fact(Skip = "https://github.com/wixtoolset/issues/issues/6401")]
348
-#else
349
- [Fact(Skip = "addon/patch related bundle")]
350
-#endif
426
public void CanUpgradePatchBundleWithAdditionalPatch()
427
{
428
var originalVersion = "1.0.0.0";
@@ -365,33 +440,45 @@ namespace WixToolsetTest.BurnE2E
440
packageB.VerifyInstalled(false);
441
442
bundleF.Install();
368
- bundleF.VerifyRegisteredAndInPackageCache();
443
+ if (this.SupportAddonAndPatchRelatedBundles)
444
+ {
445
+ bundleF.VerifyRegisteredAndInPackageCache();
446
370
- packageA.VerifyInstalled(true);
371
- packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion);
372
- packageB.VerifyInstalled(true);
447
+ packageA.VerifyInstalled(true);
448
+ packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion);
449
+ packageB.VerifyInstalled(true);
450
+ }
451
452
bundleF_PatchAv101.Install();
375
- bundleF_PatchAv101.VerifyRegisteredAndInPackageCache();
453
+ if (this.SupportAddonAndPatchRelatedBundles)
454
+ {
455
+ bundleF_PatchAv101.VerifyRegisteredAndInPackageCache();
456
377
- packageA.VerifyInstalled(true);
378
- packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion);
379
- packageB.VerifyInstalled(false);
457
+ packageA.VerifyInstalled(true);
458
+ packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion);
459
+ packageB.VerifyInstalled(false);
460
+ }
461
462
bundleF_PatchAv102.Install();
382
- bundleF_PatchAv102.VerifyRegisteredAndInPackageCache();
463
+ if (this.SupportAddonAndPatchRelatedBundles)
464
+ {
465
+ bundleF_PatchAv102.VerifyRegisteredAndInPackageCache();
466
384
- packageA.VerifyInstalled(true);
385
- packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion2);
386
- packageB.VerifyInstalled(false);
467
+ packageA.VerifyInstalled(true);
468
+ packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion2);
469
+ packageB.VerifyInstalled(false);
470
+ }
471
472
bundleF.Uninstall();
389
- bundleF.VerifyUnregisteredAndRemovedFromPackageCache();
390
- bundleF_PatchAv101.VerifyUnregisteredAndRemovedFromPackageCache();
391
- bundleF_PatchAv102.VerifyUnregisteredAndRemovedFromPackageCache();
392
-
393
- packageA.VerifyInstalled(false);
394
- packageB.VerifyInstalled(false);
473
+ if (this.SupportAddonAndPatchRelatedBundles)
474
+ {
475
+ bundleF.VerifyUnregisteredAndRemovedFromPackageCache();
476
+ bundleF_PatchAv101.VerifyUnregisteredAndRemovedFromPackageCache();
477
+ bundleF_PatchAv102.VerifyUnregisteredAndRemovedFromPackageCache();
478
+
479
+ packageA.VerifyInstalled(false);
480
+ packageB.VerifyInstalled(false);
481
+ }
482
}
483
484
[Fact]