@joebigelow / wix / commits / 2cbe8383

Add test for 5GB external payload.

Sean Hall committed May 1, 2021 at 23:58 UTC 2cbe83832cc76aa379b29665de5523e82c543acf
7 files changed +401 -298
.gitignore
+2
@@ -3,6 +3,8 @@
3 ##
4 ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
5
6 +src/TestData/CacheTests/BundleC/fivegb.file
7 +
8 # User-specific files
9 *.rsuser
10 *.suo
src/TestData/CacheTests/BundleC/BundleC.wixproj new
+26
@@ -0,0 +1,26 @@
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>{997BDF9A-2540-42DB-8F86-296BA243194B}</UpgradeCode>
6 + </PropertyGroup>
7 + <ItemGroup>
8 + <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
9 + </ItemGroup>
10 + <ItemGroup>
11 + <ProjectReference Include="..\PackageA\PackageA.wixproj" />
12 + <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
13 + </ItemGroup>
14 + <ItemGroup>
15 + <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.101" />
16 + <PackageReference Include="WixToolset.NetFx.wixext" Version="4.0.73" />
17 + </ItemGroup>
18 + <!-- We do this dynamically to avoid committing such a large file to source control. -->
19 + <Target Name="CreateLargeFile" AfterTargets="BeforeBuild" Inputs="$(MSBuildProjectFullPath)" Outputs="$(MSBuildProjectDirectory)\fivegb.file">
20 + <Exec Command='"$(BaseOutputPath)$(Configuration)\netcoreapp3.1\win-x86\testexe.exe" /lf "fivegb.file|5368709120' WorkingDirectory="$(MSBuildProjectDirectory)" />
21 + </Target>
22 + <!-- We do this to avoid copying such a large file to the VM to run the tests. -->
23 + <Target Name="DeleteLargeFile" AfterTargets="AfterBuild">
24 + <Delete Files="$(OutputPath)fivegb.file" />
25 + </Target>
26 +</Project>
\ No newline at end of file
src/TestData/CacheTests/BundleC/BundleC.wxs new
+12
@@ -0,0 +1,12 @@
1 +<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2 +
3 +
4 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 + <Fragment>
6 + <PackageGroup Id="BundlePackages">
7 + <MsiPackage Id="PackageA" SourceFile="$(var.PackageA.TargetPath)">
8 + <Payload SourceFile="fivegb.file" Compressed="no" />
9 + </MsiPackage>
10 + </PackageGroup>
11 + </Fragment>
12 +</Wix>
src/TestExe/NetfxTask.cs new
+295
@@ -0,0 +1,295 @@
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 +#if NET35
4 +using System;
5 +using System.Collections.Generic;
6 +using System.Diagnostics;
7 +using System.IO;
8 +using System.Management;
9 +using Microsoft.Win32;
10 +
11 +namespace TestExe
12 +{
13 + public class ProcessInfoTask : Task
14 + {
15 + public ProcessInfoTask(string Data) : base(Data) { }
16 +
17 + public override void RunTask()
18 + {
19 + try
20 + {
21 + string processInfoXml = "";
22 +
23 + // Get information about the process and who is running it
24 + Process thisProc = Process.GetCurrentProcess();
25 + string username = thisProc.StartInfo.EnvironmentVariables["username"].ToString();
26 +
27 + int parentProcId = GetParentProcess(thisProc.Id);
28 + Process parentProc = Process.GetProcessById(parentProcId);
29 + string parentUsername = parentProc.StartInfo.EnvironmentVariables["username"].ToString();
30 +
31 + int grandparentProcId = GetParentProcess(parentProc.Id);
32 + Process grandparentProc = Process.GetProcessById(grandparentProcId);
33 + string grandparentUsername = grandparentProc.StartInfo.EnvironmentVariables["username"].ToString();
34 +
35 + processInfoXml += "<ProcessInfo>";
36 + processInfoXml += " <ProcessName>" + thisProc.ProcessName + "</ProcessName>";
37 + processInfoXml += " <Id>" + thisProc.Id.ToString() + "</Id>";
38 + processInfoXml += " <SessionId>" + thisProc.SessionId.ToString() + "</SessionId>";
39 + processInfoXml += " <MachineName>" + thisProc.MachineName + "</MachineName>";
40 + // this stuff isn't set since we didn't start the process and tell it what to use. So don't bother
41 + //processInfoXml += " <StartInfo>";
42 + //processInfoXml += " <FileName>" + thisProc.StartInfo.FileName + "</FileName>";
43 + //processInfoXml += " <UserName>" + thisProc.StartInfo.UserName + "</UserName>";
44 + //processInfoXml += " <WorkingDirectory>" + thisProc.StartInfo.WorkingDirectory + "</WorkingDirectory>";
45 + //processInfoXml += " <Arguments>" + thisProc.StartInfo.Arguments + "</Arguments>";
46 + //processInfoXml += " </StartInfo>";
47 + processInfoXml += " <StartTime>" + thisProc.StartTime.ToString() + "</StartTime>";
48 + processInfoXml += " <Username>" + username + "</Username>";
49 + processInfoXml += " <ParentProcess>";
50 + processInfoXml += " <ProcessName>" + parentProc.ProcessName + "</ProcessName>";
51 + processInfoXml += " <Id>" + parentProc.Id.ToString() + "</Id>";
52 + processInfoXml += " <StartTime>" + parentProc.StartTime.ToString() + "</StartTime>";
53 + processInfoXml += " <Username>" + parentUsername + "</Username>";
54 + processInfoXml += " </ParentProcess>";
55 + processInfoXml += " <GrandparentProcess>";
56 + processInfoXml += " <ProcessName>" + grandparentProc.ProcessName + "</ProcessName>";
57 + processInfoXml += " <Id>" + grandparentProc.Id.ToString() + "</Id>";
58 + processInfoXml += " <StartTime>" + grandparentProc.StartTime.ToString() + "</StartTime>";
59 + processInfoXml += " <Username>" + grandparentUsername + "</Username>";
60 + processInfoXml += " </GrandparentProcess>";
61 + processInfoXml += "</ProcessInfo>";
62 +
63 + string logFile = System.Environment.ExpandEnvironmentVariables(this.data);
64 + Console.WriteLine("Creating Process Info data file: " + logFile);
65 + StreamWriter textFile = File.CreateText(logFile);
66 + textFile.WriteLine(processInfoXml);
67 + textFile.Close();
68 + }
69 + catch (Exception eX)
70 + {
71 + Console.WriteLine("Creating Process Info data file failed");
72 + Console.WriteLine(eX.Message);
73 + }
74 +
75 +
76 + }
77 +
78 + private static int GetParentProcess(int Id)
79 + {
80 + int parentPid = 0;
81 + using (ManagementObject mo = new ManagementObject("win32_process.handle='" + Id.ToString() + "'"))
82 + {
83 + mo.Get();
84 + parentPid = Convert.ToInt32(mo["ParentProcessId"]);
85 + }
86 + return parentPid;
87 + }
88 + }
89 +
90 + /// <summary>
91 + /// Task class that will create a registry key and write a name and value in it
92 + /// </summary>
93 + public class RegistryWriterTask : Task
94 + {
95 + private string hive;
96 + private string keyPath;
97 + private string[] keyPathArray;
98 + private string name;
99 + private RegistryValueKind regValueKind;
100 + private object value;
101 +
102 + public RegistryWriterTask(string Data) : base(Data) { }
103 +
104 + public override void RunTask()
105 + {
106 + if (this.parseRegKeyNameTypeValue(System.Environment.ExpandEnvironmentVariables(this.data)))
107 + {
108 + RegistryKey rk = Registry.LocalMachine;
109 +
110 + if (this.hive == "HKCU") { rk = Microsoft.Win32.Registry.CurrentUser; }
111 + if (this.hive == "HKCC") { rk = Microsoft.Win32.Registry.CurrentConfig; }
112 + if (this.hive == "HKLM") { rk = Microsoft.Win32.Registry.LocalMachine; }
113 +
114 + foreach (string key in this.keyPathArray)
115 + {
116 + rk = rk.CreateSubKey(key, RegistryKeyPermissionCheck.ReadWriteSubTree);
117 + }
118 +
119 + rk.SetValue(this.name, this.value, this.regValueKind);
120 + Console.WriteLine("Created registry key: '{0}' name: '{1}' value: '{2}' of type: '{3}'",
121 + this.hive + "\\" + this.keyPath,
122 + this.name,
123 + this.value.ToString(),
124 + this.regValueKind.ToString());
125 + }
126 + else
127 + {
128 + Console.WriteLine("Unable to write registry key.");
129 + }
130 +
131 + }
132 +
133 + private bool parseRegKeyNameTypeValue(string delimittedData)
134 + {
135 + string[] splitString = delimittedData.Split(new string[] { "," }, StringSplitOptions.None);
136 + if (splitString.Length != 4)
137 + {
138 + Console.WriteLine("Invalid regkey. Unable to parse key,name,type,value from: \"" + delimittedData + "\"");
139 + return false;
140 + }
141 + else
142 + {
143 + this.keyPath = splitString[0];
144 + this.name = splitString[1];
145 + string datatype = splitString[2];
146 + if (datatype == "DWord")
147 + {
148 + this.value = UInt32.Parse(splitString[3]);
149 + }
150 + else if (datatype == "QWord")
151 + {
152 + this.value = UInt64.Parse(splitString[3]);
153 + }
154 + else
155 + {
156 + this.value = splitString[3];
157 + }
158 +
159 + if (this.keyPath.ToUpper().StartsWith("HKLM\\"))
160 + {
161 + this.hive = "HKLM";
162 + this.keyPath = this.keyPath.Replace("HKLM\\", "");
163 + }
164 + else if (this.keyPath.ToUpper().StartsWith("HKCC\\"))
165 + {
166 + this.hive = "HKCC";
167 + this.keyPath = this.keyPath.Replace("HKCC\\", "");
168 + }
169 + else if (this.keyPath.ToUpper().StartsWith("HKCU\\"))
170 + {
171 + this.hive = "HKCU";
172 + this.keyPath = this.keyPath.Replace("HKCU\\", "");
173 + }
174 + else
175 + {
176 + Console.WriteLine("Invalid regkey. Unable to determin hive. regkey must start with either: [HKLM], [HKCU], or [HKCC]");
177 + return false;
178 + }
179 + this.keyPathArray = this.keyPath.Split(new string[] { "\\" }, StringSplitOptions.None);
180 +
181 + try
182 + {
183 + this.regValueKind = (RegistryValueKind)System.Enum.Parse(typeof(RegistryValueKind), datatype);
184 + }
185 + catch (Exception ex)
186 + {
187 + Console.WriteLine("Invalid datatype. It must be: String, DWord, or QWord (case sensitive)");
188 + Console.WriteLine(ex.Message);
189 + return false;
190 + }
191 + }
192 + return true;
193 + }
194 + }
195 +
196 + /// <summary>
197 + /// Task class that will delete a registry key value or registry key and all of its children
198 + /// </summary>
199 + public class RegistryDeleterTask : Task
200 + {
201 + private string hive;
202 + private string keyPath;
203 + private string[] keyPathArray;
204 + private string name;
205 +
206 + public RegistryDeleterTask(string Data) : base(Data) { }
207 +
208 + public override void RunTask()
209 + {
210 + if (this.parseRegKeyName(System.Environment.ExpandEnvironmentVariables(this.data)))
211 + {
212 + try
213 + {
214 + RegistryKey rk = Registry.LocalMachine;
215 +
216 + if (this.hive == "HKCU") { rk = Microsoft.Win32.Registry.CurrentUser; }
217 + if (this.hive == "HKCC") { rk = Microsoft.Win32.Registry.CurrentConfig; }
218 + if (this.hive == "HKLM") { rk = Microsoft.Win32.Registry.LocalMachine; }
219 +
220 + RegistryKey rkParent = null;
221 + foreach (string key in this.keyPathArray)
222 + {
223 + rkParent = rk;
224 + rk = rk.OpenSubKey(key, true);
225 + }
226 +
227 + if (String.IsNullOrEmpty(this.name))
228 + {
229 + // delete the key and all of its children
230 + string subkeyToDelete = this.keyPathArray[this.keyPathArray.Length - 1];
231 + rkParent.DeleteSubKeyTree(subkeyToDelete);
232 + Console.WriteLine("Deleted registry key: '{0}'", this.hive + "\\" + this.keyPath);
233 + }
234 + else
235 + {
236 + // just delete this value
237 + rk.DeleteValue(this.name);
238 + Console.WriteLine("Deleted registry key: '{0}' name: '{1}'", this.hive + "\\" + this.keyPath, this.name);
239 + }
240 + }
241 + catch (Exception ex)
242 + {
243 + Console.WriteLine("Unable to delete registry key: '{0}'", this.hive + "\\" + this.keyPath);
244 + Console.WriteLine(ex.Message);
245 + }
246 + }
247 + else
248 + {
249 + Console.WriteLine("Unable to delete registry key.");
250 + }
251 +
252 + }
253 +
254 + private bool parseRegKeyName(string delimittedData)
255 + {
256 + string[] splitString = delimittedData.Split(new string[] { "," }, StringSplitOptions.None);
257 +
258 + if (splitString.Length > 2)
259 + {
260 + Console.WriteLine("Unable to parse registry key and name.");
261 + return false;
262 + }
263 +
264 + this.keyPath = splitString[0];
265 + if (splitString.Length == 2)
266 + {
267 + this.name = splitString[1];
268 + }
269 +
270 + if (this.keyPath.ToUpper().StartsWith("HKLM\\"))
271 + {
272 + this.hive = "HKLM";
273 + this.keyPath = this.keyPath.Replace("HKLM\\", "");
274 + }
275 + else if (this.keyPath.ToUpper().StartsWith("HKCC\\"))
276 + {
277 + this.hive = "HKCC";
278 + this.keyPath = this.keyPath.Replace("HKCC\\", "");
279 + }
280 + else if (this.keyPath.ToUpper().StartsWith("HKCU\\"))
281 + {
282 + this.hive = "HKCU";
283 + this.keyPath = this.keyPath.Replace("HKCU\\", "");
284 + }
285 + else
286 + {
287 + Console.WriteLine("Invalid regkey. Unable to determine hive. regkey must start with either: [HKLM], [HKCU], or [HKCC]");
288 + return false;
289 + }
290 + this.keyPathArray = this.keyPath.Split(new string[] { "\\" }, StringSplitOptions.None);
291 + return true;
292 + }
293 + }
294 +}
295 +#endif
src/TestExe/Task.cs
+34 -296
@@ -4,9 +4,6 @@ using System;
4 using System.Collections.Generic;
5 using System.Diagnostics;
6 using System.IO;
7 -using System.Linq;
8 -using System.Management;
9 -using System.Text;
7 using Microsoft.Win32;
8
9 namespace TestExe
@@ -17,7 +14,7 @@ namespace TestExe
14
15 public Task(string Data)
16 {
20 - data = Data;
17 + this.data = Data;
18 }
19
20 public abstract void RunTask();
@@ -52,8 +49,8 @@ namespace TestExe
49
50 public override void RunTask()
51 {
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]);
52 + int low = int.Parse(this.data.Split(new string[] { ":" }, 2, StringSplitOptions.None)[0]);
53 + int high = int.Parse(this.data.Split(new string[] { ":" }, 2, StringSplitOptions.None)[1]);
54
55 Random r = new Random();
56 int milliseconds = r.Next(high - low) + low;
@@ -62,13 +59,30 @@ namespace TestExe
59 }
60 }
61
62 + public class LargeFileTask : Task
63 + {
64 + public LargeFileTask(string Data) : base(Data) { }
65 +
66 + public override void RunTask()
67 + {
68 + string[] tokens = this.data.Split(new char[] { '|' }, 2);
69 + string filePath = System.Environment.ExpandEnvironmentVariables(tokens[0]);
70 + long size = long.Parse(tokens[1]);
71 + using (var stream = File.Create(filePath))
72 + {
73 + stream.Seek(size - 1, SeekOrigin.Begin);
74 + stream.WriteByte(1);
75 + }
76 + }
77 + }
78 +
79 public class LogTask : Task
80 {
81 string[] argsUsed;
82 public LogTask(string Data, string[] args)
83 : base(Data)
84 {
71 - argsUsed = args;
85 + this.argsUsed = args;
86 }
87
88 public override void RunTask()
@@ -76,14 +90,14 @@ namespace TestExe
90 string logFile = "";
91 string argsUsedString = "";
92
79 - foreach (string a in argsUsed)
93 + foreach (string a in this.argsUsed)
94 {
95 argsUsedString += a + " ";
96 }
97
98 try
99 {
86 - logFile = System.Environment.ExpandEnvironmentVariables(data);
100 + logFile = System.Environment.ExpandEnvironmentVariables(this.data);
101 Console.WriteLine("creating log file: " + logFile);
102 StreamWriter textFile = File.CreateText(logFile);
103 textFile.WriteLine("This is a log file created by TestExe.exe");
@@ -98,90 +112,13 @@ namespace TestExe
112 }
113 }
114
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 -
115 public class FileExistsTask : Task
116 {
117 public FileExistsTask(string Data) : base(Data) { }
118
119 public override void RunTask()
120 {
184 - string fileToExist = System.Environment.ExpandEnvironmentVariables(data);
121 + string fileToExist = System.Environment.ExpandEnvironmentVariables(this.data);
122
123 if (!String.IsNullOrEmpty(fileToExist))
124 {
@@ -196,211 +133,6 @@ namespace TestExe
133 }
134 }
135
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 -
136 public class TaskParser
137 {
138
@@ -431,18 +163,23 @@ namespace TestExe
163 t = new SleepRandomTask(args[i + 1]);
164 tasks.Add(t);
165 break;
434 - case "/log":
435 - t = new LogTask(args[i + 1], args);
166 + case "/lf":
167 + t = new LargeFileTask(args[i + 1]);
168 tasks.Add(t);
169 break;
438 - case "/pinfo":
439 - t = new ProcessInfoTask(args[i + 1]);
170 + case "/log":
171 + t = new LogTask(args[i + 1], args);
172 tasks.Add(t);
173 break;
174 case "/fe":
175 t = new FileExistsTask(args[i + 1]);
176 tasks.Add(t);
177 break;
178 +#if NET35
179 + case "/pinfo":
180 + t = new ProcessInfoTask(args[i + 1]);
181 + tasks.Add(t);
182 + break;
183 case "/regw":
184 t = new RegistryWriterTask(args[i + 1]);
185 tasks.Add(t);
@@ -451,6 +188,7 @@ namespace TestExe
188 t = new RegistryDeleterTask(args[i + 1]);
189 tasks.Add(t);
190 break;
191 +#endif
192
193 default:
194 Console.WriteLine("Error: Invalid switch specified.");
src/TestExe/TestExe.csproj
+5 -2
@@ -3,15 +3,18 @@
3
4 <Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 - <TargetFrameworks>net35</TargetFrameworks>
6 + <TargetFrameworks>net35;netcoreapp3.1</TargetFrameworks>
7 <AssemblyName>TestExe</AssemblyName>
8 <RootNamespace>TestExe</RootNamespace>
9 <OutputType>Exe</OutputType>
10 <DebugType>embedded</DebugType>
11 <RuntimeIdentifier>win-x86</RuntimeIdentifier>
12 + <SelfContained>false</SelfContained>
13 + <UseAppHost>true</UseAppHost>
14 + <RollForward>Major</RollForward>
15 </PropertyGroup>
16
14 - <ItemGroup>
17 + <ItemGroup Condition="'$(TargetFramework)'=='net35'">
18 <Reference Include="System.Management" />
19 </ItemGroup>
20 </Project>
\ No newline at end of file
src/WixToolsetTest.BurnE2E/CacheTests.cs
+27
@@ -5,6 +5,7 @@ namespace WixToolsetTest.BurnE2E
5 using System.Collections.Generic;
6 using System.IO;
7 using WixBuildTools.TestSupport;
8 + using WixTestTools;
9 using WixToolset.Mba.Core;
10 using Xunit;
11 using Xunit.Abstractions;
@@ -13,6 +14,32 @@ namespace WixToolsetTest.BurnE2E
14 {
15 public CacheTests(ITestOutputHelper testOutputHelper) : base(testOutputHelper) { }
16
17 + [Fact]
18 + public void CanCache5GBFile()
19 + {
20 + var packageA = this.CreatePackageInstaller("PackageA");
21 + var bundleC = this.CreateBundleInstaller("BundleC");
22 +
23 + packageA.VerifyInstalled(false);
24 +
25 + // Recreate the 5GB payload to avoid having to copy it to the VM to run the tests.
26 + var targetFilePath = Path.Combine(this.TestContext.TestDataFolder, "fivegb.file");
27 + if (!File.Exists(targetFilePath))
28 + {
29 + var testTool = new TestTool(Path.Combine(TestData.Get(), "win-x86", "TestExe.exe"))
30 + {
31 + Arguments = "/lf \"" + targetFilePath + "|5368709120\"",
32 + ExpectedExitCode = 0,
33 + };
34 + testTool.Run(true);
35 + }
36 +
37 + bundleC.Install();
38 + bundleC.VerifyRegisteredAndInPackageCache();
39 +
40 + packageA.VerifyInstalled(true);
41 + }
42 +
43 [Fact]
44 public void CanDownloadPayloadsFromMissingAttachedContainer()
45 {