public void CanMergeModule() { var folder = TestData.Get(@"TestData\SimpleMerge"); using (var fs = new DisposableFileSystem()) { var intermediateFolder = fs.GetFolder(); var msiPath = Path.Combine(intermediateFolder, @"bin\test.msi"); var cabPath = Path.Combine(intermediateFolder, @"bin\cab1.cab"); var result = WixRunner.Execute(new[] { "build", Path.Combine(folder, "Package.wxs"), "-loc", Path.Combine(folder, "Package.en-us.wxl"), "-bindpath", Path.Combine(folder, ".data"), "-intermediateFolder", intermediateFolder, "-o", msiPath }); result.AssertSuccess(); Assert.True(File.Exists(msiPath)); Assert.True(File.Exists(Path.Combine(intermediateFolder, @"bin\test.wixpdb"))); var intermediate = Intermediate.Load(Path.Combine(intermediateFolder, @"bin\test.wixpdb")); var section = intermediate.Sections.Single(); Assert.Empty(section.Symbols.OfType <FileSymbol>()); var data = WindowsInstallerData.Load(Path.Combine(intermediateFolder, @"bin\test.wixpdb")); Assert.Null(data.Tables["File"]); var results = Query.QueryDatabase(msiPath, new[] { "File" }); WixAssert.CompareLineByLine(new[] { "File:filyIq8rqcxxf903Hsn5K9L0SWV73g.243FB739_4D05_472F_9CFB_EF6B1017B6DE\tModuleComponent.243FB739_4D05_472F_9CFB_EF6B1017B6DE\ttest.txt\t17\t\t\t512\t0" }, results); var files = Query.GetCabinetFiles(cabPath); WixAssert.CompareLineByLine(new[] { "filyIq8rqcxxf903Hsn5K9L0SWV73g.243FB739_4D05_472F_9CFB_EF6B1017B6DE" }, files.Select(f => f.Name).ToArray()); } }
public void CanBuildX64Bundle() { var folder = TestData.Get(@"TestData\SimpleBundle"); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var intermediateFolder = Path.Combine(baseFolder, "obj"); var exePath = Path.Combine(baseFolder, @"bin\test.exe"); var pdbPath = Path.Combine(baseFolder, @"bin\test.wixpdb"); var baFolderPath = Path.Combine(baseFolder, "ba"); var extractFolderPath = Path.Combine(baseFolder, "extract"); var result = WixRunner.Execute(false, new[] // TODO: go back to elevating warnings as errors. { "build", "-arch", "x64", Path.Combine(folder, "Bundle.wxs"), "-loc", Path.Combine(folder, "Bundle.en-us.wxl"), "-bindpath", Path.Combine(folder, "data"), "-intermediateFolder", intermediateFolder, "-o", exePath, }); result.AssertSuccess(); var warning = Assert.Single(result.Messages.Where(m => m.Level == MessageLevel.Warning)); Assert.Equal((int)WarningMessages.Ids.ExperimentalBundlePlatform, warning.Id); Assert.True(File.Exists(exePath)); Assert.True(File.Exists(pdbPath)); var manifestResource = new Resource(ResourceType.Manifest, "#1", 1033); manifestResource.Load(exePath); var actualManifestData = Encoding.UTF8.GetString(manifestResource.Data); Assert.Equal("<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<assembly manifestVersion=\"1.0\" xmlns=\"urn:schemas-microsoft-com:asm.v1\">" + "<assemblyIdentity name=\"test.exe\" version=\"1.0.0.0\" processorArchitecture=\"amd64\" type=\"win32\" />" + "<description>~TestBundle</description>" + "<dependency><dependentAssembly><assemblyIdentity name=\"Microsoft.Windows.Common-Controls\" version=\"6.0.0.0\" processorArchitecture=\"amd64\" publicKeyToken=\"6595b64144ccf1df\" language=\"*\" type=\"win32\" /></dependentAssembly></dependency>" + "<compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\"><application><supportedOS Id=\"{e2011457-1546-43c5-a5fe-008deee3d3f0}\" /><supportedOS Id=\"{35138b9a-5d96-4fbd-8e2d-a2440225f93a}\" /><supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\" /><supportedOS Id=\"{1f676c76-80e1-4239-95bb-83d0f6d0da78}\" /><supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\" /></application></compatibility>" + "<trustInfo xmlns=\"urn:schemas-microsoft-com:asm.v3\"><security><requestedPrivileges><requestedExecutionLevel level=\"asInvoker\" uiAccess=\"false\" /></requestedPrivileges></security></trustInfo>" + "<application xmlns=\"urn:schemas-microsoft-com:asm.v3\"><windowsSettings><dpiAware xmlns=\"http://schemas.microsoft.com/SMI/2005/WindowsSettings\">true/pm</dpiAware><dpiAwareness xmlns=\"http://schemas.microsoft.com/SMI/2016/WindowsSettings\">PerMonitorV2, PerMonitor</dpiAwareness></windowsSettings></application>" + "</assembly>", actualManifestData); } }
public void CanGetDefaultName() { var folder = TestData.Get(@"TestData"); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var intermediateFolder = Path.Combine(baseFolder, "obj"); var msiPath = Path.Combine(baseFolder, @"bin\test.msi"); var result = WixRunner.Execute(new[] { "build", Path.Combine(folder, "Directory", "DefaultName.wxs"), Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"), "-bindpath", Path.Combine(folder, "SingleFile", "data"), "-intermediateFolder", intermediateFolder, "-o", msiPath }); result.AssertSuccess(); var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb")); var section = intermediate.Sections.Single(); var dirSymbols = section.Symbols.OfType <WixToolset.Data.Symbols.DirectorySymbol>().ToList(); WixAssert.CompareLineByLine(new[] { "BinFolder\tCompanyFolder\t.", "CompanyFolder\tProgramFilesFolder\tExample Corporation", "ProgramFilesFolder\tTARGETDIR\tPFiles", "TARGETDIR\t\tSourceDir" }, dirSymbols.OrderBy(d => d.Id.Id).Select(d => String.Join('\t', d.Id.Id, d.ParentDirectoryRef, d.Name)).ToArray()); var data = WindowsInstallerData.Load(Path.Combine(baseFolder, @"bin\test.wixpdb")); var directoryRows = data.Tables["Directory"].Rows; WixAssert.CompareLineByLine(new[] { "BinFolder\tCompanyFolder\t.", "CompanyFolder\tProgramFilesFolder\tu7-b4gch|Example Corporation", "ProgramFilesFolder\tTARGETDIR\tPFiles", "TARGETDIR\t\tSourceDir" }, directoryRows.Select(r => String.Join('\t', r.FieldAsString(0), r.FieldAsString(1), r.FieldAsString(2))).ToArray()); } }
public void ErrorWhenRequireDetectCondition() { var folder = TestData.Get(@"TestData", "ExePackage"); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var result = WixRunner.Execute(new[] { "build", Path.Combine(folder, "RequireDetectCondition.wxs"), "-o", Path.Combine(baseFolder, "test.wixlib") }); Assert.Equal(401, result.ExitCode); } }
public void PopulatesBAManifestWithPayloadInformation() { var folder = TestData.Get(@"TestData"); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var intermediateFolder = Path.Combine(baseFolder, "obj"); var bundlePath = Path.Combine(baseFolder, @"bin\test.exe"); var baFolderPath = Path.Combine(baseFolder, "ba"); var extractFolderPath = Path.Combine(baseFolder, "extract"); var result = WixRunner.Execute(false, new[] { "build", Path.Combine(folder, "SharedPayloadsBetweenPackages", "SharedPayloadsBetweenPackages.wxs"), Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"), "-bindpath", Path.Combine(folder, ".Data"), "-bindpath", Path.Combine(folder, "SimpleBundle", "data"), "-intermediateFolder", intermediateFolder, "-o", bundlePath }); result.AssertSuccess(); Assert.True(File.Exists(bundlePath)); var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath); extractResult.AssertSuccess(); var payloadElements = extractResult.SelectBADataNodes("/ba:BootstrapperApplicationData/ba:WixPayloadProperties"); var ignoreAttributesByElementName = new Dictionary <string, List <string> > { { "WixPayloadProperties", new List <string> { "Size" } }, }; Assert.Equal(4, payloadElements.Count); Assert.Equal("<WixPayloadProperties Package='credwiz.exe' Payload='SourceFilePayload' Container='WixAttachedContainer' Name='SharedPayloadsBetweenPackages.wxs' Size='*' LayoutOnly='no' />", payloadElements[0].GetTestXml(ignoreAttributesByElementName)); Assert.Equal("<WixPayloadProperties Package='credwiz.exe' Payload='credwiz.exe' Container='WixAttachedContainer' Name='credwiz.exe' Size='*' LayoutOnly='no' />", payloadElements[1].GetTestXml(ignoreAttributesByElementName)); Assert.Equal("<WixPayloadProperties Package='cscript.exe' Payload='SourceFilePayload' Container='WixAttachedContainer' Name='SharedPayloadsBetweenPackages.wxs' Size='*' LayoutOnly='no' />", payloadElements[2].GetTestXml(ignoreAttributesByElementName)); Assert.Equal("<WixPayloadProperties Package='cscript.exe' Payload='cscript.exe' Container='WixAttachedContainer' Name='cscript.exe' Size='*' LayoutOnly='no' />", payloadElements[3].GetTestXml(ignoreAttributesByElementName)); } }
public void PopulatesCustomTableWithFilePathSerialized() { var folder = TestData.Get(@"TestData"); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var intermediateFolder = Path.Combine(baseFolder, "obj"); var wixlibPath = Path.Combine(baseFolder, @"bin\test.wixlib"); var msiPath = Path.Combine(baseFolder, @"bin\test.msi"); var result = WixRunner.Execute(new[] { "build", Path.Combine(folder, "CustomTable", "CustomTableWithFile.wxs"), "-bindpath", Path.Combine(folder, "CustomTable", "data"), "-intermediateFolder", intermediateFolder, "-o", wixlibPath }); result.AssertSuccess(); result = WixRunner.Execute(new[] { "build", Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"), Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"), "-lib", wixlibPath, "-bindpath", Path.Combine(folder, "CustomTable", "data"), "-intermediateFolder", intermediateFolder, "-o", msiPath }); result.AssertSuccess(); Assert.True(File.Exists(msiPath)); var results = Query.QueryDatabase(msiPath, new[] { "CustomTableWithFile" }); Assert.Equal(new[] { "CustomTableWithFile:Row1\t[Binary data]", "CustomTableWithFile:Row2\t[Binary data]", }, results); } }
public void CanBuildManualUpgrade() { var folder = TestData.Get(@"TestData\ManualUpgrade"); using (var fs = new DisposableFileSystem()) { var intermediateFolder = fs.GetFolder(); var result = WixRunner.Execute(new[] { "build", Path.Combine(folder, "Package.wxs"), Path.Combine(folder, "PackageComponents.wxs"), "-loc", Path.Combine(folder, "Package.en-us.wxl"), "-bindpath", Path.Combine(folder, "data"), "-intermediateFolder", intermediateFolder, "-o", Path.Combine(intermediateFolder, @"bin\test.msi") }, out var messages); Assert.Equal(0, result); var pdbPath = Path.Combine(intermediateFolder, @"bin\test.wixpdb"); Assert.True(File.Exists(Path.Combine(intermediateFolder, @"bin\test.msi"))); Assert.True(File.Exists(pdbPath)); Assert.True(File.Exists(Path.Combine(intermediateFolder, @"bin\MsiPackage\test.txt"))); var intermediate = Intermediate.Load(pdbPath); var section = intermediate.Sections.Single(); var upgradeSymbol = section.Symbols.OfType <UpgradeSymbol>().Single(); Assert.False(upgradeSymbol.ExcludeLanguages); Assert.True(upgradeSymbol.IgnoreRemoveFailures); Assert.False(upgradeSymbol.VersionMaxInclusive); Assert.True(upgradeSymbol.VersionMinInclusive); Assert.Equal("13.0.0", upgradeSymbol.VersionMax); Assert.Equal("12.0.0", upgradeSymbol.VersionMin); Assert.False(upgradeSymbol.OnlyDetect); Assert.Equal("BLAHBLAHBLAH", upgradeSymbol.ActionProperty); var pdb = WindowsInstallerData.Load(pdbPath, suppressVersionCheck: false); var secureProperties = pdb.Tables["Property"].Rows.Where(row => row.GetKey() == "SecureCustomProperties").Single(); Assert.Contains("BLAHBLAHBLAH", secureProperties.FieldAsString(1)); } }
public void CannotBuildWithMissingVersionedExtension() { var folder = TestData.Get(@"TestData\ExampleExtension"); using (var fs = new DisposableFileSystem()) { var intermediateFolder = fs.GetFolder(); var exception = Assert.Throws <WixException>(() => WixRunner.Execute(new[] { "build", Path.Combine(folder, "Package.wxs"), "-ext", "ExampleExtension.DoesNotExist/1.0.0" })); Assert.StartsWith("The extension 'ExampleExtension.DoesNotExist/1.0.0' could not be found. Checked paths: ", exception.Message); } }
public void CanBuildVersionIndependentProgId() { var folder = TestData.Get(@"TestData\ProgId"); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var intermediateFolder = Path.Combine(baseFolder, "obj"); var result = WixRunner.Execute(new[] { "build", Path.Combine(folder, "Package.wxs"), Path.Combine(folder, "PackageComponents.wxs"), "-loc", Path.Combine(folder, "Package.en-us.wxl"), "-bindpath", Path.Combine(folder, "data"), "-intermediateFolder", intermediateFolder, "-o", Path.Combine(baseFolder, @"bin\test.msi") }); result.AssertSuccess(); Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.msi"))); Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.wixpdb"))); Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\MsiPackage\Foo.exe"))); var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb")); var section = intermediate.Sections.Single(); var progids = section.Symbols.OfType <ProgIdSymbol>().OrderBy(symbol => symbol.ProgId).ToList(); Assert.Equal(new[] { "Foo.File.hol", "Foo.File.hol.15" }, progids.Select(p => p.ProgId).ToArray()); Assert.Equal(new[] { "Foo.File.hol.15", null }, progids.Select(p => p.ParentProgIdRef).ToArray()); } }
public void CanConvertSingleFile() { const string beforeFileName = "SingleFile.wxs"; const string afterFileName = "ConvertedSingleFile.wxs"; var folder = TestData.Get(@"TestData\SingleFile"); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(true); var targetFile = Path.Combine(baseFolder, beforeFileName); File.Copy(Path.Combine(folder, beforeFileName), Path.Combine(baseFolder, beforeFileName)); var runner = new WixCopRunner { FixErrors = true, SearchPatterns = { targetFile, }, }; var result = runner.Execute(); Assert.Equal(2, result.ExitCode); var expected = File.ReadAllText(Path.Combine(folder, afterFileName)).Replace("\r\n", "\n"); var actual = File.ReadAllText(targetFile).Replace("\r\n", "\n"); Assert.Equal(expected, actual); var runner2 = new WixCopRunner { FixErrors = true, SearchPatterns = { targetFile, }, }; var result2 = runner2.Execute(); Assert.Equal(0, result2.ExitCode); } }
public void PopulatesBAManifestWithPackageInformation() { var folder = TestData.Get(@"TestData"); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var intermediateFolder = Path.Combine(baseFolder, "obj"); var bundlePath = Path.Combine(baseFolder, @"bin\test.exe"); var baFolderPath = Path.Combine(baseFolder, "ba"); var extractFolderPath = Path.Combine(baseFolder, "extract"); var result = WixRunner.Execute(false, new[] { "build", Path.Combine(folder, "CustomPackageDescription", "CustomPackageDescription.wxs"), Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"), "-bindpath", Path.Combine(folder, ".Data"), "-bindpath", Path.Combine(folder, "SimpleBundle", "data"), "-intermediateFolder", intermediateFolder, "-o", bundlePath }); result.AssertSuccess(); Assert.True(File.Exists(bundlePath)); var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath); extractResult.AssertSuccess(); var packageElements = extractResult.SelectBADataNodes("/ba:BootstrapperApplicationData/ba:WixPackageProperties"); var ignoreAttributesByElementName = new Dictionary <string, List <string> > { { "WixPackageProperties", new List <string> { "DownloadSize", "PackageSize", "InstalledSize", "Version" } }, }; Assert.Equal(3, packageElements.Count); Assert.Equal("<WixPackageProperties Package='burn.exe' Vital='yes' DisplayName='Windows Installer XML Toolset' Description='WiX Toolset Bootstrapper' DownloadSize='*' PackageSize='*' InstalledSize='*' PackageType='Exe' Permanent='yes' LogPathVariable='WixBundleLog_burn.exe' RollbackLogPathVariable='WixBundleRollbackLog_burn.exe' Compressed='yes' Version='*' Cache='keep' />", packageElements[0].GetTestXml(ignoreAttributesByElementName)); Assert.Equal("<WixPackageProperties Package='RemotePayloadExe' Vital='yes' DisplayName='Override RemotePayload display name' Description='Override RemotePayload description' DownloadSize='1' PackageSize='1' InstalledSize='1' PackageType='Exe' Permanent='yes' LogPathVariable='WixBundleLog_RemotePayloadExe' RollbackLogPathVariable='WixBundleRollbackLog_RemotePayloadExe' Compressed='no' Version='1.0.0.0' Cache='keep' />", packageElements[1].GetTestXml()); Assert.Equal("<WixPackageProperties Package='calc.exe' Vital='yes' DisplayName='Override harvested display name' Description='Override harvested description' DownloadSize='*' PackageSize='*' InstalledSize='*' PackageType='Exe' Permanent='yes' LogPathVariable='WixBundleLog_calc.exe' RollbackLogPathVariable='WixBundleRollbackLog_calc.exe' Compressed='yes' Version='*' Cache='keep' />", packageElements[2].GetTestXml(ignoreAttributesByElementName)); } }
public void CanBuildMsiUsingExtensionLibrary() { var folder = TestData.Get(@"TestData\Wixipl"); var extensionPath = Path.GetFullPath(new Uri(typeof(ExampleExtensionFactory).Assembly.CodeBase).LocalPath); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var intermediateFolder = Path.Combine(baseFolder, "obj"); var result = WixRunner.Execute(new[] { "build", "-ext", extensionPath, Path.Combine(folder, "Package.wxs"), Path.Combine(folder, "PackageComponents.wxs"), "-loc", Path.Combine(folder, "Package.en-us.wxl"), "-bindpath", Path.Combine(folder, "data"), "-intermediateFolder", intermediateFolder, "-o", Path.Combine(baseFolder, @"bin\test.msi"), }); result.AssertSuccess(); var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb")); var section = intermediate.Sections.Single(); { var fileSymbol = section.Symbols.OfType <FileSymbol>().Single(); Assert.Equal(Path.Combine(folder, @"data\test.txt"), fileSymbol[FileSymbolFields.Source].AsPath().Path); Assert.Equal(@"test.txt", fileSymbol[FileSymbolFields.Source].PreviousValue.AsPath().Path); } { var binary = section.Symbols.OfType <BinarySymbol>().Single(); var path = binary[BinarySymbolFields.Data].AsPath().Path; Assert.StartsWith(Path.Combine(baseFolder, @"obj\Example.Extension"), path); Assert.EndsWith(@"wix-ir\example.txt", path); Assert.Equal(@"BinFromWir", binary.Id.Id); } } }
public void PopulatesManifestWithExePackages() { var folder = TestData.Get(@"TestData"); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var intermediateFolder = Path.Combine(baseFolder, "obj"); var bundlePath = Path.Combine(baseFolder, @"bin\test.exe"); var baFolderPath = Path.Combine(baseFolder, "ba"); var extractFolderPath = Path.Combine(baseFolder, "extract"); var result = WixRunner.Execute(false, new[] { "build", Path.Combine(folder, "SharedPayloadsBetweenPackages", "SharedPayloadsBetweenPackages.wxs"), Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"), "-bindpath", Path.Combine(folder, ".Data"), "-bindpath", Path.Combine(folder, "SimpleBundle", "data"), "-intermediateFolder", intermediateFolder, "-o", bundlePath }); result.AssertSuccess(); Assert.True(File.Exists(bundlePath)); var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath); extractResult.AssertSuccess(); var exePackageElements = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Chain/burn:ExePackage"); var ignoreAttributesByElementName = new Dictionary <string, List <string> > { { "ExePackage", new List <string> { "CacheId", "InstallSize", "Size" } }, }; Assert.Equal(2, exePackageElements.Count); Assert.Equal("<ExePackage Id='credwiz.exe' Cache='keep' CacheId='*' InstallSize='*' Size='*' PerMachine='yes' Permanent='yes' Vital='yes' RollbackBoundaryForward='WixDefaultBoundary' LogPathVariable='WixBundleLog_credwiz.exe' RollbackLogPathVariable='WixBundleRollbackLog_credwiz.exe' DetectCondition='' InstallArguments='' UninstallArguments='' RepairArguments='' Repairable='no'><PayloadRef Id='credwiz.exe' /><PayloadRef Id='SourceFilePayload' /></ExePackage>", exePackageElements[0].GetTestXml(ignoreAttributesByElementName)); Assert.Equal("<ExePackage Id='cscript.exe' Cache='keep' CacheId='*' InstallSize='*' Size='*' PerMachine='yes' Permanent='yes' Vital='yes' RollbackBoundaryBackward='WixDefaultBoundary' LogPathVariable='WixBundleLog_cscript.exe' RollbackLogPathVariable='WixBundleRollbackLog_cscript.exe' DetectCondition='' InstallArguments='' UninstallArguments='' RepairArguments='' Repairable='no'><PayloadRef Id='cscript.exe' /><PayloadRef Id='SourceFilePayload' /></ExePackage>", exePackageElements[1].GetTestXml(ignoreAttributesByElementName)); } }
public void PopulatesUpgradeTableFromDetectOnlyUpgrade() { var folder = TestData.Get(@"TestData"); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var intermediateFolder = Path.Combine(baseFolder, "obj"); var msiPath = Path.Combine(baseFolder, @"bin\test.msi"); var result = WixRunner.Execute(new[] { "build", Path.Combine(folder, "Upgrade", "DetectOnly.wxs"), Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"), Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"), "-bindpath", Path.Combine(folder, "SingleFile", "data"), "-intermediateFolder", intermediateFolder, "-o", msiPath }); result.AssertSuccess(); Assert.True(File.Exists(msiPath)); var results = Query.QueryDatabase(msiPath, new[] { "Upgrade" }); Assert.Equal(new[] { "Upgrade:{12E4699F-E774-4D05-8A01-5BDD41BBA127}\t\t1.0.0.0\t1033\t1\t\tWIX_UPGRADE_DETECTED", "Upgrade:{12E4699F-E774-4D05-8A01-5BDD41BBA127}\t1.0.0.0\t\t1033\t2\t\tWIX_DOWNGRADE_DETECTED", "Upgrade:{B05772EA-82B8-4DE0-B7EB-45B5F0CCFE6D}\t1.0.0\t\t\t256\t\tRELPRODFOUND", }, results); var prefix = "Property:SecureCustomProperties\t"; var secureProperties = Query.QueryDatabase(msiPath, new[] { "Property" }).Where(p => p.StartsWith(prefix)).Single(); Assert.Equal(new[] { "RELPRODFOUND", "WIX_DOWNGRADE_DETECTED", "WIX_UPGRADE_DETECTED", }, secureProperties.Substring(prefix.Length).Split(';').OrderBy(p => p)); } }
public void CanReloadFullFramework4MBA() { using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var bundleFile = TestData.Get(bundleBasePath, "FullFramework4Bundle.exe"); var testEngine = new TestEngine(); var result = testEngine.RunReloadEngine(bundleFile, baseFolder); var logMessages = result.Output; Assert.Equal("Loading managed bootstrapper application.", logMessages[0]); Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]); Assert.Equal("FullFramework4BA", logMessages[2]); Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]); Assert.Equal("Loading managed bootstrapper application.", logMessages[4]); Assert.Equal("Creating BA thread to run asynchronously.", logMessages[5]); Assert.Equal("FullFramework4BA", logMessages[6]); Assert.Equal("Shutdown,Restart,0", logMessages[7]); } }
public void CanBuildSimpleMsiPackageWithIceSuppressions() { var projectPath = TestData.Get(@"TestData\SimpleMsiPackage\MsiPackage\MsiPackage.wixproj"); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var binFolder = Path.Combine(baseFolder, @"bin\"); var intermediateFolder = Path.Combine(baseFolder, @"obj\"); var result = MsbuildRunner.Execute(projectPath, new[] { $"-p:WixTargetsPath={WixTargetsPath}", $"-p:IntermediateOutputPath={intermediateFolder}", $"-p:OutputPath={binFolder}", "-p:SuppressIces=\"ICE45;ICE46\"" }); result.AssertSuccess(); } }
public void PopulatesDirectoryTableWithValidDefaultDir() { var folder = TestData.Get(@"TestData"); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var intermediateFolder = Path.Combine(baseFolder, "obj"); var msiPath = Path.Combine(baseFolder, @"bin\test.msi"); var result = WixRunner.Execute(new[] { "build", Path.Combine(folder, "DefaultDir", "DefaultDir.wxs"), Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"), "-bindpath", Path.Combine(folder, "SingleFile", "data"), "-intermediateFolder", intermediateFolder, "-o", msiPath }); result.AssertSuccess(); Assert.True(File.Exists(msiPath)); var results = Query.QueryDatabase(msiPath, new[] { "Directory" }); Assert.Equal(new[] { "Directory:DUPLICATENAMEANDSHORTNAME\tINSTALLFOLDER\tduplicat", "Directory:INSTALLFOLDER\tProgramFilesFolder\toekcr5lq|MsiPackage", "Directory:NAMEANDSHORTNAME\tINSTALLFOLDER\tSHORTNAM|NameAndShortName", "Directory:NAMEANDSHORTSOURCENAME\tINSTALLFOLDER\tNAMEASSN|NameAndShortSourceName", "Directory:NAMEWITHSHORTVALUE\tINSTALLFOLDER\tSHORTVAL", "Directory:ProgramFilesFolder\tTARGETDIR\t.", "Directory:SHORTNAMEANDLONGSOURCENAME\tINSTALLFOLDER\tSHNALSNM:6ukthv5q|ShortNameAndLongSourceName", "Directory:SHORTNAMEONLY\tINSTALLFOLDER\tSHORTONL", "Directory:SOURCENAME\tINSTALLFOLDER\ts2s5bq-i|NameAndSourceName:dhnqygng|SourceNameWithName", "Directory:SOURCENAMESONLY\tINSTALLFOLDER\t.:SRCNAMON|SourceNameOnly", "Directory:SOURCENAMEWITHSHORTVALUE\tINSTALLFOLDER\t.:SRTSRCVL", "Directory:TARGETDIR\t\tSourceDir", }, results); } }
public void CanBuildWithExampleExtension() { var folder = TestData.Get(@"TestData\ExampleExtension"); var extensionPath = Path.GetFullPath(new Uri(typeof(ExampleExtensionFactory).Assembly.CodeBase).LocalPath); using (var fs = new DisposableFileSystem()) { var intermediateFolder = fs.GetFolder(); var program = new Program(); var result = program.Run(new WixToolsetServiceProvider(), null, new[] { "build", Path.Combine(folder, "Package.wxs"), Path.Combine(folder, "PackageComponents.wxs"), "-loc", Path.Combine(folder, "Package.en-us.wxl"), "-ext", extensionPath, "-bindpath", Path.Combine(folder, "data"), "-intermediateFolder", intermediateFolder, "-o", Path.Combine(intermediateFolder, @"bin\extest.msi") }); Assert.Equal(0, result); Assert.True(File.Exists(Path.Combine(intermediateFolder, @"bin\extest.msi"))); Assert.True(File.Exists(Path.Combine(intermediateFolder, @"bin\extest.wixpdb"))); Assert.True(File.Exists(Path.Combine(intermediateFolder, @"bin\MsiPackage\example.txt"))); var intermediate = Intermediate.Load(Path.Combine(intermediateFolder, @"bin\extest.wir")); var section = intermediate.Sections.Single(); var wixFile = section.Tuples.OfType <WixFileTuple>().Single(); Assert.Equal(Path.Combine(folder, @"data\example.txt"), wixFile[WixFileTupleFields.Source].AsPath().Path); Assert.Equal(@"example.txt", wixFile[WixFileTupleFields.Source].PreviousValue.AsPath().Path); var example = section.Tuples.Where(t => t.Definition.Type == TupleDefinitionType.MustBeFromAnExtension).Single(); Assert.Equal("Foo", example.Id.Id); Assert.Equal("Foo", example[0].AsString()); Assert.Equal("Bar", example[1].AsString()); } }
public void CanBuildBundleUsingExePackageWithProvides() { var folder = TestData.Get(@"TestData"); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var intermediateFolder = Path.Combine(baseFolder, "obj"); var binFolder = Path.Combine(baseFolder, "bin"); var bundlePath = Path.Combine(binFolder, "test.exe"); var baFolderPath = Path.Combine(baseFolder, "ba"); var extractFolderPath = Path.Combine(baseFolder, "extract"); var result = WixRunner.Execute(new[] { "build", Path.Combine(folder, "Dependency", "ExePackageProvidesBundle.wxs"), Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"), "-bindpath", Path.Combine(folder, ".Data"), "-bindpath", Path.Combine(folder, "SimpleBundle", "data"), "-intermediateFolder", intermediateFolder, "-o", bundlePath, }); result.AssertSuccess(); Assert.True(File.Exists(bundlePath)); var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath); extractResult.AssertSuccess(); var provides = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Chain/burn:ExePackage/burn:Provides") .Cast <XmlElement>() .Select(e => e.GetTestXml()) .ToArray(); WixAssert.CompareLineByLine(new string[] { "<Provides Key='DependencyTests_ExeA,v1.0' Version='1.0.0.0' DisplayName='Windows Installer XML Toolset' />", }, provides); } }
public void ReportsInnerExceptionForUnexpectedExceptions() { var folder = TestData.Get(@"TestData\SimpleMsiPackage\MsiPackage"); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var intermediateFolder = Path.Combine(baseFolder, "obj"); var pdbPath = Path.Combine(baseFolder, @"bin\testpackage.wixpdb"); var engine = new FakeBuildEngine(); var task = new DoIt { BuildEngine = engine, SourceFiles = new[] { new TaskItem(Path.Combine(folder, "Package.wxs")), new TaskItem(Path.Combine(folder, "PackageComponents.wxs")), }, LocalizationFiles = new[] { new TaskItem(Path.Combine(folder, "Package.en-us.wxl")), }, BindInputPaths = new[] { new TaskItem(Path.Combine(folder, "data")), }, IntermediateDirectory = new TaskItem(intermediateFolder), OutputFile = new TaskItem(Path.Combine(baseFolder, @"bin\test.msi")), PdbType = "Full", PdbFile = new TaskItem(pdbPath), }; var result = task.Execute(); Assert.False(result, $"MSBuild task succeeded unexpectedly. Output:\r\n{engine.Output}"); Assert.Contains( "System.PlatformNotSupportedException: Could not find platform specific 'wixnative.exe' ---> System.IO.FileNotFoundException: Could not find internal piece of WiX Toolset from", engine.Output); } }
public void BundleVariableWithHiddenPersistedIsRejected() { var folder = TestData.Get(@"TestData\BadInput"); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var intermediateFolder = Path.Combine(baseFolder, "obj"); var wixlibPath = Path.Combine(intermediateFolder, @"test.wixlib"); var result = WixRunner.Execute(new[] { "build", Path.Combine(folder, "HiddenPersistedBundleVariable.wxs"), "-intermediateFolder", intermediateFolder, "-o", wixlibPath, }); Assert.Equal(193, result.ExitCode); } }
public void HandleInvalidIds() { var folder = TestData.Get(@"TestData\BadInput"); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var intermediateFolder = Path.Combine(baseFolder, "obj"); var wixlibPath = Path.Combine(intermediateFolder, @"test.wixlib"); var result = WixRunner.Execute(new[] { "build", Path.Combine(folder, "InvalidIds.wxs"), "-intermediateFolder", intermediateFolder, "-o", wixlibPath, }); Assert.Equal(330, result.ExitCode); } }
public void RegistryKeyWithoutAttributesDoesntCrash() { var folder = TestData.Get(@"TestData\BadInput"); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var intermediateFolder = Path.Combine(baseFolder, "obj"); var wixlibPath = Path.Combine(intermediateFolder, @"test.wixlib"); var result = WixRunner.Execute(new[] { "build", Path.Combine(folder, "RegistryKey.wxs"), "-intermediateFolder", intermediateFolder, "-o", wixlibPath, }); Assert.InRange(result.ExitCode, 2, Int32.MaxValue); } }
public void CanDetectReadOnlyOutputFile() { const string beforeFileName = "SingleFile.wxs"; var folder = TestData.Get(@"TestData\SingleFile"); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(true); var targetFile = Path.Combine(baseFolder, beforeFileName); File.Copy(Path.Combine(folder, beforeFileName), Path.Combine(baseFolder, beforeFileName)); var info = new FileInfo(targetFile); info.IsReadOnly = true; var messaging = new MockMessaging(); var converter = new WixConverter(messaging, 4); var errors = converter.ConvertFile(targetFile, true); Assert.Single(messaging.Messages.Where(m => m.Id == 5 /*WixConverter.ConverterTestType.UnauthorizedAccessException*/)); } }
public void CanReloadSCDEarliestCoreMBA() { using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var bundleFile = TestData.Get(bundleBasePath, "EarliestCoreBundleSCD.exe"); var testEngine = new TestEngine(); var result = testEngine.RunReloadEngine(bundleFile, baseFolder); var logMessages = result.Output; Assert.Equal("Loading .NET Core SCD bootstrapper application.", logMessages[0]); Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]); Assert.Equal("EarliestCoreBA", logMessages[2]); Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]); Assert.Equal("Loading .NET Core SCD bootstrapper application.", logMessages[4]); Assert.Equal("Reloaded 1 time(s)", logMessages[5]); // dnchost doesn't currently support unloading Assert.Equal("Creating BA thread to run asynchronously.", logMessages[6]); Assert.Equal("EarliestCoreBA", logMessages[7]); Assert.Equal("Shutdown,Restart,0", logMessages[8]); } }
public void CanBuildWithErrorTable() { var folder = TestData.Get(@"TestData\ErrorsInUI"); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var intermediateFolder = Path.Combine(baseFolder, "obj"); var result = WixRunner.Execute(new[] { "build", Path.Combine(folder, "Package.wxs"), Path.Combine(folder, "PackageComponents.wxs"), "-loc", Path.Combine(folder, "Package.en-us.wxl"), "-bindpath", Path.Combine(folder, "data"), "-intermediateFolder", intermediateFolder, "-o", Path.Combine(baseFolder, @"bin\test.msi") }); result.AssertSuccess(); Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.msi"))); Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.wixpdb"))); Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\MsiPackage\test.txt"))); var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb")); var section = intermediate.Sections.Single(); var errors = section.Symbols.OfType <ErrorSymbol>().ToDictionary(t => t.Id.Id); Assert.Equal("Category 55 Emergency Doomsday Crisis", errors["1234"].Message.Trim()); Assert.Equal(" ", errors["5678"].Message); var customAction1 = section.Symbols.OfType <CustomActionSymbol>().Where(t => t.Id.Id == "CanWeReferenceAnError_YesWeCan").Single(); Assert.Equal("1234", customAction1.Target); var customAction2 = section.Symbols.OfType <CustomActionSymbol>().Where(t => t.Id.Id == "TextErrorsWorkOKToo").Single(); Assert.Equal("If you see this, something went wrong.", customAction2.Target); } }
public void CanBuildSingleFile() { var folder = TestData.Get(@"TestData\SingleFile"); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var intermediateFolder = Path.Combine(baseFolder, "obj"); var result = WixRunner.Execute(new[] { "build", Path.Combine(folder, "Package.wxs"), Path.Combine(folder, "PackageComponents.wxs"), "-loc", Path.Combine(folder, "Package.en-us.wxl"), "-bindpath", Path.Combine(folder, "data"), "-intermediateFolder", intermediateFolder, "-o", Path.Combine(baseFolder, @"bin\test.msi") }); result.AssertSuccess(); Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.msi"))); Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.wixpdb"))); Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\MsiPackage\test.txt"))); var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb")); Assert.False(intermediate.HasLevel(WixToolset.Data.IntermediateLevels.Compiled)); Assert.True(intermediate.HasLevel(WixToolset.Data.IntermediateLevels.Linked)); Assert.True(intermediate.HasLevel(WixToolset.Data.IntermediateLevels.Resolved)); Assert.True(intermediate.HasLevel(WixToolset.Data.WindowsInstaller.IntermediateLevels.FullyBound)); var section = intermediate.Sections.Single(); var fileSymbol = section.Symbols.OfType <FileSymbol>().First(); Assert.Equal(Path.Combine(folder, @"data\test.txt"), fileSymbol[FileSymbolFields.Source].AsPath().Path); Assert.Equal(@"test.txt", fileSymbol[FileSymbolFields.Source].PreviousValue.AsPath().Path); } }
public void CanCompileAndDecompile() { var folder = TestData.Get(@"TestData"); var expectedFile = Path.Combine(folder, "CustomTable", "CustomTable-Expected.wxs"); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var intermediateFolder = Path.Combine(baseFolder, "obj"); var msiPath = Path.Combine(baseFolder, @"bin\test.msi"); var decompiledWxsPath = Path.Combine(baseFolder, @"decompiled.wxs"); var result = WixRunner.Execute(new[] { "build", "-d", "ProductCode=83f9c623-26fe-42ab-951e-170022117f54", Path.Combine(folder, "CustomTable", "CustomTable.wxs"), Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"), Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"), "-bindpath", Path.Combine(folder, "SingleFile", "data"), "-intermediateFolder", intermediateFolder, "-o", msiPath }); result.AssertSuccess(); Assert.True(File.Exists(msiPath)); result = WixRunner.Execute(new[] { "decompile", msiPath, "-sw1060", "-intermediateFolder", intermediateFolder, "-o", decompiledWxsPath }); result.AssertSuccess(); WixAssert.CompareXml(expectedFile, decompiledWxsPath); } }
public void PopulatesManifestWithSetVariables() { var folder = TestData.Get(@"TestData"); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var intermediateFolder = Path.Combine(baseFolder, "obj"); var bundlePath = Path.Combine(baseFolder, @"bin\test.exe"); var baFolderPath = Path.Combine(baseFolder, "ba"); var extractFolderPath = Path.Combine(baseFolder, "extract"); var result = WixRunner.Execute(new[] { "build", Path.Combine(folder, "SetVariable", "Simple.wxs"), Path.Combine(folder, "BundleWithPackageGroupRef", "MinimalPackageGroup.wxs"), Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"), "-bindpath", Path.Combine(folder, "SimpleBundle", "data"), "-intermediateFolder", intermediateFolder, "-o", bundlePath }); result.AssertSuccess(); Assert.True(File.Exists(bundlePath)); var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath); extractResult.AssertSuccess(); var setVariables = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:SetVariable"); Assert.Equal(6, setVariables.Count); Assert.Equal("<SetVariable Id='SetCoercedNumber' Variable='CoercedNumber' Value='2' Type='numeric' />", setVariables[0].GetTestXml()); Assert.Equal("<SetVariable Id='SetCoercedString' Variable='CoercedString' Value='Bar' Type='string' />", setVariables[1].GetTestXml()); Assert.Equal("<SetVariable Id='SetCoercedVersion' Variable='CoercedVersion' Value='v2.0' Type='version' />", setVariables[2].GetTestXml()); Assert.Equal("<SetVariable Id='SetNeedsFormatting' Variable='NeedsFormatting' Value='[One] [Two] [Three]' Type='string' />", setVariables[3].GetTestXml()); Assert.Equal("<SetVariable Id='SetVersionString' Variable='VersionString' Value='v1.0' Type='string' />", setVariables[4].GetTestXml()); Assert.Equal("<SetVariable Id='SetUnset' Variable='Unset' Condition='VersionString = v2.0' />", setVariables[5].GetTestXml()); } }
public void CanBuildSingleFile() { var folder = TestData.Get(@"TestData\SingleFile"); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var intermediateFolder = Path.Combine(baseFolder, "obj"); var result = WixRunner.Execute(new[] { "build", Path.Combine(folder, "Package.wxs"), Path.Combine(folder, "PackageComponents.wxs"), "-intermediateFolder", intermediateFolder, "-o", Path.Combine(intermediateFolder, @"test.wixipl") }); result.AssertSuccess(); result = WixRunner.Execute(new[] { "build", Path.Combine(intermediateFolder, @"test.wixipl"), "-loc", Path.Combine(folder, "Package.en-us.wxl"), "-bindpath", Path.Combine(folder, "data"), "-intermediateFolder", intermediateFolder, "-o", Path.Combine(baseFolder, @"bin\test.msi") }); result.AssertSuccess(); var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"obj\test.wir")); var section = intermediate.Sections.Single(); var wixFile = section.Tuples.OfType <WixFileTuple>().Single(); Assert.Equal(Path.Combine(folder, @"data\test.txt"), wixFile[WixFileTupleFields.Source].AsPath().Path); Assert.Equal(@"test.txt", wixFile[WixFileTupleFields.Source].PreviousValue.AsPath().Path); } }