aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2021-03-11 17:54:30 -0600
committerSean Hall <r.sean.hall@gmail.com>2021-03-11 21:17:20 -0600
commit81908a5ec1647d76b45f50e4a18c37e1544818be (patch)
tree131b6d1e52f7bdbf701cf7026c4d7b7ea9b356fa
parent99d7440134d0f33683d1150a770a2bc594be41de (diff)
downloadwix-81908a5ec1647d76b45f50e4a18c37e1544818be.tar.gz
wix-81908a5ec1647d76b45f50e4a18c37e1544818be.tar.bz2
wix-81908a5ec1647d76b45f50e4a18c37e1544818be.zip
Port forward compatible tests from old repo.
-rw-r--r--src/TestData/ForwardCompatibleBundleTests/BundleAv1/Bundle.wxs40
-rw-r--r--src/TestData/ForwardCompatibleBundleTests/BundleAv1/BundleA.props7
-rw-r--r--src/TestData/ForwardCompatibleBundleTests/BundleAv1/BundleAv1.wixproj12
-rw-r--r--src/TestData/ForwardCompatibleBundleTests/BundleAv1/BundleAv1.wxs10
-rw-r--r--src/TestData/ForwardCompatibleBundleTests/BundleAv2/BundleAv2.wixproj18
-rw-r--r--src/TestData/ForwardCompatibleBundleTests/BundleAv2/BundleAv2.wxs10
-rw-r--r--src/TestData/ForwardCompatibleBundleTests/BundleCv1/Bundle.wxs40
-rw-r--r--src/TestData/ForwardCompatibleBundleTests/BundleCv1/BundleC.props7
-rw-r--r--src/TestData/ForwardCompatibleBundleTests/BundleCv1/BundleCv1.wixproj12
-rw-r--r--src/TestData/ForwardCompatibleBundleTests/BundleCv1/BundleCv1.wxs10
-rw-r--r--src/TestData/ForwardCompatibleBundleTests/BundleCv2/BundleCv2.wixproj18
-rw-r--r--src/TestData/ForwardCompatibleBundleTests/BundleCv2/BundleCv2.wxs10
-rw-r--r--src/TestData/ForwardCompatibleBundleTests/PackageAv1/PackageA.props9
-rw-r--r--src/TestData/ForwardCompatibleBundleTests/PackageAv1/PackageAv1.wixproj4
-rw-r--r--src/TestData/ForwardCompatibleBundleTests/PackageAv2/PackageAv2.wixproj7
-rw-r--r--src/TestData/ForwardCompatibleBundleTests/PackageCv1/PackageC.props9
-rw-r--r--src/TestData/ForwardCompatibleBundleTests/PackageCv1/PackageCv1.wixproj4
-rw-r--r--src/TestData/ForwardCompatibleBundleTests/PackageCv2/PackageCv2.wixproj7
-rw-r--r--src/TestData/Templates/PackagePerUser.wxs65
-rw-r--r--src/WixTestTools/BundleRegistration.cs26
-rw-r--r--src/WixToolsetTest.BurnE2E/ForwardCompatibleBundleTests.cs469
21 files changed, 794 insertions, 0 deletions
diff --git a/src/TestData/ForwardCompatibleBundleTests/BundleAv1/Bundle.wxs b/src/TestData/ForwardCompatibleBundleTests/BundleAv1/Bundle.wxs
new file mode 100644
index 00000000..175d9a1f
--- /dev/null
+++ b/src/TestData/ForwardCompatibleBundleTests/BundleAv1/Bundle.wxs
@@ -0,0 +1,40 @@
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<?ifndef Version?>
4<?define Version = 1.0.0.0?>
5<?endif?>
6
7<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
8 <!-- ProviderKey should be the only thing different from the template -->
9 <Bundle Name="~$(var.TestGroupName) - $(var.BundleName)" Version="$(var.Version)" UpgradeCode="$(var.UpgradeCode)" Compressed="yes" ProviderKey="~$(var.TestGroupName)_BundleA">
10 <Log Prefix="~$(var.TestGroupName)_$(var.BundleName)" />
11
12 <Variable Name="TestGroupName" Value="$(var.TestGroupName)" />
13
14 <?ifdef SoftwareTag?>
15 <SoftwareTag Regid="regid.1995-08.com.example" InstallPath="[CommonAppDataFolder]regid.1995-08.com.example" />
16 <?endif?>
17
18 <?ifndef BA?>
19 <!-- pulled in through the PackageGroupRef below -->
20 <?elseif $(var.BA) = "TestBAdnc"?>
21 <!-- pulled in through the PackageGroupRef below -->
22 <?elseif $(var.BA) = "hyperlinkLicense"?>
23 <BootstrapperApplication>
24 <bal:WixStandardBootstrapperApplication LicenseUrl="" Theme="hyperlinkLicense" />
25 </BootstrapperApplication>
26 <?else?>
27 <BootstrapperApplicationRef Id="$(var.BA)" />
28 <?endif?>
29
30 <Chain>
31 <?ifndef BA?>
32 <PackageGroupRef Id="TestBA" />
33 <?elseif $(var.BA) = "TestBAdnc"?>
34 <PackageGroupRef Id="TestBAdnc" />
35 <?endif?>
36
37 <PackageGroupRef Id="BundlePackages" />
38 </Chain>
39 </Bundle>
40</Wix>
diff --git a/src/TestData/ForwardCompatibleBundleTests/BundleAv1/BundleA.props b/src/TestData/ForwardCompatibleBundleTests/BundleAv1/BundleA.props
new file mode 100644
index 00000000..329ea107
--- /dev/null
+++ b/src/TestData/ForwardCompatibleBundleTests/BundleAv1/BundleA.props
@@ -0,0 +1,7 @@
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>{5ACFAE02-DDF0-4F1C-BEAD-1E0998E5CF9B}</UpgradeCode>
6 </PropertyGroup>
7</Project>
diff --git a/src/TestData/ForwardCompatibleBundleTests/BundleAv1/BundleAv1.wixproj b/src/TestData/ForwardCompatibleBundleTests/BundleAv1/BundleAv1.wixproj
new file mode 100644
index 00000000..dea8b4f4
--- /dev/null
+++ b/src/TestData/ForwardCompatibleBundleTests/BundleAv1/BundleAv1.wixproj
@@ -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<Project Sdk="WixToolset.Sdk">
3 <Import Project="BundleA.props" />
4 <ItemGroup>
5 <ProjectReference Include="..\PackageAv1\PackageAv1.wixproj" />
6 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
7 </ItemGroup>
8 <ItemGroup>
9 <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.89" />
10 <PackageReference Include="WixToolset.NetFx.wixext" Version="4.0.64" />
11 </ItemGroup>
12</Project> \ No newline at end of file
diff --git a/src/TestData/ForwardCompatibleBundleTests/BundleAv1/BundleAv1.wxs b/src/TestData/ForwardCompatibleBundleTests/BundleAv1/BundleAv1.wxs
new file mode 100644
index 00000000..7bf16212
--- /dev/null
+++ b/src/TestData/ForwardCompatibleBundleTests/BundleAv1/BundleAv1.wxs
@@ -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
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <PackageGroup Id="BundlePackages">
7 <MsiPackage Id="PackageA" SourceFile="$(var.PackageAv1.TargetPath)" />
8 </PackageGroup>
9 </Fragment>
10</Wix>
diff --git a/src/TestData/ForwardCompatibleBundleTests/BundleAv2/BundleAv2.wixproj b/src/TestData/ForwardCompatibleBundleTests/BundleAv2/BundleAv2.wixproj
new file mode 100644
index 00000000..dec1d299
--- /dev/null
+++ b/src/TestData/ForwardCompatibleBundleTests/BundleAv2/BundleAv2.wixproj
@@ -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<Project Sdk="WixToolset.Sdk">
3 <Import Project="..\BundleAv1\BundleA.props" />
4 <PropertyGroup>
5 <Version>2.0.0.0</Version>
6 </PropertyGroup>
7 <ItemGroup>
8 <Compile Include="..\BundleAv1\Bundle.wxs" />
9 </ItemGroup>
10 <ItemGroup>
11 <ProjectReference Include="..\PackageAv2\PackageAv2.wixproj" />
12 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
13 </ItemGroup>
14 <ItemGroup>
15 <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.89" />
16 <PackageReference Include="WixToolset.NetFx.wixext" Version="4.0.64" />
17 </ItemGroup>
18</Project> \ No newline at end of file
diff --git a/src/TestData/ForwardCompatibleBundleTests/BundleAv2/BundleAv2.wxs b/src/TestData/ForwardCompatibleBundleTests/BundleAv2/BundleAv2.wxs
new file mode 100644
index 00000000..5cbee5a8
--- /dev/null
+++ b/src/TestData/ForwardCompatibleBundleTests/BundleAv2/BundleAv2.wxs
@@ -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
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <PackageGroup Id="BundlePackages">
7 <MsiPackage Id="PackageA" SourceFile="$(var.PackageAv2.TargetPath)" />
8 </PackageGroup>
9 </Fragment>
10</Wix>
diff --git a/src/TestData/ForwardCompatibleBundleTests/BundleCv1/Bundle.wxs b/src/TestData/ForwardCompatibleBundleTests/BundleCv1/Bundle.wxs
new file mode 100644
index 00000000..dd305e42
--- /dev/null
+++ b/src/TestData/ForwardCompatibleBundleTests/BundleCv1/Bundle.wxs
@@ -0,0 +1,40 @@
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<?ifndef Version?>
4<?define Version = 1.0.0.0?>
5<?endif?>
6
7<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
8 <!-- ProviderKey should be the only thing different from the template -->
9 <Bundle Name="~$(var.TestGroupName) - $(var.BundleName)" Version="$(var.Version)" UpgradeCode="$(var.UpgradeCode)" Compressed="yes" ProviderKey="~$(var.TestGroupName)_BundleC">
10 <Log Prefix="~$(var.TestGroupName)_$(var.BundleName)" />
11
12 <Variable Name="TestGroupName" Value="$(var.TestGroupName)" />
13
14 <?ifdef SoftwareTag?>
15 <SoftwareTag Regid="regid.1995-08.com.example" InstallPath="[CommonAppDataFolder]regid.1995-08.com.example" />
16 <?endif?>
17
18 <?ifndef BA?>
19 <!-- pulled in through the PackageGroupRef below -->
20 <?elseif $(var.BA) = "TestBAdnc"?>
21 <!-- pulled in through the PackageGroupRef below -->
22 <?elseif $(var.BA) = "hyperlinkLicense"?>
23 <BootstrapperApplication>
24 <bal:WixStandardBootstrapperApplication LicenseUrl="" Theme="hyperlinkLicense" />
25 </BootstrapperApplication>
26 <?else?>
27 <BootstrapperApplicationRef Id="$(var.BA)" />
28 <?endif?>
29
30 <Chain>
31 <?ifndef BA?>
32 <PackageGroupRef Id="TestBA" />
33 <?elseif $(var.BA) = "TestBAdnc"?>
34 <PackageGroupRef Id="TestBAdnc" />
35 <?endif?>
36
37 <PackageGroupRef Id="BundlePackages" />
38 </Chain>
39 </Bundle>
40</Wix>
diff --git a/src/TestData/ForwardCompatibleBundleTests/BundleCv1/BundleC.props b/src/TestData/ForwardCompatibleBundleTests/BundleCv1/BundleC.props
new file mode 100644
index 00000000..73a9bb63
--- /dev/null
+++ b/src/TestData/ForwardCompatibleBundleTests/BundleCv1/BundleC.props
@@ -0,0 +1,7 @@
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>{D387D602-533C-495D-B14E-AA9D46AF314B}</UpgradeCode>
6 </PropertyGroup>
7</Project>
diff --git a/src/TestData/ForwardCompatibleBundleTests/BundleCv1/BundleCv1.wixproj b/src/TestData/ForwardCompatibleBundleTests/BundleCv1/BundleCv1.wixproj
new file mode 100644
index 00000000..28c6a478
--- /dev/null
+++ b/src/TestData/ForwardCompatibleBundleTests/BundleCv1/BundleCv1.wixproj
@@ -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<Project Sdk="WixToolset.Sdk">
3 <Import Project="BundleC.props" />
4 <ItemGroup>
5 <ProjectReference Include="..\PackageCv1\PackageCv1.wixproj" />
6 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
7 </ItemGroup>
8 <ItemGroup>
9 <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.89" />
10 <PackageReference Include="WixToolset.NetFx.wixext" Version="4.0.64" />
11 </ItemGroup>
12</Project> \ No newline at end of file
diff --git a/src/TestData/ForwardCompatibleBundleTests/BundleCv1/BundleCv1.wxs b/src/TestData/ForwardCompatibleBundleTests/BundleCv1/BundleCv1.wxs
new file mode 100644
index 00000000..43e75910
--- /dev/null
+++ b/src/TestData/ForwardCompatibleBundleTests/BundleCv1/BundleCv1.wxs
@@ -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
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <PackageGroup Id="BundlePackages">
7 <MsiPackage Id="PackageC" SourceFile="$(var.PackageCv1.TargetPath)" />
8 </PackageGroup>
9 </Fragment>
10</Wix>
diff --git a/src/TestData/ForwardCompatibleBundleTests/BundleCv2/BundleCv2.wixproj b/src/TestData/ForwardCompatibleBundleTests/BundleCv2/BundleCv2.wixproj
new file mode 100644
index 00000000..51f61d73
--- /dev/null
+++ b/src/TestData/ForwardCompatibleBundleTests/BundleCv2/BundleCv2.wixproj
@@ -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<Project Sdk="WixToolset.Sdk">
3 <Import Project="..\BundleCv1\BundleC.props" />
4 <PropertyGroup>
5 <Version>2.0.0.0</Version>
6 </PropertyGroup>
7 <ItemGroup>
8 <Compile Include="..\BundleCv1\Bundle.wxs" />
9 </ItemGroup>
10 <ItemGroup>
11 <ProjectReference Include="..\PackageCv2\PackageCv2.wixproj" />
12 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
13 </ItemGroup>
14 <ItemGroup>
15 <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.89" />
16 <PackageReference Include="WixToolset.NetFx.wixext" Version="4.0.64" />
17 </ItemGroup>
18</Project> \ No newline at end of file
diff --git a/src/TestData/ForwardCompatibleBundleTests/BundleCv2/BundleCv2.wxs b/src/TestData/ForwardCompatibleBundleTests/BundleCv2/BundleCv2.wxs
new file mode 100644
index 00000000..53115c96
--- /dev/null
+++ b/src/TestData/ForwardCompatibleBundleTests/BundleCv2/BundleCv2.wxs
@@ -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
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <PackageGroup Id="BundlePackages">
7 <MsiPackage Id="PackageC" SourceFile="$(var.PackageCv2.TargetPath)" />
8 </PackageGroup>
9 </Fragment>
10</Wix>
diff --git a/src/TestData/ForwardCompatibleBundleTests/PackageAv1/PackageA.props b/src/TestData/ForwardCompatibleBundleTests/PackageAv1/PackageA.props
new file mode 100644
index 00000000..de83c1f5
--- /dev/null
+++ b/src/TestData/ForwardCompatibleBundleTests/PackageAv1/PackageA.props
@@ -0,0 +1,9 @@
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 <UpgradeCode>{F764127F-8893-4483-A136-F53660C32423}</UpgradeCode>
5 </PropertyGroup>
6 <ItemGroup>
7 <Compile Include="..\..\Templates\Package.wxs" Link="Package.wxs" />
8 </ItemGroup>
9</Project> \ No newline at end of file
diff --git a/src/TestData/ForwardCompatibleBundleTests/PackageAv1/PackageAv1.wixproj b/src/TestData/ForwardCompatibleBundleTests/PackageAv1/PackageAv1.wixproj
new file mode 100644
index 00000000..45d3b2c8
--- /dev/null
+++ b/src/TestData/ForwardCompatibleBundleTests/PackageAv1/PackageAv1.wixproj
@@ -0,0 +1,4 @@
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="PackageA.props" />
4</Project> \ No newline at end of file
diff --git a/src/TestData/ForwardCompatibleBundleTests/PackageAv2/PackageAv2.wixproj b/src/TestData/ForwardCompatibleBundleTests/PackageAv2/PackageAv2.wixproj
new file mode 100644
index 00000000..b419f663
--- /dev/null
+++ b/src/TestData/ForwardCompatibleBundleTests/PackageAv2/PackageAv2.wixproj
@@ -0,0 +1,7 @@
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="..\PackageAv1\PackageA.props" />
4 <PropertyGroup>
5 <Version>2.0.0.0</Version>
6 </PropertyGroup>
7</Project> \ No newline at end of file
diff --git a/src/TestData/ForwardCompatibleBundleTests/PackageCv1/PackageC.props b/src/TestData/ForwardCompatibleBundleTests/PackageCv1/PackageC.props
new file mode 100644
index 00000000..91d3bdda
--- /dev/null
+++ b/src/TestData/ForwardCompatibleBundleTests/PackageCv1/PackageC.props
@@ -0,0 +1,9 @@
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 <UpgradeCode>{DF1C1C42-F5B9-4167-914B-1AF97E829C48}</UpgradeCode>
5 </PropertyGroup>
6 <ItemGroup>
7 <Compile Include="..\..\Templates\PackagePerUser.wxs" Link="PackagePerUser.wxs" />
8 </ItemGroup>
9</Project> \ No newline at end of file
diff --git a/src/TestData/ForwardCompatibleBundleTests/PackageCv1/PackageCv1.wixproj b/src/TestData/ForwardCompatibleBundleTests/PackageCv1/PackageCv1.wixproj
new file mode 100644
index 00000000..45615706
--- /dev/null
+++ b/src/TestData/ForwardCompatibleBundleTests/PackageCv1/PackageCv1.wixproj
@@ -0,0 +1,4 @@
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="PackageC.props" />
4</Project> \ No newline at end of file
diff --git a/src/TestData/ForwardCompatibleBundleTests/PackageCv2/PackageCv2.wixproj b/src/TestData/ForwardCompatibleBundleTests/PackageCv2/PackageCv2.wixproj
new file mode 100644
index 00000000..640ad21d
--- /dev/null
+++ b/src/TestData/ForwardCompatibleBundleTests/PackageCv2/PackageCv2.wixproj
@@ -0,0 +1,7 @@
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="..\PackageCv1\PackageC.props" />
4 <PropertyGroup>
5 <Version>2.0.0.0</Version>
6 </PropertyGroup>
7</Project> \ No newline at end of file
diff --git a/src/TestData/Templates/PackagePerUser.wxs b/src/TestData/Templates/PackagePerUser.wxs
new file mode 100644
index 00000000..e985966c
--- /dev/null
+++ b/src/TestData/Templates/PackagePerUser.wxs
@@ -0,0 +1,65 @@
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
5<?ifndef Version?>
6<?define Version = 1.0.0.0?>
7<?endif?>
8
9<?ifndef ProductCode?>
10<?define ProductCode = *?>
11<?endif?>
12
13<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
14 <Package Name="~$(var.TestGroupName) - $(var.PackageName)" Language="1033" Version="$(var.Version)" Manufacturer="Microsoft Corporation" UpgradeCode="$(var.UpgradeCode)" Compressed="yes" ProductCode="$(var.ProductCode)" Scope="perUser">
15 <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
16 <?ifndef CabPrefix?>
17 <MediaTemplate EmbedCab="yes" />
18 <?else?>
19 <MediaTemplate CabinetTemplate="{0}$(var.CabPrefix).cab" />
20 <?endif?>
21
22 <?ifdef SoftwareTag?>
23 <SoftwareTag Regid="regid.1995-08.com.example" InstallDirectory="LocalAppDataFolder" />
24 <?endif?>
25
26 <PropertyRef Id="TestVersion" />
27
28 <Feature Id="Complete" Level="1">
29 <ComponentRef Id="FileComponent" />
30 <ComponentRef Id="RegistryComponent" />
31 <?ifdef var.ProductComponents?>
32 <ComponentGroupRef Id="ProductComponents" />
33 <?endif?>
34 </Feature>
35 </Package>
36
37 <Fragment>
38 <Directory Id="TARGETDIR" Name="SourceDir">
39 <Directory Id="LocalAppDataFolder" />
40 <Directory Id="ProgramFilesFolder">
41 <Directory Id="WixDir" Name="~Test WiX">
42 <Directory Id="TestDir" Name="$(var.TestGroupName)">
43 <Directory Id="INSTALLFOLDER" Name="$(var.PackageName)" />
44 </Directory>
45 </Directory>
46 </Directory>
47 </Directory>
48 </Fragment>
49
50 <Fragment>
51 <Component Id="FileComponent" Directory="INSTALLFOLDER">
52 <File Source="$(sys.SOURCEFILEPATH)" />
53 </Component>
54 </Fragment>
55
56 <Fragment>
57 <Component Id="RegistryComponent" Directory="INSTALLFOLDER">
58 <RegistryValue Root="HKCU" Key="Software\WiX\Tests\$(var.TestGroupName)" Name="$(var.PackageName)" Value="!(bind.Property.TestVersion)" Type="string" />
59 </Component>
60 </Fragment>
61
62 <Fragment>
63 <Property Id="TestVersion" Value="$(var.Version)" />
64 </Fragment>
65</Wix>
diff --git a/src/WixTestTools/BundleRegistration.cs b/src/WixTestTools/BundleRegistration.cs
index 1a066232..bf9e2903 100644
--- a/src/WixTestTools/BundleRegistration.cs
+++ b/src/WixTestTools/BundleRegistration.cs
@@ -151,5 +151,31 @@ namespace WixTestTools
151 151
152 return registration; 152 return registration;
153 } 153 }
154
155 public static bool TryGetDependencyProviderValue(string providerId, string name, out string value)
156 {
157 value = null;
158
159 string key = String.Format(@"Installer\Dependencies\{0}", providerId);
160 using (RegistryKey providerKey = Registry.ClassesRoot.OpenSubKey(key))
161 {
162 if (null == providerKey)
163 {
164 return false;
165 }
166
167 value = providerKey.GetValue(name) as string;
168 return value != null;
169 }
170 }
171
172 public static bool DependencyDependentExists(string providerId, string dependentId)
173 {
174 string key = String.Format(@"Installer\Dependencies\{0}\Dependents\{1}", providerId, dependentId);
175 using (RegistryKey dependentKey = Registry.ClassesRoot.OpenSubKey(key))
176 {
177 return null != dependentKey;
178 }
179 }
154 } 180 }
155} 181}
diff --git a/src/WixToolsetTest.BurnE2E/ForwardCompatibleBundleTests.cs b/src/WixToolsetTest.BurnE2E/ForwardCompatibleBundleTests.cs
new file mode 100644
index 00000000..eb649c86
--- /dev/null
+++ b/src/WixToolsetTest.BurnE2E/ForwardCompatibleBundleTests.cs
@@ -0,0 +1,469 @@
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.BurnE2E
4{
5 using System;
6 using System.IO;
7 using WixTestTools;
8 using Xunit;
9 using Xunit.Abstractions;
10
11 public class ForwardCompatibleBundleTests : BurnE2ETests
12 {
13 public ForwardCompatibleBundleTests(ITestOutputHelper testOutputHelper) : base(testOutputHelper) { }
14
15 private const string BundleAProviderId = "~" + nameof(ForwardCompatibleBundleTests) + "_BundleA";
16 private const string BundleCProviderId = "~" + nameof(ForwardCompatibleBundleTests) + "_BundleC";
17 private const string V100 = "1.0.0.0";
18 private const string V200 = "2.0.0.0";
19
20 [Fact]
21 public void CanTrack1ForwardCompatibleDependentThroughMajorUpgrade()
22 {
23 string providerId = BundleAProviderId;
24 string parent = "~BundleAv1";
25 string parentSwitch = String.Concat("-parent ", parent);
26
27 var packageAv1 = this.CreatePackageInstaller("PackageAv1");
28 var packageAv2 = this.CreatePackageInstaller("PackageAv2");
29 var bundleAv1 = this.CreateBundleInstaller("BundleAv1");
30 var bundleAv2 = this.CreateBundleInstaller("BundleAv2");
31
32 packageAv1.VerifyInstalled(false);
33 packageAv2.VerifyInstalled(false);
34
35 // Install the v1 bundle with a parent.
36 bundleAv1.Install(arguments: parentSwitch);
37 bundleAv1.VerifyRegisteredAndInPackageCache();
38
39 packageAv1.VerifyInstalled(true);
40 packageAv2.VerifyInstalled(false);
41 Assert.True(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out var actualProviderVersion));
42 Assert.Equal(V100, actualProviderVersion);
43 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent));
44
45 // Upgrade with the v2 bundle.
46 bundleAv2.Install();
47 bundleAv2.VerifyRegisteredAndInPackageCache();
48 bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache();
49
50 packageAv1.VerifyInstalled(false);
51 packageAv2.VerifyInstalled(true);
52 Assert.True(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out actualProviderVersion));
53 Assert.Equal(V200, actualProviderVersion);
54 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent));
55
56 // Uninstall the v2 bundle and nothing should happen because there is still a parent.
57 bundleAv2.Uninstall();
58 bundleAv2.VerifyRegisteredAndInPackageCache();
59
60 packageAv1.VerifyInstalled(false);
61 packageAv2.VerifyInstalled(true);
62 Assert.True(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out actualProviderVersion));
63 Assert.Equal(V200, actualProviderVersion);
64 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent));
65
66 // Uninstall the v1 bundle with passthrough and all should be removed.
67 bundleAv1.Uninstall(arguments: parentSwitch);
68 bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache();
69 bundleAv2.VerifyUnregisteredAndRemovedFromPackageCache();
70
71 packageAv1.VerifyInstalled(false);
72 packageAv2.VerifyInstalled(false);
73 Assert.False(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out actualProviderVersion));
74 }
75
76 [Fact]
77 public void CanTrack1ForwardCompatibleDependentThroughMajorUpgradeWithParentNone()
78 {
79 string providerId = BundleAProviderId;
80 string parent = "~BundleAv1";
81 string parentSwitch = String.Concat("-parent ", parent);
82
83 var packageAv1 = this.CreatePackageInstaller("PackageAv1");
84 var packageAv2 = this.CreatePackageInstaller("PackageAv2");
85 var bundleAv1 = this.CreateBundleInstaller("BundleAv1");
86 var bundleAv2 = this.CreateBundleInstaller("BundleAv2");
87
88 packageAv1.VerifyInstalled(false);
89 packageAv2.VerifyInstalled(false);
90
91 // Install the v1 bundle with a parent.
92 bundleAv1.Install(arguments: parentSwitch);
93 bundleAv1.VerifyRegisteredAndInPackageCache();
94
95 packageAv1.VerifyInstalled(true);
96 packageAv2.VerifyInstalled(false);
97 Assert.True(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out var actualProviderVersion));
98 Assert.Equal(V100, actualProviderVersion);
99 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent));
100
101 // Upgrade with the v2 bundle but prevent self parent being registered.
102 bundleAv2.Install(arguments: "-parent:none");
103 bundleAv2.VerifyRegisteredAndInPackageCache();
104 bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache();
105
106 packageAv1.VerifyInstalled(false);
107 packageAv2.VerifyInstalled(true);
108 Assert.True(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out actualProviderVersion));
109 Assert.Equal(V200, actualProviderVersion);
110 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent));
111
112 // Uninstall the v1 bundle with passthrough and all should be removed.
113 bundleAv1.Uninstall(arguments: parentSwitch);
114 bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache();
115 bundleAv2.VerifyUnregisteredAndRemovedFromPackageCache();
116
117 packageAv1.VerifyInstalled(false);
118 packageAv2.VerifyInstalled(false);
119 Assert.False(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out actualProviderVersion));
120 }
121
122 [Fact]
123 public void CanTrack2ForwardCompatibleDependentsThroughMajorUpgrade()
124 {
125 string providerId = BundleAProviderId;
126 string parent = "~BundleAv1";
127 string parent2 = "~BundleAv1_Parent2";
128 string parentSwitch = String.Concat("-parent ", parent);
129 string parent2Switch = String.Concat("-parent ", parent2);
130
131 var packageAv1 = this.CreatePackageInstaller("PackageAv1");
132 var packageAv2 = this.CreatePackageInstaller("PackageAv2");
133 var bundleAv1 = this.CreateBundleInstaller("BundleAv1");
134 var bundleAv2 = this.CreateBundleInstaller("BundleAv2");
135
136 packageAv1.VerifyInstalled(false);
137 packageAv2.VerifyInstalled(false);
138
139 // Install the v1 bundle with a parent.
140 bundleAv1.Install(arguments: parentSwitch);
141 bundleAv1.VerifyRegisteredAndInPackageCache();
142
143 packageAv1.VerifyInstalled(true);
144 packageAv2.VerifyInstalled(false);
145 Assert.True(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out var actualProviderVersion));
146 Assert.Equal(V100, actualProviderVersion);
147 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent));
148
149 // Install the v1 bundle with a second parent.
150 bundleAv1.Install(arguments: parent2Switch);
151 bundleAv1.VerifyRegisteredAndInPackageCache();
152
153 packageAv1.VerifyInstalled(true);
154 packageAv2.VerifyInstalled(false);
155 Assert.True(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out actualProviderVersion));
156 Assert.Equal(V100, actualProviderVersion);
157 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent2));
158
159 // Upgrade with the v2 bundle.
160 bundleAv2.Install();
161 bundleAv2.VerifyRegisteredAndInPackageCache();
162 bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache();
163
164 packageAv1.VerifyInstalled(false);
165 packageAv2.VerifyInstalled(true);
166 Assert.True(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out actualProviderVersion));
167 Assert.Equal(V200, actualProviderVersion);
168 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent));
169 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent2));
170
171 // Uninstall the v2 bundle and nothing should happen because there is still a parent.
172 bundleAv2.Uninstall();
173 bundleAv2.VerifyRegisteredAndInPackageCache();
174
175 packageAv1.VerifyInstalled(false);
176 packageAv2.VerifyInstalled(true);
177 Assert.True(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out actualProviderVersion));
178 Assert.Equal(V200, actualProviderVersion);
179 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent));
180 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent2));
181
182 // Uninstall one parent of the v1 bundle and nothing should happen because there is still a parent.
183 bundleAv1.Uninstall(arguments: parentSwitch);
184 bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache();
185 bundleAv2.VerifyRegisteredAndInPackageCache();
186
187 packageAv1.VerifyInstalled(false);
188 packageAv2.VerifyInstalled(true);
189 Assert.True(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out actualProviderVersion));
190 Assert.Equal(V200, actualProviderVersion);
191 Assert.False(BundleRegistration.DependencyDependentExists(providerId, parent));
192 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent2));
193
194 // Uninstall the v1 bundle with passthrough with second parent and all should be removed.
195 bundleAv1.Uninstall(arguments: parent2Switch);
196 bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache();
197 bundleAv2.VerifyUnregisteredAndRemovedFromPackageCache();
198
199 packageAv1.VerifyInstalled(false);
200 packageAv2.VerifyInstalled(false);
201 Assert.False(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out actualProviderVersion));
202 }
203
204 [Fact]
205 public void CanTrack2ForwardCompatibleDependentsThroughMajorUpgradePerUser()
206 {
207 string providerId = BundleCProviderId;
208 string parent = "~BundleCv1";
209 string parent2 = "~BundleCv1_Parent2";
210 string parentSwitch = String.Concat("-parent ", parent);
211 string parent2Switch = String.Concat("-parent ", parent2);
212
213 var packageCv1 = this.CreatePackageInstaller("PackageCv1");
214 var packageCv2 = this.CreatePackageInstaller("PackageCv2");
215 var bundleCv1 = this.CreateBundleInstaller("BundleCv1");
216 var bundleCv2 = this.CreateBundleInstaller("BundleCv2");
217
218 packageCv1.VerifyInstalled(false);
219 packageCv2.VerifyInstalled(false);
220
221 // Install the v1 bundle with a parent.
222 bundleCv1.Install(arguments: parentSwitch);
223 bundleCv1.VerifyRegisteredAndInPackageCache();
224
225 packageCv1.VerifyInstalled(true);
226 packageCv2.VerifyInstalled(false);
227 Assert.True(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out var actualProviderVersion));
228 Assert.Equal(V100, actualProviderVersion);
229 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent));
230
231 // Install the v1 bundle with a second parent.
232 bundleCv1.Install(arguments: parent2Switch);
233 bundleCv1.VerifyRegisteredAndInPackageCache();
234
235 packageCv1.VerifyInstalled(true);
236 packageCv2.VerifyInstalled(false);
237 Assert.True(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out actualProviderVersion));
238 Assert.Equal(V100, actualProviderVersion);
239 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent2));
240
241 // Upgrade with the v2 bundle.
242 bundleCv2.Install();
243 bundleCv2.VerifyRegisteredAndInPackageCache();
244 bundleCv1.VerifyUnregisteredAndRemovedFromPackageCache();
245
246 packageCv1.VerifyInstalled(false);
247 packageCv2.VerifyInstalled(true);
248 Assert.True(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out actualProviderVersion));
249 Assert.Equal(V200, actualProviderVersion);
250 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent));
251 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent2));
252
253 // Uninstall the v2 bundle and nothing should happen because there is still a parent.
254 bundleCv2.Uninstall();
255 bundleCv2.VerifyRegisteredAndInPackageCache();
256
257 packageCv1.VerifyInstalled(false);
258 packageCv2.VerifyInstalled(true);
259 Assert.True(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out actualProviderVersion));
260 Assert.Equal(V200, actualProviderVersion);
261 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent));
262 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent2));
263
264 // Uninstall one parent of the v1 bundle and nothing should happen because there is still a parent.
265 bundleCv1.Uninstall(arguments: parentSwitch);
266 bundleCv1.VerifyUnregisteredAndRemovedFromPackageCache();
267 bundleCv2.VerifyRegisteredAndInPackageCache();
268
269 packageCv1.VerifyInstalled(false);
270 packageCv2.VerifyInstalled(true);
271 Assert.True(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out actualProviderVersion));
272 Assert.Equal(V200, actualProviderVersion);
273 Assert.False(BundleRegistration.DependencyDependentExists(providerId, parent));
274 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent2));
275
276 // Uninstall the v1 bundle with passthrough with second parent and all should be removed.
277 bundleCv1.Uninstall(arguments: parent2Switch);
278 bundleCv1.VerifyUnregisteredAndRemovedFromPackageCache();
279 bundleCv2.VerifyUnregisteredAndRemovedFromPackageCache();
280
281 packageCv1.VerifyInstalled(false);
282 packageCv2.VerifyInstalled(false);
283 Assert.False(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out actualProviderVersion));
284 }
285
286 [Fact]
287 public void CanTrack2ForwardCompatibleDependentsThroughMajorUpgradeWithParent()
288 {
289 string providerId = BundleAProviderId;
290 string parent = "~BundleAv1";
291 string parent2 = "~BundleAv1_Parent2";
292 string parent3 = "~BundleAv1_Parent3";
293 string parentSwitch = String.Concat("-parent ", parent);
294 string parent2Switch = String.Concat("-parent ", parent2);
295 string parent3Switch = String.Concat("-parent ", parent3);
296
297 var packageAv1 = this.CreatePackageInstaller("PackageAv1");
298 var packageAv2 = this.CreatePackageInstaller("PackageAv2");
299 var bundleAv1 = this.CreateBundleInstaller("BundleAv1");
300 var bundleAv2 = this.CreateBundleInstaller("BundleAv2");
301
302 packageAv1.VerifyInstalled(false);
303 packageAv2.VerifyInstalled(false);
304
305 // Install the v1 bundle with a parent.
306 bundleAv1.Install(arguments: parentSwitch);
307 bundleAv1.VerifyRegisteredAndInPackageCache();
308
309 packageAv1.VerifyInstalled(true);
310 packageAv2.VerifyInstalled(false);
311 Assert.True(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out var actualProviderVersion));
312 Assert.Equal(V100, actualProviderVersion);
313 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent));
314
315 // Install the v1 bundle with a second parent.
316 bundleAv1.Install(arguments: parent2Switch);
317 bundleAv1.VerifyRegisteredAndInPackageCache();
318
319 packageAv1.VerifyInstalled(true);
320 packageAv2.VerifyInstalled(false);
321 Assert.True(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out actualProviderVersion));
322 Assert.Equal(V100, actualProviderVersion);
323 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent2));
324
325 // Upgrade with the v2 bundle.
326 bundleAv2.Install(arguments: parent3Switch);
327 bundleAv2.VerifyRegisteredAndInPackageCache();
328 bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache();
329
330 packageAv1.VerifyInstalled(false);
331 packageAv2.VerifyInstalled(true);
332 Assert.True(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out actualProviderVersion));
333 Assert.Equal(V200, actualProviderVersion);
334 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent));
335 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent2));
336 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent3));
337
338 // Uninstall the v2 bundle and nothing should happen because there is still a parent.
339 bundleAv2.Uninstall(arguments: parent3Switch);
340 bundleAv2.VerifyRegisteredAndInPackageCache();
341
342 packageAv1.VerifyInstalled(false);
343 packageAv2.VerifyInstalled(true);
344 Assert.True(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out actualProviderVersion));
345 Assert.Equal(V200, actualProviderVersion);
346 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent));
347 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent2));
348 Assert.False(BundleRegistration.DependencyDependentExists(providerId, parent3));
349
350 // Uninstall one parent of the v1 bundle and nothing should happen because there is still a parent.
351 bundleAv1.Uninstall(arguments: parentSwitch);
352 bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache();
353 bundleAv2.VerifyRegisteredAndInPackageCache();
354
355 packageAv1.VerifyInstalled(false);
356 packageAv2.VerifyInstalled(true);
357 Assert.True(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out actualProviderVersion));
358 Assert.Equal(V200, actualProviderVersion);
359 Assert.False(BundleRegistration.DependencyDependentExists(providerId, parent));
360 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent2));
361
362 // Uninstall the v1 bundle with passthrough with second parent and all should be removed.
363 bundleAv1.Uninstall(arguments: parent2Switch);
364 bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache();
365 bundleAv2.VerifyUnregisteredAndRemovedFromPackageCache();
366
367 packageAv1.VerifyInstalled(false);
368 packageAv2.VerifyInstalled(false);
369 Assert.False(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out actualProviderVersion));
370 }
371
372 [Fact]
373 public void CanUninstallForwardCompatibleWithBundlesUninstalledInFifoOrder()
374 {
375 string providerId = BundleAProviderId;
376 string parent = "~BundleAv1";
377 string parentSwitch = String.Concat("-parent ", parent);
378
379 var packageAv1 = this.CreatePackageInstaller("PackageAv1");
380 var packageAv2 = this.CreatePackageInstaller("PackageAv2");
381 var bundleAv1 = this.CreateBundleInstaller("BundleAv1");
382 var bundleAv2 = this.CreateBundleInstaller("BundleAv2");
383
384 packageAv1.VerifyInstalled(false);
385 packageAv2.VerifyInstalled(false);
386
387 bundleAv2.Install();
388 bundleAv2.VerifyRegisteredAndInPackageCache();
389
390 packageAv1.VerifyInstalled(false);
391 packageAv2.VerifyInstalled(true);
392 Assert.True(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out var actualProviderVersion));
393 Assert.Equal(V200, actualProviderVersion);
394
395 // Install the v1 bundle with a parent which should passthrough to v2.
396 bundleAv1.Install(arguments: parentSwitch);
397 bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache();
398
399 packageAv1.VerifyInstalled(false);
400 packageAv2.VerifyInstalled(true);
401 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent));
402
403 bundleAv2.Uninstall();
404 bundleAv2.VerifyRegisteredAndInPackageCache();
405
406 packageAv1.VerifyInstalled(false);
407 packageAv2.VerifyInstalled(true);
408 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent));
409
410 // Uninstall the v1 bundle with passthrough and all should be removed.
411 bundleAv1.Uninstall(arguments: parentSwitch);
412 bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache();
413 bundleAv2.VerifyUnregisteredAndRemovedFromPackageCache();
414
415 packageAv1.VerifyInstalled(false);
416 packageAv2.VerifyInstalled(false);
417 Assert.False(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out actualProviderVersion));
418 }
419
420 [Fact]
421 public void CanUninstallForwardCompatibleWithBundlesUninstalledInReverseOrder()
422 {
423 string providerId = BundleAProviderId;
424 string parent = "~BundleAv1";
425 string parentSwitch = String.Concat("-parent ", parent);
426
427 var packageAv1 = this.CreatePackageInstaller("PackageAv1");
428 var packageAv2 = this.CreatePackageInstaller("PackageAv2");
429 var bundleAv1 = this.CreateBundleInstaller("BundleAv1");
430 var bundleAv2 = this.CreateBundleInstaller("BundleAv2");
431
432 packageAv1.VerifyInstalled(false);
433 packageAv2.VerifyInstalled(false);
434
435 bundleAv2.Install();
436 bundleAv2.VerifyRegisteredAndInPackageCache();
437
438 packageAv1.VerifyInstalled(false);
439 packageAv2.VerifyInstalled(true);
440 Assert.True(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out var actualProviderVersion));
441 Assert.Equal(V200, actualProviderVersion);
442
443 // Install the v1 bundle with a parent which should passthrough to v2.
444 bundleAv1.Install(arguments: parentSwitch);
445 bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache();
446
447 packageAv1.VerifyInstalled(false);
448 packageAv2.VerifyInstalled(true);
449 Assert.True(BundleRegistration.DependencyDependentExists(providerId, parent));
450
451 // Uninstall the v1 bundle with the same parent which should passthrough to v2 and remove parent.
452 bundleAv1.Uninstall(arguments: parentSwitch);
453 bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache();
454 bundleAv2.VerifyRegisteredAndInPackageCache();
455
456 packageAv1.VerifyInstalled(false);
457 packageAv2.VerifyInstalled(true);
458 Assert.False(BundleRegistration.DependencyDependentExists(providerId, parent));
459
460 // Uninstall the v2 bundle and all should be removed.
461 bundleAv2.Uninstall();
462 bundleAv2.VerifyUnregisteredAndRemovedFromPackageCache();
463
464 packageAv1.VerifyInstalled(false);
465 packageAv2.VerifyInstalled(false);
466 Assert.False(BundleRegistration.TryGetDependencyProviderValue(providerId, "Version", out actualProviderVersion));
467 }
468 }
469}