aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Arnson <bob@firegiant.com>2024-08-25 19:13:37 -0400
committerRob Mensching <rob@firegiant.com>2024-12-26 22:00:57 -0800
commit05d9529abdee99372e3b99808f8fed04c755ae95 (patch)
tree734ca55fd418d5208ffb431f35ee4a31f48bb783
parentda34545f4caddf3ccc353392531139e2500cf578 (diff)
downloadwix-05d9529abdee99372e3b99808f8fed04c755ae95.tar.gz
wix-05d9529abdee99372e3b99808f8fed04c755ae95.tar.bz2
wix-05d9529abdee99372e3b99808f8fed04c755ae95.zip
Also use EnsureTable to schedule standard actions.
Fixes https://github.com/wixtoolset/issues/issues/8632 Fixes https://github.com/wixtoolset/issues/issues/8199
-rw-r--r--src/wix/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs360
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs33
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/TestData/EnsureTable/StandardActions.wxs7
3 files changed, 244 insertions, 156 deletions
diff --git a/src/wix/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs b/src/wix/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs
index 3cda47ae..4f739420 100644
--- a/src/wix/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs
+++ b/src/wix/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs
@@ -4,7 +4,6 @@ namespace WixToolset.Core.WindowsInstaller.Bind
4{ 4{
5 using System; 5 using System;
6 using System.Collections.Generic; 6 using System.Collections.Generic;
7 using System.Globalization;
8 using System.Linq; 7 using System.Linq;
9 using WixToolset.Data; 8 using WixToolset.Data;
10 using WixToolset.Data.Symbols; 9 using WixToolset.Data.Symbols;
@@ -30,6 +29,42 @@ namespace WixToolset.Core.WindowsInstaller.Bind
30 29
31 private Dictionary<string, RelativeActions> RelativeActionsForActions { get; } 30 private Dictionary<string, RelativeActions> RelativeActionsForActions { get; }
32 31
32 public Dictionary<string, SymbolDefinitionType> SymbolTypeForTable { get; } = new Dictionary<string, SymbolDefinitionType>
33 {
34 { "AppSearch", SymbolDefinitionType.AppSearch },
35 { "CCPSearch", SymbolDefinitionType.CCPSearch },
36 { "Class", SymbolDefinitionType.Class },
37 { "Complus", SymbolDefinitionType.Complus},
38 { "CreateFolder", SymbolDefinitionType.CreateFolder },
39 { "DuplicateFile", SymbolDefinitionType.DuplicateFile },
40 { "Environment", SymbolDefinitionType.Environment },
41 { "Extension", SymbolDefinitionType.Extension },
42 { "File", SymbolDefinitionType.File },
43 { "IniFile", SymbolDefinitionType.IniFile },
44 { "IsolatedComponent", SymbolDefinitionType.IsolatedComponent },
45 { "LaunchCondition", SymbolDefinitionType.LaunchCondition },
46 { "MIME", SymbolDefinitionType.MIME },
47 { "MoveFile", SymbolDefinitionType.MoveFile },
48 { "MsiAssembly", SymbolDefinitionType.Assembly },
49 { "MsiAssemblyName", SymbolDefinitionType.Assembly },
50 { "MsiServiceConfig", SymbolDefinitionType.LaunchCondition },
51 { "MsiServiceConfigFailureActions", SymbolDefinitionType.MsiServiceConfigFailureActions },
52 { "ODBCAttribute", SymbolDefinitionType.ODBCAttribute },
53 { "ODBCDataSource", SymbolDefinitionType.ODBCDataSource },
54 { "ODBCDriver", SymbolDefinitionType.ODBCDriver },
55 { "ODBCTranslator", SymbolDefinitionType.ODBCTranslator },
56 { "ODBCSourceAttribute", SymbolDefinitionType.ODBCSourceAttribute },
57 { "PublishComponent", SymbolDefinitionType.PublishComponent },
58 { "Registry", SymbolDefinitionType.Registry },
59 { "RemoveRegistry", SymbolDefinitionType.RemoveRegistry },
60 { "RemoveFile", SymbolDefinitionType.RemoveFile },
61 { "ServiceControl", SymbolDefinitionType.ServiceControl },
62 { "ServiceInstall", SymbolDefinitionType.ServiceInstall },
63 { "Shortcut", SymbolDefinitionType.Shortcut },
64 { "TypeLib", SymbolDefinitionType.TypeLib },
65 { "Upgrade", SymbolDefinitionType.Upgrade },
66 };
67
33 public void Execute() 68 public void Execute()
34 { 69 {
35 var requiredActionSymbols = new Dictionary<string, WixActionSymbol>(); 70 var requiredActionSymbols = new Dictionary<string, WixActionSymbol>();
@@ -131,7 +166,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
131 166
132 // A dictionary used for detecting cyclic references among action symbols. 167 // A dictionary used for detecting cyclic references among action symbols.
133 var firstReference = new Dictionary<WixActionSymbol, WixActionSymbol>(); 168 var firstReference = new Dictionary<WixActionSymbol, WixActionSymbol>();
134 169
135 // Build up dependency trees of the relatively scheduled actions. 170 // Build up dependency trees of the relatively scheduled actions.
136 // Use ToList() to create a copy of the required action symbols so that new symbols can 171 // Use ToList() to create a copy of the required action symbols so that new symbols can
137 // be added while enumerating. 172 // be added while enumerating.
@@ -396,165 +431,179 @@ namespace WixToolset.Core.WindowsInstaller.Bind
396 // Gather the required actions for each symbol type. 431 // Gather the required actions for each symbol type.
397 foreach (var symbolType in this.Section.Symbols.Select(t => t.Definition.Type).Distinct()) 432 foreach (var symbolType in this.Section.Symbols.Select(t => t.Definition.Type).Distinct())
398 { 433 {
399 switch (symbolType) 434 this.GetActionsForSymbolType(symbolType, set);
435 }
436
437 // Gather the required actions for each ensured table.
438 foreach (var ensureTable in this.Section.Symbols.OfType<WixEnsureTableSymbol>())
439 {
440 if (this.SymbolTypeForTable.TryGetValue(ensureTable.Table, out var symbolType))
400 { 441 {
401 case SymbolDefinitionType.AppSearch: 442 this.GetActionsForSymbolType(symbolType, set);
402 set.Add("InstallExecuteSequence/AppSearch"); 443 }
403 set.Add("InstallUISequence/AppSearch"); 444 }
404 break;
405 case SymbolDefinitionType.CCPSearch:
406 set.Add("InstallExecuteSequence/AppSearch");
407 set.Add("InstallExecuteSequence/CCPSearch");
408 set.Add("InstallExecuteSequence/RMCCPSearch");
409 set.Add("InstallUISequence/AppSearch");
410 set.Add("InstallUISequence/CCPSearch");
411 set.Add("InstallUISequence/RMCCPSearch");
412 break;
413 case SymbolDefinitionType.Class:
414 set.Add("AdvertiseExecuteSequence/RegisterClassInfo");
415 set.Add("InstallExecuteSequence/RegisterClassInfo");
416 set.Add("InstallExecuteSequence/UnregisterClassInfo");
417 break;
418 case SymbolDefinitionType.Complus:
419 set.Add("InstallExecuteSequence/RegisterComPlus");
420 set.Add("InstallExecuteSequence/UnregisterComPlus");
421 break;
422 case SymbolDefinitionType.Component:
423 case SymbolDefinitionType.CreateFolder:
424 set.Add("InstallExecuteSequence/CreateFolders");
425 set.Add("InstallExecuteSequence/RemoveFolders");
426 break;
427 case SymbolDefinitionType.DuplicateFile:
428 set.Add("InstallExecuteSequence/DuplicateFiles");
429 set.Add("InstallExecuteSequence/RemoveDuplicateFiles");
430 break;
431 case SymbolDefinitionType.Environment:
432 set.Add("InstallExecuteSequence/WriteEnvironmentStrings");
433 set.Add("InstallExecuteSequence/RemoveEnvironmentStrings");
434 break;
435 case SymbolDefinitionType.Extension:
436 set.Add("AdvertiseExecuteSequence/RegisterExtensionInfo");
437 set.Add("InstallExecuteSequence/RegisterExtensionInfo");
438 set.Add("InstallExecuteSequence/UnregisterExtensionInfo");
439 break;
440 case SymbolDefinitionType.File:
441 set.Add("InstallExecuteSequence/InstallFiles");
442 set.Add("InstallExecuteSequence/RemoveFiles");
443
444 var foundFont = false;
445 var foundSelfReg = false;
446 var foundBindPath = false;
447 foreach (var file in this.Section.Symbols.OfType<FileSymbol>())
448 {
449 // Note that TrueType fonts are denoted by the empty string in the FontTitle
450 // field. So, non-null means a font is present.
451 if (!foundFont && file.FontTitle != null)
452 {
453 set.Add("InstallExecuteSequence/RegisterFonts");
454 set.Add("InstallExecuteSequence/UnregisterFonts");
455 foundFont = true;
456 }
457 445
458 if (!foundSelfReg && file.SelfRegCost.HasValue) 446 return set;
459 { 447 }
460 set.Add("InstallExecuteSequence/SelfRegModules");
461 set.Add("InstallExecuteSequence/SelfUnregModules");
462 foundSelfReg = true;
463 }
464 448
465 if (!foundBindPath && !String.IsNullOrEmpty(file.BindPath)) 449 private void GetActionsForSymbolType(SymbolDefinitionType symbolType, HashSet<string> set)
466 { 450 {
467 set.Add("InstallExecuteSequence/BindImage"); 451 switch (symbolType)
468 foundBindPath = true; 452 {
469 } 453 case SymbolDefinitionType.AppSearch:
454 set.Add("InstallExecuteSequence/AppSearch");
455 set.Add("InstallUISequence/AppSearch");
456 break;
457 case SymbolDefinitionType.CCPSearch:
458 set.Add("InstallExecuteSequence/AppSearch");
459 set.Add("InstallExecuteSequence/CCPSearch");
460 set.Add("InstallExecuteSequence/RMCCPSearch");
461 set.Add("InstallUISequence/AppSearch");
462 set.Add("InstallUISequence/CCPSearch");
463 set.Add("InstallUISequence/RMCCPSearch");
464 break;
465 case SymbolDefinitionType.Class:
466 set.Add("AdvertiseExecuteSequence/RegisterClassInfo");
467 set.Add("InstallExecuteSequence/RegisterClassInfo");
468 set.Add("InstallExecuteSequence/UnregisterClassInfo");
469 break;
470 case SymbolDefinitionType.Complus:
471 set.Add("InstallExecuteSequence/RegisterComPlus");
472 set.Add("InstallExecuteSequence/UnregisterComPlus");
473 break;
474 case SymbolDefinitionType.Component:
475 case SymbolDefinitionType.CreateFolder:
476 set.Add("InstallExecuteSequence/CreateFolders");
477 set.Add("InstallExecuteSequence/RemoveFolders");
478 break;
479 case SymbolDefinitionType.DuplicateFile:
480 set.Add("InstallExecuteSequence/DuplicateFiles");
481 set.Add("InstallExecuteSequence/RemoveDuplicateFiles");
482 break;
483 case SymbolDefinitionType.Environment:
484 set.Add("InstallExecuteSequence/WriteEnvironmentStrings");
485 set.Add("InstallExecuteSequence/RemoveEnvironmentStrings");
486 break;
487 case SymbolDefinitionType.Extension:
488 set.Add("AdvertiseExecuteSequence/RegisterExtensionInfo");
489 set.Add("InstallExecuteSequence/RegisterExtensionInfo");
490 set.Add("InstallExecuteSequence/UnregisterExtensionInfo");
491 break;
492 case SymbolDefinitionType.File:
493 set.Add("InstallExecuteSequence/InstallFiles");
494 set.Add("InstallExecuteSequence/RemoveFiles");
495
496 var foundFont = false;
497 var foundSelfReg = false;
498 var foundBindPath = false;
499 foreach (var file in this.Section.Symbols.OfType<FileSymbol>())
500 {
501 // Note that TrueType fonts are denoted by the empty string in the FontTitle
502 // field. So, non-null means a font is present.
503 if (!foundFont && file.FontTitle != null)
504 {
505 set.Add("InstallExecuteSequence/RegisterFonts");
506 set.Add("InstallExecuteSequence/UnregisterFonts");
507 foundFont = true;
470 } 508 }
471 break; 509
472 case SymbolDefinitionType.IniFile: 510 if (!foundSelfReg && file.SelfRegCost.HasValue)
473 set.Add("InstallExecuteSequence/WriteIniValues");
474 set.Add("InstallExecuteSequence/RemoveIniValues");
475 break;
476 case SymbolDefinitionType.IsolatedComponent:
477 set.Add("InstallExecuteSequence/IsolateComponents");
478 break;
479 case SymbolDefinitionType.LaunchCondition:
480 set.Add("InstallExecuteSequence/LaunchConditions");
481 set.Add("InstallUISequence/LaunchConditions");
482 break;
483 case SymbolDefinitionType.MIME:
484 set.Add("AdvertiseExecuteSequence/RegisterMIMEInfo");
485 set.Add("InstallExecuteSequence/RegisterMIMEInfo");
486 set.Add("InstallExecuteSequence/UnregisterMIMEInfo");
487 break;
488 case SymbolDefinitionType.MoveFile:
489 set.Add("InstallExecuteSequence/MoveFiles");
490 break;
491 case SymbolDefinitionType.Assembly:
492 set.Add("AdvertiseExecuteSequence/MsiPublishAssemblies");
493 set.Add("InstallExecuteSequence/MsiPublishAssemblies");
494 set.Add("InstallExecuteSequence/MsiUnpublishAssemblies");
495 break;
496 case SymbolDefinitionType.MsiServiceConfig:
497 case SymbolDefinitionType.MsiServiceConfigFailureActions:
498 set.Add("InstallExecuteSequence/MsiConfigureServices");
499 break;
500 case SymbolDefinitionType.ODBCDataSource:
501 case SymbolDefinitionType.ODBCTranslator:
502 case SymbolDefinitionType.ODBCDriver:
503 set.Add("InstallExecuteSequence/SetODBCFolders");
504 set.Add("InstallExecuteSequence/InstallODBC");
505 set.Add("InstallExecuteSequence/RemoveODBC");
506 break;
507 case SymbolDefinitionType.ProgId:
508 set.Add("AdvertiseExecuteSequence/RegisterProgIdInfo");
509 set.Add("InstallExecuteSequence/RegisterProgIdInfo");
510 set.Add("InstallExecuteSequence/UnregisterProgIdInfo");
511 break;
512 case SymbolDefinitionType.PublishComponent:
513 set.Add("AdvertiseExecuteSequence/PublishComponents");
514 set.Add("InstallExecuteSequence/PublishComponents");
515 set.Add("InstallExecuteSequence/UnpublishComponents");
516 break;
517 case SymbolDefinitionType.Registry:
518 case SymbolDefinitionType.RemoveRegistry:
519 set.Add("InstallExecuteSequence/WriteRegistryValues");
520 set.Add("InstallExecuteSequence/RemoveRegistryValues");
521 break;
522 case SymbolDefinitionType.RemoveFile:
523 set.Add("InstallExecuteSequence/RemoveFiles");
524 break;
525 case SymbolDefinitionType.ServiceControl:
526 set.Add("InstallExecuteSequence/StartServices");
527 set.Add("InstallExecuteSequence/StopServices");
528 set.Add("InstallExecuteSequence/DeleteServices");
529 break;
530 case SymbolDefinitionType.ServiceInstall:
531 set.Add("InstallExecuteSequence/InstallServices");
532 break;
533 case SymbolDefinitionType.Shortcut:
534 set.Add("AdvertiseExecuteSequence/CreateShortcuts");
535 set.Add("InstallExecuteSequence/CreateShortcuts");
536 set.Add("InstallExecuteSequence/RemoveShortcuts");
537 break;
538 case SymbolDefinitionType.TypeLib:
539 set.Add("InstallExecuteSequence/RegisterTypeLibraries");
540 set.Add("InstallExecuteSequence/UnregisterTypeLibraries");
541 break;
542 case SymbolDefinitionType.Upgrade:
543 set.Add("InstallExecuteSequence/FindRelatedProducts");
544 set.Add("InstallUISequence/FindRelatedProducts");
545
546 // Only add the MigrateFeatureStates action if MigrateFeature attribute is set on
547 // at least one UpgradeVersion element.
548 if (this.Section.Symbols.OfType<UpgradeSymbol>().Any(t => t.MigrateFeatures))
549 { 511 {
550 set.Add("InstallExecuteSequence/MigrateFeatureStates"); 512 set.Add("InstallExecuteSequence/SelfRegModules");
551 set.Add("InstallUISequence/MigrateFeatureStates"); 513 set.Add("InstallExecuteSequence/SelfUnregModules");
514 foundSelfReg = true;
552 } 515 }
553 break;
554 }
555 }
556 516
557 return set; 517 if (!foundBindPath && !String.IsNullOrEmpty(file.BindPath))
518 {
519 set.Add("InstallExecuteSequence/BindImage");
520 foundBindPath = true;
521 }
522 }
523 break;
524 case SymbolDefinitionType.IniFile:
525 set.Add("InstallExecuteSequence/WriteIniValues");
526 set.Add("InstallExecuteSequence/RemoveIniValues");
527 break;
528 case SymbolDefinitionType.IsolatedComponent:
529 set.Add("InstallExecuteSequence/IsolateComponents");
530 break;
531 case SymbolDefinitionType.LaunchCondition:
532 set.Add("InstallExecuteSequence/LaunchConditions");
533 set.Add("InstallUISequence/LaunchConditions");
534 break;
535 case SymbolDefinitionType.MIME:
536 set.Add("AdvertiseExecuteSequence/RegisterMIMEInfo");
537 set.Add("InstallExecuteSequence/RegisterMIMEInfo");
538 set.Add("InstallExecuteSequence/UnregisterMIMEInfo");
539 break;
540 case SymbolDefinitionType.MoveFile:
541 set.Add("InstallExecuteSequence/MoveFiles");
542 break;
543 case SymbolDefinitionType.Assembly:
544 set.Add("AdvertiseExecuteSequence/MsiPublishAssemblies");
545 set.Add("InstallExecuteSequence/MsiPublishAssemblies");
546 set.Add("InstallExecuteSequence/MsiUnpublishAssemblies");
547 break;
548 case SymbolDefinitionType.MsiServiceConfig:
549 case SymbolDefinitionType.MsiServiceConfigFailureActions:
550 set.Add("InstallExecuteSequence/MsiConfigureServices");
551 break;
552 case SymbolDefinitionType.ODBCDataSource:
553 case SymbolDefinitionType.ODBCTranslator:
554 case SymbolDefinitionType.ODBCDriver:
555 set.Add("InstallExecuteSequence/SetODBCFolders");
556 set.Add("InstallExecuteSequence/InstallODBC");
557 set.Add("InstallExecuteSequence/RemoveODBC");
558 break;
559 case SymbolDefinitionType.ProgId:
560 set.Add("AdvertiseExecuteSequence/RegisterProgIdInfo");
561 set.Add("InstallExecuteSequence/RegisterProgIdInfo");
562 set.Add("InstallExecuteSequence/UnregisterProgIdInfo");
563 break;
564 case SymbolDefinitionType.PublishComponent:
565 set.Add("AdvertiseExecuteSequence/PublishComponents");
566 set.Add("InstallExecuteSequence/PublishComponents");
567 set.Add("InstallExecuteSequence/UnpublishComponents");
568 break;
569 case SymbolDefinitionType.Registry:
570 case SymbolDefinitionType.RemoveRegistry:
571 set.Add("InstallExecuteSequence/WriteRegistryValues");
572 set.Add("InstallExecuteSequence/RemoveRegistryValues");
573 break;
574 case SymbolDefinitionType.RemoveFile:
575 set.Add("InstallExecuteSequence/RemoveFiles");
576 break;
577 case SymbolDefinitionType.ServiceControl:
578 set.Add("InstallExecuteSequence/StartServices");
579 set.Add("InstallExecuteSequence/StopServices");
580 set.Add("InstallExecuteSequence/DeleteServices");
581 break;
582 case SymbolDefinitionType.ServiceInstall:
583 set.Add("InstallExecuteSequence/InstallServices");
584 break;
585 case SymbolDefinitionType.Shortcut:
586 set.Add("AdvertiseExecuteSequence/CreateShortcuts");
587 set.Add("InstallExecuteSequence/CreateShortcuts");
588 set.Add("InstallExecuteSequence/RemoveShortcuts");
589 break;
590 case SymbolDefinitionType.TypeLib:
591 set.Add("InstallExecuteSequence/RegisterTypeLibraries");
592 set.Add("InstallExecuteSequence/UnregisterTypeLibraries");
593 break;
594 case SymbolDefinitionType.Upgrade:
595 set.Add("InstallExecuteSequence/FindRelatedProducts");
596 set.Add("InstallUISequence/FindRelatedProducts");
597
598 // Only add the MigrateFeatureStates action if MigrateFeature attribute is set on
599 // at least one UpgradeVersion element.
600 if (this.Section.Symbols.OfType<UpgradeSymbol>().Any(t => t.MigrateFeatures))
601 {
602 set.Add("InstallExecuteSequence/MigrateFeatureStates");
603 set.Add("InstallUISequence/MigrateFeatureStates");
604 }
605 break;
606 }
558 } 607 }
559 608
560 /// <summary> 609 /// <summary>
@@ -661,8 +710,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
661 710
662 return parentActionSymbol; 711 return parentActionSymbol;
663 } 712 }
664 713
665
666 private RelativeActions GetRelativeActions(WixActionSymbol action) 714 private RelativeActions GetRelativeActions(WixActionSymbol action)
667 { 715 {
668 if (!this.RelativeActionsForActions.TryGetValue(action.Id.Id, out var relativeActions)) 716 if (!this.RelativeActionsForActions.TryGetValue(action.Id.Id, out var relativeActions))
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs
index 3194ed7a..d1025971 100644
--- a/src/wix/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs
@@ -980,5 +980,38 @@ namespace WixToolsetTest.CoreIntegration
980 }, results); 980 }, results);
981 } 981 }
982 } 982 }
983
984 [Fact]
985 public void EnsureTableSchedulesAppropriateStandardActions()
986 {
987 var folder = TestData.Get(@"TestData\EnsureTable");
988
989 using (var fs = new DisposableFileSystem())
990 {
991 var baseFolder = fs.GetFolder();
992 var intermediateFolder = Path.Combine(baseFolder, "obj");
993 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
994
995 var result = WixRunner.Execute(new[]
996 {
997 "build",
998 Path.Combine(folder, "StandardActions.wxs"),
999 "-intermediateFolder", intermediateFolder,
1000 "-o", msiPath
1001 });
1002
1003 result.AssertSuccess();
1004
1005 var results = Query.QueryDatabase(msiPath, new[] { "InstallExecuteSequence" });
1006 WixAssert.CompareLineByLine(new[]
1007 {
1008 "InstallExecuteSequence:AppSearch\t\t50",
1009 "InstallExecuteSequence:CCPSearch\tNOT Installed\t500",
1010 "InstallExecuteSequence:FileCost\t\t900",
1011 "InstallExecuteSequence:RemoveFiles\t\t3500",
1012 "InstallExecuteSequence:RMCCPSearch\tNOT Installed\t600",
1013 }, results.Where(l => l.Contains("Search") || l.Contains("File")).ToArray());
1014 }
1015 }
983 } 1016 }
984} 1017}
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/EnsureTable/StandardActions.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/EnsureTable/StandardActions.wxs
new file mode 100644
index 00000000..e37330e8
--- /dev/null
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/EnsureTable/StandardActions.wxs
@@ -0,0 +1,7 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 <Package Name="EnsureTable_StandardActions" Manufacturer="WiX Toolset Worldwide" Version="1.0" UpgradeCode="{EB227D6E-1559-47E4-BE0A-B5E921D68B9C}">
4 <EnsureTable Id="CCPSearch" />
5 <EnsureTable Id="RemoveFile" />
6 </Package>
7</Wix>