aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2021-03-08 16:06:01 -0600
committerSean Hall <r.sean.hall@gmail.com>2021-03-08 16:11:57 -0600
commit99d7440134d0f33683d1150a770a2bc594be41de (patch)
tree9a38c1df21c0022516bdfeca0d30f235acd3b46a
parent23e3978430ec3ae4f1ea808af0b590b71b2fec9a (diff)
downloadwix-99d7440134d0f33683d1150a770a2bc594be41de.tar.gz
wix-99d7440134d0f33683d1150a770a2bc594be41de.tar.bz2
wix-99d7440134d0f33683d1150a770a2bc594be41de.zip
Port dependency tests from old repo.
-rw-r--r--BurnE2ETests.sln14
-rw-r--r--global.json2
-rw-r--r--nuget.config1
-rw-r--r--src/TestData/DependencyTests/BundleAv1/BundleA.props11
-rw-r--r--src/TestData/DependencyTests/BundleAv1/BundleAv1.wixproj16
-rw-r--r--src/TestData/DependencyTests/BundleAv1/BundleAv1.wxs21
-rw-r--r--src/TestData/DependencyTests/BundleAv1_0_1/BundleAv1_0_1.wixproj16
-rw-r--r--src/TestData/DependencyTests/BundleAv1_0_1/BundleAv1_0_1.wxs21
-rw-r--r--src/TestData/DependencyTests/BundleB/Bundle.wxs40
-rw-r--r--src/TestData/DependencyTests/BundleB/BundleB.wixproj18
-rw-r--r--src/TestData/DependencyTests/BundleB/BundleB.wxs22
-rw-r--r--src/TestData/DependencyTests/BundleC/BundleC.wixproj22
-rw-r--r--src/TestData/DependencyTests/BundleC/BundleC.wxs12
-rw-r--r--src/TestData/DependencyTests/BundleD/BundleD.wixproj22
-rw-r--r--src/TestData/DependencyTests/BundleD/BundleD.wxs12
-rw-r--r--src/TestData/DependencyTests/BundleE/BundleE.wixproj21
-rw-r--r--src/TestData/DependencyTests/BundleE/BundleE.wxs19
-rw-r--r--src/TestData/DependencyTests/BundleF/BundleF.wixproj21
-rw-r--r--src/TestData/DependencyTests/BundleF/BundleF.wxs12
-rw-r--r--src/TestData/DependencyTests/BundleF_AddOnA/BundleF_AddOn.wxs22
-rw-r--r--src/TestData/DependencyTests/BundleF_AddOnA/BundleF_AddOnA.wixproj20
-rw-r--r--src/TestData/DependencyTests/BundleF_AddOnB/BundleF_AddOnB.wixproj21
-rw-r--r--src/TestData/DependencyTests/BundleF_PatchAv1_0_1/BundleF_PatchA.props11
-rw-r--r--src/TestData/DependencyTests/BundleF_PatchAv1_0_1/BundleF_PatchAv1_0_1.wixproj16
-rw-r--r--src/TestData/DependencyTests/BundleF_PatchAv1_0_1/BundleF_PatchAv1_0_1.wxs13
-rw-r--r--src/TestData/DependencyTests/BundleF_PatchAv1_0_2/BundleF_PatchAv1_0_2.wixproj17
-rw-r--r--src/TestData/DependencyTests/BundleF_PatchAv1_0_2/BundleF_PatchAv1_0_2.wxs16
-rw-r--r--src/TestData/DependencyTests/BundleHv1/BundleH.props10
-rw-r--r--src/TestData/DependencyTests/BundleHv1/BundleHv1.wixproj13
-rw-r--r--src/TestData/DependencyTests/BundleHv1/BundleHv1.wxs11
-rw-r--r--src/TestData/DependencyTests/BundleHv2/BundleHv2.wixproj16
-rw-r--r--src/TestData/DependencyTests/BundleHv2/BundleHv2.wxs11
-rw-r--r--src/TestData/DependencyTests/BundleJ/BundleJ.wixproj21
-rw-r--r--src/TestData/DependencyTests/BundleJ/BundleJ.wxs12
-rw-r--r--src/TestData/DependencyTests/BundleJ_Patch/BundleJ_Patch.wixproj21
-rw-r--r--src/TestData/DependencyTests/BundleJ_Patch/BundleJ_Patch.wxs16
-rw-r--r--src/TestData/DependencyTests/BundleL/BundleL.wixproj20
-rw-r--r--src/TestData/DependencyTests/BundleL/BundleL.wxs10
-rw-r--r--src/TestData/DependencyTests/PackageAv1/PackageA.props12
-rw-r--r--src/TestData/DependencyTests/PackageAv1/PackageAv1.wixproj7
-rw-r--r--src/TestData/DependencyTests/PackageAv1/ProductComponents.wxs16
-rw-r--r--src/TestData/DependencyTests/PackageAv1_0_1/PackageAv1_0_1.wixproj13
-rw-r--r--src/TestData/DependencyTests/PackageAv1_0_2/PackageAv1_0_2.wixproj13
-rw-r--r--src/TestData/DependencyTests/PackageB/PackageB.wixproj13
-rw-r--r--src/TestData/DependencyTests/PackageB/ProductComponents.wxs18
-rw-r--r--src/TestData/DependencyTests/PackageC/PackageC.wixproj13
-rw-r--r--src/TestData/DependencyTests/PackageDv1/Package.wxs66
-rw-r--r--src/TestData/DependencyTests/PackageDv1/PackageD.props7
-rw-r--r--src/TestData/DependencyTests/PackageDv1/PackageDv1.wixproj7
-rw-r--r--src/TestData/DependencyTests/PackageDv2/PackageDv2.wixproj13
-rw-r--r--src/TestData/DependencyTests/PackageEv1/PackageE.props12
-rw-r--r--src/TestData/DependencyTests/PackageEv1/PackageEv1.wixproj7
-rw-r--r--src/TestData/DependencyTests/PackageEv1/ProductComponents.wxs16
-rw-r--r--src/TestData/DependencyTests/PackageEv1_0_1/PackageEv1_0_1.wixproj13
-rw-r--r--src/TestData/DependencyTests/PatchA/PatchA.wixproj15
-rw-r--r--src/TestData/DependencyTests/PatchA/PatchA.wxs22
-rw-r--r--src/TestData/DependencyTests/PatchB/PatchB.wixproj15
-rw-r--r--src/TestData/DependencyTests/PatchB/PatchB.wxs21
-rw-r--r--src/TestData/Templates/PackageFail.wxs2
-rw-r--r--src/TestData/TestBA/TestBAWixlib/TestExe.wxs9
-rw-r--r--src/TestData/TestBA/TestBAWixlib/testbawixlib.wixproj1
-rw-r--r--src/TestData/TestData.proj8
-rw-r--r--src/TestExe/Program.cs74
-rw-r--r--src/TestExe/Task.cs471
-rw-r--r--src/TestExe/TestExe.csproj17
-rw-r--r--src/TestExe/app.config10
-rw-r--r--src/WixTestTools/BundleInstaller.cs3
-rw-r--r--src/WixTestTools/BundleRegistration.cs14
-rw-r--r--src/WixTestTools/BundleVerifier.cs65
-rw-r--r--src/WixTestTools/MsiUtilities.cs20
-rw-r--r--src/WixTestTools/PackageVerifier.cs7
-rw-r--r--src/WixTestTools/WixTestTools.csproj2
-rw-r--r--src/WixToolsetTest.BurnE2E/DependencyTests.cs586
-rw-r--r--src/WixToolsetTest.BurnE2E/WixToolsetTest.BurnE2E.csproj2
74 files changed, 2206 insertions, 24 deletions
diff --git a/BurnE2ETests.sln b/BurnE2ETests.sln
index aa259184..2e3523bf 100644
--- a/BurnE2ETests.sln
+++ b/BurnE2ETests.sln
@@ -5,6 +5,8 @@ VisualStudioVersion = 16.0.29503.13
5MinimumVisualStudioVersion = 10.0.40219.1 5MinimumVisualStudioVersion = 10.0.40219.1
6Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestBA", "src\TestBA\TestBA.csproj", "{04022D35-6D75-49D0-91D2-4208E09DBA6D}" 6Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestBA", "src\TestBA\TestBA.csproj", "{04022D35-6D75-49D0-91D2-4208E09DBA6D}"
7EndProject 7EndProject
8Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestExe", "src\TestExe\TestExe.csproj", "{B038B342-BE42-4951-82A9-7789412CF37F}"
9EndProject
8Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixTestTools", "src\WixTestTools\WixTestTools.csproj", "{3D3B02F3-79B6-4BD5-AD49-2889DA3849A7}" 10Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixTestTools", "src\WixTestTools\WixTestTools.csproj", "{3D3B02F3-79B6-4BD5-AD49-2889DA3849A7}"
9EndProject 11EndProject
10Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.BurnE2E", "src\WixToolsetTest.BurnE2E\WixToolsetTest.BurnE2E.csproj", "{FED9D707-E5C3-4867-87B0-FABDB5EB0823}" 12Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.BurnE2E", "src\WixToolsetTest.BurnE2E\WixToolsetTest.BurnE2E.csproj", "{FED9D707-E5C3-4867-87B0-FABDB5EB0823}"
@@ -31,6 +33,18 @@ Global
31 {04022D35-6D75-49D0-91D2-4208E09DBA6D}.Release|x64.Build.0 = Release|Any CPU 33 {04022D35-6D75-49D0-91D2-4208E09DBA6D}.Release|x64.Build.0 = Release|Any CPU
32 {04022D35-6D75-49D0-91D2-4208E09DBA6D}.Release|x86.ActiveCfg = Release|Any CPU 34 {04022D35-6D75-49D0-91D2-4208E09DBA6D}.Release|x86.ActiveCfg = Release|Any CPU
33 {04022D35-6D75-49D0-91D2-4208E09DBA6D}.Release|x86.Build.0 = Release|Any CPU 35 {04022D35-6D75-49D0-91D2-4208E09DBA6D}.Release|x86.Build.0 = Release|Any CPU
36 {B038B342-BE42-4951-82A9-7789412CF37F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
37 {B038B342-BE42-4951-82A9-7789412CF37F}.Debug|Any CPU.Build.0 = Debug|Any CPU
38 {B038B342-BE42-4951-82A9-7789412CF37F}.Debug|x64.ActiveCfg = Debug|Any CPU
39 {B038B342-BE42-4951-82A9-7789412CF37F}.Debug|x64.Build.0 = Debug|Any CPU
40 {B038B342-BE42-4951-82A9-7789412CF37F}.Debug|x86.ActiveCfg = Debug|Any CPU
41 {B038B342-BE42-4951-82A9-7789412CF37F}.Debug|x86.Build.0 = Debug|Any CPU
42 {B038B342-BE42-4951-82A9-7789412CF37F}.Release|Any CPU.ActiveCfg = Release|Any CPU
43 {B038B342-BE42-4951-82A9-7789412CF37F}.Release|Any CPU.Build.0 = Release|Any CPU
44 {B038B342-BE42-4951-82A9-7789412CF37F}.Release|x64.ActiveCfg = Release|Any CPU
45 {B038B342-BE42-4951-82A9-7789412CF37F}.Release|x64.Build.0 = Release|Any CPU
46 {B038B342-BE42-4951-82A9-7789412CF37F}.Release|x86.ActiveCfg = Release|Any CPU
47 {B038B342-BE42-4951-82A9-7789412CF37F}.Release|x86.Build.0 = Release|Any CPU
34 {3D3B02F3-79B6-4BD5-AD49-2889DA3849A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 48 {3D3B02F3-79B6-4BD5-AD49-2889DA3849A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
35 {3D3B02F3-79B6-4BD5-AD49-2889DA3849A7}.Debug|Any CPU.Build.0 = Debug|Any CPU 49 {3D3B02F3-79B6-4BD5-AD49-2889DA3849A7}.Debug|Any CPU.Build.0 = Debug|Any CPU
36 {3D3B02F3-79B6-4BD5-AD49-2889DA3849A7}.Debug|x64.ActiveCfg = Debug|Any CPU 50 {3D3B02F3-79B6-4BD5-AD49-2889DA3849A7}.Debug|x64.ActiveCfg = Debug|Any CPU
diff --git a/global.json b/global.json
index 2e158a40..078998a4 100644
--- a/global.json
+++ b/global.json
@@ -1,6 +1,6 @@
1{ 1{
2 "msbuild-sdks": { 2 "msbuild-sdks": {
3 "WixToolset.Sdk": "4.0.0-build-0194" 3 "WixToolset.Sdk": "4.0.0-build-0195"
4 }, 4 },
5 "sdk": { 5 "sdk": {
6 "allowPrerelease": false 6 "allowPrerelease": false
diff --git a/nuget.config b/nuget.config
index 0d7536b8..9187a22e 100644
--- a/nuget.config
+++ b/nuget.config
@@ -5,6 +5,7 @@
5 <add key="wixtoolset-balutil" value="https://ci.appveyor.com/nuget/wixtoolset-balutil" /> 5 <add key="wixtoolset-balutil" value="https://ci.appveyor.com/nuget/wixtoolset-balutil" />
6 <add key="wixtoolset-bal-wixext" value="https://ci.appveyor.com/nuget/wixtoolset-bal-wixext" /> 6 <add key="wixtoolset-bal-wixext" value="https://ci.appveyor.com/nuget/wixtoolset-bal-wixext" />
7 <add key="wixtoolset-data" value="https://ci.appveyor.com/nuget/wixtoolset-data" /> 7 <add key="wixtoolset-data" value="https://ci.appveyor.com/nuget/wixtoolset-data" />
8 <add key="wixtoolset-dependency-wixext" value="https://ci.appveyor.com/nuget/wixtoolset-dependency-wixext" />
8 <add key="wixtoolset-dtf" value="https://ci.appveyor.com/nuget/wixtoolset-dtf" /> 9 <add key="wixtoolset-dtf" value="https://ci.appveyor.com/nuget/wixtoolset-dtf" />
9 <add key="wixtoolset-netfx-wixext" value="https://ci.appveyor.com/nuget/wixtoolset-netfx-wixext" /> 10 <add key="wixtoolset-netfx-wixext" value="https://ci.appveyor.com/nuget/wixtoolset-netfx-wixext" />
10 <add key="wixtoolset-tools" value="https://ci.appveyor.com/nuget/wixtoolset-tools" /> 11 <add key="wixtoolset-tools" value="https://ci.appveyor.com/nuget/wixtoolset-tools" />
diff --git a/src/TestData/DependencyTests/BundleAv1/BundleA.props b/src/TestData/DependencyTests/BundleAv1/BundleA.props
new file mode 100644
index 00000000..256501c7
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleAv1/BundleA.props
@@ -0,0 +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. -->
2<Project>
3 <PropertyGroup>
4 <OutputType>Bundle</OutputType>
5 <BundleName>BundleA</BundleName>
6 <UpgradeCode>{6950EF3F-674E-4689-A5C8-80D12AB6E34F}</UpgradeCode>
7 </PropertyGroup>
8 <ItemGroup>
9 <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
10 </ItemGroup>
11</Project>
diff --git a/src/TestData/DependencyTests/BundleAv1/BundleAv1.wixproj b/src/TestData/DependencyTests/BundleAv1/BundleAv1.wixproj
new file mode 100644
index 00000000..ede63892
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleAv1/BundleAv1.wixproj
@@ -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<Project Sdk="WixToolset.Sdk">
3 <Import Project="BundleA.props" />
4 <PropertyGroup>
5 <Version>1.0.0.0</Version>
6 </PropertyGroup>
7 <ItemGroup>
8 <ProjectReference Include="..\PackageAv1\PackageAv1.wixproj" />
9 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
10 </ItemGroup>
11 <ItemGroup>
12 <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.89" />
13 <PackageReference Include="WixToolset.NetFx.wixext" Version="4.0.64" />
14 <PackageReference Include="WixToolset.Util.wixext" Version="4.0.77" />
15 </ItemGroup>
16</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/BundleAv1/BundleAv1.wxs b/src/TestData/DependencyTests/BundleAv1/BundleAv1.wxs
new file mode 100644
index 00000000..9218e823
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleAv1/BundleAv1.wxs
@@ -0,0 +1,21 @@
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">
6 <Fragment>
7 <util:RegistrySearch Root="HKLM" Key="$(var.TestExeRegistryKey)" Value="Version" Variable="ExeA_Version" />
8
9 <PackageGroup Id="BundlePackages">
10 <MsiPackage Id="PackageA" SourceFile="$(var.PackageAv1.TargetPath)" />
11 <ExePackage Id="ExeA" Cache="no" PerMachine="yes"
12 DetectCondition="ExeA_Version AND ExeA_Version &gt;= v$(var.Version)"
13 InstallArguments="/regw &quot;HKLM\$(var.TestExeRegistryKey),Version,String,$(var.Version)&quot;"
14 RepairArguments="/regw &quot;HKLM\$(var.TestExeRegistryKey),Version,String,$(var.Version)&quot;"
15 UninstallArguments="/regd &quot;HKLM\$(var.TestExeRegistryKey),Version&quot;">
16 <Provides Key="$(var.TestGroupName)_ExeA,v1.0" Version="$(var.Version)" />
17 <PayloadGroupRef Id="TestExePayloads" />
18 </ExePackage>
19 </PackageGroup>
20 </Fragment>
21</Wix>
diff --git a/src/TestData/DependencyTests/BundleAv1_0_1/BundleAv1_0_1.wixproj b/src/TestData/DependencyTests/BundleAv1_0_1/BundleAv1_0_1.wixproj
new file mode 100644
index 00000000..26a61a70
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleAv1_0_1/BundleAv1_0_1.wixproj
@@ -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<Project Sdk="WixToolset.Sdk">
3 <Import Project="..\BundleAv1\BundleA.props" />
4 <PropertyGroup>
5 <Version>1.0.1.0</Version>
6 </PropertyGroup>
7 <ItemGroup>
8 <ProjectReference Include="..\PackageAv1_0_1\PackageAv1_0_1.wixproj" />
9 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
10 </ItemGroup>
11 <ItemGroup>
12 <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.89" />
13 <PackageReference Include="WixToolset.NetFx.wixext" Version="4.0.64" />
14 <PackageReference Include="WixToolset.Util.wixext" Version="4.0.77" />
15 </ItemGroup>
16</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/BundleAv1_0_1/BundleAv1_0_1.wxs b/src/TestData/DependencyTests/BundleAv1_0_1/BundleAv1_0_1.wxs
new file mode 100644
index 00000000..1590574f
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleAv1_0_1/BundleAv1_0_1.wxs
@@ -0,0 +1,21 @@
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">
6 <Fragment>
7 <util:RegistrySearch Root="HKLM" Key="$(var.TestExeRegistryKey)" Value="Version" Variable="ExeA_Version" />
8
9 <PackageGroup Id="BundlePackages">
10 <MsiPackage Id="PackageA" Name="PackageAv1.msi" SourceFile="$(var.PackageAv1_0_1.TargetPath)" />
11 <ExePackage Id="ExeA" Cache="no" PerMachine="yes"
12 DetectCondition="ExeA_Version AND ExeA_Version &gt;= v$(var.Version)"
13 InstallArguments="/regw &quot;HKLM\$(var.TestExeRegistryKey),Version,String,$(var.Version)&quot;"
14 RepairArguments="/regw &quot;HKLM\$(var.TestExeRegistryKey),Version,String,$(var.Version)&quot;"
15 UninstallArguments="/regd &quot;HKLM\$(var.TestExeRegistryKey),Version&quot;">
16 <Provides Key="$(var.TestGroupName)_ExeA,v1.0" Version="$(var.Version)" />
17 <PayloadGroupRef Id="TestExePayloads" />
18 </ExePackage>
19 </PackageGroup>
20 </Fragment>
21</Wix>
diff --git a/src/TestData/DependencyTests/BundleB/Bundle.wxs b/src/TestData/DependencyTests/BundleB/Bundle.wxs
new file mode 100644
index 00000000..8d2dce60
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleB/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="WiX.$(var.TestGroupName).$(var.BundleName).B">
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/DependencyTests/BundleB/BundleB.wixproj b/src/TestData/DependencyTests/BundleB/BundleB.wixproj
new file mode 100644
index 00000000..34c76ccb
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleB/BundleB.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 <PropertyGroup>
4 <OutputType>Bundle</OutputType>
5 <UpgradeCode>{228859BB-F917-4F43-A1E0-50C8DCCA92EF}</UpgradeCode>
6 <Version>1.0.0.0</Version>
7 </PropertyGroup>
8 <ItemGroup>
9 <ProjectReference Include="..\PackageAv1\PackageAv1.wixproj" />
10 <ProjectReference Include="..\PackageB\PackageB.wixproj" />
11 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
12 </ItemGroup>
13 <ItemGroup>
14 <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.89" />
15 <PackageReference Include="WixToolset.NetFx.wixext" Version="4.0.64" />
16 <PackageReference Include="WixToolset.Util.wixext" Version="4.0.77" />
17 </ItemGroup>
18</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/BundleB/BundleB.wxs b/src/TestData/DependencyTests/BundleB/BundleB.wxs
new file mode 100644
index 00000000..026100fa
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleB/BundleB.wxs
@@ -0,0 +1,22 @@
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">
6 <Fragment>
7 <util:RegistrySearch Root="HKLM" Key="$(var.TestExeRegistryKey)" Value="Version" Variable="ExeA_Version" />
8
9 <PackageGroup Id="BundlePackages">
10 <MsiPackage Id="PackageA" SourceFile="$(var.PackageAv1.TargetPath)" />
11 <MsiPackage Id="PackageB" SourceFile="$(var.PackageB.TargetPath)" />
12 <ExePackage Id="ExeA" Cache="no" PerMachine="yes"
13 DetectCondition="ExeA_Version AND ExeA_Version &gt;= v$(var.Version)"
14 InstallArguments="/regw &quot;HKLM\$(var.TestExeRegistryKey),Version,String,$(var.Version)&quot;"
15 RepairArguments="/regw &quot;HKLM\$(var.TestExeRegistryKey),Version,String,$(var.Version)&quot;"
16 UninstallArguments="/regd &quot;HKLM\$(var.TestExeRegistryKey),Version&quot;">
17 <Provides Key="$(var.TestGroupName)_ExeA,v1.0" Version="$(var.Version)" />
18 <PayloadGroupRef Id="TestExePayloads" />
19 </ExePackage>
20 </PackageGroup>
21 </Fragment>
22</Wix>
diff --git a/src/TestData/DependencyTests/BundleC/BundleC.wixproj b/src/TestData/DependencyTests/BundleC/BundleC.wixproj
new file mode 100644
index 00000000..f77e772f
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleC/BundleC.wixproj
@@ -0,0 +1,22 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <PropertyGroup>
4 <OutputType>Bundle</OutputType>
5 <!-- Same as BundleA -->
6 <UpgradeCode>{6950EF3F-674E-4689-A5C8-80D12AB6E34F}</UpgradeCode>
7 <Version>1.0.1.0</Version>
8 </PropertyGroup>
9 <ItemGroup>
10 <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
11 </ItemGroup>
12 <ItemGroup>
13 <ProjectReference Include="..\PackageAv1\PackageAv1.wixproj" />
14 <ProjectReference Include="..\PatchA\PatchA.wixproj" />
15 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
16 </ItemGroup>
17 <ItemGroup>
18 <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.89" />
19 <PackageReference Include="WixToolset.NetFx.wixext" Version="4.0.64" />
20 <PackageReference Include="WixToolset.Util.wixext" Version="4.0.77" />
21 </ItemGroup>
22</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/BundleC/BundleC.wxs b/src/TestData/DependencyTests/BundleC/BundleC.wxs
new file mode 100644
index 00000000..2ce8ed44
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleC/BundleC.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" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
4 <Fragment>
5 <PackageGroup Id="BundlePackages">
6 <MsiPackage Id="PackageA" SourceFile="$(var.PackageAv1.TargetPath)">
7 <SlipstreamMsp Id="PatchA"/>
8 </MsiPackage>
9 <MspPackage Id="PatchA" SourceFile="$(var.PatchA.TargetPath)" />
10 </PackageGroup>
11 </Fragment>
12</Wix>
diff --git a/src/TestData/DependencyTests/BundleD/BundleD.wixproj b/src/TestData/DependencyTests/BundleD/BundleD.wixproj
new file mode 100644
index 00000000..6f2f098e
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleD/BundleD.wixproj
@@ -0,0 +1,22 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <PropertyGroup>
4 <OutputType>Bundle</OutputType>
5 <!-- Same as BundleA -->
6 <UpgradeCode>{6950EF3F-674E-4689-A5C8-80D12AB6E34F}</UpgradeCode>
7 <Version>1.0.1.0</Version>
8 <SuppressSpecificWarnings>1153</SuppressSpecificWarnings>
9 </PropertyGroup>
10 <ItemGroup>
11 <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
12 </ItemGroup>
13 <ItemGroup>
14 <ProjectReference Include="..\PackageAv1\PackageAv1.wixproj" />
15 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
16 </ItemGroup>
17 <ItemGroup>
18 <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.89" />
19 <PackageReference Include="WixToolset.NetFx.wixext" Version="4.0.64" />
20 <PackageReference Include="WixToolset.Util.wixext" Version="4.0.77" />
21 </ItemGroup>
22</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/BundleD/BundleD.wxs b/src/TestData/DependencyTests/BundleD/BundleD.wxs
new file mode 100644
index 00000000..8ee40558
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleD/BundleD.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" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
4 <Fragment>
5 <PackageGroup Id="BundlePackages">
6 <MsiPackage Id="PackageA" SourceFile="$(var.PackageAv1.TargetPath)" />
7 <ExePackage Id="TestExe" Cache="no" PerMachine="yes" Permanent="yes" InstallArguments="/ec 1603">
8 <PayloadGroupRef Id="TestExePayloads" />
9 </ExePackage>
10 </PackageGroup>
11 </Fragment>
12</Wix>
diff --git a/src/TestData/DependencyTests/BundleE/BundleE.wixproj b/src/TestData/DependencyTests/BundleE/BundleE.wixproj
new file mode 100644
index 00000000..e43ffceb
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleE/BundleE.wixproj
@@ -0,0 +1,21 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <PropertyGroup>
4 <OutputType>Bundle</OutputType>
5 <UpgradeCode>{250B4261-E67F-47E0-AB15-209EF58B769D}</UpgradeCode>
6 <Version>1.0.0.0</Version>
7 </PropertyGroup>
8 <ItemGroup>
9 <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
10 </ItemGroup>
11 <ItemGroup>
12 <ProjectReference Include="..\PackageAv1\PackageAv1.wixproj" />
13 <ProjectReference Include="..\PackageC\PackageC.wixproj" />
14 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
15 </ItemGroup>
16 <ItemGroup>
17 <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.89" />
18 <PackageReference Include="WixToolset.NetFx.wixext" Version="4.0.64" />
19 <PackageReference Include="WixToolset.Util.wixext" Version="4.0.77" />
20 </ItemGroup>
21</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/BundleE/BundleE.wxs b/src/TestData/DependencyTests/BundleE/BundleE.wxs
new file mode 100644
index 00000000..204e66ab
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleE/BundleE.wxs
@@ -0,0 +1,19 @@
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">
6 <Fragment>
7 <util:RegistrySearch Root="HKLM" Key="$(var.TestExeRegistryKey)" Value="Version" Variable="ExeA_Version" />
8
9 <PackageGroup Id="BundlePackages">
10 <MsiPackage Id="PackageA" SourceFile="$(var.PackageAv1.TargetPath)" />
11 <MsiPackage Id="PackageC" SourceFile="$(var.PackageC.TargetPath)" Vital="no" />
12 <ExePackage Id="ExeA" Cache="no" Vital="no" PerMachine="yes" InstallArguments="/ec 1603"
13 DetectCondition="ExeA_Version AND ExeA_Version &gt;= v$(var.Version)">
14 <Provides Key="$(var.TestGroupName)_ExeA,v1.0" Version="$(var.Version)" />
15 <PayloadGroupRef Id="TestExePayloads" />
16 </ExePackage>
17 </PackageGroup>
18 </Fragment>
19</Wix>
diff --git a/src/TestData/DependencyTests/BundleF/BundleF.wixproj b/src/TestData/DependencyTests/BundleF/BundleF.wixproj
new file mode 100644
index 00000000..0bbe9ae6
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleF/BundleF.wixproj
@@ -0,0 +1,21 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <PropertyGroup>
4 <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>
11 <ItemGroup>
12 <ProjectReference Include="..\PackageAv1\PackageAv1.wixproj" />
13 <ProjectReference Include="..\PackageB\PackageB.wixproj" />
14 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
15 </ItemGroup>
16 <ItemGroup>
17 <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.89" />
18 <PackageReference Include="WixToolset.NetFx.wixext" Version="4.0.64" />
19 <PackageReference Include="WixToolset.Util.wixext" Version="4.0.77" />
20 </ItemGroup>
21</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/BundleF/BundleF.wxs b/src/TestData/DependencyTests/BundleF/BundleF.wxs
new file mode 100644
index 00000000..1347836a
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleF/BundleF.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/TestData/DependencyTests/BundleF_AddOnA/BundleF_AddOn.wxs b/src/TestData/DependencyTests/BundleF_AddOnA/BundleF_AddOn.wxs
new file mode 100644
index 00000000..c8ca4a3f
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleF_AddOnA/BundleF_AddOn.wxs
@@ -0,0 +1,22 @@
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">
6 <Fragment>
7 <RelatedBundle Id="583B5ECB-04E6-4837-A30C-A1ADCBE24235" Action="Addon" />
8 <util:RegistrySearch Root="HKLM" Key="$(var.TestExeRegistryKey)" Value="Version" Variable="ExeA_Version" />
9
10 <PackageGroup Id="BundlePackages">
11 <MsiPackage Id="PackageA" SourceFile="$(var.PackageAv1.TargetPath)" />
12 <ExePackage Id="ExeA" Cache="no" PerMachine="yes"
13 DetectCondition="ExeA_Version AND ExeA_Version &gt;= v$(var.Version)"
14 InstallArguments="/regw &quot;HKLM\$(var.TestExeRegistryKey),Version,String,$(var.Version)&quot;"
15 RepairArguments="/regw &quot;HKLM\$(var.TestExeRegistryKey),Version,String,$(var.Version)&quot;"
16 UninstallArguments="/regd &quot;HKLM\$(var.TestExeRegistryKey),Version&quot;">
17 <Provides Key="$(var.TestGroupName)_ExeA,v1.0" Version="$(var.Version)" />
18 <PayloadGroupRef Id="TestExePayloads" />
19 </ExePackage>
20 </PackageGroup>
21 </Fragment>
22</Wix>
diff --git a/src/TestData/DependencyTests/BundleF_AddOnA/BundleF_AddOnA.wixproj b/src/TestData/DependencyTests/BundleF_AddOnA/BundleF_AddOnA.wixproj
new file mode 100644
index 00000000..31994fb1
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleF_AddOnA/BundleF_AddOnA.wixproj
@@ -0,0 +1,20 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <PropertyGroup>
4 <OutputType>Bundle</OutputType>
5 <UpgradeCode>{022D0F5D-D140-47E1-A19A-5B2CEEE52668}</UpgradeCode>
6 <Version>1.0.0.0</Version>
7 </PropertyGroup>
8 <ItemGroup>
9 <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
10 </ItemGroup>
11 <ItemGroup>
12 <ProjectReference Include="..\PackageAv1\PackageAv1.wixproj" />
13 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
14 </ItemGroup>
15 <ItemGroup>
16 <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.89" />
17 <PackageReference Include="WixToolset.NetFx.wixext" Version="4.0.64" />
18 <PackageReference Include="WixToolset.Util.wixext" Version="4.0.77" />
19 </ItemGroup>
20</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/BundleF_AddOnB/BundleF_AddOnB.wixproj b/src/TestData/DependencyTests/BundleF_AddOnB/BundleF_AddOnB.wixproj
new file mode 100644
index 00000000..056f8a1b
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleF_AddOnB/BundleF_AddOnB.wixproj
@@ -0,0 +1,21 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <PropertyGroup>
4 <OutputType>Bundle</OutputType>
5 <UpgradeCode>{8AB16F34-CA65-46E1-BDC0-08F157B4781C}</UpgradeCode>
6 <Version>1.0.0.0</Version>
7 </PropertyGroup>
8 <ItemGroup>
9 <Compile Include="..\BundleF_AddOnA\BundleF_AddOn.wxs" Link="BundleF_AddOn.wxs" />
10 <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
11 </ItemGroup>
12 <ItemGroup>
13 <ProjectReference Include="..\PackageAv1\PackageAv1.wixproj" />
14 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
15 </ItemGroup>
16 <ItemGroup>
17 <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.89" />
18 <PackageReference Include="WixToolset.NetFx.wixext" Version="4.0.64" />
19 <PackageReference Include="WixToolset.Util.wixext" Version="4.0.77" />
20 </ItemGroup>
21</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/BundleF_PatchAv1_0_1/BundleF_PatchA.props b/src/TestData/DependencyTests/BundleF_PatchAv1_0_1/BundleF_PatchA.props
new file mode 100644
index 00000000..cbc025ef
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleF_PatchAv1_0_1/BundleF_PatchA.props
@@ -0,0 +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. -->
2<Project>
3 <PropertyGroup>
4 <OutputType>Bundle</OutputType>
5 <BundleName>BundleF_PatchA</BundleName>
6 <UpgradeCode>{90F41437-BEF8-4ED8-8902-C5DED74E4F6C}</UpgradeCode>
7 </PropertyGroup>
8 <ItemGroup>
9 <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
10 </ItemGroup>
11</Project>
diff --git a/src/TestData/DependencyTests/BundleF_PatchAv1_0_1/BundleF_PatchAv1_0_1.wixproj b/src/TestData/DependencyTests/BundleF_PatchAv1_0_1/BundleF_PatchAv1_0_1.wixproj
new file mode 100644
index 00000000..3c113acd
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleF_PatchAv1_0_1/BundleF_PatchAv1_0_1.wixproj
@@ -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<Project Sdk="WixToolset.Sdk">
3 <Import Project="BundleF_PatchA.props" />
4 <PropertyGroup>
5 <Version>1.0.1.0</Version>
6 </PropertyGroup>
7 <ItemGroup>
8 <ProjectReference Include="..\PatchA\PatchA.wixproj" />
9 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
10 </ItemGroup>
11 <ItemGroup>
12 <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.89" />
13 <PackageReference Include="WixToolset.NetFx.wixext" Version="4.0.64" />
14 <PackageReference Include="WixToolset.Util.wixext" Version="4.0.77" />
15 </ItemGroup>
16</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/BundleF_PatchAv1_0_1/BundleF_PatchAv1_0_1.wxs b/src/TestData/DependencyTests/BundleF_PatchAv1_0_1/BundleF_PatchAv1_0_1.wxs
new file mode 100644
index 00000000..8ef8a351
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleF_PatchAv1_0_1/BundleF_PatchAv1_0_1.wxs
@@ -0,0 +1,13 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
4 <Fragment>
5 <RelatedBundle Id="{EC2B2B3F-E57C-45A4-A0E8-762156DAD99D}" Action="Patch" />
6
7 <PackageGroup Id="BundlePackages">
8 <MspPackage Id="PatchA" SourceFile="$(var.PatchA.TargetPath)" PerMachine="yes">
9 <Provides Key="$(var.TestGroupName)_PatchA" Version="$(var.Version)" />
10 </MspPackage>
11 </PackageGroup>
12 </Fragment>
13</Wix>
diff --git a/src/TestData/DependencyTests/BundleF_PatchAv1_0_2/BundleF_PatchAv1_0_2.wixproj b/src/TestData/DependencyTests/BundleF_PatchAv1_0_2/BundleF_PatchAv1_0_2.wixproj
new file mode 100644
index 00000000..cd88b4bf
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleF_PatchAv1_0_2/BundleF_PatchAv1_0_2.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_PatchAv1_0_1\BundleF_PatchA.props" />
4 <PropertyGroup>
5 <Version>1.0.2.0</Version>
6 </PropertyGroup>
7 <ItemGroup>
8 <ProjectReference Include="..\PatchA\PatchA.wixproj" />
9 <ProjectReference Include="..\PatchB\PatchB.wixproj" />
10 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
11 </ItemGroup>
12 <ItemGroup>
13 <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.89" />
14 <PackageReference Include="WixToolset.NetFx.wixext" Version="4.0.64" />
15 <PackageReference Include="WixToolset.Util.wixext" Version="4.0.77" />
16 </ItemGroup>
17</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/BundleF_PatchAv1_0_2/BundleF_PatchAv1_0_2.wxs b/src/TestData/DependencyTests/BundleF_PatchAv1_0_2/BundleF_PatchAv1_0_2.wxs
new file mode 100644
index 00000000..2b47d5ed
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleF_PatchAv1_0_2/BundleF_PatchAv1_0_2.wxs
@@ -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<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
4 <Fragment>
5 <RelatedBundle Id="{EC2B2B3F-E57C-45A4-A0E8-762156DAD99D}" Action="Patch" />
6
7 <PackageGroup Id="BundlePackages">
8 <MspPackage Id="PatchA" SourceFile="$(var.PatchA.TargetPath)" PerMachine="yes">
9 <Provides Key="$(var.TestGroupName)_PatchA" Version="$(var.Version)" />
10 </MspPackage>
11 <MspPackage Id="PatchB" SourceFile="$(var.PatchB.TargetPath)" PerMachine="yes">
12 <Provides Key="$(var.TestGroupName)_PatchB" Version="$(var.Version)" />
13 </MspPackage>
14 </PackageGroup>
15 </Fragment>
16</Wix>
diff --git a/src/TestData/DependencyTests/BundleHv1/BundleH.props b/src/TestData/DependencyTests/BundleHv1/BundleH.props
new file mode 100644
index 00000000..14801ec3
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleHv1/BundleH.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>{C5EA6B61-EF32-48E0-A6F9-08EB6D096843}</UpgradeCode>
6 </PropertyGroup>
7 <ItemGroup>
8 <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
9 </ItemGroup>
10</Project>
diff --git a/src/TestData/DependencyTests/BundleHv1/BundleHv1.wixproj b/src/TestData/DependencyTests/BundleHv1/BundleHv1.wixproj
new file mode 100644
index 00000000..7c3d87f2
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleHv1/BundleHv1.wixproj
@@ -0,0 +1,13 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <Import Project="BundleH.props" />
4 <ItemGroup>
5 <ProjectReference Include="..\PackageAv1\PackageAv1.wixproj" />
6 <ProjectReference Include="..\PackageDv1\PackageDv1.wixproj" />
7 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
8 </ItemGroup>
9 <ItemGroup>
10 <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.89" />
11 <PackageReference Include="WixToolset.NetFx.wixext" Version="4.0.64" />
12 </ItemGroup>
13</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/BundleHv1/BundleHv1.wxs b/src/TestData/DependencyTests/BundleHv1/BundleHv1.wxs
new file mode 100644
index 00000000..b553d829
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleHv1/BundleHv1.wxs
@@ -0,0 +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. -->
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)" Visible="yes" Permanent="yes" />
8 <MsiPackage Id="PackageD" SourceFile="$(var.PackageDv1.TargetPath)" Visible="yes" />
9 </PackageGroup>
10 </Fragment>
11</Wix>
diff --git a/src/TestData/DependencyTests/BundleHv2/BundleHv2.wixproj b/src/TestData/DependencyTests/BundleHv2/BundleHv2.wixproj
new file mode 100644
index 00000000..4cf14238
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleHv2/BundleHv2.wixproj
@@ -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<Project Sdk="WixToolset.Sdk">
3 <Import Project="..\BundleHv1\BundleH.props" />
4 <PropertyGroup>
5 <Version>2.0.0.0</Version>
6 </PropertyGroup>
7 <ItemGroup>
8 <ProjectReference Include="..\PackageAv1\PackageAv1.wixproj" />
9 <ProjectReference Include="..\PackageDv2\PackageDv2.wixproj" />
10 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
11 </ItemGroup>
12 <ItemGroup>
13 <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.89" />
14 <PackageReference Include="WixToolset.NetFx.wixext" Version="4.0.64" />
15 </ItemGroup>
16</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/BundleHv2/BundleHv2.wxs b/src/TestData/DependencyTests/BundleHv2/BundleHv2.wxs
new file mode 100644
index 00000000..690f8e7a
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleHv2/BundleHv2.wxs
@@ -0,0 +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. -->
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)" Visible="yes" Permanent="yes" />
8 <MsiPackage Id="PackageD" SourceFile="$(var.PackageDv2.TargetPath)" Visible="yes" />
9 </PackageGroup>
10 </Fragment>
11</Wix>
diff --git a/src/TestData/DependencyTests/BundleJ/BundleJ.wixproj b/src/TestData/DependencyTests/BundleJ/BundleJ.wixproj
new file mode 100644
index 00000000..004b2d6a
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleJ/BundleJ.wixproj
@@ -0,0 +1,21 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <PropertyGroup>
4 <OutputType>Bundle</OutputType>
5 <UpgradeCode>{37BDF884-C24A-4C12-9D0C-421FC30747F2}</UpgradeCode>
6 <Version>1.0.0.0</Version>
7 </PropertyGroup>
8 <ItemGroup>
9 <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
10 </ItemGroup>
11 <ItemGroup>
12 <ProjectReference Include="..\PackageAv1\PackageAv1.wixproj" />
13 <ProjectReference Include="..\PackageEv1\PackageEv1.wixproj" />
14 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
15 </ItemGroup>
16 <ItemGroup>
17 <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.89" />
18 <PackageReference Include="WixToolset.NetFx.wixext" Version="4.0.64" />
19 <PackageReference Include="WixToolset.Util.wixext" Version="4.0.77" />
20 </ItemGroup>
21</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/BundleJ/BundleJ.wxs b/src/TestData/DependencyTests/BundleJ/BundleJ.wxs
new file mode 100644
index 00000000..422b4b22
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleJ/BundleJ.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="{B1617DA6-F824-4B9F-B9B2-A6AFD07A652D}" Action="Detect" />
6
7 <PackageGroup Id="BundlePackages">
8 <MsiPackage Id="PackageA" SourceFile="$(var.PackageAv1.TargetPath)" />
9 <MsiPackage Id="PackageE" SourceFile="$(var.PackageEv1.TargetPath)" />
10 </PackageGroup>
11 </Fragment>
12</Wix>
diff --git a/src/TestData/DependencyTests/BundleJ_Patch/BundleJ_Patch.wixproj b/src/TestData/DependencyTests/BundleJ_Patch/BundleJ_Patch.wixproj
new file mode 100644
index 00000000..b7dbd86a
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleJ_Patch/BundleJ_Patch.wixproj
@@ -0,0 +1,21 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <PropertyGroup>
4 <OutputType>Bundle</OutputType>
5 <UpgradeCode>{353B5A34-3B46-424E-8817-25B3D01C8C16}</UpgradeCode>
6 <Version>1.0.1.0</Version>
7 </PropertyGroup>
8 <ItemGroup>
9 <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
10 </ItemGroup>
11 <ItemGroup>
12 <ProjectReference Include="..\PackageEv1_0_1\PackageEv1_0_1.wixproj" />
13 <ProjectReference Include="..\PatchA\PatchA.wixproj" />
14 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
15 </ItemGroup>
16 <ItemGroup>
17 <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.89" />
18 <PackageReference Include="WixToolset.NetFx.wixext" Version="4.0.64" />
19 <PackageReference Include="WixToolset.Util.wixext" Version="4.0.77" />
20 </ItemGroup>
21</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/BundleJ_Patch/BundleJ_Patch.wxs b/src/TestData/DependencyTests/BundleJ_Patch/BundleJ_Patch.wxs
new file mode 100644
index 00000000..ddd4d8db
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleJ_Patch/BundleJ_Patch.wxs
@@ -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<?define TestExeRegistryKey = Software\WiX\Tests\$(var.TestGroupName)\ExeA?>
4
5<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
6 <Fragment>
7 <RelatedBundle Id="{B1617DA6-F824-4B9F-B9B2-A6AFD07A652D}" Action="Patch" />
8
9 <PackageGroup Id="BundlePackages">
10 <MspPackage Id="PatchA" SourceFile="$(var.PatchA.TargetPath)">
11 <Provides Key="$(var.TestGroupName)_PatchA" Version="$(var.Version)" />
12 </MspPackage>
13 <MsiPackage Id="PackageE" Name="PackageEv1.msi" SourceFile="$(var.PackageEv1_0_1.TargetPath)" />
14 </PackageGroup>
15 </Fragment>
16</Wix>
diff --git a/src/TestData/DependencyTests/BundleL/BundleL.wixproj b/src/TestData/DependencyTests/BundleL/BundleL.wixproj
new file mode 100644
index 00000000..f25af7f9
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleL/BundleL.wixproj
@@ -0,0 +1,20 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <PropertyGroup>
4 <OutputType>Bundle</OutputType>
5 <UpgradeCode>{2EDB07DC-DCCD-419F-AD25-52ABF36B53AE}</UpgradeCode>
6 </PropertyGroup>
7 <ItemGroup>
8 <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
9 </ItemGroup>
10 <ItemGroup>
11 <ProjectReference Include="..\PackageAv1\PackageAv1.wixproj" />
12 <ProjectReference Include="..\PackageC\PackageC.wixproj" />
13 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
14 </ItemGroup>
15 <ItemGroup>
16 <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.89" />
17 <PackageReference Include="WixToolset.NetFx.wixext" Version="4.0.64" />
18 <PackageReference Include="WixToolset.Util.wixext" Version="4.0.77" />
19 </ItemGroup>
20</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/BundleL/BundleL.wxs b/src/TestData/DependencyTests/BundleL/BundleL.wxs
new file mode 100644
index 00000000..d3789e63
--- /dev/null
+++ b/src/TestData/DependencyTests/BundleL/BundleL.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<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
4 <Fragment>
5 <PackageGroup Id="BundlePackages">
6 <MsiPackage Id="PackageA" SourceFile="$(var.PackageAv1.TargetPath)" />
7 <MsiPackage Id="PackageC" SourceFile="$(var.PackageC.TargetPath)" Vital="no" />
8 </PackageGroup>
9 </Fragment>
10</Wix>
diff --git a/src/TestData/DependencyTests/PackageAv1/PackageA.props b/src/TestData/DependencyTests/PackageAv1/PackageA.props
new file mode 100644
index 00000000..8cbe9aa9
--- /dev/null
+++ b/src/TestData/DependencyTests/PackageAv1/PackageA.props
@@ -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>
3 <PropertyGroup>
4 <PackageName>PackageA</PackageName>
5 <ProductComponentsRef>true</ProductComponentsRef>
6 <ProductCode>{6F171EC9-0774-4974-A8D1-493EF53CAB74}</ProductCode>
7 <UpgradeCode>{45E933B7-B56A-44D5-8EEC-625EC199085E}</UpgradeCode>
8 </PropertyGroup>
9 <ItemGroup>
10 <Compile Include="..\..\Templates\Package.wxs" Link="Package.wxs" />
11 </ItemGroup>
12</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/PackageAv1/PackageAv1.wixproj b/src/TestData/DependencyTests/PackageAv1/PackageAv1.wixproj
new file mode 100644
index 00000000..561f181a
--- /dev/null
+++ b/src/TestData/DependencyTests/PackageAv1/PackageAv1.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="PackageA.props" />
4 <ItemGroup>
5 <PackageReference Include="WixToolset.Dependency.wixext" Version="4.0.24" />
6 </ItemGroup>
7</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/PackageAv1/ProductComponents.wxs b/src/TestData/DependencyTests/PackageAv1/ProductComponents.wxs
new file mode 100644
index 00000000..eca7f6b4
--- /dev/null
+++ b/src/TestData/DependencyTests/PackageAv1/ProductComponents.wxs
@@ -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<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:dep="http://wixtoolset.org/schemas/v4/wxs/dependency">
4 <Fragment>
5 <ComponentGroup Id="ProductComponents">
6 <ComponentRef Id="FileComponent2" />
7 </ComponentGroup>
8 </Fragment>
9
10 <Fragment>
11 <Component Id="FileComponent2" Guid="BB609407-F2F4-458D-95F8-BF184D6E8496" Directory="INSTALLFOLDER">
12 <File Source="$(sys.SOURCEFILEPATH)" />
13 <Provides Key="WiX.$(var.TestGroupName).A,v1.0" dep:Check="yes" />
14 </Component>
15 </Fragment>
16</Wix>
diff --git a/src/TestData/DependencyTests/PackageAv1_0_1/PackageAv1_0_1.wixproj b/src/TestData/DependencyTests/PackageAv1_0_1/PackageAv1_0_1.wixproj
new file mode 100644
index 00000000..41917a56
--- /dev/null
+++ b/src/TestData/DependencyTests/PackageAv1_0_1/PackageAv1_0_1.wixproj
@@ -0,0 +1,13 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <Import Project="..\PackageAv1\PackageA.props" />
4 <PropertyGroup>
5 <Version>1.0.1.0</Version>
6 </PropertyGroup>
7 <ItemGroup>
8 <Compile Include="..\PackageAv1\ProductComponents.wxs" Link="ProductComponents.wxs" />
9 </ItemGroup>
10 <ItemGroup>
11 <PackageReference Include="WixToolset.Dependency.wixext" Version="4.0.24" />
12 </ItemGroup>
13</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/PackageAv1_0_2/PackageAv1_0_2.wixproj b/src/TestData/DependencyTests/PackageAv1_0_2/PackageAv1_0_2.wixproj
new file mode 100644
index 00000000..8cf6dcd1
--- /dev/null
+++ b/src/TestData/DependencyTests/PackageAv1_0_2/PackageAv1_0_2.wixproj
@@ -0,0 +1,13 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <Import Project="..\PackageAv1\PackageA.props" />
4 <PropertyGroup>
5 <Version>1.0.2.0</Version>
6 </PropertyGroup>
7 <ItemGroup>
8 <Compile Include="..\PackageAv1\ProductComponents.wxs" Link="ProductComponents.wxs" />
9 </ItemGroup>
10 <ItemGroup>
11 <PackageReference Include="WixToolset.Dependency.wixext" Version="4.0.24" />
12 </ItemGroup>
13</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/PackageB/PackageB.wixproj b/src/TestData/DependencyTests/PackageB/PackageB.wixproj
new file mode 100644
index 00000000..2e6b9ffb
--- /dev/null
+++ b/src/TestData/DependencyTests/PackageB/PackageB.wixproj
@@ -0,0 +1,13 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <PropertyGroup>
4 <ProductComponentsRef>true</ProductComponentsRef>
5 <UpgradeCode>{E26243B0-F1A2-4E74-A82D-25B306908E78}</UpgradeCode>
6 </PropertyGroup>
7 <ItemGroup>
8 <Compile Include="..\..\Templates\Package.wxs" Link="Package.wxs" />
9 </ItemGroup>
10 <ItemGroup>
11 <PackageReference Include="WixToolset.Dependency.wixext" Version="4.0.24" />
12 </ItemGroup>
13</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/PackageB/ProductComponents.wxs b/src/TestData/DependencyTests/PackageB/ProductComponents.wxs
new file mode 100644
index 00000000..b59e53e1
--- /dev/null
+++ b/src/TestData/DependencyTests/PackageB/ProductComponents.wxs
@@ -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<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:dep="http://wixtoolset.org/schemas/v4/wxs/dependency">
4 <Fragment>
5 <ComponentGroup Id="ProductComponents">
6 <ComponentRef Id="FileComponent2" />
7 </ComponentGroup>
8 </Fragment>
9
10 <Fragment>
11 <Component Id="FileComponent2" Guid="A1866388-65B4-4215-A8FB-9A7AADBE4E8E" Directory="INSTALLFOLDER">
12 <File Source="$(sys.SOURCEFILEPATH)" />
13 <Provides>
14 <Requires ProviderKey="WiX.$(var.TestGroupName).A,v1.0" Minimum="1.0.0.0" IncludeMinimum="yes" dep:Enforce="yes" />
15 </Provides>
16 </Component>
17 </Fragment>
18</Wix>
diff --git a/src/TestData/DependencyTests/PackageC/PackageC.wixproj b/src/TestData/DependencyTests/PackageC/PackageC.wixproj
new file mode 100644
index 00000000..0e7fe0ea
--- /dev/null
+++ b/src/TestData/DependencyTests/PackageC/PackageC.wixproj
@@ -0,0 +1,13 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <PropertyGroup>
4 <UpgradeCode>{F21201D4-4782-4658-99C9-2E75D51FCFA6}</UpgradeCode>
5 </PropertyGroup>
6 <ItemGroup>
7 <Compile Include="..\..\Templates\Package.wxs" Link="Package.wxs" />
8 </ItemGroup>
9 <ItemGroup>
10 <PackageReference Include="WixToolset.Dependency.wixext" Version="4.0.24" />
11 <PackageReference Include="WixToolset.Util.wixext" Version="4.0.77" />
12 </ItemGroup>
13</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/PackageDv1/Package.wxs b/src/TestData/DependencyTests/PackageDv1/Package.wxs
new file mode 100644
index 00000000..348f8ebb
--- /dev/null
+++ b/src/TestData/DependencyTests/PackageDv1/Package.wxs
@@ -0,0 +1,66 @@
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" xmlns:dep="http://wixtoolset.org/schemas/v4/wxs/dependency">
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 Schedule="afterInstallInitialize" 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" Guid="8AEF758B-5890-4490-8485-46BD65616A2B" Directory="INSTALLFOLDER">
52 <File Source="$(sys.SOURCEFILEPATH)" />
53 <Provides Key="WiX.$(var.TestGroupName).D,v1.0" dep:Check="yes" />
54 </Component>
55 </Fragment>
56
57 <Fragment>
58 <Component Id="RegistryComponent" Directory="INSTALLFOLDER">
59 <RegistryValue Root="HKCU" Key="Software\WiX\Tests\$(var.TestGroupName)" Name="$(var.PackageName)" Value="!(bind.Property.TestVersion)" Type="string" />
60 </Component>
61 </Fragment>
62
63 <Fragment>
64 <Property Id="TestVersion" Value="$(var.Version)" />
65 </Fragment>
66</Wix>
diff --git a/src/TestData/DependencyTests/PackageDv1/PackageD.props b/src/TestData/DependencyTests/PackageDv1/PackageD.props
new file mode 100644
index 00000000..999de0de
--- /dev/null
+++ b/src/TestData/DependencyTests/PackageDv1/PackageD.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 <PackageName>PackageD</PackageName>
5 <UpgradeCode>{AD82A938-2F54-45B8-A637-B14D8405A959}</UpgradeCode>
6 </PropertyGroup>
7</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/PackageDv1/PackageDv1.wixproj b/src/TestData/DependencyTests/PackageDv1/PackageDv1.wixproj
new file mode 100644
index 00000000..8094c897
--- /dev/null
+++ b/src/TestData/DependencyTests/PackageDv1/PackageDv1.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="PackageD.props" />
4 <ItemGroup>
5 <PackageReference Include="WixToolset.Dependency.wixext" Version="4.0.24" />
6 </ItemGroup>
7</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/PackageDv2/PackageDv2.wixproj b/src/TestData/DependencyTests/PackageDv2/PackageDv2.wixproj
new file mode 100644
index 00000000..e0e27fe5
--- /dev/null
+++ b/src/TestData/DependencyTests/PackageDv2/PackageDv2.wixproj
@@ -0,0 +1,13 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <Import Project="..\PackageDv1\PackageD.props" />
4 <PropertyGroup>
5 <Version>2.0.0.0</Version>
6 </PropertyGroup>
7 <ItemGroup>
8 <Compile Include="..\PackageDv1\Package.wxs" Link="Package.wxs" />
9 </ItemGroup>
10 <ItemGroup>
11 <PackageReference Include="WixToolset.Dependency.wixext" Version="4.0.24" />
12 </ItemGroup>
13</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/PackageEv1/PackageE.props b/src/TestData/DependencyTests/PackageEv1/PackageE.props
new file mode 100644
index 00000000..96f07b8c
--- /dev/null
+++ b/src/TestData/DependencyTests/PackageEv1/PackageE.props
@@ -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>
3 <PropertyGroup>
4 <PackageName>PackageE</PackageName>
5 <ProductComponentsRef>true</ProductComponentsRef>
6 <ProductCode>{70FA13C7-0338-483F-A256-E5C83750BDE5}</ProductCode>
7 <UpgradeCode>{212A5698-457E-440F-88CC-98FC49A17378}</UpgradeCode>
8 </PropertyGroup>
9 <ItemGroup>
10 <Compile Include="..\..\Templates\Package.wxs" Link="Package.wxs" />
11 </ItemGroup>
12</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/PackageEv1/PackageEv1.wixproj b/src/TestData/DependencyTests/PackageEv1/PackageEv1.wixproj
new file mode 100644
index 00000000..7d59cdbe
--- /dev/null
+++ b/src/TestData/DependencyTests/PackageEv1/PackageEv1.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="PackageE.props" />
4 <ItemGroup>
5 <PackageReference Include="WixToolset.Dependency.wixext" Version="4.0.24" />
6 </ItemGroup>
7</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/PackageEv1/ProductComponents.wxs b/src/TestData/DependencyTests/PackageEv1/ProductComponents.wxs
new file mode 100644
index 00000000..d388d2a3
--- /dev/null
+++ b/src/TestData/DependencyTests/PackageEv1/ProductComponents.wxs
@@ -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<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:dep="http://wixtoolset.org/schemas/v4/wxs/dependency">
4 <Fragment>
5 <ComponentGroup Id="ProductComponents">
6 <ComponentRef Id="FileComponent2" />
7 </ComponentGroup>
8 </Fragment>
9
10 <Fragment>
11 <Component Id="FileComponent2" Guid="BB609407-F2F4-458D-95F8-BF184D6E8496" Directory="INSTALLFOLDER">
12 <File Source="$(sys.SOURCEFILEPATH)" />
13 <Provides Key="WiX.$(var.TestGroupName).E,v1.0" dep:Check="yes" />
14 </Component>
15 </Fragment>
16</Wix>
diff --git a/src/TestData/DependencyTests/PackageEv1_0_1/PackageEv1_0_1.wixproj b/src/TestData/DependencyTests/PackageEv1_0_1/PackageEv1_0_1.wixproj
new file mode 100644
index 00000000..4d2ef922
--- /dev/null
+++ b/src/TestData/DependencyTests/PackageEv1_0_1/PackageEv1_0_1.wixproj
@@ -0,0 +1,13 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <Import Project="..\PackageEv1\PackageE.props" />
4 <PropertyGroup>
5 <Version>1.0.1.0</Version>
6 </PropertyGroup>
7 <ItemGroup>
8 <Compile Include="..\PackageEv1\ProductComponents.wxs" Link="ProductComponents.wxs" />
9 </ItemGroup>
10 <ItemGroup>
11 <PackageReference Include="WixToolset.Dependency.wixext" Version="4.0.24" />
12 </ItemGroup>
13</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/PatchA/PatchA.wixproj b/src/TestData/DependencyTests/PatchA/PatchA.wixproj
new file mode 100644
index 00000000..1c90b6f4
--- /dev/null
+++ b/src/TestData/DependencyTests/PatchA/PatchA.wixproj
@@ -0,0 +1,15 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <PropertyGroup>
4 <OutputType>PatchCreation</OutputType>
5 <TargetExt>.msp</TargetExt>
6 <SuppressSpecificWarnings>1079</SuppressSpecificWarnings>
7 </PropertyGroup>
8 <ItemGroup>
9 <ProjectReference Include="..\PackageAv1\PackageAv1.wixproj" />
10 <ProjectReference Include="..\PackageAv1_0_1\PackageAv1_0_1.wixproj" />
11 </ItemGroup>
12 <ItemGroup>
13 <PackageReference Include="WixToolset.Dependency.wixext" Version="4.0.24" />
14 </ItemGroup>
15</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/PatchA/PatchA.wxs b/src/TestData/DependencyTests/PatchA/PatchA.wxs
new file mode 100644
index 00000000..acb6f887
--- /dev/null
+++ b/src/TestData/DependencyTests/PatchA/PatchA.wxs
@@ -0,0 +1,22 @@
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">
8 <Patch AllowRemoval="yes" Classification="Update" Description="Patch A in test $(var.TestGroupName)" DisplayName="$(var.TestGroupName) - Patch A" Manufacturer="Example Corporation" MinorUpdateTargetRTM="yes">
9 <Media Id="100" Cabinet="PatchA" EmbedCab="yes">
10 <PatchBaseline
11 Id="PatchA"
12 BaselineFile="$(var.PackageAv1.TargetDir)$(var.PackageAv1.TargetName).wixpdb"
13 UpdateFile="$(var.PackageAv1_0_1.TargetDir)$(var.PackageAv1_0_1.TargetName).wixpdb"
14 />
15 </Media>
16
17 <PatchFamily Id="A" Version="$(var.Version)" Supersede="yes">
18 <ComponentRef Id="RegistryComponent"/>
19 <PropertyRef Id="TestVersion"/>
20 </PatchFamily>
21 </Patch>
22</Wix>
diff --git a/src/TestData/DependencyTests/PatchB/PatchB.wixproj b/src/TestData/DependencyTests/PatchB/PatchB.wixproj
new file mode 100644
index 00000000..5efc2350
--- /dev/null
+++ b/src/TestData/DependencyTests/PatchB/PatchB.wixproj
@@ -0,0 +1,15 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <PropertyGroup>
4 <OutputType>PatchCreation</OutputType>
5 <TargetExt>.msp</TargetExt>
6 <SuppressSpecificWarnings>1079</SuppressSpecificWarnings>
7 </PropertyGroup>
8 <ItemGroup>
9 <ProjectReference Include="..\PackageAv1\PackageAv1.wixproj" />
10 <ProjectReference Include="..\PackageAv1_0_2\PackageAv1_0_2.wixproj" />
11 </ItemGroup>
12 <ItemGroup>
13 <PackageReference Include="WixToolset.Dependency.wixext" Version="4.0.24" />
14 </ItemGroup>
15</Project> \ No newline at end of file
diff --git a/src/TestData/DependencyTests/PatchB/PatchB.wxs b/src/TestData/DependencyTests/PatchB/PatchB.wxs
new file mode 100644
index 00000000..a906dbc8
--- /dev/null
+++ b/src/TestData/DependencyTests/PatchB/PatchB.wxs
@@ -0,0 +1,21 @@
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">
8 <Patch AllowRemoval="yes" Classification="Update" Description="Patch B in test $(var.TestGroupName)" DisplayName="$(var.TestGroupName) - Patch B" Manufacturer="Example Corporation" MinorUpdateTargetRTM="yes">
9 <Media Id="100" Cabinet="PatchB" EmbedCab="yes">
10 <PatchBaseline
11 Id="PatchB"
12 BaselineFile="$(var.PackageAv1.TargetDir)$(var.PackageAv1.TargetName).wixpdb"
13 UpdateFile="$(var.PackageAv1_0_2.TargetDir)$(var.PackageAv1_0_2.TargetName).wixpdb"
14 />
15 </Media>
16
17 <PatchFamily Id="B" Version="$(var.Version)" Supersede="yes">
18 <PropertyRef Id="TestVersion"/>
19 </PatchFamily>
20 </Patch>
21</Wix>
diff --git a/src/TestData/Templates/PackageFail.wxs b/src/TestData/Templates/PackageFail.wxs
index 73858fde..54921ec6 100644
--- a/src/TestData/Templates/PackageFail.wxs
+++ b/src/TestData/Templates/PackageFail.wxs
@@ -19,7 +19,7 @@
19 </Feature> 19 </Feature>
20 20
21 <util:FailWhenDeferred /> 21 <util:FailWhenDeferred />
22 <Property Id="WIXFAILWHENDEFERRED" Value="1" /> 22 <Property Id="WIXFAILWHENDEFERRED" Secure="yes" Value="1" />
23 </Package> 23 </Package>
24 24
25 <Fragment> 25 <Fragment>
diff --git a/src/TestData/TestBA/TestBAWixlib/TestExe.wxs b/src/TestData/TestBA/TestBAWixlib/TestExe.wxs
new file mode 100644
index 00000000..f27275b0
--- /dev/null
+++ b/src/TestData/TestBA/TestBAWixlib/TestExe.wxs
@@ -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<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 <Fragment>
4 <PayloadGroup Id="TestExePayloads">
5 <ExePackagePayload SourceFile="!(bindpath.net2x86)\TestExe.exe" />
6 <Payload SourceFile="!(bindpath.net2x86)\TestExe.exe.config" />
7 </PayloadGroup>
8 </Fragment>
9</Wix>
diff --git a/src/TestData/TestBA/TestBAWixlib/testbawixlib.wixproj b/src/TestData/TestBA/TestBAWixlib/testbawixlib.wixproj
index 83d947cd..33b1379e 100644
--- a/src/TestData/TestBA/TestBAWixlib/testbawixlib.wixproj
+++ b/src/TestData/TestBA/TestBAWixlib/testbawixlib.wixproj
@@ -11,6 +11,7 @@
11 </ItemGroup> 11 </ItemGroup>
12 <ItemGroup> 12 <ItemGroup>
13 <ProjectReference Include="..\..\..\TestBA\TestBA.csproj" /> 13 <ProjectReference Include="..\..\..\TestBA\TestBA.csproj" />
14 <ProjectReference Include="..\..\..\TestExe\TestExe.csproj" />
14 </ItemGroup> 15 </ItemGroup>
15 <ItemGroup> 16 <ItemGroup>
16 <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.89" /> 17 <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.89" />
diff --git a/src/TestData/TestData.proj b/src/TestData/TestData.proj
index e8e61a94..c5682fc7 100644
--- a/src/TestData/TestData.proj
+++ b/src/TestData/TestData.proj
@@ -5,6 +5,14 @@
5<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 5<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
6 <ItemGroup> 6 <ItemGroup>
7 <TestDataProject Include="**\*.wixproj" /> 7 <TestDataProject Include="**\*.wixproj" />
8
9 <!-- https://github.com/wixtoolset/issues/issues/6387 -->
10 <TestDataProject Remove="DependencyTests\BundleC\BundleC.wixproj" />
11 <TestDataProject Remove="DependencyTests\BundleF_PatchAv1_0_1\BundleF_PatchAv1_0_1.wixproj" />
12 <TestDataProject Remove="DependencyTests\BundleF_PatchAv1_0_2\BundleF_PatchAv1_0_2.wixproj" />
13 <TestDataProject Remove="DependencyTests\BundleJ_Patch\BundleJ_Patch.wixproj" />
14 <TestDataProject Remove="DependencyTests\PatchA\PatchA.wixproj" />
15 <TestDataProject Remove="DependencyTests\PatchB\PatchB.wixproj" />
8 </ItemGroup> 16 </ItemGroup>
9 17
10 <Target Name="Build"> 18 <Target Name="Build">
diff --git a/src/TestExe/Program.cs b/src/TestExe/Program.cs
new file mode 100644
index 00000000..e92c413b
--- /dev/null
+++ b/src/TestExe/Program.cs
@@ -0,0 +1,74 @@
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
3using System;
4using System.Collections.Generic;
5using System.Linq;
6using System.Text;
7
8namespace TestExe
9{
10 class Program
11 {
12 static List<Task> tasks;
13 static int exitCodeToReturn = 0;
14
15 static int Main(string[] args)
16 {
17 Usage();
18 tasks = TaskParser.ParseTasks(args);
19
20 foreach (Task t in tasks)
21 {
22 // special case for the ExitCodeTask
23 if (t.GetType() == typeof(ExitCodeTask))
24 {
25 exitCodeToReturn = int.Parse(t.data);
26 }
27 else
28 {
29 t.RunTask();
30 }
31 }
32
33 Console.WriteLine("Exiting with ExitCode = {0}", exitCodeToReturn);
34 return exitCodeToReturn;
35 }
36
37 static void Usage()
38 {
39 Console.WriteLine(@"TestExe.exe");
40 Console.WriteLine(@"");
41 Console.WriteLine(@"TestExe can be passed various switches to define how it will behave and what tasks it will perform.");
42 Console.WriteLine(@"All switches are optional.");
43 Console.WriteLine(@"Any # of switches can be combined in any order.");
44 Console.WriteLine(@"Switches can be specified multiple times.");
45 Console.WriteLine(@"The order of the switches listed is the order they will be processed.");
46 Console.WriteLine(@"Info is written to stdout to describe what tasks are being performed as they are executed.");
47 Console.WriteLine(@"");
48 Console.WriteLine(@"Usage: TestExe.exe [tasks...]");
49 Console.WriteLine(@"");
50 Console.WriteLine(@"");
51 Console.WriteLine(@"/ec # Exit code to return. Can only be specified once. If not specified, 0 will be returned. Example: “/ec 3010” would return 3010");
52 Console.WriteLine(@"/s # Milliseconds to sleep before continuing. Example: “/s 5000” would sleep 5 seconds.");
53 Console.WriteLine(@"/sr #-# Random range of Milliseconds to sleep before continuing. Example: “/sr 5000-10000” would sleep between 5-10 seconds.");
54 Console.WriteLine(@"/log filename Create a log file called filename. Contents of the log are static text. Example: “/log %temp%\test.log” would create a %temp%\test.log file.");
55 Console.WriteLine(@"/Pinfo filename Create an xml file containing information about the process: PID, start time, user running the process, etc.");
56 Console.WriteLine(@"/fe filename Wait for a file to exist before continuing. Example: “/fe %temp%\cache\file.msi” would wait until %temp%\cache\file.msi exists.");
57 Console.WriteLine(@"/regw regkey,name,type,value (Re)writes a registry key with the specified value");
58 Console.WriteLine(@"/regd regkey,[name] Deletes registry key name or key and all of its children (subkeys and values)");
59 Console.WriteLine(@"");
60 Console.WriteLine(@"Example: ");
61 Console.WriteLine(@"");
62 Console.WriteLine(@"TestExe.exe /ec 1603 /Pinfo %temp%\Pinfo1.xml /s 1000 /log %temp%\log1.log /sr 5000-10000 /log %temp%\log2.log");
63 Console.WriteLine(@"");
64 Console.WriteLine(@"This would result in the following execution:");
65 Console.WriteLine(@" - Create an xml file with the current process info in it.");
66 Console.WriteLine(@" - Sleep 1 seconds");
67 Console.WriteLine(@" - Create log1.log");
68 Console.WriteLine(@" - Sleep between 5-10 seconds");
69 Console.WriteLine(@" - Create log2.log");
70 Console.WriteLine(@" - Exit with 1603");
71 Console.WriteLine(@"");
72 }
73 }
74}
diff --git a/src/TestExe/Task.cs b/src/TestExe/Task.cs
new file mode 100644
index 00000000..577acbea
--- /dev/null
+++ b/src/TestExe/Task.cs
@@ -0,0 +1,471 @@
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
3using System;
4using System.Collections.Generic;
5using System.Diagnostics;
6using System.IO;
7using System.Linq;
8using System.Management;
9using System.Text;
10using Microsoft.Win32;
11
12namespace TestExe
13{
14 public abstract class Task
15 {
16 public string data;
17
18 public Task(string Data)
19 {
20 data = Data;
21 }
22
23 public abstract void RunTask();
24
25 }
26
27 public class ExitCodeTask : Task
28 {
29 public ExitCodeTask(string Data) : base(Data) { }
30
31 public override void RunTask()
32 {
33 // this task does nothing. Just stores data about what exit code to return.
34 }
35 }
36
37 public class SleepTask : Task
38 {
39 public SleepTask(string Data) : base(Data) { }
40
41 public override void RunTask()
42 {
43 int milliseconds = int.Parse(this.data);
44 Console.WriteLine("Starting to sleep for {0} milliseconds", milliseconds);
45 System.Threading.Thread.Sleep(milliseconds);
46 }
47 }
48
49 public class SleepRandomTask : Task
50 {
51 public SleepRandomTask(string Data) : base(Data) { }
52
53 public override void RunTask()
54 {
55 int low = int.Parse(data.Split(new string[] { ":" }, 2, StringSplitOptions.None)[0]);
56 int high = int.Parse(data.Split(new string[] { ":" }, 2, StringSplitOptions.None)[1]);
57
58 Random r = new Random();
59 int milliseconds = r.Next(high - low) + low;
60 Console.WriteLine("Starting to sleep for {0} milliseconds", milliseconds);
61 System.Threading.Thread.Sleep(milliseconds);
62 }
63 }
64
65 public class LogTask : Task
66 {
67 string[] argsUsed;
68 public LogTask(string Data, string[] args)
69 : base(Data)
70 {
71 argsUsed = args;
72 }
73
74 public override void RunTask()
75 {
76 string logFile = "";
77 string argsUsedString = "";
78
79 foreach (string a in argsUsed)
80 {
81 argsUsedString += a + " ";
82 }
83
84 try
85 {
86 logFile = System.Environment.ExpandEnvironmentVariables(data);
87 Console.WriteLine("creating log file: " + logFile);
88 StreamWriter textFile = File.CreateText(logFile);
89 textFile.WriteLine("This is a log file created by TestExe.exe");
90 textFile.WriteLine("Args used: " + argsUsedString);
91 textFile.Close();
92 }
93 catch
94 {
95 Console.WriteLine("creating a log file failed for: {0}", logFile);
96 }
97
98 }
99 }
100
101 public class ProcessInfoTask : Task
102 {
103 public ProcessInfoTask(string Data) : base(Data) { }
104
105 public override void RunTask()
106 {
107 try
108 {
109 string processInfoXml = "";
110
111 // Get information about the process and who is running it
112 Process thisProc = Process.GetCurrentProcess();
113 string username = thisProc.StartInfo.EnvironmentVariables["username"].ToString();
114
115 int parentProcId = GetParentProcess(thisProc.Id);
116 Process parentProc = Process.GetProcessById(parentProcId);
117 string parentUsername = parentProc.StartInfo.EnvironmentVariables["username"].ToString();
118
119 int grandparentProcId = GetParentProcess(parentProc.Id);
120 Process grandparentProc = Process.GetProcessById(grandparentProcId);
121 string grandparentUsername = grandparentProc.StartInfo.EnvironmentVariables["username"].ToString();
122
123 processInfoXml += "<ProcessInfo>";
124 processInfoXml += " <ProcessName>" + thisProc.ProcessName + "</ProcessName>";
125 processInfoXml += " <Id>" + thisProc.Id.ToString() + "</Id>";
126 processInfoXml += " <SessionId>" + thisProc.SessionId.ToString() + "</SessionId>";
127 processInfoXml += " <MachineName>" + thisProc.MachineName + "</MachineName>";
128 // this stuff isn't set since we didn't start the process and tell it what to use. So don't bother
129 //processInfoXml += " <StartInfo>";
130 //processInfoXml += " <FileName>" + thisProc.StartInfo.FileName + "</FileName>";
131 //processInfoXml += " <UserName>" + thisProc.StartInfo.UserName + "</UserName>";
132 //processInfoXml += " <WorkingDirectory>" + thisProc.StartInfo.WorkingDirectory + "</WorkingDirectory>";
133 //processInfoXml += " <Arguments>" + thisProc.StartInfo.Arguments + "</Arguments>";
134 //processInfoXml += " </StartInfo>";
135 processInfoXml += " <StartTime>" + thisProc.StartTime.ToString() + "</StartTime>";
136 processInfoXml += " <Username>" + username + "</Username>";
137 processInfoXml += " <ParentProcess>";
138 processInfoXml += " <ProcessName>" + parentProc.ProcessName + "</ProcessName>";
139 processInfoXml += " <Id>" + parentProc.Id.ToString() + "</Id>";
140 processInfoXml += " <StartTime>" + parentProc.StartTime.ToString() + "</StartTime>";
141 processInfoXml += " <Username>" + parentUsername + "</Username>";
142 processInfoXml += " </ParentProcess>";
143 processInfoXml += " <GrandparentProcess>";
144 processInfoXml += " <ProcessName>" + grandparentProc.ProcessName + "</ProcessName>";
145 processInfoXml += " <Id>" + grandparentProc.Id.ToString() + "</Id>";
146 processInfoXml += " <StartTime>" + grandparentProc.StartTime.ToString() + "</StartTime>";
147 processInfoXml += " <Username>" + grandparentUsername + "</Username>";
148 processInfoXml += " </GrandparentProcess>";
149 processInfoXml += "</ProcessInfo>";
150
151 string logFile = System.Environment.ExpandEnvironmentVariables(data);
152 Console.WriteLine("Creating Process Info data file: " + logFile);
153 StreamWriter textFile = File.CreateText(logFile);
154 textFile.WriteLine(processInfoXml);
155 textFile.Close();
156 }
157 catch (Exception eX)
158 {
159 Console.WriteLine("Creating Process Info data file failed");
160 Console.WriteLine(eX.Message);
161 }
162
163
164 }
165
166 private static int GetParentProcess(int Id)
167 {
168 int parentPid = 0;
169 using (ManagementObject mo = new ManagementObject("win32_process.handle='" + Id.ToString() + "'"))
170 {
171 mo.Get();
172 parentPid = Convert.ToInt32(mo["ParentProcessId"]);
173 }
174 return parentPid;
175 }
176 }
177
178 public class FileExistsTask : Task
179 {
180 public FileExistsTask(string Data) : base(Data) { }
181
182 public override void RunTask()
183 {
184 string fileToExist = System.Environment.ExpandEnvironmentVariables(data);
185
186 if (!String.IsNullOrEmpty(fileToExist))
187 {
188 Console.WriteLine("Waiting for this file to exist: \"" + fileToExist + "\"");
189 while (!System.IO.File.Exists(fileToExist))
190 {
191 System.Threading.Thread.Sleep(250);
192 }
193 Console.WriteLine("Found: \"" + fileToExist + "\"");
194 }
195
196 }
197 }
198
199 /// <summary>
200 /// Task class that will create a registry key and write a name and value in it
201 /// </summary>
202 public class RegistryWriterTask : Task
203 {
204 private string hive;
205 private string keyPath;
206 private string[] keyPathArray;
207 private string name;
208 private RegistryValueKind regValueKind;
209 private object value;
210
211 public RegistryWriterTask(string Data) : base(Data) { }
212
213 public override void RunTask()
214 {
215 if (parseRegKeyNameTypeValue(System.Environment.ExpandEnvironmentVariables(data)))
216 {
217 RegistryKey rk = Registry.LocalMachine;
218
219 if (hive == "HKCU") rk = Microsoft.Win32.Registry.CurrentUser;
220 if (hive == "HKCC") rk = Microsoft.Win32.Registry.CurrentConfig;
221 if (hive == "HKLM") rk = Microsoft.Win32.Registry.LocalMachine;
222
223 foreach (string key in keyPathArray)
224 {
225 rk = rk.CreateSubKey(key, RegistryKeyPermissionCheck.ReadWriteSubTree);
226 }
227
228 rk.SetValue(name, value, regValueKind);
229 Console.WriteLine("Created registry key: '{0}' name: '{1}' value: '{2}' of type: '{3}'",
230 hive + "\\" + keyPath,
231 name,
232 value.ToString(),
233 regValueKind.ToString());
234 }
235 else
236 {
237 Console.WriteLine("Unable to write registry key.");
238 }
239
240 }
241
242 private bool parseRegKeyNameTypeValue(string delimittedData)
243 {
244 string[] splitString = delimittedData.Split(new string[] { "," }, StringSplitOptions.None);
245 if (splitString.Length != 4)
246 {
247 Console.WriteLine("Invalid regkey. Unable to parse key,name,type,value from: \"" + delimittedData + "\"");
248 return false;
249 }
250 else
251 {
252 keyPath = splitString[0];
253 name = splitString[1];
254 string datatype = splitString[2];
255 if (datatype == "DWord")
256 {
257 value = UInt32.Parse(splitString[3]);
258 }
259 else if (datatype == "QWord")
260 {
261 value = UInt64.Parse(splitString[3]);
262 }
263 else
264 {
265 value = splitString[3];
266 }
267
268 if (keyPath.ToUpper().StartsWith("HKLM\\"))
269 {
270 hive = "HKLM";
271 keyPath = keyPath.Replace("HKLM\\", "");
272 }
273 else if (keyPath.ToUpper().StartsWith("HKCC\\"))
274 {
275 hive = "HKCC";
276 keyPath = keyPath.Replace("HKCC\\", "");
277 }
278 else if (keyPath.ToUpper().StartsWith("HKCU\\"))
279 {
280 hive = "HKCU";
281 keyPath = keyPath.Replace("HKCU\\", "");
282 }
283 else
284 {
285 Console.WriteLine("Invalid regkey. Unable to determin hive. regkey must start with either: [HKLM], [HKCU], or [HKCC]");
286 return false;
287 }
288 keyPathArray = keyPath.Split(new string[] { "\\" }, StringSplitOptions.None);
289
290 try
291 {
292 regValueKind = (RegistryValueKind)System.Enum.Parse(typeof(RegistryValueKind), datatype);
293 }
294 catch (Exception ex)
295 {
296 Console.WriteLine("Invalid datatype. It must be: String, DWord, or QWord (case sensitive)");
297 Console.WriteLine(ex.Message);
298 return false;
299 }
300 }
301 return true;
302 }
303 }
304
305 /// <summary>
306 /// Task class that will delete a registry key value or registry key and all of its children
307 /// </summary>
308 public class RegistryDeleterTask : Task
309 {
310 private string hive;
311 private string keyPath;
312 private string[] keyPathArray;
313 private string name;
314
315 public RegistryDeleterTask(string Data) : base(Data) { }
316
317 public override void RunTask()
318 {
319 if (parseRegKeyName(System.Environment.ExpandEnvironmentVariables(data)))
320 {
321 try
322 {
323 RegistryKey rk = Registry.LocalMachine;
324
325 if (hive == "HKCU") rk = Microsoft.Win32.Registry.CurrentUser;
326 if (hive == "HKCC") rk = Microsoft.Win32.Registry.CurrentConfig;
327 if (hive == "HKLM") rk = Microsoft.Win32.Registry.LocalMachine;
328
329 RegistryKey rkParent = null;
330 foreach (string key in keyPathArray)
331 {
332 rkParent = rk;
333 rk = rk.OpenSubKey(key, true);
334 }
335
336 if (String.IsNullOrEmpty(name))
337 {
338 // delete the key and all of its children
339 string subkeyToDelete = keyPathArray[keyPathArray.Length - 1];
340 rkParent.DeleteSubKeyTree(subkeyToDelete);
341 Console.WriteLine("Deleted registry key: '{0}'", hive + "\\" + keyPath);
342 }
343 else
344 {
345 // just delete this value
346 rk.DeleteValue(name);
347 Console.WriteLine("Deleted registry key: '{0}' name: '{1}'", hive + "\\" + keyPath, name);
348 }
349 }
350 catch (Exception ex)
351 {
352 Console.WriteLine("Unable to delete registry key: '{0}'", hive + "\\" + keyPath);
353 Console.WriteLine(ex.Message);
354 }
355 }
356 else
357 {
358 Console.WriteLine("Unable to delete registry key.");
359 }
360
361 }
362
363 private bool parseRegKeyName(string delimittedData)
364 {
365 string[] splitString = delimittedData.Split(new string[] { "," }, StringSplitOptions.None);
366
367 if (splitString.Length > 2)
368 {
369 Console.WriteLine("Unable to parse registry key and name.");
370 return false;
371 }
372
373 keyPath = splitString[0];
374 if (splitString.Length == 2)
375 {
376 name = splitString[1];
377 }
378
379 if (keyPath.ToUpper().StartsWith("HKLM\\"))
380 {
381 hive = "HKLM";
382 keyPath = keyPath.Replace("HKLM\\", "");
383 }
384 else if (keyPath.ToUpper().StartsWith("HKCC\\"))
385 {
386 hive = "HKCC";
387 keyPath = keyPath.Replace("HKCC\\", "");
388 }
389 else if (keyPath.ToUpper().StartsWith("HKCU\\"))
390 {
391 hive = "HKCU";
392 keyPath = keyPath.Replace("HKCU\\", "");
393 }
394 else
395 {
396 Console.WriteLine("Invalid regkey. Unable to determine hive. regkey must start with either: [HKLM], [HKCU], or [HKCC]");
397 return false;
398 }
399 keyPathArray = keyPath.Split(new string[] { "\\" }, StringSplitOptions.None);
400 return true;
401 }
402 }
403
404 public class TaskParser
405 {
406
407 public static List<Task> ParseTasks(string[] args)
408 {
409 List<Task> tasks = new List<Task>();
410
411 try
412 {
413 // for invalid args. return empty list
414 if (args.Length % 2 == 0)
415 {
416 Task t;
417
418 for (int i = 0; i < args.Length; i += 2)
419 {
420 switch (args[i].ToLower())
421 {
422 case "/ec":
423 t = new ExitCodeTask(args[i + 1]);
424 tasks.Add(t);
425 break;
426 case "/s":
427 t = new SleepTask(args[i + 1]);
428 tasks.Add(t);
429 break;
430 case "/sr":
431 t = new SleepRandomTask(args[i + 1]);
432 tasks.Add(t);
433 break;
434 case "/log":
435 t = new LogTask(args[i + 1], args);
436 tasks.Add(t);
437 break;
438 case "/pinfo":
439 t = new ProcessInfoTask(args[i + 1]);
440 tasks.Add(t);
441 break;
442 case "/fe":
443 t = new FileExistsTask(args[i + 1]);
444 tasks.Add(t);
445 break;
446 case "/regw":
447 t = new RegistryWriterTask(args[i + 1]);
448 tasks.Add(t);
449 break;
450 case "/regd":
451 t = new RegistryDeleterTask(args[i + 1]);
452 tasks.Add(t);
453 break;
454
455 default:
456 Console.WriteLine("Error: Invalid switch specified.");
457 return new List<Task>();
458 }
459 }
460 }
461 }
462 catch
463 {
464 Console.WriteLine("Error: Invalid switch data specified. Couldn't parse the data.");
465 return new List<Task>();
466 }
467
468 return tasks;
469 }
470 }
471}
diff --git a/src/TestExe/TestExe.csproj b/src/TestExe/TestExe.csproj
new file mode 100644
index 00000000..933fa932
--- /dev/null
+++ b/src/TestExe/TestExe.csproj
@@ -0,0 +1,17 @@
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 <TargetFrameworks>net35</TargetFrameworks>
7 <AssemblyName>TestExe</AssemblyName>
8 <RootNamespace>TestExe</RootNamespace>
9 <OutputType>Exe</OutputType>
10 <DebugType>embedded</DebugType>
11 <RuntimeIdentifier>win-x86</RuntimeIdentifier>
12 </PropertyGroup>
13
14 <ItemGroup>
15 <Reference Include="System.Management" />
16 </ItemGroup>
17</Project> \ No newline at end of file
diff --git a/src/TestExe/app.config b/src/TestExe/app.config
new file mode 100644
index 00000000..f9811b74
--- /dev/null
+++ b/src/TestExe/app.config
@@ -0,0 +1,10 @@
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
5<configuration>
6 <startup>
7 <supportedRuntime version="v4.0" />
8 <supportedRuntime version="v2.0.50727" />
9 </startup>
10</configuration>
diff --git a/src/WixTestTools/BundleInstaller.cs b/src/WixTestTools/BundleInstaller.cs
index 044486fe..854c12f0 100644
--- a/src/WixTestTools/BundleInstaller.cs
+++ b/src/WixTestTools/BundleInstaller.cs
@@ -12,12 +12,15 @@ namespace WixTestTools
12 { 12 {
13 this.Bundle = Path.Combine(testContext.TestDataFolder, $"{name}.exe"); 13 this.Bundle = Path.Combine(testContext.TestDataFolder, $"{name}.exe");
14 this.BundlePdb = Path.Combine(testContext.TestDataFolder, $"{name}.wixpdb"); 14 this.BundlePdb = Path.Combine(testContext.TestDataFolder, $"{name}.wixpdb");
15 this.TestContext = testContext;
15 this.TestGroupName = testContext.TestGroupName; 16 this.TestGroupName = testContext.TestGroupName;
16 this.TestName = testContext.TestName; 17 this.TestName = testContext.TestName;
17 } 18 }
18 19
19 public string Bundle { get; } 20 public string Bundle { get; }
20 21
22 private WixTestContext TestContext { get; }
23
21 public string TestGroupName { get; } 24 public string TestGroupName { get; }
22 25
23 public string TestName { get; } 26 public string TestName { get; }
diff --git a/src/WixTestTools/BundleRegistration.cs b/src/WixTestTools/BundleRegistration.cs
index d473dcdd..1a066232 100644
--- a/src/WixTestTools/BundleRegistration.cs
+++ b/src/WixTestTools/BundleRegistration.cs
@@ -7,7 +7,8 @@ namespace WixTestTools
7 7
8 public class BundleRegistration 8 public class BundleRegistration
9 { 9 {
10 public const string BURN_REGISTRATION_REGISTRY_UNINSTALL_KEY = "SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall"; 10 public const string BURN_REGISTRATION_REGISTRY_UNINSTALL_KEY = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
11 public const string BURN_REGISTRATION_REGISTRY_UNINSTALL_KEY_WOW6432NODE = "SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
11 public const string BURN_REGISTRATION_REGISTRY_BUNDLE_CACHE_PATH = "BundleCachePath"; 12 public const string BURN_REGISTRATION_REGISTRY_BUNDLE_CACHE_PATH = "BundleCachePath";
12 public const string BURN_REGISTRATION_REGISTRY_BUNDLE_ADDON_CODE = "BundleAddonCode"; 13 public const string BURN_REGISTRATION_REGISTRY_BUNDLE_ADDON_CODE = "BundleAddonCode";
13 public const string BURN_REGISTRATION_REGISTRY_BUNDLE_DETECT_CODE = "BundleDetectCode"; 14 public const string BURN_REGISTRATION_REGISTRY_BUNDLE_DETECT_CODE = "BundleDetectCode";
@@ -89,13 +90,22 @@ namespace WixTestTools
89 90
90 public static bool TryGetPerMachineBundleRegistrationById(string bundleId, out BundleRegistration registration) 91 public static bool TryGetPerMachineBundleRegistrationById(string bundleId, out BundleRegistration registration)
91 { 92 {
92 var registrationKeyPath = $"{BURN_REGISTRATION_REGISTRY_UNINSTALL_KEY}\\{bundleId}"; 93 var registrationKeyPath = $"{BURN_REGISTRATION_REGISTRY_UNINSTALL_KEY_WOW6432NODE}\\{bundleId}";
93 using var registrationKey = Registry.LocalMachine.OpenSubKey(registrationKeyPath); 94 using var registrationKey = Registry.LocalMachine.OpenSubKey(registrationKeyPath);
94 var success = registrationKey != null; 95 var success = registrationKey != null;
95 registration = success ? GetBundleRegistration(registrationKey) : null; 96 registration = success ? GetBundleRegistration(registrationKey) : null;
96 return success; 97 return success;
97 } 98 }
98 99
100 public static bool TryGetPerUserBundleRegistrationById(string bundleId, out BundleRegistration registration)
101 {
102 var registrationKeyPath = $"{BURN_REGISTRATION_REGISTRY_UNINSTALL_KEY}\\{bundleId}";
103 using var registrationKey = Registry.CurrentUser.OpenSubKey(registrationKeyPath);
104 var success = registrationKey != null;
105 registration = success ? GetBundleRegistration(registrationKey) : null;
106 return success;
107 }
108
99 private static BundleRegistration GetBundleRegistration(RegistryKey idKey) 109 private static BundleRegistration GetBundleRegistration(RegistryKey idKey)
100 { 110 {
101 var registration = new BundleRegistration(); 111 var registration = new BundleRegistration();
diff --git a/src/WixTestTools/BundleVerifier.cs b/src/WixTestTools/BundleVerifier.cs
index 96c86fdf..433b6a0a 100644
--- a/src/WixTestTools/BundleVerifier.cs
+++ b/src/WixTestTools/BundleVerifier.cs
@@ -33,31 +33,46 @@ namespace WixTestTools
33 return this.BundleSymbol; 33 return this.BundleSymbol;
34 } 34 }
35 35
36 public string GetPackageCachePathForCacheId(string cacheId) 36 public string GetPackageCachePathForCacheId(string cacheId, bool perMachine)
37 { 37 {
38 using var policyKey = Registry.LocalMachine.OpenSubKey(FULL_BURN_POLICY_REGISTRY_PATH); 38 string cachePath;
39 var redirectedCachePath = policyKey?.GetValue("PackageCache") as string; 39 if (perMachine)
40 var cachePath = redirectedCachePath ?? Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), PACKAGE_CACHE_FOLDER_NAME); 40 {
41 using var policyKey = Registry.LocalMachine.OpenSubKey(FULL_BURN_POLICY_REGISTRY_PATH);
42 var redirectedCachePath = policyKey?.GetValue("PackageCache") as string;
43 cachePath = redirectedCachePath ?? Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), PACKAGE_CACHE_FOLDER_NAME);
44 }
45 else
46 {
47 cachePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), PACKAGE_CACHE_FOLDER_NAME);
48 }
41 return Path.Combine(cachePath, cacheId); 49 return Path.Combine(cachePath, cacheId);
42 } 50 }
43 51
44 public string GetExpectedCachedBundlePath() 52 public string GetExpectedCachedBundlePath()
45 { 53 {
46 var bundleSymbol = this.GetBundleSymbol(); 54 var bundleSymbol = this.GetBundleSymbol();
47 var cachePath = this.GetPackageCachePathForCacheId(bundleSymbol.BundleId); 55 var cachePath = this.GetPackageCachePathForCacheId(bundleSymbol.BundleId, bundleSymbol.PerMachine);
48 return Path.Combine(cachePath, Path.GetFileName(this.Bundle)); 56 return Path.Combine(cachePath, Path.GetFileName(this.Bundle));
49 } 57 }
50 58
51 public bool TryGetPerMachineRegistration(out BundleRegistration registration) 59 public bool TryGetRegistration(out BundleRegistration registration)
52 { 60 {
53 var bundleSymbol = this.GetBundleSymbol(); 61 var bundleSymbol = this.GetBundleSymbol();
54 var bundleId = bundleSymbol.BundleId; 62 var bundleId = bundleSymbol.BundleId;
55 return BundleRegistration.TryGetPerMachineBundleRegistrationById(bundleId, out registration); 63 if (bundleSymbol.PerMachine)
64 {
65 return BundleRegistration.TryGetPerMachineBundleRegistrationById(bundleId, out registration);
66 }
67 else
68 {
69 return BundleRegistration.TryGetPerUserBundleRegistrationById(bundleId, out registration);
70 }
56 } 71 }
57 72
58 public string VerifyRegisteredAndInPackageCache() 73 public string VerifyRegisteredAndInPackageCache()
59 { 74 {
60 Assert.True(this.TryGetPerMachineRegistration(out var registration)); 75 Assert.True(this.TryGetRegistration(out var registration));
61 76
62 Assert.NotNull(registration.CachePath); 77 Assert.NotNull(registration.CachePath);
63 Assert.True(File.Exists(registration.CachePath)); 78 Assert.True(File.Exists(registration.CachePath));
@@ -76,7 +91,7 @@ namespace WixTestTools
76 91
77 public void VerifyUnregisteredAndRemovedFromPackageCache(string cachedBundlePath) 92 public void VerifyUnregisteredAndRemovedFromPackageCache(string cachedBundlePath)
78 { 93 {
79 Assert.False(this.TryGetPerMachineRegistration(out _)); 94 Assert.False(this.TryGetRegistration(out _));
80 Assert.False(File.Exists(cachedBundlePath)); 95 Assert.False(File.Exists(cachedBundlePath));
81 } 96 }
82 97
@@ -86,11 +101,41 @@ namespace WixTestTools
86 var intermediate = Intermediate.Load(wixOutput); 101 var intermediate = Intermediate.Load(wixOutput);
87 var section = intermediate.Sections.Single(); 102 var section = intermediate.Sections.Single();
88 var packageSymbol = section.Symbols.OfType<WixBundlePackageSymbol>().Single(p => p.Id.Id == packageId); 103 var packageSymbol = section.Symbols.OfType<WixBundlePackageSymbol>().Single(p => p.Id.Id == packageId);
89 var cachePath = this.GetPackageCachePathForCacheId(packageSymbol.CacheId); 104 var cachePath = this.GetPackageCachePathForCacheId(packageSymbol.CacheId, packageSymbol.PerMachine == YesNoDefaultType.Yes);
90 if (Directory.Exists(cachePath)) 105 if (Directory.Exists(cachePath))
91 { 106 {
92 Directory.Delete(cachePath, true); 107 Directory.Delete(cachePath, true);
93 } 108 }
94 } 109 }
110
111 public void VerifyPackageIsCached(string packageId)
112 {
113 using var wixOutput = WixOutput.Read(this.BundlePdb);
114 var intermediate = Intermediate.Load(wixOutput);
115 var section = intermediate.Sections.Single();
116 var packageSymbol = section.Symbols.OfType<WixBundlePackageSymbol>().Single(p => p.Id.Id == packageId);
117 var cachePath = this.GetPackageCachePathForCacheId(packageSymbol.CacheId, packageSymbol.PerMachine == YesNoDefaultType.Yes);
118 Assert.True(Directory.Exists(cachePath));
119 }
120
121 public void VerifyExeTestRegistryRootDeleted(string name)
122 {
123 using var testRegistryRoot = this.TestContext.GetTestRegistryRoot(name);
124 if (testRegistryRoot != null)
125 {
126 var actualValue = testRegistryRoot.GetValue("Version") as string;
127 Assert.Null(actualValue);
128 }
129 }
130
131 public void VerifyExeTestRegistryValue(string name, string expectedValue)
132 {
133 using (var root = this.TestContext.GetTestRegistryRoot(name))
134 {
135 Assert.NotNull(root);
136 var actualValue = root.GetValue("Version") as string;
137 Assert.Equal(expectedValue, actualValue);
138 }
139 }
95 } 140 }
96} 141}
diff --git a/src/WixTestTools/MsiUtilities.cs b/src/WixTestTools/MsiUtilities.cs
index 2a848938..4c7d1601 100644
--- a/src/WixTestTools/MsiUtilities.cs
+++ b/src/WixTestTools/MsiUtilities.cs
@@ -2,6 +2,7 @@
2 2
3namespace WixTestTools 3namespace WixTestTools
4{ 4{
5 using System;
5 using WixToolset.Dtf.WindowsInstaller; 6 using WixToolset.Dtf.WindowsInstaller;
6 7
7 public class MsiUtilities 8 public class MsiUtilities
@@ -23,5 +24,24 @@ namespace WixTestTools
23 } 24 }
24 return false; 25 return false;
25 } 26 }
27
28 /// <summary>
29 /// Return true if it finds the given productcode in system with the specified version otherwise it returns false
30 /// </summary>
31 /// <param name="prodCode"></param>
32 /// <param name="prodVersion"></param>
33 /// <returns></returns>
34 public static bool IsProductInstalledWithVersion(string prodCode, Version prodVersion)
35 {
36 //look in all user's products (both per-machine and per-user)
37 foreach (ProductInstallation product in ProductInstallation.GetProducts(null, "s-1-1-0", UserContexts.All))
38 {
39 if (product.ProductCode == prodCode && product.ProductVersion == prodVersion)
40 {
41 return true;
42 }
43 }
44 return false;
45 }
26 } 46 }
27} 47}
diff --git a/src/WixTestTools/PackageVerifier.cs b/src/WixTestTools/PackageVerifier.cs
index b4289032..073e83b0 100644
--- a/src/WixTestTools/PackageVerifier.cs
+++ b/src/WixTestTools/PackageVerifier.cs
@@ -58,6 +58,13 @@ namespace WixTestTools
58 Assert.Equal(installed, MsiUtilities.IsProductInstalled(productCode)); 58 Assert.Equal(installed, MsiUtilities.IsProductInstalled(productCode));
59 } 59 }
60 60
61 public void VerifyInstalledWithVersion(bool installed)
62 {
63 var productCode = this.GetProperty("ProductCode");
64 Version prodVersion = new Version(this.GetProperty("ProductVersion"));
65 Assert.Equal(installed, MsiUtilities.IsProductInstalledWithVersion(productCode, prodVersion));
66 }
67
61 public void DeleteTestRegistryValue(string name) 68 public void DeleteTestRegistryValue(string name)
62 { 69 {
63 using (var root = this.TestContext.GetTestRegistryRoot()) 70 using (var root = this.TestContext.GetTestRegistryRoot())
diff --git a/src/WixTestTools/WixTestTools.csproj b/src/WixTestTools/WixTestTools.csproj
index f81c82d1..0c3c4c76 100644
--- a/src/WixTestTools/WixTestTools.csproj
+++ b/src/WixTestTools/WixTestTools.csproj
@@ -11,7 +11,7 @@
11 <PackageReference Include="Microsoft.Win32.Registry" Version="5.0.0" /> 11 <PackageReference Include="Microsoft.Win32.Registry" Version="5.0.0" />
12 <PackageReference Include="System.Security.Principal.Windows" Version="5.0.0" /> 12 <PackageReference Include="System.Security.Principal.Windows" Version="5.0.0" />
13 <PackageReference Include="WixBuildTools.TestSupport" Version="4.0.48" /> 13 <PackageReference Include="WixBuildTools.TestSupport" Version="4.0.48" />
14 <PackageReference Include="WixToolset.Data" Version="4.0.196" /> 14 <PackageReference Include="WixToolset.Data" Version="4.0.198" />
15 <PackageReference Include="WixToolset.Mba.Core" Version="4.0.51" /> 15 <PackageReference Include="WixToolset.Mba.Core" Version="4.0.51" />
16 </ItemGroup> 16 </ItemGroup>
17 17
diff --git a/src/WixToolsetTest.BurnE2E/DependencyTests.cs b/src/WixToolsetTest.BurnE2E/DependencyTests.cs
index a3994cf6..2e27239f 100644
--- a/src/WixToolsetTest.BurnE2E/DependencyTests.cs
+++ b/src/WixToolsetTest.BurnE2E/DependencyTests.cs
@@ -2,6 +2,9 @@
2 2
3namespace WixToolsetTest.BurnE2E 3namespace WixToolsetTest.BurnE2E
4{ 4{
5 using System;
6 using WixTestTools;
7 using WixToolset.Mba.Core;
5 using Xunit; 8 using Xunit;
6 using Xunit.Abstractions; 9 using Xunit.Abstractions;
7 10
@@ -12,27 +15,594 @@ namespace WixToolsetTest.BurnE2E
12 [Fact] 15 [Fact]
13 public void CanKeepSameExactPackageAfterUpgradingBundle() 16 public void CanKeepSameExactPackageAfterUpgradingBundle()
14 { 17 {
15 var packageA = this.CreatePackageInstaller("PackageF"); 18 var packageF = this.CreatePackageInstaller("PackageF");
16 var bundleAv1 = this.CreateBundleInstaller("BundleKv1"); 19 var bundleKv1 = this.CreateBundleInstaller("BundleKv1");
17 var bundleAv2 = this.CreateBundleInstaller("BundleKv2"); 20 var bundleKv2 = this.CreateBundleInstaller("BundleKv2");
21
22 packageF.VerifyInstalled(false);
23
24 bundleKv1.Install();
25 bundleKv1.VerifyRegisteredAndInPackageCache();
26
27 packageF.VerifyInstalled(true);
28
29 bundleKv2.Install();
30 bundleKv2.VerifyRegisteredAndInPackageCache();
31 bundleKv1.VerifyUnregisteredAndRemovedFromPackageCache();
32
33 packageF.VerifyInstalled(true);
34
35 bundleKv2.VerifyPackageIsCached("PackageF");
36
37 bundleKv2.Uninstall();
38 bundleKv2.VerifyUnregisteredAndRemovedFromPackageCache();
39
40 packageF.VerifyInstalled(false);
41 }
42
43 [Fact (Skip = "https://github.com/wixtoolset/issues/issues/6387")]
44 public void CanKeepSameExactPackageAfterUpgradingBundleWithSlipstreamedPatch()
45 {
46 var originalVersion = "1.0.0.0";
47 var patchedVersion = "1.0.1.0";
48 var testRegistryValue = "PackageA";
49 var testRegistryValueExe = "ExeA";
50
51 var packageA = this.CreatePackageInstaller("PackageAv1");
52 var bundleA = this.CreateBundleInstaller("BundleAv1");
53 var bundleC = this.CreateBundleInstaller("BundleC");
18 54
19 packageA.VerifyInstalled(false); 55 packageA.VerifyInstalled(false);
20 56
57 bundleA.Install();
58 bundleA.VerifyRegisteredAndInPackageCache();
59
60 packageA.VerifyInstalled(true);
61 packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion);
62 bundleA.VerifyExeTestRegistryValue(testRegistryValueExe, originalVersion);
63
64 // Verify https://github.com/wixtoolset/issues/issues/3294 - Uninstalling bundle registers a dependency on a package
65 bundleC.Install();
66 bundleC.VerifyRegisteredAndInPackageCache();
67 bundleA.VerifyUnregisteredAndRemovedFromPackageCache();
68
69 packageA.VerifyInstalled(true);
70 packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion);
71 bundleA.VerifyExeTestRegistryRootDeleted(testRegistryValueExe);
72
73 // Verify https://github.com/wixtoolset/issues/issues/2915 - Update bundle removes previously cached MSIs
74 bundleC.Repair();
75
76 bundleC.Uninstall();
77 bundleC.VerifyUnregisteredAndRemovedFromPackageCache();
78
79 packageA.VerifyInstalled(false);
80 }
81
82 [Fact(Skip = "https://github.com/wixtoolset/issues/issues/exea")]
83 public void CanKeepUpgradedPackageAfterUninstallUpgradedBundle()
84 {
85 var testRegistryValueExe = "ExeA";
86
87 var packageAv1 = this.CreatePackageInstaller("PackageAv1");
88 var packageAv101 = this.CreatePackageInstaller("PackageAv1_0_1");
89 var packageB = this.CreatePackageInstaller("PackageB");
90 var bundleAv1 = this.CreateBundleInstaller("BundleAv1");
91 var bundleAv101 = this.CreateBundleInstaller("BundleAv1_0_1");
92 var bundleB = this.CreateBundleInstaller("BundleB");
93
94 packageAv1.VerifyInstalledWithVersion(false);
95 packageAv101.VerifyInstalledWithVersion(false);
96 packageB.VerifyInstalled(false);
97
21 bundleAv1.Install(); 98 bundleAv1.Install();
22 bundleAv1.VerifyRegisteredAndInPackageCache(); 99 bundleAv1.VerifyRegisteredAndInPackageCache();
23 100
24 packageA.VerifyInstalled(true); 101 packageAv1.VerifyInstalledWithVersion(true);
102 bundleAv1.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.0.0");
103
104 bundleB.Install();
105 bundleB.VerifyRegisteredAndInPackageCache();
25 106
26 bundleAv2.Install(); 107 packageAv1.VerifyInstalledWithVersion(true);
27 bundleAv2.VerifyRegisteredAndInPackageCache(); 108 bundleAv1.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.0.0");
109 packageB.VerifyInstalled(true);
110
111 bundleAv101.Install();
112 bundleAv101.VerifyRegisteredAndInPackageCache();
28 bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache(); 113 bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache();
29 114
115 packageAv1.VerifyInstalledWithVersion(false);
116 packageAv101.VerifyInstalledWithVersion(true);
117 bundleAv1.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.1.0");
118
119 bundleAv101.Uninstall();
120 bundleAv101.VerifyUnregisteredAndRemovedFromPackageCache();
121
122 packageAv101.VerifyInstalledWithVersion(true);
123 bundleAv1.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.1.0");
124 }
125
126#if SUPPORT_ADDON_AND_PATCH_RELATED_BUNDLES
127 [Fact(Skip = "https://github.com/wixtoolset/issues/issues/6387")]
128#else
129 [Fact(Skip = "addon/patch related bundle")]
130#endif
131 public void CanMinorUpgradeDependencyPackageFromPatchBundle()
132 {
133 var originalVersion = "1.0.0.0";
134 var patchedVersion = "1.0.1.0";
135 var testRegistryValue = "PackageA";
136
137 var packageA = this.CreatePackageInstaller("PackageAv1");
138 var packageBv1 = this.CreatePackageInstaller("PackageBv1");
139 var packageBv101 = this.CreatePackageInstaller("PackageBv1_0_1");
140 var bundleJ = this.CreateBundleInstaller("BundleJ");
141 var bundleJ_Patch = this.CreateBundleInstaller("BundleJ_Patch");
142
143 packageA.VerifyInstalled(false);
144 packageBv1.VerifyInstalled(false);
145 packageBv101.VerifyInstalled(false);
146
147 bundleJ.Install();
148 bundleJ.VerifyRegisteredAndInPackageCache();
149
150 packageA.VerifyInstalled(true);
151 packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion);
152 packageBv1.VerifyInstalled(true);
153
154 bundleJ_Patch.Install();
155 bundleJ_Patch.VerifyRegisteredAndInPackageCache();
156
157 packageA.VerifyInstalled(true);
158 packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion);
159 packageBv1.VerifyInstalled(false);
160 packageBv101.VerifyInstalled(true);
161
162 bundleJ.Uninstall();
163 bundleJ.VerifyUnregisteredAndRemovedFromPackageCache();
164 bundleJ_Patch.VerifyUnregisteredAndRemovedFromPackageCache();
165
166 packageA.VerifyInstalled(false);
167 packageBv1.VerifyInstalled(false);
168 packageBv101.VerifyInstalled(false);
169 }
170
171#if SUPPORT_ADDON_AND_PATCH_RELATED_BUNDLES
172 [Fact(Skip = "https://github.com/wixtoolset/issues/issues/6387")]
173#else
174 [Fact(Skip = "addon/patch related bundle")]
175#endif
176 public void CanMinorUpgradeDependencyPackageFromPatchBundleThenUninstallToRestoreBase()
177 {
178 var originalVersion = "1.0.0.0";
179 var patchedVersion = "1.0.1.0";
180 var testRegistryValue = "PackageA";
181
182 var packageA = this.CreatePackageInstaller("PackageAv1");
183 var packageBv1 = this.CreatePackageInstaller("PackageBv1");
184 var packageBv101 = this.CreatePackageInstaller("PackageBv1_0_1");
185 var bundleJ = this.CreateBundleInstaller("BundleJ");
186 var bundleJ_Patch = this.CreateBundleInstaller("BundleJ_Patch");
187
188 packageA.VerifyInstalled(false);
189 packageBv1.VerifyInstalled(false);
190 packageBv101.VerifyInstalled(false);
191
192 bundleJ.Install();
193 bundleJ.VerifyRegisteredAndInPackageCache();
194
195 packageA.VerifyInstalled(true);
196 packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion);
197 packageBv1.VerifyInstalled(true);
198
199 bundleJ_Patch.Install();
200 bundleJ_Patch.VerifyRegisteredAndInPackageCache();
201
202 packageA.VerifyInstalled(true);
203 packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion);
204 packageBv1.VerifyInstalled(false);
205 packageBv101.VerifyInstalled(true);
206
207 bundleJ_Patch.Uninstall();
208 bundleJ_Patch.VerifyUnregisteredAndRemovedFromPackageCache();
209
30 packageA.VerifyInstalled(true); 210 packageA.VerifyInstalled(true);
211 packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion);
212 packageBv1.VerifyInstalled(true);
213 packageBv101.VerifyInstalled(false);
214
215 bundleJ.Uninstall();
216 bundleJ.VerifyUnregisteredAndRemovedFromPackageCache();
217
218 packageA.VerifyInstalled(false);
219 packageBv1.VerifyInstalled(false);
220 packageBv101.VerifyInstalled(false);
221 }
222
223#if SUPPORT_ADDON_AND_PATCH_RELATED_BUNDLES
224 [Fact]
225#else
226 [Fact(Skip = "addon/patch related bundle")]
227#endif
228 public void CanUninstallBaseWithAddOnsWhenAllSharePackages()
229 {
230 var testRegistryValueExe = "ExeA";
231
232 var packageA = this.CreatePackageInstaller("PackageAv1");
233 var packageB = this.CreatePackageInstaller("PackageB");
234 var bundleF = this.CreateBundleInstaller("BundleF");
235 var bundleF_AddOnA = this.CreateBundleInstaller("BundleF_AddOnA");
236 var bundleF_AddOnB = this.CreateBundleInstaller("BundleF_AddOnB");
237
238 packageA.VerifyInstalled(false);
239 packageB.VerifyInstalled(false);
240
241 bundleF.Install();
242 bundleF.VerifyRegisteredAndInPackageCache();
243
244 packageA.VerifyInstalled(true);
245 packageB.VerifyInstalled(true);
246
247 bundleF_AddOnA.Install();
248 bundleF_AddOnA.VerifyRegisteredAndInPackageCache();
249
250 packageA.VerifyInstalled(true);
251 bundleF.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.0.0");
252 packageB.VerifyInstalled(true);
253
254 bundleF_AddOnB.Install();
255 bundleF_AddOnB.VerifyRegisteredAndInPackageCache();
256
257 packageA.VerifyInstalled(true);
258 bundleF.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.0.0");
259 packageB.VerifyInstalled(true);
260
261 bundleF.Uninstall();
262 bundleF.VerifyUnregisteredAndRemovedFromPackageCache();
263 bundleF_AddOnA.VerifyUnregisteredAndRemovedFromPackageCache();
264 bundleF_AddOnB.VerifyUnregisteredAndRemovedFromPackageCache();
265
266 packageA.VerifyInstalled(false);
267 bundleF.VerifyExeTestRegistryRootDeleted(testRegistryValueExe);
268 packageB.VerifyInstalled(false);
269 }
270
271 [Fact(Skip = "https://github.com/wixtoolset/issues/issues/6388")]
272 public void CanUninstallDependencyPackagesWithBundlesUninstalledInFifoOrder()
273 {
274 var testRegistryValueExe = "ExeA";
31 275
32 bundleAv2.Uninstall(); 276 var packageA = this.CreatePackageInstaller("PackageAv1");
33 bundleAv2.VerifyUnregisteredAndRemovedFromPackageCache(); 277 var packageB = this.CreatePackageInstaller("PackageB");
278 var bundleA = this.CreateBundleInstaller("BundleAv1");
279 var bundleB = this.CreateBundleInstaller("BundleB");
34 280
35 packageA.VerifyInstalled(false); 281 packageA.VerifyInstalled(false);
282 packageB.VerifyInstalled(false);
283
284 bundleA.Install();
285 bundleA.VerifyRegisteredAndInPackageCache();
286
287 packageA.VerifyInstalled(true);
288 bundleA.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.0.0");
289
290 bundleB.Install();
291 bundleB.VerifyRegisteredAndInPackageCache();
292
293 packageA.VerifyInstalled(true);
294 bundleA.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.0.0");
295 packageB.VerifyInstalled(true);
296
297 bundleA.Uninstall();
298 bundleA.VerifyUnregisteredAndRemovedFromPackageCache();
299
300 packageA.VerifyInstalled(true);
301 bundleA.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.0.0");
302 packageB.VerifyInstalled(true);
303
304 bundleB.Uninstall();
305 bundleB.VerifyUnregisteredAndRemovedFromPackageCache();
306
307 packageA.VerifyInstalled(false);
308 bundleA.VerifyExeTestRegistryRootDeleted(testRegistryValueExe);
309 packageB.VerifyInstalled(false);
310 }
311
312 [Fact]
313 public void CanUninstallDependencyPackagesWithBundlesUninstalledInReverseOrder()
314 {
315 var packageA = this.CreatePackageInstaller("PackageAv1");
316 var packageB = this.CreatePackageInstaller("PackageB");
317 var bundleA = this.CreateBundleInstaller("BundleAv1");
318 var bundleB = this.CreateBundleInstaller("BundleB");
319
320 packageA.VerifyInstalled(false);
321 packageB.VerifyInstalled(false);
322
323 bundleA.Install();
324 bundleA.VerifyRegisteredAndInPackageCache();
325
326 packageA.VerifyInstalled(true);
327
328 bundleB.Install();
329 bundleB.VerifyRegisteredAndInPackageCache();
330
331 packageA.VerifyInstalled(true);
332 packageB.VerifyInstalled(true);
333
334 bundleB.Uninstall();
335 bundleB.VerifyUnregisteredAndRemovedFromPackageCache();
336
337 packageA.VerifyInstalled(true);
338
339 bundleA.Uninstall();
340 bundleA.VerifyUnregisteredAndRemovedFromPackageCache();
341
342 packageA.VerifyInstalled(false);
343 packageB.VerifyInstalled(false);
344 }
345
346#if SUPPORT_ADDON_AND_PATCH_RELATED_BUNDLES
347 [Fact(Skip = "https://github.com/wixtoolset/issues/issues/6387")]
348#else
349 [Fact(Skip = "addon/patch related bundle")]
350#endif
351 public void CanUpgradePatchBundleWithAdditionalPatch()
352 {
353 var originalVersion = "1.0.0.0";
354 var patchedVersion = "1.0.1.0";
355 var patchedVersion2 = "1.0.2.0";
356 var testRegistryValue = "PackageA";
357
358 var packageA = this.CreatePackageInstaller("PackageAv1");
359 var packageB = this.CreatePackageInstaller("PackageBv1");
360 var bundleF = this.CreateBundleInstaller("BundleJ");
361 var bundleF_PatchAv101 = this.CreateBundleInstaller("BundleF_PatchAv1_0_1");
362 var bundleF_PatchAv102 = this.CreateBundleInstaller("BundleF_PatchAv1_0_2");
363
364 packageA.VerifyInstalled(false);
365 packageB.VerifyInstalled(false);
366
367 bundleF.Install();
368 bundleF.VerifyRegisteredAndInPackageCache();
369
370 packageA.VerifyInstalled(true);
371 packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion);
372 packageB.VerifyInstalled(true);
373
374 bundleF_PatchAv101.Install();
375 bundleF_PatchAv101.VerifyRegisteredAndInPackageCache();
376
377 packageA.VerifyInstalled(true);
378 packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion);
379 packageB.VerifyInstalled(false);
380
381 bundleF_PatchAv102.Install();
382 bundleF_PatchAv102.VerifyRegisteredAndInPackageCache();
383
384 packageA.VerifyInstalled(true);
385 packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion2);
386 packageB.VerifyInstalled(false);
387
388 bundleF.Uninstall();
389 bundleF.VerifyUnregisteredAndRemovedFromPackageCache();
390 bundleF_PatchAv101.VerifyUnregisteredAndRemovedFromPackageCache();
391 bundleF_PatchAv102.VerifyUnregisteredAndRemovedFromPackageCache();
392
393 packageA.VerifyInstalled(false);
394 packageB.VerifyInstalled(false);
395 }
396
397 [Fact(Skip = "https://github.com/wixtoolset/issues/issues/6388")]
398 public void DoesntRegisterDependencyOnPackageNotSelectedForInstall()
399 {
400 var testRegistryValueExe = "ExeA";
401
402 var packageA = this.CreatePackageInstaller("PackageAv1");
403 var packageB = this.CreatePackageInstaller("PackageB");
404 var bundleA = this.CreateBundleInstaller("BundleAv1");
405 var bundleB = this.CreateBundleInstaller("BundleB");
406 var testBAController = this.CreateTestBAController();
407
408 packageA.VerifyInstalled(false);
409 packageB.VerifyInstalled(false);
410
411 bundleA.Install();
412 bundleA.VerifyRegisteredAndInPackageCache();
413
414 packageA.VerifyInstalled(true);
415 bundleA.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.0.0");
416
417 // Verify https://github.com/wixtoolset/issues/issues/3456 - Dependency registered on package though unselected to instal
418 testBAController.SetPackageRequestedState("PackageA", RequestState.None);
419 testBAController.SetPackageRequestedState("PackageB", RequestState.None);
420
421 bundleB.Install();
422 bundleB.VerifyRegisteredAndInPackageCache();
423
424 packageA.VerifyInstalled(true);
425 bundleA.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.0.0");
426 packageB.VerifyInstalled(false);
427
428 bundleA.Uninstall();
429 bundleA.VerifyUnregisteredAndRemovedFromPackageCache();
430
431 packageA.VerifyInstalled(false);
432 bundleA.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.0.0");
433 packageB.VerifyInstalled(false);
434
435 bundleB.Uninstall();
436 bundleB.VerifyUnregisteredAndRemovedFromPackageCache();
437
438 packageA.VerifyInstalled(false);
439 bundleA.VerifyExeTestRegistryRootDeleted(testRegistryValueExe);
440 packageB.VerifyInstalled(false);
441 }
442
443 [Fact(Skip = "https://github.com/wixtoolset/issues/issues/3516")]
444 public void DoesntRollbackPackageInstallIfPreexistingDependents()
445 {
446 var packageA = this.CreatePackageInstaller("PackageAv1");
447 var packageC = this.CreatePackageInstaller("PackageC");
448 var bundleE = this.CreateBundleInstaller("BundleE");
449 var bundleL = this.CreateBundleInstaller("BundleL");
450 var testBAController = this.CreateTestBAController();
451
452 packageA.VerifyInstalled(false);
453 packageC.VerifyInstalled(false);
454
455 // Make PackageC fail.
456 testBAController.SetPackageCancelExecuteAtProgress("PackageC", 10);
457
458 bundleE.Install();
459 bundleE.VerifyRegisteredAndInPackageCache();
460
461 packageA.VerifyInstalled(true);
462 packageC.VerifyInstalled(false);
463
464 // Make PackageC install then rollback.
465 testBAController.SetPackageCancelExecuteAtProgress("PackageC", null);
466 testBAController.SetPackageCancelOnProgressAtProgress("PackageC", 10);
467
468 bundleL.Install((int)MSIExec.MSIExecReturnCode.ERROR_INSTALL_USEREXIT);
469 bundleL.VerifyUnregisteredAndRemovedFromPackageCache();
470
471 packageA.VerifyInstalled(true);
472 packageC.VerifyInstalled(true);
473
474 testBAController.SetPackageCancelOnProgressAtProgress("PackageC", null);
475
476 bundleE.Uninstall();
477 bundleE.VerifyUnregisteredAndRemovedFromPackageCache();
478
479 packageA.VerifyInstalled(false);
480 packageC.VerifyInstalled(false);
481 }
482
483 [Fact]
484 public void RegistersDependencyOnFailedNonVitalPackages()
485 {
486 var packageA = this.CreatePackageInstaller("PackageAv1");
487 var packageC = this.CreatePackageInstaller("PackageC");
488 var bundleE = this.CreateBundleInstaller("BundleE");
489 var bundleL = this.CreateBundleInstaller("BundleL");
490 var testBAController = this.CreateTestBAController();
491
492 packageA.VerifyInstalled(false);
493 packageC.VerifyInstalled(false);
494
495 // Make PackageC fail.
496 testBAController.SetPackageCancelExecuteAtProgress("PackageC", 10);
497
498 // Verify https://github.com/wixtoolset/issues/issues/3406 - Non-vital failure result in bundle failure (install)
499 bundleE.Install();
500 bundleE.VerifyRegisteredAndInPackageCache();
501
502 packageA.VerifyInstalled(true);
503 packageC.VerifyInstalled(false);
504
505 // Verify https://github.com/wixtoolset/issues/issues/3406 - Non-vital failure result in bundle failure (repair)
506 bundleE.Repair();
507 bundleE.VerifyRegisteredAndInPackageCache();
508
509 packageA.VerifyInstalled(true);
510 packageC.VerifyInstalled(false);
511
512 testBAController.SetPackageCancelExecuteAtProgress("PackageC", null);
513
514 bundleL.Install();
515 bundleL.VerifyRegisteredAndInPackageCache();
516
517 packageA.VerifyInstalled(true);
518 packageC.VerifyInstalled(true);
519
520 // Verify https://github.com/wixtoolset/issues/issues/3516 - Burn registers dependency on failed packages
521 bundleL.Uninstall();
522 bundleL.VerifyUnregisteredAndRemovedFromPackageCache();
523
524 packageA.VerifyInstalled(true);
525 packageC.VerifyInstalled(true);
526
527 bundleE.Uninstall();
528 bundleE.VerifyUnregisteredAndRemovedFromPackageCache();
529
530 packageA.VerifyInstalled(false);
531 packageC.VerifyInstalled(false);
532 }
533
534 [Fact]
535 public void RemovesDependencyDuringUpgradeRollback()
536 {
537 var testRegistryValueExe = "ExeA";
538
539 var packageA = this.CreatePackageInstaller("PackageAv1");
540 var bundleA = this.CreateBundleInstaller("BundleAv1");
541 var bundleD = this.CreateBundleInstaller("BundleD");
542
543 packageA.VerifyInstalled(false);
544 bundleA.VerifyExeTestRegistryRootDeleted(testRegistryValueExe);
545
546 bundleA.Install();
547 bundleA.VerifyRegisteredAndInPackageCache();
548
549 packageA.VerifyInstalled(true);
550 bundleA.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.0.0");
551
552 // Verify https://github.com/wixtoolset/issues/issues/3341 - pkg dependecy not removed in rollback if pkg already present
553 bundleD.Install((int)MSIExec.MSIExecReturnCode.ERROR_INSTALL_FAILURE);
554 bundleD.VerifyUnregisteredAndRemovedFromPackageCache();
555
556 packageA.VerifyInstalled(true);
557 bundleA.VerifyExeTestRegistryValue(testRegistryValueExe, "1.0.0.0");
558
559 bundleA.Uninstall();
560 bundleA.VerifyUnregisteredAndRemovedFromPackageCache();
561
562 packageA.VerifyInstalled(false);
563 bundleA.VerifyExeTestRegistryRootDeleted(testRegistryValueExe);
564 }
565
566 [Fact]
567 public void SkipsCrossScopeDependencyRegistration()
568 {
569 var packageA = this.CreatePackageInstaller("PackageAv1");
570 var packageDv1 = this.CreatePackageInstaller("PackageDv1");
571 var packageDv2 = this.CreatePackageInstaller("PackageDv2");
572 var bundleHv1 = this.CreateBundleInstaller("BundleHv1");
573 var bundleHv2 = this.CreateBundleInstaller("BundleHv2");
574
575 packageA.VerifyInstalled(false);
576 packageDv1.VerifyInstalled(false);
577 packageDv2.VerifyInstalled(false);
578
579 var bundleHv1InstallLogFilePath = bundleHv1.Install();
580 bundleHv1.VerifyRegisteredAndInPackageCache();
581
582 packageA.VerifyInstalled(true);
583 packageDv1.VerifyInstalled(true);
584
585 Assert.True(LogVerifier.MessageInLogFileRegex(bundleHv1InstallLogFilePath, @"Skipping cross-scope dependency registration on package: PackageA, bundle scope: PerUser, package scope: PerMachine"));
586
587 var bundleHv2InstallLogFilePath = bundleHv2.Install();
588 bundleHv2.VerifyRegisteredAndInPackageCache();
589 bundleHv1.VerifyUnregisteredAndRemovedFromPackageCache();
590
591 packageA.VerifyInstalled(true);
592 packageDv1.VerifyInstalled(false);
593 packageDv2.VerifyInstalled(true);
594
595 Assert.True(LogVerifier.MessageInLogFileRegex(bundleHv2InstallLogFilePath, @"Skipping cross-scope dependency registration on package: PackageA, bundle scope: PerUser, package scope: PerMachine"));
596 Assert.True(LogVerifier.MessageInLogFileRegex(bundleHv2InstallLogFilePath, @"Detected related bundle: \{[0-9A-Za-z\-]{36}\}, type: Upgrade, scope: PerUser, version: 1\.0\.0\.0, operation: MajorUpgrade"));
597
598 bundleHv2.Uninstall();
599 bundleHv2.VerifyUnregisteredAndRemovedFromPackageCache();
600
601 // Verify that permanent packageA is still installed and then remove.
602 packageA.VerifyInstalled(true);
603 packageDv2.VerifyInstalled(false);
604 packageA.UninstallProduct();
605 packageA.VerifyInstalled(false);
36 } 606 }
37 } 607 }
38} 608}
diff --git a/src/WixToolsetTest.BurnE2E/WixToolsetTest.BurnE2E.csproj b/src/WixToolsetTest.BurnE2E/WixToolsetTest.BurnE2E.csproj
index 820ae24f..f1db82e7 100644
--- a/src/WixToolsetTest.BurnE2E/WixToolsetTest.BurnE2E.csproj
+++ b/src/WixToolsetTest.BurnE2E/WixToolsetTest.BurnE2E.csproj
@@ -20,7 +20,7 @@
20 <PackageReference Include="Microsoft.Win32.Registry" Version="5.0.0" /> 20 <PackageReference Include="Microsoft.Win32.Registry" Version="5.0.0" />
21 <PackageReference Include="System.Security.Principal.Windows" Version="5.0.0" /> 21 <PackageReference Include="System.Security.Principal.Windows" Version="5.0.0" />
22 <PackageReference Include="WixBuildTools.TestSupport" Version="4.0.48" /> 22 <PackageReference Include="WixBuildTools.TestSupport" Version="4.0.48" />
23 <PackageReference Include="WixToolset.Data" Version="4.0.196" /> 23 <PackageReference Include="WixToolset.Data" Version="4.0.198" />
24 <PackageReference Include="WixToolset.Mba.Core" Version="4.0.51" /> 24 <PackageReference Include="WixToolset.Mba.Core" Version="4.0.51" />
25 </ItemGroup> 25 </ItemGroup>
26 26