public void DisplayHelp() { Dark dark = new Dark(); dark.Help = true; dark.ExpectedOutputStrings.Add("usage: dark.exe [-?] [-nologo] database.msi [source.wxs]"); dark.ExpectedOutputStrings.Add("-ext <extension> extension assembly or \"class, assembly\""); dark.ExpectedOutputStrings.Add("-nologo skip printing dark logo information"); dark.ExpectedOutputStrings.Add("-notidy do not delete temporary files (useful for debugging)"); dark.ExpectedOutputStrings.Add("-o[ut] specify output file (default: write .wxs to current directory)"); dark.ExpectedOutputStrings.Add("-sct suppress decompiling custom tables"); dark.ExpectedOutputStrings.Add("-sdet suppress dropping empty tables (adds EnsureTable as appropriate)"); dark.ExpectedOutputStrings.Add("-sras suppress relative action sequencing"); dark.ExpectedOutputStrings.Add("(use explicit sequence numbers)"); dark.ExpectedOutputStrings.Add("-sui suppress decompiling UI-related tables"); dark.ExpectedOutputStrings.Add("-sw[N] suppress all warnings or a specific message ID"); dark.ExpectedOutputStrings.Add("(example: -sw1059 -sw1067)"); dark.ExpectedOutputStrings.Add("-swall suppress all warnings (deprecated)"); dark.ExpectedOutputStrings.Add("-v verbose output"); dark.ExpectedOutputStrings.Add("-wx[N] treat all warnings or a specific message ID as an error"); dark.ExpectedOutputStrings.Add("(example: -wx1059 -wx1067)"); dark.ExpectedOutputStrings.Add("-wxall treat all warnings as errors (deprecated)"); dark.ExpectedOutputStrings.Add("-x <path> export binaries from cabinets and embedded binaries to <path>"); dark.ExpectedOutputStrings.Add("-xo output wixout instead of WiX source code"); dark.ExpectedOutputStrings.Add("(mandatory for transforms and patches)"); dark.ExpectedOutputStrings.Add("-? | -help this help information"); dark.ExpectedOutputStrings.Add("Environment variables:"); dark.ExpectedOutputStrings.Add("WIX_TEMP overrides the temporary directory used for cab extraction, binary extraction, ..."); dark.ExpectedOutputStrings.Add("For more information see: http://wix.sourceforge.net"); dark.Run(); }
public void InvalidOutputFileName() { string[] invalidFileNames = new string[] { "testfile>msi", "testfile<msi", "testfile?msi", "testfile|msi", "testfile*msi" }; Dark dark; foreach (string invalidFileName in invalidFileNames) { dark = new Dark(); dark.InputFile = Path.Combine(WixTests.SharedBaselinesDirectory, @"MSIs\BasicProduct.msi"); dark.OutputFile = string.Empty; dark.OtherArguments = " -out " + invalidFileName; string expectedOutput = string.Format("Invalid file name specified on the command line: '{0}'. Error message: 'Illegal characters in path.'", invalidFileName); dark.ExpectedWixMessages.Add(new WixMessage(284, expectedOutput, WixMessage.MessageTypeEnum.Error)); dark.ExpectedExitCode = 284; dark.Run(); } // test for quotes dark = new Dark(); dark.InputFile = Path.Combine(WixTests.SharedBaselinesDirectory, @"MSIs\BasicProduct.msi"); dark.OutputFile = string.Empty; dark.OtherArguments = " -out testfile\\\"msi"; string expectedOutput2 = string.Format("Your file or directory path '{0}' cannot contain a quote. Quotes are often accidentally introduced when trying to refer to a directory path with spaces in it, such as \"C:\\Out Directory\\\". The correct representation for that path is: \"C:\\Out Directory\\\\\".", "testfile\"msi"); dark.ExpectedWixMessages.Add(new WixMessage(117, expectedOutput2, WixMessage.MessageTypeEnum.Error)); dark.ExpectedExitCode = 117; dark.Run(); }
/// <summary> /// Disassembles the built item. /// </summary> /// <returns>The directory containing the disassembled package source.</returns> /// <exception cref="InvalidOperationException">The item has not been built yet.</exception> /// <exception cref="TestException">Failed to disassemble the item.</exception> public virtual string Disassemble() { string outputPath = Path.Combine(Environment.CurrentDirectory, FileUtilities.GetUniqueFileName()); Directory.CreateDirectory(outputPath); Dark dark = new Dark(); dark.BinaryPath = outputPath; dark.Extensions = this.Extensions.ToList(); dark.InputFile = this.Output; dark.OutputFile = outputPath; dark.WorkingDirectory = outputPath; Result result = dark.Run(); DirectoryInfo outputDirectory = new DirectoryInfo(dark.OutputFile); this.TestArtifacts.Add(outputDirectory); if (0 != result.ExitCode) { throw new TestException(String.Format("Failed to disassemble '{0}'.", this.Output), result); } return(dark.OutputFile); }
public void MissingBinaryPath() { Dark dark = new Dark(); dark.InputFile = Path.Combine(WixTests.SharedBaselinesDirectory, @"MSIs\BasicProduct.msi"); dark.OtherArguments = " -x"; dark.ExpectedWixMessages.Add(new WixMessage(280,String.Concat("The -x option requires a directory, but the provided path is a file: ", dark.InputFile), WixMessage.MessageTypeEnum.Error)); dark.ExpectedExitCode = 280; dark.Run(); }
public void MissingExtension() { Dark dark = new Dark(); dark.InputFile = Path.Combine(WixTests.SharedBaselinesDirectory, @"MSIs\BasicProduct.msi"); dark.Extensions.Add(string.Empty); dark.ExpectedWixMessages.Add(new WixMessage(113, "The parameter '-ext' must be followed by the extension's type specification. The type specification should be a fully qualified class and assembly identity, for example: \"MyNamespace.MyClass,myextension.dll\".", WixMessage.MessageTypeEnum.Error)); dark.ExpectedExitCode = 113; dark.Run(); }
public void InvalidExtension() { Dark dark = new Dark(); dark.InputFile = Path.Combine(WixTests.SharedBaselinesDirectory, @"MSIs\BasicProduct.msi"); dark.Extensions.Add(WixTests.BasicProductWxs); dark.ExpectedWixMessages.Add(new WixMessage(144, string.Format("The extension '{0}' could not be loaded because of the following reason: Could not load file or assembly 'file:///{1}\\test\\data\\SharedData\\Authoring\\BasicProduct.wxs' or one of its dependencies. The module was expected to contain an assembly manifest.", WixTests.BasicProductWxs,Environment .GetEnvironmentVariable("WIX_ROOT")), WixMessage.MessageTypeEnum.Error)); dark.ExpectedExitCode = 144; dark.Run(); }
public void SimpleBinary() { string msi = Builder.BuildPackage(Path.Combine(BinaryTests.TestDataDirectory, @"SimpleBinary\product.wxs")); Verifier.VerifyResults(Path.Combine(BinaryTests.TestDataDirectory, @"SimpleBinary\expected.msi"), msi, "Binary"); string binaryPathDirectory = Utilities.FileUtilities.GetUniqueFileName(); Directory.CreateDirectory(binaryPathDirectory); Dark dark = new Dark(); dark.InputFile = msi; dark.OutputFile = "decompiled.wxs"; dark.BinaryPath = binaryPathDirectory; dark.Run(); }
public void InvalidOutputFile() { // make sure we have an existing file with the same name of dark output directory string invalidDirectoryName = Path.Combine(Environment.CurrentDirectory,"file.txt"); System.IO.File.Create(invalidDirectoryName); Dark dark = new Dark(); dark.InputFile = Path.Combine(WixTests.SharedBaselinesDirectory, @"MSIs\BasicProduct.msi"); dark.OutputFile = Path.Combine(invalidDirectoryName,"output.wxs"); string expectedErrorMessage = string.Format("Error writing to the path: '{0}'. Error message: 'Cannot create \"{1}\" because a file or directory with the same name already exists.'", dark.OutputFile, invalidDirectoryName); dark.ExpectedWixMessages.Add(new WixMessage(283, expectedErrorMessage, WixMessage.MessageTypeEnum.Error)); dark.ExpectedExitCode = 283; dark.Run(); }
public static string Decompile( string inputFile, string binaryPath = null, WixMessage[] expectedWixMessages = null, string[] extensions = null, bool noTidy = false, bool noLogo = false, string otherArguments = null, bool setOutputFileIfNotSpecified = true, bool suppressDroppingEmptyTables = false, bool suppressRelativeActionSequences = false, bool suppressUITables = false, int[] suppressWarnings = null, bool treatWarningsAsErrors = false, bool verbose = false, bool xmlOutput = false) { Dark dark = new Dark(); // set the passed arrguments dark.InputFile = inputFile; dark.BinaryPath = binaryPath; if (null != expectedWixMessages) { dark.ExpectedWixMessages.AddRange(expectedWixMessages); } if (null != extensions) { dark.Extensions.AddRange(extensions); } dark.NoTidy = noTidy; dark.NoLogo = noLogo; dark.OtherArguments = otherArguments; dark.SetOutputFileIfNotSpecified = setOutputFileIfNotSpecified; dark.SuppressDroppingEmptyTables = suppressDroppingEmptyTables; dark.SuppressRelativeActionSequences = suppressRelativeActionSequences; dark.SuppressUITables = suppressUITables; if (null != suppressWarnings) { dark.SuppressWarnings.AddRange(suppressWarnings); } dark.TreatWarningsAsErrors = treatWarningsAsErrors; dark.Verbose = verbose; dark.XmlOutput = xmlOutput; dark.Run(); return(dark.OutputFile); }
public static string Decompile( string inputFile, string binaryPath = null, WixMessage[] expectedWixMessages = null, string[] extensions = null, bool noTidy = false, bool noLogo = false, string otherArguments = null, bool setOutputFileIfNotSpecified = true, bool suppressDroppingEmptyTables = false, bool suppressRelativeActionSequences = false, bool suppressUITables = false, int[] suppressWarnings = null, bool treatWarningsAsErrors = false, bool verbose = false, bool xmlOutput = false) { Dark dark = new Dark(); // set the passed arrguments dark.InputFile = inputFile; dark.BinaryPath = binaryPath; if (null != expectedWixMessages) { dark.ExpectedWixMessages.AddRange(expectedWixMessages); } if (null != extensions) { dark.Extensions.AddRange(extensions); } dark.NoTidy = noTidy; dark.NoLogo = noLogo; dark.OtherArguments = otherArguments; dark.SetOutputFileIfNotSpecified = setOutputFileIfNotSpecified; dark.SuppressDroppingEmptyTables = suppressDroppingEmptyTables; dark.SuppressRelativeActionSequences = suppressRelativeActionSequences; dark.SuppressUITables = suppressUITables; if (null != suppressWarnings) { dark.SuppressWarnings.AddRange(suppressWarnings); } dark.TreatWarningsAsErrors = treatWarningsAsErrors; dark.Verbose = verbose; dark.XmlOutput = xmlOutput; dark.Run(); return dark.OutputFile; }
public void ExportBinariesToReadOnlyPath() { // Create a directory in temporary directory and set its property to read only DirectoryInfo binaryDirectory = Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), "ReadOnlyDirectory")); System.Security.AccessControl.DirectorySecurity binaryDirectorySecurity = new System.Security.AccessControl.DirectorySecurity(); binaryDirectorySecurity.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule("everyone", System.Security.AccessControl.FileSystemRights.CreateDirectories, System.Security.AccessControl.AccessControlType.Deny)); Directory.SetAccessControl(binaryDirectory.FullName, binaryDirectorySecurity); Dark dark = new Dark(); dark.InputFile = Builder.BuildPackage(Path.Combine(BinaryPathTests.TestDataDirectory, @"Product.wxs")); dark.BinaryPath = binaryDirectory.FullName; dark.ExpectedExitCode = 1; dark.ExpectedWixMessages.Add(new WixMessage(1, string.Format("Access to the path '{0}' is denied.", Path.Combine(dark.BinaryPath, "Binary")), WixMessage.MessageTypeEnum.Error)); dark.Run(); }
public void InvalidArgument() { Dark dark = new Dark(); dark.InputFile = Path.Combine(WixTests.SharedBaselinesDirectory, @"MSIs\BasicProduct.msi"); dark.OtherArguments = " -abc "; dark.ExpectedWixMessages.Add(new WixMessage(1098, "'abc' is not a valid command line argument.", WixMessage.MessageTypeEnum.Warning)); dark.Run(); // uppercase version of valid command arrguments dark = new Dark(); dark.InputFile = Path.Combine(WixTests.SharedBaselinesDirectory, @"MSIs\BasicProduct.msi"); dark.OtherArguments = " -SW1098 "; dark.ExpectedWixMessages.Add(new WixMessage(1098, "'SW1098' is not a valid command line argument.", WixMessage.MessageTypeEnum.Warning)); dark.Run(); }
/// <summary> /// Build bootstrapper packages for bundle input /// </summary> /// <param name="outputDirectory">The output directory for Candle and Light</param> /// <param name="sourceFile">The .wxs files to compile</param> /// <param name="extractEmbeddedResourcesToOutputDirectory">If true, extract embeded resources and copy them to output directory</param> /// <returns>The path to the output .exe file</returns> public static string BuildBundlePackage(string outputDirectory, string sourceFile, string[] wixExtensions, string otherCandleArguments, string otherLightArguments, bool extractEmbeddedResourcesToOutputDirectory) { string outputFileName = String.Concat(Path.GetFileNameWithoutExtension(sourceFile), ".exe"); otherLightArguments = string.IsNullOrEmpty(otherLightArguments) ? " -notidy " : otherLightArguments + " -notidy "; string extensionArguments = string.Empty; if (null != wixExtensions) { foreach (string wixExtension in wixExtensions) { extensionArguments += string.Format(" -ext {0} ", wixExtension); } } otherCandleArguments += extensionArguments; otherLightArguments += extensionArguments; // build package string bootstrapper = Builder.BuildPackage(outputDirectory, sourceFile, outputFileName, otherCandleArguments, otherLightArguments); // copy all the resulting files to the output directory if (extractEmbeddedResourcesToOutputDirectory) { if (!File.Exists(bootstrapper)) { throw new ApplicationException(string.Format("Bootrapper file '{0}' was not created as expected.", bootstrapper)); } // call dark.exe to extract the package contents to the output folder Dark dark = new Dark(outputDirectory); dark.InputFile = bootstrapper; dark.BinaryPath = outputDirectory; dark.Run(); } return(bootstrapper); }
/// <summary> /// Build bootstrapper packages for bundle input /// </summary> /// <param name="outputDirectory">The output directory for Candle and Light</param> /// <param name="sourceFile">The .wxs files to compile</param> /// <param name="extractEmbeddedResourcesToOutputDirectory">If true, extract embeded resources and copy them to output directory</param> /// <returns>The path to the output .exe file</returns> public static string BuildBundlePackage(string outputDirectory, string sourceFile, string[] wixExtensions, string otherCandleArguments, string otherLightArguments, bool extractEmbeddedResourcesToOutputDirectory) { string outputFileName = String.Concat(Path.GetFileNameWithoutExtension(sourceFile), ".exe"); otherLightArguments = string.IsNullOrEmpty(otherLightArguments) ? " -notidy " : otherLightArguments + " -notidy "; string extensionArguments = string.Empty; if (null != wixExtensions) { foreach (string wixExtension in wixExtensions) { extensionArguments += string.Format(" -ext {0} ", wixExtension); } } otherCandleArguments += extensionArguments; otherLightArguments += extensionArguments; // build package string bootstrapper = Builder.BuildPackage(outputDirectory, sourceFile, outputFileName, otherCandleArguments, otherLightArguments); // copy all the resulting files to the output directory if (extractEmbeddedResourcesToOutputDirectory) { if (!File.Exists(bootstrapper)) { throw new ApplicationException(string.Format("Bootrapper file '{0}' was not created as expected.", bootstrapper)); } // call dark.exe to extract the package contents to the output folder Dark dark = new Dark(outputDirectory); dark.InputFile = bootstrapper; dark.BinaryPath = outputDirectory; dark.Run(); } return bootstrapper; }