From 49ce77951ca980848b275cef082309c49b117f47 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Fri, 12 Jun 2020 06:51:37 -0700 Subject: Fix custom table column values case in compiler and decompiler --- .../Bind/LoadTableDefinitionsCommand.cs | 53 ++--- .../Decompile/Decompiler.cs | 52 ++--- src/WixToolset.Core/Compiler.cs | 100 ++++++++- .../CustomTableFixture.cs | 244 +++++++++++++++++++++ .../MsiQueryFixture.cs | 179 --------------- .../TestData/CustomTable/CustomTable-Expected.wxs | 33 +++ .../TestData/CustomTable/CustomTable.wxs | 4 +- .../ProductWithComponentGroupRef/Product.wxs | 2 +- .../WixToolsetTest.CoreIntegration.csproj | 1 + 9 files changed, 429 insertions(+), 239 deletions(-) create mode 100644 src/test/WixToolsetTest.CoreIntegration/CustomTableFixture.cs create mode 100644 src/test/WixToolsetTest.CoreIntegration/TestData/CustomTable/CustomTable-Expected.wxs diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/LoadTableDefinitionsCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/LoadTableDefinitionsCommand.cs index d7809034..0312ab44 100644 --- a/src/WixToolset.Core.WindowsInstaller/Bind/LoadTableDefinitionsCommand.cs +++ b/src/WixToolset.Core.WindowsInstaller/Bind/LoadTableDefinitionsCommand.cs @@ -87,84 +87,85 @@ namespace WixToolset.Core.WindowsInstaller.Bind var category = ColumnCategory.Unknown; switch (column.Category) { - case "Text": + case WixCustomTableColumnCategoryType.Text: category = ColumnCategory.Text; break; - case "UpperCase": + case WixCustomTableColumnCategoryType.UpperCase: category = ColumnCategory.UpperCase; break; - case "LowerCase": + case WixCustomTableColumnCategoryType.LowerCase: category = ColumnCategory.LowerCase; break; - case "Integer": + case WixCustomTableColumnCategoryType.Integer: category = ColumnCategory.Integer; break; - case "DoubleInteger": + case WixCustomTableColumnCategoryType.DoubleInteger: category = ColumnCategory.DoubleInteger; break; - case "TimeDate": + case WixCustomTableColumnCategoryType.TimeDate: category = ColumnCategory.TimeDate; break; - case "Identifier": + case WixCustomTableColumnCategoryType.Identifier: category = ColumnCategory.Identifier; break; - case "Property": + case WixCustomTableColumnCategoryType.Property: category = ColumnCategory.Property; break; - case "Filename": + case WixCustomTableColumnCategoryType.Filename: category = ColumnCategory.Filename; break; - case "WildCardFilename": + case WixCustomTableColumnCategoryType.WildCardFilename: category = ColumnCategory.WildCardFilename; break; - case "Path": + case WixCustomTableColumnCategoryType.Path: category = ColumnCategory.Path; break; - case "Paths": + case WixCustomTableColumnCategoryType.Paths: category = ColumnCategory.Paths; break; - case "AnyPath": + case WixCustomTableColumnCategoryType.AnyPath: category = ColumnCategory.AnyPath; break; - case "DefaultDir": + case WixCustomTableColumnCategoryType.DefaultDir: category = ColumnCategory.DefaultDir; break; - case "RegPath": + case WixCustomTableColumnCategoryType.RegPath: category = ColumnCategory.RegPath; break; - case "Formatted": + case WixCustomTableColumnCategoryType.Formatted: category = ColumnCategory.Formatted; break; - case "FormattedSddl": + case WixCustomTableColumnCategoryType.FormattedSddl: category = ColumnCategory.FormattedSDDLText; break; - case "Template": + case WixCustomTableColumnCategoryType.Template: category = ColumnCategory.Template; break; - case "Condition": + case WixCustomTableColumnCategoryType.Condition: category = ColumnCategory.Condition; break; - case "Guid": + case WixCustomTableColumnCategoryType.Guid: category = ColumnCategory.Guid; break; - case "Version": + case WixCustomTableColumnCategoryType.Version: category = ColumnCategory.Version; break; - case "Language": + case WixCustomTableColumnCategoryType.Language: category = ColumnCategory.Language; break; - case "Binary": + case WixCustomTableColumnCategoryType.Binary: category = ColumnCategory.Binary; break; - case "CustomSource": + case WixCustomTableColumnCategoryType.CustomSource: category = ColumnCategory.CustomSource; break; - case "Cabinet": + case WixCustomTableColumnCategoryType.Cabinet: category = ColumnCategory.Cabinet; break; - case "Shortcut": + case WixCustomTableColumnCategoryType.Shortcut: category = ColumnCategory.Shortcut; break; + case null: default: break; } diff --git a/src/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs b/src/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs index 560b5437..54a92f3c 100644 --- a/src/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs +++ b/src/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs @@ -4481,82 +4481,82 @@ namespace WixToolset.Core.WindowsInstaller switch (columnDefinition.Category) { case ColumnCategory.Text: - column.Category = Wix.Column.CategoryType.Text; + column.Category = Wix.Column.CategoryType.text; break; case ColumnCategory.UpperCase: - column.Category = Wix.Column.CategoryType.UpperCase; + column.Category = Wix.Column.CategoryType.upperCase; break; case ColumnCategory.LowerCase: - column.Category = Wix.Column.CategoryType.LowerCase; + column.Category = Wix.Column.CategoryType.lowerCase; break; case ColumnCategory.Integer: - column.Category = Wix.Column.CategoryType.Integer; + column.Category = Wix.Column.CategoryType.integer; break; case ColumnCategory.DoubleInteger: - column.Category = Wix.Column.CategoryType.DoubleInteger; + column.Category = Wix.Column.CategoryType.doubleInteger; break; case ColumnCategory.TimeDate: - column.Category = Wix.Column.CategoryType.TimeDate; + column.Category = Wix.Column.CategoryType.timeDate; break; case ColumnCategory.Identifier: - column.Category = Wix.Column.CategoryType.Identifier; + column.Category = Wix.Column.CategoryType.identifier; break; case ColumnCategory.Property: - column.Category = Wix.Column.CategoryType.Property; + column.Category = Wix.Column.CategoryType.property; break; case ColumnCategory.Filename: - column.Category = Wix.Column.CategoryType.Filename; + column.Category = Wix.Column.CategoryType.filename; break; case ColumnCategory.WildCardFilename: - column.Category = Wix.Column.CategoryType.WildCardFilename; + column.Category = Wix.Column.CategoryType.wildCardFilename; break; case ColumnCategory.Path: - column.Category = Wix.Column.CategoryType.Path; + column.Category = Wix.Column.CategoryType.path; break; case ColumnCategory.Paths: - column.Category = Wix.Column.CategoryType.Paths; + column.Category = Wix.Column.CategoryType.paths; break; case ColumnCategory.AnyPath: - column.Category = Wix.Column.CategoryType.AnyPath; + column.Category = Wix.Column.CategoryType.anyPath; break; case ColumnCategory.DefaultDir: - column.Category = Wix.Column.CategoryType.DefaultDir; + column.Category = Wix.Column.CategoryType.defaultDir; break; case ColumnCategory.RegPath: - column.Category = Wix.Column.CategoryType.RegPath; + column.Category = Wix.Column.CategoryType.regPath; break; case ColumnCategory.Formatted: - column.Category = Wix.Column.CategoryType.Formatted; + column.Category = Wix.Column.CategoryType.formatted; break; case ColumnCategory.FormattedSDDLText: - column.Category = Wix.Column.CategoryType.FormattedSddl; + column.Category = Wix.Column.CategoryType.formattedSddl; break; case ColumnCategory.Template: - column.Category = Wix.Column.CategoryType.Template; + column.Category = Wix.Column.CategoryType.template; break; case ColumnCategory.Condition: - column.Category = Wix.Column.CategoryType.Condition; + column.Category = Wix.Column.CategoryType.condition; break; case ColumnCategory.Guid: - column.Category = Wix.Column.CategoryType.Guid; + column.Category = Wix.Column.CategoryType.guid; break; case ColumnCategory.Version: - column.Category = Wix.Column.CategoryType.Version; + column.Category = Wix.Column.CategoryType.version; break; case ColumnCategory.Language: - column.Category = Wix.Column.CategoryType.Language; + column.Category = Wix.Column.CategoryType.language; break; case ColumnCategory.Binary: - column.Category = Wix.Column.CategoryType.Binary; + column.Category = Wix.Column.CategoryType.binary; break; case ColumnCategory.CustomSource: - column.Category = Wix.Column.CategoryType.CustomSource; + column.Category = Wix.Column.CategoryType.customSource; break; case ColumnCategory.Cabinet: - column.Category = Wix.Column.CategoryType.Cabinet; + column.Category = Wix.Column.CategoryType.cabinet; break; case ColumnCategory.Shortcut: - column.Category = Wix.Column.CategoryType.Shortcut; + column.Category = Wix.Column.CategoryType.shortcut; break; default: throw new InvalidOperationException($"Unknown custom column category '{columnDefinition.Category.ToString()}'."); diff --git a/src/WixToolset.Core/Compiler.cs b/src/WixToolset.Core/Compiler.cs index 3365789f..da0806fb 100644 --- a/src/WixToolset.Core/Compiler.cs +++ b/src/WixToolset.Core/Compiler.cs @@ -3712,7 +3712,6 @@ namespace WixToolset.Core { case "Column": string columnName = null; - var category = String.Empty; IntermediateFieldType? columnType = null; var description = String.Empty; int? keyColumn = null; @@ -3720,6 +3719,7 @@ namespace WixToolset.Core var localizable = false; long? maxValue = null; long? minValue = null; + WixCustomTableColumnCategoryType? category = null; var modularization = WixCustomTableColumnModularizeType.None; var nullable = false; var primaryKey = false; @@ -3735,7 +3735,97 @@ namespace WixToolset.Core columnName = this.Core.GetAttributeIdentifierValue(childSourceLineNumbers, childAttrib); break; case "Category": - category = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib); + var categoryValue = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib); + switch (categoryValue) + { + case "text": + category = WixCustomTableColumnCategoryType.Text; + break; + case "upperCase": + category = WixCustomTableColumnCategoryType.UpperCase; + break; + case "lowerCase": + category = WixCustomTableColumnCategoryType.LowerCase; + break; + case "integer": + category = WixCustomTableColumnCategoryType.Integer; + break; + case "doubleInteger": + category = WixCustomTableColumnCategoryType.DoubleInteger; + break; + case "timeDate": + category = WixCustomTableColumnCategoryType.TimeDate; + break; + case "identifier": + category = WixCustomTableColumnCategoryType.Identifier; + break; + case "property": + category = WixCustomTableColumnCategoryType.Property; + break; + case "filename": + category = WixCustomTableColumnCategoryType.Filename; + break; + case "wildCardFilename": + category = WixCustomTableColumnCategoryType.WildCardFilename; + break; + case "path": + category = WixCustomTableColumnCategoryType.Path; + break; + case "paths": + category = WixCustomTableColumnCategoryType.Paths; + break; + case "anyPath": + category = WixCustomTableColumnCategoryType.AnyPath; + break; + case "defaultDir": + category = WixCustomTableColumnCategoryType.DefaultDir; + break; + case "regPath": + category = WixCustomTableColumnCategoryType.RegPath; + break; + case "formatted": + category = WixCustomTableColumnCategoryType.Formatted; + break; + case "formattedSddl": + category = WixCustomTableColumnCategoryType.FormattedSddl; + break; + case "template": + category = WixCustomTableColumnCategoryType.Template; + break; + case "condition": + category = WixCustomTableColumnCategoryType.Condition; + break; + case "guid": + category = WixCustomTableColumnCategoryType.Guid; + break; + case "version": + category = WixCustomTableColumnCategoryType.Version; + break; + case "language": + category = WixCustomTableColumnCategoryType.Language; + break; + case "binary": + category = WixCustomTableColumnCategoryType.Binary; + break; + case "customSource": + category = WixCustomTableColumnCategoryType.CustomSource; + break; + case "cabinet": + category = WixCustomTableColumnCategoryType.Cabinet; + break; + case "shortcut": + category = WixCustomTableColumnCategoryType.Shortcut; + break; + case "": + break; + default: + this.Core.Write(ErrorMessages.IllegalAttributeValue(childSourceLineNumbers, child.Name.LocalName, "Category", categoryValue, + "text", "upperCase", "lowerCase", "integer", "doubleInteger", "timeDate", "identifier", "property", "filename", + "wildCardFilename", "path", "paths", "anyPath", "defaultDir", "regPath", "formatted", "formattedSddl", "template", + "condition", "guid", "version", "language", "binary", "customSource", "cabinet", "shortcut")); + columnType = IntermediateFieldType.String; // set a value to prevent expected attribute error below. + break; + } break; case "Description": description = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib); @@ -3854,11 +3944,11 @@ namespace WixToolset.Core } else if (columnType == IntermediateFieldType.Path) { - if (String.IsNullOrEmpty(category)) + if (!category.HasValue) { - category = "Binary"; + category = WixCustomTableColumnCategoryType.Binary; } - else if (category != "Binary") + else if (category != WixCustomTableColumnCategoryType.Binary) { this.Core.Write(ErrorMessages.ExpectedBinaryCategory(childSourceLineNumbers)); } diff --git a/src/test/WixToolsetTest.CoreIntegration/CustomTableFixture.cs b/src/test/WixToolsetTest.CoreIntegration/CustomTableFixture.cs new file mode 100644 index 00000000..85a0ffae --- /dev/null +++ b/src/test/WixToolsetTest.CoreIntegration/CustomTableFixture.cs @@ -0,0 +1,244 @@ +// 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. + +namespace WixToolsetTest.CoreIntegration +{ + using System.IO; + using Microsoft.Build.Tasks; + using WixBuildTools.TestSupport; + using WixToolset.Core.TestPackage; + using Xunit; + + public class CustomTableFixture + { + [Fact] + public void PopulatesCustomTable1() + { + 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, "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)); + var results = Query.QueryDatabase(msiPath, new[] { "CustomTable1" }); + Assert.Equal(new[] + { + "CustomTable1:Row1\ttest.txt", + "CustomTable1:Row2\ttest.txt", + }, results); + } + } + + [Fact] + public void PopulatesCustomTableWithLocalization() + { + 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, "CustomTable", "LocalizedCustomTable.wxs"), + Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"), + Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"), + "-loc", Path.Combine(folder, "CustomTable", "LocalizedCustomTable.en-us.wxl"), + "-bindpath", Path.Combine(folder, "SingleFile", "data"), + "-intermediateFolder", intermediateFolder, + "-o", msiPath + }); + + result.AssertSuccess(); + + Assert.True(File.Exists(msiPath)); + var results = Query.QueryDatabase(msiPath, new[] { "CustomTableLocalized" }); + Assert.Equal(new[] + { + "CustomTableLocalized:Row1\tThis is row one", + "CustomTableLocalized:Row2\tThis is row two", + }, results); + } + } + + [Fact] + public void PopulatesCustomTableWithFilePath() + { + 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, "CustomTable", "CustomTableWithFile.wxs"), + Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"), + Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"), + "-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); + } + } + + [Fact] + 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); + } + } + + [Fact] + public void UnrealCustomTableIsNotPresentInMsi() + { + 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, "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)); + var results = Query.QueryDatabase(msiPath, new[] { "CustomTable2" }); + Assert.Empty(results); + } + } + + [Fact] + 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", + 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, + "-intermediateFolder", intermediateFolder, + "-o", decompiledWxsPath + }); + + result.AssertSuccess(); + + CompareLineByLine(expectedFile, decompiledWxsPath); + } + } + + private static void CompareLineByLine(string expectedFile, string actualFile) + { + var expectedLines = File.ReadAllLines(expectedFile); + var actualLines = File.ReadAllLines(actualFile); + for (var i = 0; i < expectedLines.Length; ++i) + { + Assert.True(actualLines.Length > i, $"{i}: Expected file longer than actual file"); + Assert.Equal($"{i}: {expectedLines[i]}", $"{i}: {actualLines[i]}"); + } + Assert.True(expectedLines.Length == actualLines.Length, "Actual file longer than expected file"); + } + } +} diff --git a/src/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs b/src/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs index 78a8f0a4..70d6612e 100644 --- a/src/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs +++ b/src/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs @@ -438,185 +438,6 @@ namespace WixToolsetTest.CoreIntegration } } - [Fact] - public void PopulatesCustomTable1() - { - 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, "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)); - var results = Query.QueryDatabase(msiPath, new[] { "CustomTable1" }); - Assert.Equal(new[] - { - "CustomTable1:Row1\ttest.txt", - "CustomTable1:Row2\ttest.txt", - }, results); - } - } - - [Fact] - public void PopulatesCustomTableWithLocalization() - { - 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, "CustomTable", "LocalizedCustomTable.wxs"), - Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"), - Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"), - "-loc", Path.Combine(folder, "CustomTable", "LocalizedCustomTable.en-us.wxl"), - "-bindpath", Path.Combine(folder, "SingleFile", "data"), - "-intermediateFolder", intermediateFolder, - "-o", msiPath - }); - - result.AssertSuccess(); - - Assert.True(File.Exists(msiPath)); - var results = Query.QueryDatabase(msiPath, new[] { "CustomTableLocalized" }); - Assert.Equal(new[] - { - "CustomTableLocalized:Row1\tThis is row one", - "CustomTableLocalized:Row2\tThis is row two", - }, results); - } - } - - [Fact] - public void PopulatesCustomTableWithFilePath() - { - 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, "CustomTable", "CustomTableWithFile.wxs"), - Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"), - Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"), - "-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); - } - } - - [Fact] - 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); - } - } - - [Fact] - public void UnrealCustomTableIsNotPresentInMsi() - { - 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, "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)); - var results = Query.QueryDatabase(msiPath, new[] { "CustomTable2" }); - Assert.Empty(results); - } - } - [Fact] public void PopulatesDirectoryTableWithValidDefaultDir() { diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/CustomTable/CustomTable-Expected.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/CustomTable/CustomTable-Expected.wxs new file mode 100644 index 00000000..68386612 --- /dev/null +++ b/src/test/WixToolsetTest.CoreIntegration/TestData/CustomTable/CustomTable-Expected.wxs @@ -0,0 +1,33 @@ + + + + + + + + + Row1 + test.txt + + + Row2 + test.txt + + + + + + + + + + + + + + + + + + + diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/CustomTable/CustomTable.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/CustomTable/CustomTable.wxs index 8eb4fbf9..51aee5f2 100644 --- a/src/test/WixToolsetTest.CoreIntegration/TestData/CustomTable/CustomTable.wxs +++ b/src/test/WixToolsetTest.CoreIntegration/TestData/CustomTable/CustomTable.wxs @@ -6,8 +6,8 @@ - - + + Row1 test.txt diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/ProductWithComponentGroupRef/Product.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/ProductWithComponentGroupRef/Product.wxs index 0d1e89e6..e0e5345a 100644 --- a/src/test/WixToolsetTest.CoreIntegration/TestData/ProductWithComponentGroupRef/Product.wxs +++ b/src/test/WixToolsetTest.CoreIntegration/TestData/ProductWithComponentGroupRef/Product.wxs @@ -1,6 +1,6 @@ - + diff --git a/src/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj b/src/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj index 51775cd0..7ede6655 100644 --- a/src/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj +++ b/src/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj @@ -34,6 +34,7 @@ + -- cgit v1.2.3-55-g6feb