aboutsummaryrefslogtreecommitdiff
path: root/src/test/burn
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/burn')
-rw-r--r--src/test/burn/TestData/Templates/Bundle.wxs4
-rw-r--r--src/test/burn/TestData/TestData.proj2
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/ArchSpecificBundle/ArchSpecificBundle.wixproj17
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/ArchSpecificBundle/ArchSpecificBundle.wxs13
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/ArchSpecificBundle/Bundle.wxs63
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/DtfSamples.sln28
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/EmbeddedUI/EmbeddedUI.config10
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/EmbeddedUI/EmbeddedUI.csproj24
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/EmbeddedUI/InstallProgressCounter.cs174
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/EmbeddedUI/SampleEmbeddedUI.cs141
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/EmbeddedUI/SetupWizard.xaml19
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/EmbeddedUI/SetupWizard.xaml.cs154
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/EmbeddedUIBundle/Bundle.wxs63
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/EmbeddedUIBundle/EmbeddedUIBundle.wixproj15
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/EmbeddedUIBundle/EmbeddedUIBundle.wxs11
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/EmbeddedUIPackage/EmbeddedUIPackage.wixproj16
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/EmbeddedUIPackage/EmbeddedUIPackage.wxs13
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/InternalUIBundle/Bundle.wxs63
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/InternalUIBundle/InternalUIBundle.wixproj14
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/InternalUIBundle/InternalUIBundle.wxs10
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/InternalUIPackage/InternalUIPackage.wixproj16
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/InternalUIPackage/InternalUIPackage.wxs24
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/InternalUIarm64Package/InternalUIarm64Package.wixproj14
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/InternalUIarm64Package/InternalUIarm64Package.wxs9
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/InternalUIx64Package/InternalUIx64Package.wixproj14
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/InternalUIx64Package/InternalUIx64Package.wxs9
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/InternalUIx86Package/InternalUIx86Package.wixproj14
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/InternalUIx86Package/InternalUIx86Package.wxs9
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/ManagedCA/CustomAction.config10
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/ManagedCA/ManagedCA.csproj16
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/ManagedCA/SampleCA.cs125
-rw-r--r--src/test/burn/TestData/WixIuiBaTests/ManagedCA/testsub/testfile.txt1
-rw-r--r--src/test/burn/WixTestTools/PackageVerifier.cs18
-rw-r--r--src/test/burn/WixToolsetTest.BurnE2E/WixIuiBaTests.cs144
34 files changed, 1272 insertions, 5 deletions
diff --git a/src/test/burn/TestData/Templates/Bundle.wxs b/src/test/burn/TestData/Templates/Bundle.wxs
index 612e67f5..c55f67a7 100644
--- a/src/test/burn/TestData/Templates/Bundle.wxs
+++ b/src/test/burn/TestData/Templates/Bundle.wxs
@@ -33,6 +33,10 @@
33 <BootstrapperApplication> 33 <BootstrapperApplication>
34 <bal:WixStandardBootstrapperApplication LicenseUrl="" Theme="hyperlinkLicense" /> 34 <bal:WixStandardBootstrapperApplication LicenseUrl="" Theme="hyperlinkLicense" />
35 </BootstrapperApplication> 35 </BootstrapperApplication>
36 <?elseif $(var.BA) = "iui"?>
37 <BootstrapperApplication>
38 <bal:WixInternalUIBootstrapperApplication />
39 </BootstrapperApplication>
36 <?else?> 40 <?else?>
37 <BootstrapperApplicationRef Id="$(var.BA)" /> 41 <BootstrapperApplicationRef Id="$(var.BA)" />
38 <?endif?> 42 <?endif?>
diff --git a/src/test/burn/TestData/TestData.proj b/src/test/burn/TestData/TestData.proj
index 27bfb02b..0f7cbee9 100644
--- a/src/test/burn/TestData/TestData.proj
+++ b/src/test/burn/TestData/TestData.proj
@@ -4,7 +4,7 @@
4<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 4<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
5 <ItemGroup> 5 <ItemGroup>
6 <TestDataProject Include="**\*.wixproj" /> 6 <TestDataProject Include="**\*.wixproj" />
7 7
8 <!-- https://github.com/wixtoolset/issues/issues/6401 --> 8 <!-- https://github.com/wixtoolset/issues/issues/6401 -->
9 <TestDataProject Remove="DependencyTests\BundleC\BundleC.wixproj" /> 9 <TestDataProject Remove="DependencyTests\BundleC\BundleC.wixproj" />
10 <TestDataProject Remove="DependencyTests\BundleF_PatchAv1_0_1\BundleF_PatchAv1_0_1.wixproj" /> 10 <TestDataProject Remove="DependencyTests\BundleF_PatchAv1_0_1\BundleF_PatchAv1_0_1.wixproj" />
diff --git a/src/test/burn/TestData/WixIuiBaTests/ArchSpecificBundle/ArchSpecificBundle.wixproj b/src/test/burn/TestData/WixIuiBaTests/ArchSpecificBundle/ArchSpecificBundle.wixproj
new file mode 100644
index 00000000..9e3cba8b
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/ArchSpecificBundle/ArchSpecificBundle.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 <PropertyGroup>
4 <OutputType>Bundle</OutputType>
5 <BA>iui</BA>
6 <UpgradeCode>{22B5ADAF-74D3-424A-8D32-9901FCF97E6D}</UpgradeCode>
7 </PropertyGroup>
8 <ItemGroup>
9 <ProjectReference Include="..\InternalUIPackage\InternalUIPackage.wixproj" />
10 <ProjectReference Include="..\InternalUIarm64Package\InternalUIarm64Package.wixproj" />
11 <ProjectReference Include="..\InternalUIx64Package\InternalUIx64Package.wixproj" />
12 <ProjectReference Include="..\InternalUIx86Package\InternalUIx86Package.wixproj" />
13 </ItemGroup>
14 <ItemGroup>
15 <PackageReference Include="WixToolset.Bal.wixext" />
16 </ItemGroup>
17</Project> \ No newline at end of file
diff --git a/src/test/burn/TestData/WixIuiBaTests/ArchSpecificBundle/ArchSpecificBundle.wxs b/src/test/burn/TestData/WixIuiBaTests/ArchSpecificBundle/ArchSpecificBundle.wxs
new file mode 100644
index 00000000..71b8665f
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/ArchSpecificBundle/ArchSpecificBundle.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
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
5 <Fragment>
6 <PackageGroup Id="BundlePackages">
7 <MsiPackage Id="InternalUIPackage" SourceFile="$(var.InternalUIPackage.TargetPath)" />
8 <MsiPackage Id="InternalUIarm64Package" SourceFile="$(var.InternalUIarm64Package.TargetPath)" bal:PrimaryPackageType="arm64" />
9 <MsiPackage Id="InternalUIx64Package" SourceFile="$(var.InternalUIx64Package.TargetPath)" bal:PrimaryPackageType="x64" />
10 <MsiPackage Id="InternalUIx86Package" SourceFile="$(var.InternalUIx86Package.TargetPath)" bal:PrimaryPackageType="x86" />
11 </PackageGroup>
12 </Fragment>
13</Wix>
diff --git a/src/test/burn/TestData/WixIuiBaTests/ArchSpecificBundle/Bundle.wxs b/src/test/burn/TestData/WixIuiBaTests/ArchSpecificBundle/Bundle.wxs
new file mode 100644
index 00000000..195c159e
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/ArchSpecificBundle/Bundle.wxs
@@ -0,0 +1,63 @@
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<?ifndef BundleLogDirectory?>
7<?define BundleLogDirectory = .?>
8<?endif?>
9
10<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
11 <!-- The only difference from the template should be the SplashScreen and uncompressed -->
12 <Bundle Name="~$(var.TestGroupName) - $(var.BundleName)" Version="$(var.Version)" UpgradeCode="$(var.UpgradeCode)" Compressed="no" SplashScreenSourceFile="..\..\Manual\BafThmutilTesting\theme\star_transparent.bmp">
13 <Log Prefix="$(var.BundleLogDirectory)\~$(var.TestGroupName)_$(var.BundleName)" />
14
15 <Variable Name="TestGroupName" Value="$(var.TestGroupName)" />
16
17 <?ifdef SoftwareTag?>
18 <SoftwareTag Regid="regid.1995-08.com.example" InstallPath="[CommonAppDataFolder]regid.1995-08.com.example" />
19 <?endif?>
20
21 <?ifndef BA?>
22 <!-- pulled in through the PackageGroupRef below -->
23 <?elseif $(var.BA) = "TestBAdnc"?>
24 <!-- pulled in through the PackageGroupRef below -->
25 <?elseif $(var.BA) = "TestBA_x64"?>
26 <!-- pulled in through the PackageGroupRef below -->
27 <?elseif $(var.BA) = "TestBAdnc_x64"?>
28 <!-- pulled in through the PackageGroupRef below -->
29 <?elseif $(var.BA) = "WixBA"?>
30 <!-- pulled in through the PackageGroupRef below -->
31 <?elseif $(var.BA) = "WixBAdnc_x64"?>
32 <!-- pulled in through the PackageGroupRef below -->
33 <?elseif $(var.BA) = "hyperlinkLicense"?>
34 <BootstrapperApplication>
35 <bal:WixStandardBootstrapperApplication LicenseUrl="" Theme="hyperlinkLicense" />
36 </BootstrapperApplication>
37 <?elseif $(var.BA) = "iui"?>
38 <BootstrapperApplication>
39 <bal:WixInternalUIBootstrapperApplication />
40 </BootstrapperApplication>
41 <?else?>
42 <BootstrapperApplicationRef Id="$(var.BA)" />
43 <?endif?>
44
45 <Chain>
46 <?ifndef BA?>
47 <PackageGroupRef Id="TestBA" />
48 <?elseif $(var.BA) = "TestBAdnc"?>
49 <PackageGroupRef Id="TestBAdnc" />
50 <?elseif $(var.BA) = "TestBA_x64"?>
51 <PackageGroupRef Id="TestBA_x64" />
52 <?elseif $(var.BA) = "TestBAdnc_x64"?>
53 <PackageGroupRef Id="TestBAdnc_x64" />
54 <?elseif $(var.BA) = "WixBA"?>
55 <PackageGroupRef Id="WixBA" />
56 <?elseif $(var.BA) = "WixBAdnc_x64"?>
57 <PackageGroupRef Id="WixBAdnc_x64" />
58 <?endif?>
59
60 <PackageGroupRef Id="BundlePackages" />
61 </Chain>
62 </Bundle>
63</Wix>
diff --git a/src/test/burn/TestData/WixIuiBaTests/DtfSamples.sln b/src/test/burn/TestData/WixIuiBaTests/DtfSamples.sln
new file mode 100644
index 00000000..1e6c2082
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/DtfSamples.sln
@@ -0,0 +1,28 @@
1
2Microsoft Visual Studio Solution File, Format Version 12.00
3# Visual Studio Version 16
4VisualStudioVersion = 16.0.30114.105
5MinimumVisualStudioVersion = 10.0.40219.1
6Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EmbeddedUI", "EmbeddedUI\EmbeddedUI.csproj", "{864B8C50-7895-4485-AC89-900D86FD8C0D}"
7EndProject
8Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ManagedCA", "ManagedCA\ManagedCA.csproj", "{8F53B9CC-6FBE-493D-9C9A-09B2AD578CE7}"
9EndProject
10Global
11 GlobalSection(SolutionConfigurationPlatforms) = preSolution
12 Debug|Any CPU = Debug|Any CPU
13 Release|Any CPU = Release|Any CPU
14 EndGlobalSection
15 GlobalSection(SolutionProperties) = preSolution
16 HideSolutionNode = FALSE
17 EndGlobalSection
18 GlobalSection(ProjectConfigurationPlatforms) = postSolution
19 {864B8C50-7895-4485-AC89-900D86FD8C0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
20 {864B8C50-7895-4485-AC89-900D86FD8C0D}.Debug|Any CPU.Build.0 = Debug|Any CPU
21 {864B8C50-7895-4485-AC89-900D86FD8C0D}.Release|Any CPU.ActiveCfg = Debug|Any CPU
22 {864B8C50-7895-4485-AC89-900D86FD8C0D}.Release|Any CPU.Build.0 = Debug|Any CPU
23 {8F53B9CC-6FBE-493D-9C9A-09B2AD578CE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
24 {8F53B9CC-6FBE-493D-9C9A-09B2AD578CE7}.Debug|Any CPU.Build.0 = Debug|Any CPU
25 {8F53B9CC-6FBE-493D-9C9A-09B2AD578CE7}.Release|Any CPU.ActiveCfg = Release|Any CPU
26 {8F53B9CC-6FBE-493D-9C9A-09B2AD578CE7}.Release|Any CPU.Build.0 = Release|Any CPU
27 EndGlobalSection
28EndGlobal
diff --git a/src/test/burn/TestData/WixIuiBaTests/EmbeddedUI/EmbeddedUI.config b/src/test/burn/TestData/WixIuiBaTests/EmbeddedUI/EmbeddedUI.config
new file mode 100644
index 00000000..700aff6f
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/EmbeddedUI/EmbeddedUI.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 useLegacyV2RuntimeActivationPolicy="true">
7 <supportedRuntime version="v4.0" />
8 <supportedRuntime version="v2.0.50727" />
9 </startup>
10</configuration>
diff --git a/src/test/burn/TestData/WixIuiBaTests/EmbeddedUI/EmbeddedUI.csproj b/src/test/burn/TestData/WixIuiBaTests/EmbeddedUI/EmbeddedUI.csproj
new file mode 100644
index 00000000..a6339220
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/EmbeddedUI/EmbeddedUI.csproj
@@ -0,0 +1,24 @@
1<Project Sdk="Microsoft.NET.Sdk">
2 <PropertyGroup>
3 <TargetFramework>net35</TargetFramework>
4 <Description>Sample managed embedded external UI</Description>
5 <UseWPF>true</UseWPF>
6 </PropertyGroup>
7
8 <ItemGroup>
9 <Content Include="EmbeddedUI.config" CopyToOutputDirectory="PreserveNewest" />
10 </ItemGroup>
11
12 <ItemGroup>
13 <Reference Include="PresentationCore" />
14 <Reference Include="PresentationFramework" />
15 <Reference Include="System" />
16 <Reference Include="System.Core" />
17 <Reference Include="System.Xml" />
18 <Reference Include="WindowsBase" />
19 </ItemGroup>
20
21 <ItemGroup>
22 <PackageReference Include="WixToolset.Dtf.CustomAction" />
23 </ItemGroup>
24</Project>
diff --git a/src/test/burn/TestData/WixIuiBaTests/EmbeddedUI/InstallProgressCounter.cs b/src/test/burn/TestData/WixIuiBaTests/EmbeddedUI/InstallProgressCounter.cs
new file mode 100644
index 00000000..3d75081c
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/EmbeddedUI/InstallProgressCounter.cs
@@ -0,0 +1,174 @@
1namespace WixToolset.Samples.EmbeddedUI
2{
3 using System;
4 using WixToolset.Dtf.WindowsInstaller;
5
6 /// <summary>
7 /// Tracks MSI progress messages and converts them to usable progress.
8 /// </summary>
9 public class InstallProgressCounter
10 {
11 private int total;
12 private int completed;
13 private int step;
14 private bool moveForward;
15 private bool enableActionData;
16 private int progressPhase;
17 private double scriptPhaseWeight;
18
19 public InstallProgressCounter() : this(0.3)
20 {
21 }
22
23 public InstallProgressCounter(double scriptPhaseWeight)
24 {
25 if (!(0 <= scriptPhaseWeight && scriptPhaseWeight <= 1))
26 {
27 throw new ArgumentOutOfRangeException("scriptPhaseWeight");
28 }
29
30 this.scriptPhaseWeight = scriptPhaseWeight;
31 }
32
33 /// <summary>
34 /// Gets a number between 0 and 1 that indicates the overall installation progress.
35 /// </summary>
36 public double Progress { get; private set; }
37
38 public void ProcessMessage(InstallMessage messageType, Record messageRecord)
39 {
40 // This MSI progress-handling code was mostly borrowed from burn and translated from C++ to C#.
41
42 switch (messageType)
43 {
44 case InstallMessage.ActionStart:
45 if (this.enableActionData)
46 {
47 this.enableActionData = false;
48 }
49 break;
50
51 case InstallMessage.ActionData:
52 if (this.enableActionData)
53 {
54 if (this.moveForward)
55 {
56 this.completed += this.step;
57 }
58 else
59 {
60 this.completed -= this.step;
61 }
62
63 this.UpdateProgress();
64 }
65 break;
66
67 case InstallMessage.Progress:
68 this.ProcessProgressMessage(messageRecord);
69 break;
70 }
71 }
72
73 private void ProcessProgressMessage(Record progressRecord)
74 {
75 // This MSI progress-handling code was mostly borrowed from burn and translated from C++ to C#.
76
77 if (progressRecord == null || progressRecord.FieldCount == 0)
78 {
79 return;
80 }
81
82 int fieldCount = progressRecord.FieldCount;
83 int progressType = progressRecord.GetInteger(1);
84 string progressTypeString = String.Empty;
85 switch (progressType)
86 {
87 case 0: // Master progress reset
88 if (fieldCount < 4)
89 {
90 return;
91 }
92
93 this.progressPhase++;
94
95 this.total = progressRecord.GetInteger(2);
96 if (this.progressPhase == 1)
97 {
98 // HACK!!! this is a hack courtesy of the Windows Installer team. It seems the script planning phase
99 // is always off by "about 50". So we'll toss an extra 50 ticks on so that the standard progress
100 // doesn't go over 100%. If there are any custom actions, they may blow the total so we'll call this
101 // "close" and deal with the rest.
102 this.total += 50;
103 }
104
105 this.moveForward = (progressRecord.GetInteger(3) == 0);
106 this.completed = (this.moveForward ? 0 : this.total); // if forward start at 0, if backwards start at max
107 this.enableActionData = false;
108
109 this.UpdateProgress();
110 break;
111
112 case 1: // Action info
113 if (fieldCount < 3)
114 {
115 return;
116 }
117
118 if (progressRecord.GetInteger(3) == 0)
119 {
120 this.enableActionData = false;
121 }
122 else
123 {
124 this.enableActionData = true;
125 this.step = progressRecord.GetInteger(2);
126 }
127 break;
128
129 case 2: // Progress report
130 if (fieldCount < 2 || this.total == 0 || this.progressPhase == 0)
131 {
132 return;
133 }
134
135 if (this.moveForward)
136 {
137 this.completed += progressRecord.GetInteger(2);
138 }
139 else
140 {
141 this.completed -= progressRecord.GetInteger(2);
142 }
143
144 this.UpdateProgress();
145 break;
146
147 case 3: // Progress total addition
148 this.total += progressRecord.GetInteger(2);
149 break;
150 }
151 }
152
153 private void UpdateProgress()
154 {
155 if (this.progressPhase < 1 || this.total == 0)
156 {
157 this.Progress = 0;
158 }
159 else if (this.progressPhase == 1)
160 {
161 this.Progress = this.scriptPhaseWeight * Math.Min(this.completed, this.total) / this.total;
162 }
163 else if (this.progressPhase == 2)
164 {
165 this.Progress = this.scriptPhaseWeight +
166 (1 - this.scriptPhaseWeight) * Math.Min(this.completed, this.total) / this.total;
167 }
168 else
169 {
170 this.Progress = 1;
171 }
172 }
173 }
174}
diff --git a/src/test/burn/TestData/WixIuiBaTests/EmbeddedUI/SampleEmbeddedUI.cs b/src/test/burn/TestData/WixIuiBaTests/EmbeddedUI/SampleEmbeddedUI.cs
new file mode 100644
index 00000000..ae86dc97
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/EmbeddedUI/SampleEmbeddedUI.cs
@@ -0,0 +1,141 @@
1namespace WixToolset.Samples.EmbeddedUI
2{
3 using System;
4 using System.Collections.Generic;
5 using System.Configuration;
6 using System.Threading;
7 using System.Windows;
8 using System.Windows.Threading;
9 using WixToolset.Dtf.WindowsInstaller;
10 using Application = System.Windows.Application;
11
12 public class SampleEmbeddedUI : IEmbeddedUI
13 {
14 private bool isMaintenance;
15 private Thread appThread;
16 private Application app;
17 private SetupWizard setupWizard;
18 private ManualResetEvent installStartEvent;
19 private ManualResetEvent installExitEvent;
20
21 /// <summary>
22 /// Initializes the embedded UI.
23 /// </summary>
24 /// <param name="session">Handle to the installer which can be used to get and set properties.
25 /// The handle is only valid for the duration of this method call.</param>
26 /// <param name="resourcePath">Path to the directory that contains all the files from the MsiEmbeddedUI table.</param>
27 /// <param name="internalUILevel">On entry, contains the current UI level for the installation. After this
28 /// method returns, the installer resets the UI level to the returned value of this parameter.</param>
29 /// <returns>True if the embedded UI was successfully initialized; false if the installation
30 /// should continue without the embedded UI.</returns>
31 /// <exception cref="InstallCanceledException">The installation was canceled by the user.</exception>
32 /// <exception cref="InstallerException">The embedded UI failed to initialize and
33 /// causes the installation to fail.</exception>
34 public bool Initialize(Session session, string resourcePath, ref InstallUIOptions internalUILevel)
35 {
36 if (session != null)
37 {
38 if ((internalUILevel & InstallUIOptions.Full) != InstallUIOptions.Full)
39 {
40 // Don't show custom UI when the UI level is set to basic.
41 return false;
42
43 // An embedded UI could display an alternate dialog sequence for reduced or
44 // basic modes, but it's not implemented here. We'll just fall back to the
45 // built-in MSI basic UI.
46 }
47
48 if (String.Equals(session["REMOVE"], "All", StringComparison.OrdinalIgnoreCase))
49 {
50 // Don't show custom UI when uninstall was specified on the command line.
51 return false;
52 }
53
54 this.isMaintenance = session.EvaluateCondition("Installed");
55 }
56
57 // Start the setup wizard on a separate thread.
58 this.installStartEvent = new ManualResetEvent(false);
59 this.installExitEvent = new ManualResetEvent(false);
60 this.appThread = new Thread(this.Run);
61 this.appThread.SetApartmentState(ApartmentState.STA);
62 this.appThread.Start();
63
64 // Wait for the setup wizard to either kickoff the install or prematurely exit.
65 int waitResult = WaitHandle.WaitAny(new WaitHandle[] { this.installStartEvent, this.installExitEvent });
66 if (waitResult == 1)
67 {
68 // The setup wizard set the exit event instead of the start event. Cancel the installation.
69 throw new InstallCanceledException();
70 }
71 else
72 {
73 switch (this.setupWizard.Operation)
74 {
75 case SetupOperationType.Repair:
76 session["REINSTALL"] = "ALL";
77 break;
78 case SetupOperationType.Uninstall:
79 session["REMOVE"] = "ALL";
80 break;
81 }
82
83 // Start the installation with a silenced internal UI.
84 // This "embedded external UI" will handle message types except for source resolution.
85 internalUILevel = InstallUIOptions.NoChange | InstallUIOptions.SourceResolutionOnly;
86 return true;
87 }
88 }
89
90 /// <summary>
91 /// Processes information and progress messages sent to the user interface.
92 /// </summary>
93 /// <param name="messageType">Message type.</param>
94 /// <param name="messageRecord">Record that contains message data.</param>
95 /// <param name="buttons">Message box buttons.</param>
96 /// <param name="icon">Message box icon.</param>
97 /// <param name="defaultButton">Message box default button.</param>
98 /// <returns>Result of processing the message.</returns>
99 public MessageResult ProcessMessage(InstallMessage messageType, Record messageRecord,
100 MessageButtons buttons, MessageIcon icon, MessageDefaultButton defaultButton)
101 {
102 // Synchronously send the message to the setup wizard window on its thread.
103 object result = this.setupWizard.Dispatcher.Invoke(DispatcherPriority.Send,
104 new Func<MessageResult>(delegate()
105 {
106 return this.setupWizard.ProcessMessage(messageType, messageRecord, buttons, icon, defaultButton);
107 }));
108 return (MessageResult) result;
109 }
110
111 /// <summary>
112 /// Shuts down the embedded UI at the end of the installation.
113 /// </summary>
114 /// <remarks>
115 /// If the installation was canceled during initialization, this method will not be called.
116 /// If the installation was canceled or failed at any later point, this method will be called at the end.
117 /// </remarks>
118 public void Shutdown()
119 {
120 // Wait for the user to exit the setup wizard.
121 this.setupWizard.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
122 new Action(delegate()
123 {
124 this.setupWizard.EnableExit();
125 }));
126 this.appThread.Join();
127 }
128
129 /// <summary>
130 /// Creates the setup wizard and runs the application thread.
131 /// </summary>
132 private void Run()
133 {
134 this.app = new Application();
135 this.setupWizard = new SetupWizard(this.installStartEvent, this.isMaintenance);
136 this.setupWizard.InitializeComponent();
137 this.app.Run(this.setupWizard);
138 this.installExitEvent.Set();
139 }
140 }
141}
diff --git a/src/test/burn/TestData/WixIuiBaTests/EmbeddedUI/SetupWizard.xaml b/src/test/burn/TestData/WixIuiBaTests/EmbeddedUI/SetupWizard.xaml
new file mode 100644
index 00000000..97e406c2
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/EmbeddedUI/SetupWizard.xaml
@@ -0,0 +1,19 @@
1
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<Window x:Class="WixToolset.Samples.EmbeddedUI.SetupWizard"
6 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
7 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
8 Title="Sample Embedded UI" Height="400" Width="540" Visibility="Visible">
9 <Grid>
10 <TextBox Margin="8,8,8,63" Name="messagesTextBox" IsReadOnly="True" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Auto" FontFamily="Lucida Console" FontSize="10" />
11 <Button Height="23" HorizontalAlignment="Left" Name="repairButton" VerticalAlignment="Bottom" Width="75" Visibility="Hidden" Click="repairButton_Click" Margin="8,0,0,8">Repair</Button>
12 <Button Height="23" HorizontalAlignment="Left" Name="uninstallButton" VerticalAlignment="Bottom" Width="75" Visibility="Hidden" Click="uninstallButton_Click" Margin="91,0,0,8">Uninstall</Button>
13 <Button Height="23" HorizontalAlignment="Right" Name="installButton" VerticalAlignment="Bottom" Width="75" Click="installButton_Click" Margin="0,0,91,8">Install</Button>
14 <Button Height="23" HorizontalAlignment="Right" Name="exitButton" VerticalAlignment="Bottom" Width="75" Visibility="Hidden" Click="exitButton_Click" Margin="0,0,8,8">Exit</Button>
15 <Button Height="23" Margin="0,0,8,8" Name="cancelButton" VerticalAlignment="Bottom" Width="75" HorizontalAlignment="Right" Click="cancelButton_Click">Cancel</Button>
16 <ProgressBar Height="16" Margin="8,0,8,39" Name="progressBar" VerticalAlignment="Bottom" Visibility="Hidden" IsIndeterminate="False" />
17 <Label Height="28" HorizontalAlignment="Left" Margin="8,0,0,4.48" Name="progressLabel" VerticalAlignment="Bottom" Width="120" Visibility="Hidden">0%</Label>
18 </Grid>
19</Window>
diff --git a/src/test/burn/TestData/WixIuiBaTests/EmbeddedUI/SetupWizard.xaml.cs b/src/test/burn/TestData/WixIuiBaTests/EmbeddedUI/SetupWizard.xaml.cs
new file mode 100644
index 00000000..a4345481
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/EmbeddedUI/SetupWizard.xaml.cs
@@ -0,0 +1,154 @@
1namespace WixToolset.Samples.EmbeddedUI
2{
3 using System;
4 using System.Collections.Generic;
5 using System.Linq;
6 using System.Text;
7 using System.Threading;
8 using System.Windows;
9 using System.Windows.Controls;
10 using System.Windows.Data;
11 using System.Windows.Documents;
12 using System.Windows.Input;
13 using System.Windows.Media;
14 using System.Windows.Media.Imaging;
15 using System.Windows.Navigation;
16 using System.Windows.Shapes;
17 using WixToolset.Dtf.WindowsInstaller;
18
19 public enum SetupOperationType
20 {
21 Install,
22 Repair,
23 Uninstall
24 }
25
26 /// <summary>
27 /// Interaction logic for SetupWizard.xaml
28 /// </summary>
29 public partial class SetupWizard : Window
30 {
31 private bool isMaintenance;
32 private ManualResetEvent installStartEvent;
33 private InstallProgressCounter progressCounter;
34 private bool canceled;
35
36 public SetupOperationType Operation { get; private set; }
37
38 public SetupWizard(ManualResetEvent installStartEvent, bool isMaintenance)
39 {
40 this.installStartEvent = installStartEvent;
41 this.progressCounter = new InstallProgressCounter(0.5);
42 this.isMaintenance = isMaintenance;
43
44 this.Loaded += this.SetupWizard_Loaded;
45 }
46
47 private void SetupWizard_Loaded(object sender, RoutedEventArgs e)
48 {
49 this.Loaded -= this.SetupWizard_Loaded;
50
51 if (this.isMaintenance)
52 {
53 this.installButton.Visibility = Visibility.Hidden;
54 this.repairButton.Visibility = Visibility.Visible;
55 this.uninstallButton.Visibility = Visibility.Visible;
56 }
57 }
58
59 public MessageResult ProcessMessage(InstallMessage messageType, Record messageRecord,
60 MessageButtons buttons, MessageIcon icon, MessageDefaultButton defaultButton)
61 {
62 try
63 {
64 this.progressCounter.ProcessMessage(messageType, messageRecord);
65 this.progressBar.Value = this.progressBar.Minimum +
66 this.progressCounter.Progress * (this.progressBar.Maximum - this.progressBar.Minimum);
67 this.progressLabel.Content = "" + (int) Math.Round(100 * this.progressCounter.Progress) + "%";
68
69 switch (messageType)
70 {
71 case InstallMessage.Error:
72 case InstallMessage.Warning:
73 case InstallMessage.Info:
74 string message = String.Format("{0}: {1}", messageType, messageRecord);
75 this.LogMessage(message);
76 break;
77 }
78
79 if (this.canceled)
80 {
81 this.canceled = false;
82 return MessageResult.Cancel;
83 }
84 }
85 catch (Exception ex)
86 {
87 this.LogMessage(ex.ToString());
88 this.LogMessage(ex.StackTrace);
89 }
90
91 return MessageResult.OK;
92 }
93
94 private void LogMessage(string message)
95 {
96 this.messagesTextBox.Text += Environment.NewLine + message;
97 this.messagesTextBox.ScrollToEnd();
98 }
99
100 internal void EnableExit()
101 {
102 this.progressBar.Visibility = Visibility.Hidden;
103 this.progressLabel.Visibility = Visibility.Hidden;
104 this.cancelButton.Visibility = Visibility.Hidden;
105 this.exitButton.Visibility = Visibility.Visible;
106 }
107
108 private void installButton_Click(object sender, RoutedEventArgs e)
109 {
110 this.Operation = SetupOperationType.Install;
111 this.StartInstall();
112 }
113
114 private void repairButton_Click(object sender, RoutedEventArgs e)
115 {
116 this.Operation = SetupOperationType.Repair;
117 this.StartInstall();
118 }
119
120 private void uninstallButton_Click(object sender, RoutedEventArgs e)
121 {
122 this.Operation = SetupOperationType.Uninstall;
123 this.StartInstall();
124 }
125
126 private void StartInstall()
127 {
128 this.installButton.Visibility = Visibility.Hidden;
129 this.repairButton.Visibility = Visibility.Hidden;
130 this.uninstallButton.Visibility = Visibility.Hidden;
131 this.progressBar.Visibility = Visibility.Visible;
132 this.progressLabel.Visibility = Visibility.Visible;
133 this.installStartEvent.Set();
134 }
135
136 private void exitButton_Click(object sender, RoutedEventArgs e)
137 {
138 this.Close();
139 }
140
141 private void cancelButton_Click(object sender, RoutedEventArgs e)
142 {
143 if (this.installButton.Visibility == Visibility.Visible)
144 {
145 this.Close();
146 }
147 else
148 {
149 this.canceled = true;
150 this.cancelButton.IsEnabled = false;
151 }
152 }
153 }
154}
diff --git a/src/test/burn/TestData/WixIuiBaTests/EmbeddedUIBundle/Bundle.wxs b/src/test/burn/TestData/WixIuiBaTests/EmbeddedUIBundle/Bundle.wxs
new file mode 100644
index 00000000..195c159e
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/EmbeddedUIBundle/Bundle.wxs
@@ -0,0 +1,63 @@
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<?ifndef BundleLogDirectory?>
7<?define BundleLogDirectory = .?>
8<?endif?>
9
10<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
11 <!-- The only difference from the template should be the SplashScreen and uncompressed -->
12 <Bundle Name="~$(var.TestGroupName) - $(var.BundleName)" Version="$(var.Version)" UpgradeCode="$(var.UpgradeCode)" Compressed="no" SplashScreenSourceFile="..\..\Manual\BafThmutilTesting\theme\star_transparent.bmp">
13 <Log Prefix="$(var.BundleLogDirectory)\~$(var.TestGroupName)_$(var.BundleName)" />
14
15 <Variable Name="TestGroupName" Value="$(var.TestGroupName)" />
16
17 <?ifdef SoftwareTag?>
18 <SoftwareTag Regid="regid.1995-08.com.example" InstallPath="[CommonAppDataFolder]regid.1995-08.com.example" />
19 <?endif?>
20
21 <?ifndef BA?>
22 <!-- pulled in through the PackageGroupRef below -->
23 <?elseif $(var.BA) = "TestBAdnc"?>
24 <!-- pulled in through the PackageGroupRef below -->
25 <?elseif $(var.BA) = "TestBA_x64"?>
26 <!-- pulled in through the PackageGroupRef below -->
27 <?elseif $(var.BA) = "TestBAdnc_x64"?>
28 <!-- pulled in through the PackageGroupRef below -->
29 <?elseif $(var.BA) = "WixBA"?>
30 <!-- pulled in through the PackageGroupRef below -->
31 <?elseif $(var.BA) = "WixBAdnc_x64"?>
32 <!-- pulled in through the PackageGroupRef below -->
33 <?elseif $(var.BA) = "hyperlinkLicense"?>
34 <BootstrapperApplication>
35 <bal:WixStandardBootstrapperApplication LicenseUrl="" Theme="hyperlinkLicense" />
36 </BootstrapperApplication>
37 <?elseif $(var.BA) = "iui"?>
38 <BootstrapperApplication>
39 <bal:WixInternalUIBootstrapperApplication />
40 </BootstrapperApplication>
41 <?else?>
42 <BootstrapperApplicationRef Id="$(var.BA)" />
43 <?endif?>
44
45 <Chain>
46 <?ifndef BA?>
47 <PackageGroupRef Id="TestBA" />
48 <?elseif $(var.BA) = "TestBAdnc"?>
49 <PackageGroupRef Id="TestBAdnc" />
50 <?elseif $(var.BA) = "TestBA_x64"?>
51 <PackageGroupRef Id="TestBA_x64" />
52 <?elseif $(var.BA) = "TestBAdnc_x64"?>
53 <PackageGroupRef Id="TestBAdnc_x64" />
54 <?elseif $(var.BA) = "WixBA"?>
55 <PackageGroupRef Id="WixBA" />
56 <?elseif $(var.BA) = "WixBAdnc_x64"?>
57 <PackageGroupRef Id="WixBAdnc_x64" />
58 <?endif?>
59
60 <PackageGroupRef Id="BundlePackages" />
61 </Chain>
62 </Bundle>
63</Wix>
diff --git a/src/test/burn/TestData/WixIuiBaTests/EmbeddedUIBundle/EmbeddedUIBundle.wixproj b/src/test/burn/TestData/WixIuiBaTests/EmbeddedUIBundle/EmbeddedUIBundle.wixproj
new file mode 100644
index 00000000..7c856200
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/EmbeddedUIBundle/EmbeddedUIBundle.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>Bundle</OutputType>
5 <BA>iui</BA>
6 <UpgradeCode>{5115D6AC-A1FE-40C6-BEB3-BEBB39E61579}</UpgradeCode>
7 </PropertyGroup>
8 <ItemGroup>
9 <ProjectReference Include="..\EmbeddedUIPackage\EmbeddedUIPackage.wixproj" />
10 <ProjectReference Include="..\InternalUIPackage\InternalUIPackage.wixproj" />
11 </ItemGroup>
12 <ItemGroup>
13 <PackageReference Include="WixToolset.Bal.wixext" />
14 </ItemGroup>
15</Project> \ No newline at end of file
diff --git a/src/test/burn/TestData/WixIuiBaTests/EmbeddedUIBundle/EmbeddedUIBundle.wxs b/src/test/burn/TestData/WixIuiBaTests/EmbeddedUIBundle/EmbeddedUIBundle.wxs
new file mode 100644
index 00000000..6adda9de
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/EmbeddedUIBundle/EmbeddedUIBundle.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="InternalUIPackage" SourceFile="$(var.InternalUIPackage.TargetPath)" Permanent="yes" />
8 <MsiPackage Id="EmbeddedUIPackage" SourceFile="$(var.EmbeddedUIPackage.TargetPath)" />
9 </PackageGroup>
10 </Fragment>
11</Wix>
diff --git a/src/test/burn/TestData/WixIuiBaTests/EmbeddedUIPackage/EmbeddedUIPackage.wixproj b/src/test/burn/TestData/WixIuiBaTests/EmbeddedUIPackage/EmbeddedUIPackage.wixproj
new file mode 100644
index 00000000..0a62f38b
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/EmbeddedUIPackage/EmbeddedUIPackage.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 <PropertyGroup>
4 <ProductComponentsRef>true</ProductComponentsRef>
5 <UpgradeCode>{A6826B6D-2F3F-456D-BABF-1B8CDCE3AE68}</UpgradeCode>
6 </PropertyGroup>
7 <ItemGroup>
8 <Compile Include="..\..\Templates\Package.wxs" Link="Package.wxs" />
9 </ItemGroup>
10 <ItemGroup>
11 <ProjectReference Include="..\EmbeddedUI\EmbeddedUI.csproj" />
12 </ItemGroup>
13 <ItemGroup>
14 <PackageReference Include="WixToolset.UI.wixext" />
15 </ItemGroup>
16</Project> \ No newline at end of file
diff --git a/src/test/burn/TestData/WixIuiBaTests/EmbeddedUIPackage/EmbeddedUIPackage.wxs b/src/test/burn/TestData/WixIuiBaTests/EmbeddedUIPackage/EmbeddedUIPackage.wxs
new file mode 100644
index 00000000..e5d18c80
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/EmbeddedUIPackage/EmbeddedUIPackage.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" xmlns:ui="http://wixtoolset.org/schemas/v4/wxs/ui">
4 <Fragment>
5 <ComponentGroup Id="ProductComponents" />
6
7 <ui:WixUI Id="WixUI_Minimal" />
8
9 <UI>
10 <EmbeddedUI SourceFile="$(var.EmbeddedUI.TargetDir)$(var.EmbeddedUI.TargetName).CA.dll" />
11 </UI>
12 </Fragment>
13</Wix>
diff --git a/src/test/burn/TestData/WixIuiBaTests/InternalUIBundle/Bundle.wxs b/src/test/burn/TestData/WixIuiBaTests/InternalUIBundle/Bundle.wxs
new file mode 100644
index 00000000..195c159e
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/InternalUIBundle/Bundle.wxs
@@ -0,0 +1,63 @@
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<?ifndef BundleLogDirectory?>
7<?define BundleLogDirectory = .?>
8<?endif?>
9
10<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
11 <!-- The only difference from the template should be the SplashScreen and uncompressed -->
12 <Bundle Name="~$(var.TestGroupName) - $(var.BundleName)" Version="$(var.Version)" UpgradeCode="$(var.UpgradeCode)" Compressed="no" SplashScreenSourceFile="..\..\Manual\BafThmutilTesting\theme\star_transparent.bmp">
13 <Log Prefix="$(var.BundleLogDirectory)\~$(var.TestGroupName)_$(var.BundleName)" />
14
15 <Variable Name="TestGroupName" Value="$(var.TestGroupName)" />
16
17 <?ifdef SoftwareTag?>
18 <SoftwareTag Regid="regid.1995-08.com.example" InstallPath="[CommonAppDataFolder]regid.1995-08.com.example" />
19 <?endif?>
20
21 <?ifndef BA?>
22 <!-- pulled in through the PackageGroupRef below -->
23 <?elseif $(var.BA) = "TestBAdnc"?>
24 <!-- pulled in through the PackageGroupRef below -->
25 <?elseif $(var.BA) = "TestBA_x64"?>
26 <!-- pulled in through the PackageGroupRef below -->
27 <?elseif $(var.BA) = "TestBAdnc_x64"?>
28 <!-- pulled in through the PackageGroupRef below -->
29 <?elseif $(var.BA) = "WixBA"?>
30 <!-- pulled in through the PackageGroupRef below -->
31 <?elseif $(var.BA) = "WixBAdnc_x64"?>
32 <!-- pulled in through the PackageGroupRef below -->
33 <?elseif $(var.BA) = "hyperlinkLicense"?>
34 <BootstrapperApplication>
35 <bal:WixStandardBootstrapperApplication LicenseUrl="" Theme="hyperlinkLicense" />
36 </BootstrapperApplication>
37 <?elseif $(var.BA) = "iui"?>
38 <BootstrapperApplication>
39 <bal:WixInternalUIBootstrapperApplication />
40 </BootstrapperApplication>
41 <?else?>
42 <BootstrapperApplicationRef Id="$(var.BA)" />
43 <?endif?>
44
45 <Chain>
46 <?ifndef BA?>
47 <PackageGroupRef Id="TestBA" />
48 <?elseif $(var.BA) = "TestBAdnc"?>
49 <PackageGroupRef Id="TestBAdnc" />
50 <?elseif $(var.BA) = "TestBA_x64"?>
51 <PackageGroupRef Id="TestBA_x64" />
52 <?elseif $(var.BA) = "TestBAdnc_x64"?>
53 <PackageGroupRef Id="TestBAdnc_x64" />
54 <?elseif $(var.BA) = "WixBA"?>
55 <PackageGroupRef Id="WixBA" />
56 <?elseif $(var.BA) = "WixBAdnc_x64"?>
57 <PackageGroupRef Id="WixBAdnc_x64" />
58 <?endif?>
59
60 <PackageGroupRef Id="BundlePackages" />
61 </Chain>
62 </Bundle>
63</Wix>
diff --git a/src/test/burn/TestData/WixIuiBaTests/InternalUIBundle/InternalUIBundle.wixproj b/src/test/burn/TestData/WixIuiBaTests/InternalUIBundle/InternalUIBundle.wixproj
new file mode 100644
index 00000000..193d0ca6
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/InternalUIBundle/InternalUIBundle.wixproj
@@ -0,0 +1,14 @@
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 <BA>iui</BA>
6 <UpgradeCode>{62CB2BAE-129D-41D1-928B-5353FC542130}</UpgradeCode>
7 </PropertyGroup>
8 <ItemGroup>
9 <ProjectReference Include="..\InternalUIPackage\InternalUIPackage.wixproj" />
10 </ItemGroup>
11 <ItemGroup>
12 <PackageReference Include="WixToolset.Bal.wixext" />
13 </ItemGroup>
14</Project> \ No newline at end of file
diff --git a/src/test/burn/TestData/WixIuiBaTests/InternalUIBundle/InternalUIBundle.wxs b/src/test/burn/TestData/WixIuiBaTests/InternalUIBundle/InternalUIBundle.wxs
new file mode 100644
index 00000000..332f0b08
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/InternalUIBundle/InternalUIBundle.wxs
@@ -0,0 +1,10 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <PackageGroup Id="BundlePackages">
7 <MsiPackage Id="InternalUIPackage" SourceFile="$(var.InternalUIPackage.TargetPath)" />
8 </PackageGroup>
9 </Fragment>
10</Wix>
diff --git a/src/test/burn/TestData/WixIuiBaTests/InternalUIPackage/InternalUIPackage.wixproj b/src/test/burn/TestData/WixIuiBaTests/InternalUIPackage/InternalUIPackage.wixproj
new file mode 100644
index 00000000..2744d4b3
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/InternalUIPackage/InternalUIPackage.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 <PropertyGroup>
4 <ProductComponentsRef>true</ProductComponentsRef>
5 <UpgradeCode>{7A0FE267-9EAE-4780-B41E-60C9E7044F53}</UpgradeCode>
6 </PropertyGroup>
7 <ItemGroup>
8 <Compile Include="..\..\Templates\Package.wxs" Link="Package.wxs" />
9 </ItemGroup>
10 <ItemGroup>
11 <ProjectReference Include="..\ManagedCA\ManagedCA.csproj" />
12 </ItemGroup>
13 <ItemGroup>
14 <PackageReference Include="WixToolset.UI.wixext" />
15 </ItemGroup>
16</Project> \ No newline at end of file
diff --git a/src/test/burn/TestData/WixIuiBaTests/InternalUIPackage/InternalUIPackage.wxs b/src/test/burn/TestData/WixIuiBaTests/InternalUIPackage/InternalUIPackage.wxs
new file mode 100644
index 00000000..d5f30729
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/InternalUIPackage/InternalUIPackage.wxs
@@ -0,0 +1,24 @@
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:ui="http://wixtoolset.org/schemas/v4/wxs/ui">
4 <Fragment>
5 <ComponentGroup Id="ProductComponents" />
6
7 <ui:WixUI Id="WixUI_Minimal" />
8
9 <Binary Id="TestData" SourceFile="$(var.ManagedCA.TargetDir)testsub\testfile.txt" />
10 <Binary Id="ManagedCA" SourceFile="$(var.ManagedCA.TargetDir)$(var.ManagedCA.TargetName).CA.dll" />
11 <CustomAction Id="SampleCA1" BinaryRef="ManagedCA" DllEntry="SampleCA1" Execute="firstSequence" />
12 <CustomAction Id="SampleCustomAction2" BinaryRef="ManagedCA" DllEntry="SampleCA2" Execute="firstSequence" Return="ignore" />
13
14 <InstallUISequence>
15 <Custom Action="SampleCA1" After="CostFinalize" Condition="NOT Installed" />
16 <Custom Action="SampleCustomAction2" After="SampleCA1" Condition="NOT Installed" />
17 </InstallUISequence>
18
19 <InstallExecuteSequence>
20 <Custom Action="SampleCA1" After="CostFinalize" Condition="NOT Installed" />
21 <Custom Action="SampleCustomAction2" After="SampleCA1" Condition="NOT Installed" />
22 </InstallExecuteSequence>
23 </Fragment>
24</Wix>
diff --git a/src/test/burn/TestData/WixIuiBaTests/InternalUIarm64Package/InternalUIarm64Package.wixproj b/src/test/burn/TestData/WixIuiBaTests/InternalUIarm64Package/InternalUIarm64Package.wixproj
new file mode 100644
index 00000000..e7d5b484
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/InternalUIarm64Package/InternalUIarm64Package.wixproj
@@ -0,0 +1,14 @@
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 <InstallerPlatform>arm64</InstallerPlatform>
5 <ProductComponentsRef>true</ProductComponentsRef>
6 <UpgradeCode>{357EBF93-039C-4378-8BCB-8B53F9B9F69A}</UpgradeCode>
7 </PropertyGroup>
8 <ItemGroup>
9 <Compile Include="..\..\Templates\Package.wxs" Link="Package.wxs" />
10 </ItemGroup>
11 <ItemGroup>
12 <PackageReference Include="WixToolset.UI.wixext" />
13 </ItemGroup>
14</Project> \ No newline at end of file
diff --git a/src/test/burn/TestData/WixIuiBaTests/InternalUIarm64Package/InternalUIarm64Package.wxs b/src/test/burn/TestData/WixIuiBaTests/InternalUIarm64Package/InternalUIarm64Package.wxs
new file mode 100644
index 00000000..c30cf607
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/InternalUIarm64Package/InternalUIarm64Package.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
3<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:ui="http://wixtoolset.org/schemas/v4/wxs/ui">
4 <Fragment>
5 <ComponentGroup Id="ProductComponents" />
6
7 <ui:WixUI Id="WixUI_Minimal" />
8 </Fragment>
9</Wix>
diff --git a/src/test/burn/TestData/WixIuiBaTests/InternalUIx64Package/InternalUIx64Package.wixproj b/src/test/burn/TestData/WixIuiBaTests/InternalUIx64Package/InternalUIx64Package.wixproj
new file mode 100644
index 00000000..ff646914
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/InternalUIx64Package/InternalUIx64Package.wixproj
@@ -0,0 +1,14 @@
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 <InstallerPlatform>x64</InstallerPlatform>
5 <ProductComponentsRef>true</ProductComponentsRef>
6 <UpgradeCode>{2EBACF8F-BECD-401C-94F2-CFA2C9C3C07F}</UpgradeCode>
7 </PropertyGroup>
8 <ItemGroup>
9 <Compile Include="..\..\Templates\Package.wxs" Link="Package.wxs" />
10 </ItemGroup>
11 <ItemGroup>
12 <PackageReference Include="WixToolset.UI.wixext" />
13 </ItemGroup>
14</Project> \ No newline at end of file
diff --git a/src/test/burn/TestData/WixIuiBaTests/InternalUIx64Package/InternalUIx64Package.wxs b/src/test/burn/TestData/WixIuiBaTests/InternalUIx64Package/InternalUIx64Package.wxs
new file mode 100644
index 00000000..c30cf607
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/InternalUIx64Package/InternalUIx64Package.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
3<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:ui="http://wixtoolset.org/schemas/v4/wxs/ui">
4 <Fragment>
5 <ComponentGroup Id="ProductComponents" />
6
7 <ui:WixUI Id="WixUI_Minimal" />
8 </Fragment>
9</Wix>
diff --git a/src/test/burn/TestData/WixIuiBaTests/InternalUIx86Package/InternalUIx86Package.wixproj b/src/test/burn/TestData/WixIuiBaTests/InternalUIx86Package/InternalUIx86Package.wixproj
new file mode 100644
index 00000000..4107ab44
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/InternalUIx86Package/InternalUIx86Package.wixproj
@@ -0,0 +1,14 @@
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 <InstallerPlatform>x64</InstallerPlatform>
5 <ProductComponentsRef>true</ProductComponentsRef>
6 <UpgradeCode>{1FA46DA0-5F83-459A-8A30-3E5A54D20A4D}</UpgradeCode>
7 </PropertyGroup>
8 <ItemGroup>
9 <Compile Include="..\..\Templates\Package.wxs" Link="Package.wxs" />
10 </ItemGroup>
11 <ItemGroup>
12 <PackageReference Include="WixToolset.UI.wixext" />
13 </ItemGroup>
14</Project> \ No newline at end of file
diff --git a/src/test/burn/TestData/WixIuiBaTests/InternalUIx86Package/InternalUIx86Package.wxs b/src/test/burn/TestData/WixIuiBaTests/InternalUIx86Package/InternalUIx86Package.wxs
new file mode 100644
index 00000000..c30cf607
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/InternalUIx86Package/InternalUIx86Package.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
3<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:ui="http://wixtoolset.org/schemas/v4/wxs/ui">
4 <Fragment>
5 <ComponentGroup Id="ProductComponents" />
6
7 <ui:WixUI Id="WixUI_Minimal" />
8 </Fragment>
9</Wix>
diff --git a/src/test/burn/TestData/WixIuiBaTests/ManagedCA/CustomAction.config b/src/test/burn/TestData/WixIuiBaTests/ManagedCA/CustomAction.config
new file mode 100644
index 00000000..700aff6f
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/ManagedCA/CustomAction.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 useLegacyV2RuntimeActivationPolicy="true">
7 <supportedRuntime version="v4.0" />
8 <supportedRuntime version="v2.0.50727" />
9 </startup>
10</configuration>
diff --git a/src/test/burn/TestData/WixIuiBaTests/ManagedCA/ManagedCA.csproj b/src/test/burn/TestData/WixIuiBaTests/ManagedCA/ManagedCA.csproj
new file mode 100644
index 00000000..866b7575
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/ManagedCA/ManagedCA.csproj
@@ -0,0 +1,16 @@
1<Project Sdk="Microsoft.NET.Sdk">
2 <PropertyGroup>
3 <TargetFramework>net20</TargetFramework>
4 <Description>Sample managed custom actions</Description>
5 </PropertyGroup>
6
7 <ItemGroup>
8 <Content Include="CustomAction.config" CopyToOutputDirectory="PreserveNewest" />
9 <None Include="testsub\testfile.txt" CopyToOutputDirectory="PreserveNewest" />
10 <CustomActionContents Include="testsub\SampleCAs.cs=$(OutputDirectory)testsub\testfile.txt" />
11 </ItemGroup>
12
13 <ItemGroup>
14 <PackageReference Include="WixToolset.Dtf.CustomAction" />
15 </ItemGroup>
16</Project>
diff --git a/src/test/burn/TestData/WixIuiBaTests/ManagedCA/SampleCA.cs b/src/test/burn/TestData/WixIuiBaTests/ManagedCA/SampleCA.cs
new file mode 100644
index 00000000..fc9f30fe
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/ManagedCA/SampleCA.cs
@@ -0,0 +1,125 @@
1namespace WixToolset.Samples
2{
3 using System;
4 using System.Collections.Generic;
5 using System.IO;
6 using WixToolset.Dtf.WindowsInstaller;
7
8 public class SampleCA
9 {
10 [CustomAction]
11 public static ActionResult SampleCA1(Session session)
12 {
13 using (Record msgRec = new Record(0))
14 {
15 msgRec[0] = "Hello from SampleCA1!" +
16 "\r\nCLR version is v" + Environment.Version;
17 session.Message(InstallMessage.Info, msgRec);
18 session.Message(InstallMessage.User, msgRec);
19 }
20
21 session.Log("Testing summary info...");
22 SummaryInfo summInfo = session.Database.SummaryInfo;
23 session.Log("MSI PackageCode = {0}", summInfo.RevisionNumber);
24 session.Log("MSI ModifyDate = {0}", summInfo.LastSaveTime);
25
26 string testProp = session["SampleCATest"];
27 session.Log("Simple property test: [SampleCATest]={0}.", testProp);
28
29 session.Log("Testing subdirectory extraction...");
30 string testFilePath = "testsub\\SampleCAs.cs";
31 if (!File.Exists(testFilePath))
32 {
33 session.Log("Subdirectory extraction failed. File not found: " + testFilePath);
34 return ActionResult.Failure;
35 }
36 else
37 {
38 session.Log("Found file extracted in subdirectory.");
39 }
40
41 session.Log("Testing record stream extraction...");
42 string tempFile = null;
43 try
44 {
45 tempFile = Path.GetTempFileName();
46 using (View binView = session.Database.OpenView(
47 "SELECT `Binary`.`Data` FROM `Binary`, `CustomAction` " +
48 "WHERE `CustomAction`.`Target` = 'SampleCA1' AND " +
49 "`CustomAction`.`Source` = `Binary`.`Name`"))
50 {
51 binView.Execute();
52 using (Record binRec = binView.Fetch())
53 {
54 binRec.GetStream(1, tempFile);
55 }
56 }
57
58 session.Log("CA binary file size: {0}", new FileInfo(tempFile).Length);
59 string binFileVersion = Installer.GetFileVersion(tempFile);
60 session.Log("CA binary file version: {0}", binFileVersion);
61 }
62 finally
63 {
64 if (tempFile != null && File.Exists(tempFile))
65 {
66 File.Delete(tempFile);
67 }
68 }
69
70 session.Log("Testing record stream reading...");
71 using (View binView2 = session.Database.OpenView("SELECT `Data` FROM `Binary` WHERE `Name` = 'TestData'"))
72 {
73 binView2.Execute();
74 using (Record binRec2 = binView2.Fetch())
75 {
76 Stream stream = binRec2.GetStream("Data");
77 string testData = new StreamReader(stream, System.Text.Encoding.UTF8).ReadToEnd();
78 session.Log("Test data: " + testData);
79 }
80 }
81
82 session.Log("Listing components");
83 using (View compView = session.Database.OpenView(
84 "SELECT `Component` FROM `Component`"))
85 {
86 compView.Execute();
87 foreach (Record compRec in compView)
88 {
89 using (compRec)
90 {
91 session.Log("\t{0}", compRec["Component"]);
92 }
93 }
94 }
95
96 session.Log("Testing the ability to access an external MSI database...");
97 string tempDbFile = Path.GetTempFileName();
98 using (Database tempDb = new Database(tempDbFile, DatabaseOpenMode.CreateDirect))
99 {
100 // Just create an empty database.
101 }
102 using (Database tempDb2 = new Database(tempDbFile))
103 {
104 // See if we can open and query the database.
105 IList<string> tables = tempDb2.ExecuteStringQuery("SELECT `Name` FROM `_Tables`");
106 session.Log("Found " + tables.Count + " tables in the newly created database.");
107 }
108 File.Delete(tempDbFile);
109
110 return ActionResult.Success;
111 }
112
113 [CustomAction("SampleCA2")]
114 public static ActionResult SampleCustomAction2(Session session)
115 {
116 using (Record msgRec = new Record(0))
117 {
118 msgRec[0] = "Hello from SampleCA2!";
119 session.Message(InstallMessage.Info, msgRec);
120 session.Message(InstallMessage.User, msgRec);
121 }
122 return ActionResult.UserExit;
123 }
124 }
125}
diff --git a/src/test/burn/TestData/WixIuiBaTests/ManagedCA/testsub/testfile.txt b/src/test/burn/TestData/WixIuiBaTests/ManagedCA/testsub/testfile.txt
new file mode 100644
index 00000000..8056aefd
--- /dev/null
+++ b/src/test/burn/TestData/WixIuiBaTests/ManagedCA/testsub/testfile.txt
@@ -0,0 +1 @@
test file for testing subdirectory support and binary stream reading
diff --git a/src/test/burn/WixTestTools/PackageVerifier.cs b/src/test/burn/WixTestTools/PackageVerifier.cs
index fd8378e0..4545b9ec 100644
--- a/src/test/burn/WixTestTools/PackageVerifier.cs
+++ b/src/test/burn/WixTestTools/PackageVerifier.cs
@@ -63,17 +63,27 @@ namespace WixTestTools
63 return row.Value; 63 return row.Value;
64 } 64 }
65 65
66 public void VerifyInstalled(bool installed) 66 public bool IsInstalled()
67 { 67 {
68 var productCode = this.GetProperty("ProductCode"); 68 var productCode = this.GetProperty("ProductCode");
69 Assert.Equal(installed, MsiUtilities.IsProductInstalled(productCode)); 69 return MsiUtilities.IsProductInstalled(productCode);
70 } 70 }
71 71
72 public void VerifyInstalledWithVersion(bool installed) 72 public bool IsInstalledWithVersion()
73 { 73 {
74 var productCode = this.GetProperty("ProductCode"); 74 var productCode = this.GetProperty("ProductCode");
75 Version prodVersion = new Version(this.GetProperty("ProductVersion")); 75 Version prodVersion = new Version(this.GetProperty("ProductVersion"));
76 Assert.Equal(installed, MsiUtilities.IsProductInstalledWithVersion(productCode, prodVersion)); 76 return MsiUtilities.IsProductInstalledWithVersion(productCode, prodVersion);
77 }
78
79 public void VerifyInstalled(bool installed)
80 {
81 Assert.Equal(installed, this.IsInstalled());
82 }
83
84 public void VerifyInstalledWithVersion(bool installed)
85 {
86 Assert.Equal(installed, this.IsInstalledWithVersion());
77 } 87 }
78 88
79 public void DeleteTestRegistryValue(string name) 89 public void DeleteTestRegistryValue(string name)
diff --git a/src/test/burn/WixToolsetTest.BurnE2E/WixIuiBaTests.cs b/src/test/burn/WixToolsetTest.BurnE2E/WixIuiBaTests.cs
new file mode 100644
index 00000000..18dd41db
--- /dev/null
+++ b/src/test/burn/WixToolsetTest.BurnE2E/WixIuiBaTests.cs
@@ -0,0 +1,144 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolsetTest.BurnE2E
4{
5 using WixTestTools;
6 using Xunit;
7 using Xunit.Abstractions;
8
9 public class WixIuiBaTests : BurnE2ETests
10 {
11 public WixIuiBaTests(ITestOutputHelper testOutputHelper) : base(testOutputHelper) { }
12
13 [RuntimeFact]
14 public void CanInstallArchitectureSpecificPrimaryPackage()
15 {
16 var defaultPackage = this.CreatePackageInstaller("InternalUIPackage");
17 var x86Package = this.CreatePackageInstaller("InternalUIx86Package");
18 var x64Package = this.CreatePackageInstaller("InternalUIx64Package");
19 var arm64Package = this.CreatePackageInstaller("InternalUIarm64Package");
20 var bundle = this.CreateBundleInstaller("ArchSpecificBundle");
21
22 defaultPackage.VerifyInstalled(false);
23 x86Package.VerifyInstalled(false);
24 x64Package.VerifyInstalled(false);
25 arm64Package.VerifyInstalled(false);
26 bundle.VerifyUnregisteredAndRemovedFromPackageCache();
27
28 bundle.Install();
29 bundle.VerifyRegisteredAndInPackageCache();
30 defaultPackage.VerifyInstalled(false);
31
32 var archSpecificInstalls = 0;
33 if (x86Package.IsInstalled())
34 {
35 ++archSpecificInstalls;
36 }
37
38 if (x64Package.IsInstalled())
39 {
40 ++archSpecificInstalls;
41 }
42
43 if (arm64Package.IsInstalled())
44 {
45 ++archSpecificInstalls;
46 }
47
48 Assert.Equal(1, archSpecificInstalls);
49
50 bundle.Uninstall();
51 bundle.VerifyUnregisteredAndRemovedFromPackageCache();
52 defaultPackage.VerifyInstalled(false);
53 x86Package.VerifyInstalled(false);
54 x64Package.VerifyInstalled(false);
55 arm64Package.VerifyInstalled(false);
56 }
57
58 [RuntimeFact]
59 public void CanSilentlyInstallAndUninstallEmbeddedUIBundle()
60 {
61 var prereqPackage = this.CreatePackageInstaller("InternalUIPackage");
62 var package = this.CreatePackageInstaller("EmbeddedUIPackage");
63 var bundle = this.CreateBundleInstaller("EmbeddedUIBundle");
64
65 prereqPackage.VerifyInstalled(false);
66 package.VerifyInstalled(false);
67 bundle.VerifyUnregisteredAndRemovedFromPackageCache();
68
69 bundle.Install();
70 bundle.VerifyRegisteredAndInPackageCache();
71 prereqPackage.VerifyInstalled(true);
72 package.VerifyInstalled(true);
73
74 bundle.Uninstall();
75 bundle.VerifyUnregisteredAndRemovedFromPackageCache();
76 prereqPackage.VerifyInstalled(true);
77 package.VerifyInstalled(false);
78 }
79
80 [RuntimeFact]
81 public void CanSilentlyInstallAndUninstallInternalUIBundle()
82 {
83 var package = this.CreatePackageInstaller("InternalUIPackage");
84 var bundle = this.CreateBundleInstaller("InternalUIBundle");
85
86 package.VerifyInstalled(false);
87 bundle.VerifyUnregisteredAndRemovedFromPackageCache();
88
89 bundle.Install();
90 bundle.VerifyRegisteredAndInPackageCache();
91 package.VerifyInstalled(true);
92
93 bundle.Uninstall();
94 bundle.VerifyUnregisteredAndRemovedFromPackageCache();
95 package.VerifyInstalled(false);
96 }
97
98 // Manual test for EmbeddedUIBundle:
99 // 1. Double click EmbeddedUIBundle.exe.
100 // 2. Verify that the prereq BA came up and click the install button (allow elevation).
101 // 3. Verify that the prereq BA automatically closed after installing the prereq.
102 // 4. Verify that the MSI UI came up and click the install button.
103 // 5. After it's finished, click the exit button.
104 // 6. Verify that no other UI is shown and that everything was installed.
105 // 7. Double click EmbeddedUIBundle.exe (allow elevation).
106 // 8. Verify that the prereq BA did not come up.
107 // 9. Verify that the MSI UI came up and click the uninstall button.
108 // 10. After it's finished, click the exit button.
109 // 11. Verify that no other UI is shown and that everything was uninstalled except for the prereq which was permanent.
110 // 12. Uninstall InternalUIPackage to make sure the machine is clean for other tests.
111
112 // Alternate EmbeddedUIBundle test - manually install InternalUIPackage first and verify that the prereq BA doesn't come up during install either.
113
114 // Manual test for InternalUIBundle:
115 // 1. Double click InternalUIBundle.exe on a machine that will prompt for elevation.
116 // 2. Verify that the splash screen appeared but the prereq BA did not come up.
117 // 3. Verify that the elevation prompt came up immediately instead of flashing on the taskbar. (This is currently broken)
118 // 4. Allow elevation.
119 // 5. Verify that the MSI UI came up and the splash screen disappeared.
120 // 6. Accept the two CA messages and click the install button.
121 // 7. After it's finished, click the exit button.
122 // 8. Verify that no other UI is shown and that everything was installed.
123 // 9. Double click InternalUIBundle.exe (allow elevation).
124 // 10. Verify that the prereq BA did not come up.
125 // 11. Verify that the MSI UI came up and click the uninstall button.
126 // 12. After it's finished, click the exit button.
127 // 13. Verify that no other UI is shown and that everything was uninstalled to make sure the machine is clean for other tests.
128
129 // Manual test for Help:
130 // 1. Run EmbeddedUIBundle.exe /help from the command line.
131 // 2. Verify that the prereq BA shows the help information without trying to install the prereqs.
132
133 // Manual test for Layout:
134 // 1. Run EmbeddedUIBundle.exe /layout from an unelevated command line on a machine that will prompt for elevation.
135 // 2. Verify that the prereq BA performs the layout without requiring any input from the user.
136 // 3. Verify that it never prompted for elevation.
137 // 4. Click the exit button.
138
139 // Manual test for Caching error:
140 // 1. Copy InternalUIBundle.exe to a separate folder so that it can't find InternalUIPackage.msi.
141 // 2. Attempt to install InternalUIBundle.exe (allow elevation).
142 // 3. Verify that the prereq BA comes up with the Failure page saying that a file couldn't be found.
143 }
144}