aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Mensching <rob@firegiant.com>2023-02-22 00:53:41 -0800
committerRob Mensching <rob@firegiant.com>2023-02-22 12:21:00 -0700
commitd24800ebb5b9693041d41dbcb7d620e3441c822d (patch)
treeae767659258f6fe0bd012be9dbb562230a96efbd
parent793a52ae8cbb8873bc23582e4c13e63d729d0bc7 (diff)
downloadwix-d24800ebb5b9693041d41dbcb7d620e3441c822d.tar.gz
wix-d24800ebb5b9693041d41dbcb7d620e3441c822d.tar.bz2
wix-d24800ebb5b9693041d41dbcb7d620e3441c822d.zip
Allow MsiPackage ForcePerMachine to set the ALLUSERS property
Fixes 7232
-rw-r--r--src/wix/WixToolset.Core.Burn/Bundles/PerformBundleBackendValidationCommand.cs9
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/BundlePackageFixture.cs138
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleAllUsers/AllUsersPackage.wxs14
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleAllUsers/BundleWithAllUsersPackage.wxs11
4 files changed, 122 insertions, 50 deletions
diff --git a/src/wix/WixToolset.Core.Burn/Bundles/PerformBundleBackendValidationCommand.cs b/src/wix/WixToolset.Core.Burn/Bundles/PerformBundleBackendValidationCommand.cs
index 49a25c0a..01df9f32 100644
--- a/src/wix/WixToolset.Core.Burn/Bundles/PerformBundleBackendValidationCommand.cs
+++ b/src/wix/WixToolset.Core.Burn/Bundles/PerformBundleBackendValidationCommand.cs
@@ -130,7 +130,14 @@ namespace WixToolset.Core.Burn.Bundles
130 130
131 private void ValidateMsiProperty(WixBundleMsiPropertySymbol symbol) 131 private void ValidateMsiProperty(WixBundleMsiPropertySymbol symbol)
132 { 132 {
133 this.BackendHelper.ValidateBundleMsiPropertyName(symbol.SourceLineNumbers, "MsiProperty", "Name", symbol.Name); 133 // Validate the MSI properties *except* for the ALLUSERS property when set during binding (most likely
134 // by the MsiPackage/@ForcePerMachine attribute).
135 var nameField = symbol.Fields[(int)WixBundleMsiPropertySymbolFields.Name];
136 var name = nameField.AsString();
137 if (name != "ALLUSERS" || nameField.Context != "wix.bind")
138 {
139 this.BackendHelper.ValidateBundleMsiPropertyName(symbol.SourceLineNumbers, "MsiProperty", "Name", name);
140 }
134 141
135 if (symbol.Condition != null) 142 if (symbol.Condition != null)
136 { 143 {
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/BundlePackageFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/BundlePackageFixture.cs
index 2538c0dc..e4ac2dd6 100644
--- a/src/wix/test/WixToolsetTest.CoreIntegration/BundlePackageFixture.cs
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/BundlePackageFixture.cs
@@ -51,16 +51,7 @@ namespace WixToolsetTest.CoreIntegration
51 51
52 Assert.True(File.Exists(chainBundlePath)); 52 Assert.True(File.Exists(chainBundlePath));
53 53
54 string chainBundleId; 54 var chainBundleId = GetBundleIdFromWixpdb(chainPdbPath);
55 using (var wixOutput = WixOutput.Read(chainPdbPath))
56 {
57
58 var intermediate = Intermediate.Load(wixOutput);
59 var section = intermediate.Sections.Single();
60
61 var bundleSymbol = section.Symbols.OfType<WixBundleSymbol>().Single();
62 chainBundleId = bundleSymbol.BundleId;
63 }
64 55
65 // parent.exe 56 // parent.exe
66 result = WixRunner.Execute(new[] 57 result = WixRunner.Execute(new[]
@@ -78,16 +69,7 @@ namespace WixToolsetTest.CoreIntegration
78 69
79 Assert.True(File.Exists(parentBundlePath)); 70 Assert.True(File.Exists(parentBundlePath));
80 71
81 string parentBundleId; 72 var parentBundleId = GetBundleIdFromWixpdb(parentPdbPath);
82 using (var wixOutput = WixOutput.Read(parentPdbPath))
83 {
84
85 var intermediate = Intermediate.Load(wixOutput);
86 var section = intermediate.Sections.Single();
87
88 var bundleSymbol = section.Symbols.OfType<WixBundleSymbol>().Single();
89 parentBundleId = bundleSymbol.BundleId;
90 }
91 73
92 var extractResult = BundleExtractor.ExtractBAContainer(null, parentBundlePath, parentBaFolderPath, extractFolderPath); 74 var extractResult = BundleExtractor.ExtractBAContainer(null, parentBundlePath, parentBaFolderPath, extractFolderPath);
93 extractResult.AssertSuccess(); 75 extractResult.AssertSuccess();
@@ -140,16 +122,7 @@ namespace WixToolsetTest.CoreIntegration
140 122
141 Assert.True(File.Exists(grandparentBundlePath)); 123 Assert.True(File.Exists(grandparentBundlePath));
142 124
143 string grandparentBundleId; 125 var grandparentBundleId = GetBundleIdFromWixpdb(grandparentPdbPath);
144 using (var wixOutput = WixOutput.Read(grandparentPdbPath))
145 {
146
147 var intermediate = Intermediate.Load(wixOutput);
148 var section = intermediate.Sections.Single();
149
150 var bundleSymbol = section.Symbols.OfType<WixBundleSymbol>().Single();
151 grandparentBundleId = bundleSymbol.BundleId;
152 }
153 126
154 var grandparentExtractResult = BundleExtractor.ExtractBAContainer(null, grandparentBundlePath, grandparentBaFolderPath, extractFolderPath); 127 var grandparentExtractResult = BundleExtractor.ExtractBAContainer(null, grandparentBundlePath, grandparentBaFolderPath, extractFolderPath);
155 grandparentExtractResult.AssertSuccess(); 128 grandparentExtractResult.AssertSuccess();
@@ -229,16 +202,8 @@ namespace WixToolsetTest.CoreIntegration
229 Assert.True(File.Exists(parentBundlePath)); 202 Assert.True(File.Exists(parentBundlePath));
230 203
231 var chainBundleId = "{216BDA7F-74BD-45E8-957B-500552F05629}"; 204 var chainBundleId = "{216BDA7F-74BD-45E8-957B-500552F05629}";
232 string parentBundleId;
233 using (var wixOutput = WixOutput.Read(parentPdbPath))
234 {
235
236 var intermediate = Intermediate.Load(wixOutput);
237 var section = intermediate.Sections.Single();
238 205
239 var bundleSymbol = section.Symbols.OfType<WixBundleSymbol>().Single(); 206 var parentBundleId = GetBundleIdFromWixpdb(parentPdbPath);
240 parentBundleId = bundleSymbol.BundleId;
241 }
242 207
243 var extractResult = BundleExtractor.ExtractBAContainer(null, parentBundlePath, parentBaFolderPath, extractFolderPath); 208 var extractResult = BundleExtractor.ExtractBAContainer(null, parentBundlePath, parentBaFolderPath, extractFolderPath);
244 extractResult.AssertSuccess(); 209 extractResult.AssertSuccess();
@@ -316,16 +281,7 @@ namespace WixToolsetTest.CoreIntegration
316 281
317 Assert.True(File.Exists(parentBundlePath)); 282 Assert.True(File.Exists(parentBundlePath));
318 283
319 string parentBundleId; 284 var parentBundleId = GetBundleIdFromWixpdb(parentPdbPath);
320 using (var wixOutput = WixOutput.Read(parentPdbPath))
321 {
322
323 var intermediate = Intermediate.Load(wixOutput);
324 var section = intermediate.Sections.Single();
325
326 var bundleSymbol = section.Symbols.OfType<WixBundleSymbol>().Single();
327 parentBundleId = bundleSymbol.BundleId;
328 }
329 285
330 var extractResult = BundleExtractor.ExtractBAContainer(null, parentBundlePath, baFolderPath, extractFolderPath); 286 var extractResult = BundleExtractor.ExtractBAContainer(null, parentBundlePath, baFolderPath, extractFolderPath);
331 extractResult.AssertSuccess(); 287 extractResult.AssertSuccess();
@@ -363,5 +319,89 @@ namespace WixToolsetTest.CoreIntegration
363 }, packageElements); 319 }, packageElements);
364 } 320 }
365 } 321 }
322
323 [Fact]
324 public void CanBuildBundleWithAllUsersPackage()
325 {
326 var folder = TestData.Get("TestData");
327
328 using (var fs = new DisposableFileSystem())
329 {
330 var baseFolder = fs.GetFolder();
331 var dataPath = Path.Combine(folder, ".Data");
332
333 var msiIntermediateFolder = Path.Combine(baseFolder, "obj", "msi");
334 var msiBinFolder = Path.Combine(baseFolder, "bin", "msi");
335 var msiPath = Path.Combine(msiBinFolder, "test.msi");
336
337 var bundleIntermediateFolder = Path.Combine(baseFolder, "obj", "bundle");
338 var bundleBinFolder = Path.Combine(baseFolder, "bin", "bundle");
339 var bundlePath = Path.Combine(bundleBinFolder, "bundle.exe");
340 var bundlePdbPath = Path.Combine(bundleBinFolder, "bundle.wixpdb");
341
342 var baFolderPath = Path.Combine(baseFolder, "extract", "ba");
343 var extractFolderPath = Path.Combine(baseFolder, "extract", "files");
344
345 var result = WixRunner.Execute(new[]
346 {
347 "build",
348 Path.Combine(folder, "BundleAllUsers", "AllUsersPackage.wxs"),
349 "-bindpath", dataPath,
350 "-intermediateFolder", msiIntermediateFolder,
351 "-o", msiPath
352 });
353
354 result.AssertSuccess();
355
356 result = WixRunner.Execute(new[]
357 {
358 "build",
359 Path.Combine(folder, "BundleAllUsers", "BundleWithAllUsersPackage.wxs"),
360 "-bindpath", dataPath,
361 "-bindpath", msiBinFolder,
362 "-intermediateFolder", bundleIntermediateFolder,
363 "-o", bundlePath
364 });
365
366 result.AssertSuccess();
367
368 var parentBundleId = GetBundleIdFromWixpdb(bundlePdbPath);
369
370 var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath);
371 extractResult.AssertSuccess();
372
373 var registrations = extractResult.GetManifestTestXmlLines("/burn:BurnManifest/burn:Registration");
374 WixAssert.CompareLineByLine(new[]
375 {
376 $"<Registration Id='{parentBundleId}' ExecutableName='bundle.exe' PerMachine='yes' Tag='' Version='9.9' ProviderKey='{parentBundleId}'>" +
377 "<Arp DisplayName='All Users Bundle' DisplayVersion='9.9' Publisher='Example Corporation' />" +
378 "</Registration>"
379 }, registrations);
380
381 var ignoreAttributesByElementName = new Dictionary<string, List<string>>
382 {
383 { "WixPackageProperties", new List<string> { "DownloadSize", "PackageSize" } },
384 };
385
386 var packageElements = extractResult.GetBADataTestXmlLines("/ba:BootstrapperApplicationData/ba:WixPackageProperties", ignoreAttributesByElementName);
387 WixAssert.CompareLineByLine(new[]
388 {
389 "<WixPackageProperties Package='test.msi' Vital='yes' DisplayName='All Users Package' DownloadSize='*' PackageSize='*' InstalledSize='28' PackageType='Msi' Permanent='no' LogPathVariable='WixBundleLog_test.msi' RollbackLogPathVariable='WixBundleRollbackLog_test.msi' Compressed='no' ProductCode='{33333333-3333-3333-3333-333333333333}' UpgradeCode='{4BE34BEE-CA23-488E-96A0-B15878E3654B}' Version='1.0' Cache='keep' />",
390 }, packageElements);
391 }
392 }
393
394 private static string GetBundleIdFromWixpdb(string bundlePdbPath)
395 {
396 using (var wixOutput = WixOutput.Read(bundlePdbPath))
397 {
398
399 var intermediate = Intermediate.Load(wixOutput);
400 var section = intermediate.Sections.Single();
401
402 var bundleSymbol = section.Symbols.OfType<WixBundleSymbol>().Single();
403 return bundleSymbol.BundleId;
404 }
405 }
366 } 406 }
367} 407}
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleAllUsers/AllUsersPackage.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleAllUsers/AllUsersPackage.wxs
new file mode 100644
index 00000000..63046563
--- /dev/null
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleAllUsers/AllUsersPackage.wxs
@@ -0,0 +1,14 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Package ProductCode="33333333-3333-3333-3333-333333333333" Name="All Users Package" Version="1.0" Manufacturer="Example Corporation" UpgradeCode="4BE34BEE-CA23-488E-96A0-B15878E3654B" Compressed="no" Scope="perUserOrMachine">
3
4 <StandardDirectory Id="ProgramFilesFolder">
5 <Directory Id="INSTALLFOLDER" Name="Example" />
6 </StandardDirectory>
7
8 <Feature Id="Main">
9 <Component Directory="INSTALLFOLDER">
10 <File Source="test.txt" />
11 </Component>
12 </Feature>
13 </Package>
14</Wix>
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleAllUsers/BundleWithAllUsersPackage.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleAllUsers/BundleWithAllUsersPackage.wxs
new file mode 100644
index 00000000..6344e861
--- /dev/null
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleAllUsers/BundleWithAllUsersPackage.wxs
@@ -0,0 +1,11 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Bundle Name="All Users Bundle" Version="9.9" Manufacturer="Example Corporation" UpgradeCode="{4BE34BEE-CA23-488E-96A0-B15878E3654B}" Compressed="no">
3 <BootstrapperApplication>
4 <BootstrapperApplicationDll SourceFile="fakeba.dll" />
5 </BootstrapperApplication>
6
7 <Chain>
8 <MsiPackage SourceFile="test.msi" ForcePerMachine="yes" />
9 </Chain>
10 </Bundle>
11</Wix>