aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Bind/LoadTableDefinitionsCommand.cs53
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs52
-rw-r--r--src/WixToolset.Core/Compiler.cs100
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/CustomTableFixture.cs244
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs179
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/TestData/CustomTable/CustomTable-Expected.wxs33
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/TestData/CustomTable/CustomTable.wxs4
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/TestData/ProductWithComponentGroupRef/Product.wxs2
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj1
9 files changed, 429 insertions, 239 deletions
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
87 var category = ColumnCategory.Unknown; 87 var category = ColumnCategory.Unknown;
88 switch (column.Category) 88 switch (column.Category)
89 { 89 {
90 case "Text": 90 case WixCustomTableColumnCategoryType.Text:
91 category = ColumnCategory.Text; 91 category = ColumnCategory.Text;
92 break; 92 break;
93 case "UpperCase": 93 case WixCustomTableColumnCategoryType.UpperCase:
94 category = ColumnCategory.UpperCase; 94 category = ColumnCategory.UpperCase;
95 break; 95 break;
96 case "LowerCase": 96 case WixCustomTableColumnCategoryType.LowerCase:
97 category = ColumnCategory.LowerCase; 97 category = ColumnCategory.LowerCase;
98 break; 98 break;
99 case "Integer": 99 case WixCustomTableColumnCategoryType.Integer:
100 category = ColumnCategory.Integer; 100 category = ColumnCategory.Integer;
101 break; 101 break;
102 case "DoubleInteger": 102 case WixCustomTableColumnCategoryType.DoubleInteger:
103 category = ColumnCategory.DoubleInteger; 103 category = ColumnCategory.DoubleInteger;
104 break; 104 break;
105 case "TimeDate": 105 case WixCustomTableColumnCategoryType.TimeDate:
106 category = ColumnCategory.TimeDate; 106 category = ColumnCategory.TimeDate;
107 break; 107 break;
108 case "Identifier": 108 case WixCustomTableColumnCategoryType.Identifier:
109 category = ColumnCategory.Identifier; 109 category = ColumnCategory.Identifier;
110 break; 110 break;
111 case "Property": 111 case WixCustomTableColumnCategoryType.Property:
112 category = ColumnCategory.Property; 112 category = ColumnCategory.Property;
113 break; 113 break;
114 case "Filename": 114 case WixCustomTableColumnCategoryType.Filename:
115 category = ColumnCategory.Filename; 115 category = ColumnCategory.Filename;
116 break; 116 break;
117 case "WildCardFilename": 117 case WixCustomTableColumnCategoryType.WildCardFilename:
118 category = ColumnCategory.WildCardFilename; 118 category = ColumnCategory.WildCardFilename;
119 break; 119 break;
120 case "Path": 120 case WixCustomTableColumnCategoryType.Path:
121 category = ColumnCategory.Path; 121 category = ColumnCategory.Path;
122 break; 122 break;
123 case "Paths": 123 case WixCustomTableColumnCategoryType.Paths:
124 category = ColumnCategory.Paths; 124 category = ColumnCategory.Paths;
125 break; 125 break;
126 case "AnyPath": 126 case WixCustomTableColumnCategoryType.AnyPath:
127 category = ColumnCategory.AnyPath; 127 category = ColumnCategory.AnyPath;
128 break; 128 break;
129 case "DefaultDir": 129 case WixCustomTableColumnCategoryType.DefaultDir:
130 category = ColumnCategory.DefaultDir; 130 category = ColumnCategory.DefaultDir;
131 break; 131 break;
132 case "RegPath": 132 case WixCustomTableColumnCategoryType.RegPath:
133 category = ColumnCategory.RegPath; 133 category = ColumnCategory.RegPath;
134 break; 134 break;
135 case "Formatted": 135 case WixCustomTableColumnCategoryType.Formatted:
136 category = ColumnCategory.Formatted; 136 category = ColumnCategory.Formatted;
137 break; 137 break;
138 case "FormattedSddl": 138 case WixCustomTableColumnCategoryType.FormattedSddl:
139 category = ColumnCategory.FormattedSDDLText; 139 category = ColumnCategory.FormattedSDDLText;
140 break; 140 break;
141 case "Template": 141 case WixCustomTableColumnCategoryType.Template:
142 category = ColumnCategory.Template; 142 category = ColumnCategory.Template;
143 break; 143 break;
144 case "Condition": 144 case WixCustomTableColumnCategoryType.Condition:
145 category = ColumnCategory.Condition; 145 category = ColumnCategory.Condition;
146 break; 146 break;
147 case "Guid": 147 case WixCustomTableColumnCategoryType.Guid:
148 category = ColumnCategory.Guid; 148 category = ColumnCategory.Guid;
149 break; 149 break;
150 case "Version": 150 case WixCustomTableColumnCategoryType.Version:
151 category = ColumnCategory.Version; 151 category = ColumnCategory.Version;
152 break; 152 break;
153 case "Language": 153 case WixCustomTableColumnCategoryType.Language:
154 category = ColumnCategory.Language; 154 category = ColumnCategory.Language;
155 break; 155 break;
156 case "Binary": 156 case WixCustomTableColumnCategoryType.Binary:
157 category = ColumnCategory.Binary; 157 category = ColumnCategory.Binary;
158 break; 158 break;
159 case "CustomSource": 159 case WixCustomTableColumnCategoryType.CustomSource:
160 category = ColumnCategory.CustomSource; 160 category = ColumnCategory.CustomSource;
161 break; 161 break;
162 case "Cabinet": 162 case WixCustomTableColumnCategoryType.Cabinet:
163 category = ColumnCategory.Cabinet; 163 category = ColumnCategory.Cabinet;
164 break; 164 break;
165 case "Shortcut": 165 case WixCustomTableColumnCategoryType.Shortcut:
166 category = ColumnCategory.Shortcut; 166 category = ColumnCategory.Shortcut;
167 break; 167 break;
168 case null:
168 default: 169 default:
169 break; 170 break;
170 } 171 }
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
4481 switch (columnDefinition.Category) 4481 switch (columnDefinition.Category)
4482 { 4482 {
4483 case ColumnCategory.Text: 4483 case ColumnCategory.Text:
4484 column.Category = Wix.Column.CategoryType.Text; 4484 column.Category = Wix.Column.CategoryType.text;
4485 break; 4485 break;
4486 case ColumnCategory.UpperCase: 4486 case ColumnCategory.UpperCase:
4487 column.Category = Wix.Column.CategoryType.UpperCase; 4487 column.Category = Wix.Column.CategoryType.upperCase;
4488 break; 4488 break;
4489 case ColumnCategory.LowerCase: 4489 case ColumnCategory.LowerCase:
4490 column.Category = Wix.Column.CategoryType.LowerCase; 4490 column.Category = Wix.Column.CategoryType.lowerCase;
4491 break; 4491 break;
4492 case ColumnCategory.Integer: 4492 case ColumnCategory.Integer:
4493 column.Category = Wix.Column.CategoryType.Integer; 4493 column.Category = Wix.Column.CategoryType.integer;
4494 break; 4494 break;
4495 case ColumnCategory.DoubleInteger: 4495 case ColumnCategory.DoubleInteger:
4496 column.Category = Wix.Column.CategoryType.DoubleInteger; 4496 column.Category = Wix.Column.CategoryType.doubleInteger;
4497 break; 4497 break;
4498 case ColumnCategory.TimeDate: 4498 case ColumnCategory.TimeDate:
4499 column.Category = Wix.Column.CategoryType.TimeDate; 4499 column.Category = Wix.Column.CategoryType.timeDate;
4500 break; 4500 break;
4501 case ColumnCategory.Identifier: 4501 case ColumnCategory.Identifier:
4502 column.Category = Wix.Column.CategoryType.Identifier; 4502 column.Category = Wix.Column.CategoryType.identifier;
4503 break; 4503 break;
4504 case ColumnCategory.Property: 4504 case ColumnCategory.Property:
4505 column.Category = Wix.Column.CategoryType.Property; 4505 column.Category = Wix.Column.CategoryType.property;
4506 break; 4506 break;
4507 case ColumnCategory.Filename: 4507 case ColumnCategory.Filename:
4508 column.Category = Wix.Column.CategoryType.Filename; 4508 column.Category = Wix.Column.CategoryType.filename;
4509 break; 4509 break;
4510 case ColumnCategory.WildCardFilename: 4510 case ColumnCategory.WildCardFilename:
4511 column.Category = Wix.Column.CategoryType.WildCardFilename; 4511 column.Category = Wix.Column.CategoryType.wildCardFilename;
4512 break; 4512 break;
4513 case ColumnCategory.Path: 4513 case ColumnCategory.Path:
4514 column.Category = Wix.Column.CategoryType.Path; 4514 column.Category = Wix.Column.CategoryType.path;
4515 break; 4515 break;
4516 case ColumnCategory.Paths: 4516 case ColumnCategory.Paths:
4517 column.Category = Wix.Column.CategoryType.Paths; 4517 column.Category = Wix.Column.CategoryType.paths;
4518 break; 4518 break;
4519 case ColumnCategory.AnyPath: 4519 case ColumnCategory.AnyPath:
4520 column.Category = Wix.Column.CategoryType.AnyPath; 4520 column.Category = Wix.Column.CategoryType.anyPath;
4521 break; 4521 break;
4522 case ColumnCategory.DefaultDir: 4522 case ColumnCategory.DefaultDir:
4523 column.Category = Wix.Column.CategoryType.DefaultDir; 4523 column.Category = Wix.Column.CategoryType.defaultDir;
4524 break; 4524 break;
4525 case ColumnCategory.RegPath: 4525 case ColumnCategory.RegPath:
4526 column.Category = Wix.Column.CategoryType.RegPath; 4526 column.Category = Wix.Column.CategoryType.regPath;
4527 break; 4527 break;
4528 case ColumnCategory.Formatted: 4528 case ColumnCategory.Formatted:
4529 column.Category = Wix.Column.CategoryType.Formatted; 4529 column.Category = Wix.Column.CategoryType.formatted;
4530 break; 4530 break;
4531 case ColumnCategory.FormattedSDDLText: 4531 case ColumnCategory.FormattedSDDLText:
4532 column.Category = Wix.Column.CategoryType.FormattedSddl; 4532 column.Category = Wix.Column.CategoryType.formattedSddl;
4533 break; 4533 break;
4534 case ColumnCategory.Template: 4534 case ColumnCategory.Template:
4535 column.Category = Wix.Column.CategoryType.Template; 4535 column.Category = Wix.Column.CategoryType.template;
4536 break; 4536 break;
4537 case ColumnCategory.Condition: 4537 case ColumnCategory.Condition:
4538 column.Category = Wix.Column.CategoryType.Condition; 4538 column.Category = Wix.Column.CategoryType.condition;
4539 break; 4539 break;
4540 case ColumnCategory.Guid: 4540 case ColumnCategory.Guid:
4541 column.Category = Wix.Column.CategoryType.Guid; 4541 column.Category = Wix.Column.CategoryType.guid;
4542 break; 4542 break;
4543 case ColumnCategory.Version: 4543 case ColumnCategory.Version:
4544 column.Category = Wix.Column.CategoryType.Version; 4544 column.Category = Wix.Column.CategoryType.version;
4545 break; 4545 break;
4546 case ColumnCategory.Language: 4546 case ColumnCategory.Language:
4547 column.Category = Wix.Column.CategoryType.Language; 4547 column.Category = Wix.Column.CategoryType.language;
4548 break; 4548 break;
4549 case ColumnCategory.Binary: 4549 case ColumnCategory.Binary:
4550 column.Category = Wix.Column.CategoryType.Binary; 4550 column.Category = Wix.Column.CategoryType.binary;
4551 break; 4551 break;
4552 case ColumnCategory.CustomSource: 4552 case ColumnCategory.CustomSource:
4553 column.Category = Wix.Column.CategoryType.CustomSource; 4553 column.Category = Wix.Column.CategoryType.customSource;
4554 break; 4554 break;
4555 case ColumnCategory.Cabinet: 4555 case ColumnCategory.Cabinet:
4556 column.Category = Wix.Column.CategoryType.Cabinet; 4556 column.Category = Wix.Column.CategoryType.cabinet;
4557 break; 4557 break;
4558 case ColumnCategory.Shortcut: 4558 case ColumnCategory.Shortcut:
4559 column.Category = Wix.Column.CategoryType.Shortcut; 4559 column.Category = Wix.Column.CategoryType.shortcut;
4560 break; 4560 break;
4561 default: 4561 default:
4562 throw new InvalidOperationException($"Unknown custom column category '{columnDefinition.Category.ToString()}'."); 4562 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
3712 { 3712 {
3713 case "Column": 3713 case "Column":
3714 string columnName = null; 3714 string columnName = null;
3715 var category = String.Empty;
3716 IntermediateFieldType? columnType = null; 3715 IntermediateFieldType? columnType = null;
3717 var description = String.Empty; 3716 var description = String.Empty;
3718 int? keyColumn = null; 3717 int? keyColumn = null;
@@ -3720,6 +3719,7 @@ namespace WixToolset.Core
3720 var localizable = false; 3719 var localizable = false;
3721 long? maxValue = null; 3720 long? maxValue = null;
3722 long? minValue = null; 3721 long? minValue = null;
3722 WixCustomTableColumnCategoryType? category = null;
3723 var modularization = WixCustomTableColumnModularizeType.None; 3723 var modularization = WixCustomTableColumnModularizeType.None;
3724 var nullable = false; 3724 var nullable = false;
3725 var primaryKey = false; 3725 var primaryKey = false;
@@ -3735,7 +3735,97 @@ namespace WixToolset.Core
3735 columnName = this.Core.GetAttributeIdentifierValue(childSourceLineNumbers, childAttrib); 3735 columnName = this.Core.GetAttributeIdentifierValue(childSourceLineNumbers, childAttrib);
3736 break; 3736 break;
3737 case "Category": 3737 case "Category":
3738 category = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib); 3738 var categoryValue = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib);
3739 switch (categoryValue)
3740 {
3741 case "text":
3742 category = WixCustomTableColumnCategoryType.Text;
3743 break;
3744 case "upperCase":
3745 category = WixCustomTableColumnCategoryType.UpperCase;
3746 break;
3747 case "lowerCase":
3748 category = WixCustomTableColumnCategoryType.LowerCase;
3749 break;
3750 case "integer":
3751 category = WixCustomTableColumnCategoryType.Integer;
3752 break;
3753 case "doubleInteger":
3754 category = WixCustomTableColumnCategoryType.DoubleInteger;
3755 break;
3756 case "timeDate":
3757 category = WixCustomTableColumnCategoryType.TimeDate;
3758 break;
3759 case "identifier":
3760 category = WixCustomTableColumnCategoryType.Identifier;
3761 break;
3762 case "property":
3763 category = WixCustomTableColumnCategoryType.Property;
3764 break;
3765 case "filename":
3766 category = WixCustomTableColumnCategoryType.Filename;
3767 break;
3768 case "wildCardFilename":
3769 category = WixCustomTableColumnCategoryType.WildCardFilename;
3770 break;
3771 case "path":
3772 category = WixCustomTableColumnCategoryType.Path;
3773 break;
3774 case "paths":
3775 category = WixCustomTableColumnCategoryType.Paths;
3776 break;
3777 case "anyPath":
3778 category = WixCustomTableColumnCategoryType.AnyPath;
3779 break;
3780 case "defaultDir":
3781 category = WixCustomTableColumnCategoryType.DefaultDir;
3782 break;
3783 case "regPath":
3784 category = WixCustomTableColumnCategoryType.RegPath;
3785 break;
3786 case "formatted":
3787 category = WixCustomTableColumnCategoryType.Formatted;
3788 break;
3789 case "formattedSddl":
3790 category = WixCustomTableColumnCategoryType.FormattedSddl;
3791 break;
3792 case "template":
3793 category = WixCustomTableColumnCategoryType.Template;
3794 break;
3795 case "condition":
3796 category = WixCustomTableColumnCategoryType.Condition;
3797 break;
3798 case "guid":
3799 category = WixCustomTableColumnCategoryType.Guid;
3800 break;
3801 case "version":
3802 category = WixCustomTableColumnCategoryType.Version;
3803 break;
3804 case "language":
3805 category = WixCustomTableColumnCategoryType.Language;
3806 break;
3807 case "binary":
3808 category = WixCustomTableColumnCategoryType.Binary;
3809 break;
3810 case "customSource":
3811 category = WixCustomTableColumnCategoryType.CustomSource;
3812 break;
3813 case "cabinet":
3814 category = WixCustomTableColumnCategoryType.Cabinet;
3815 break;
3816 case "shortcut":
3817 category = WixCustomTableColumnCategoryType.Shortcut;
3818 break;
3819 case "":
3820 break;
3821 default:
3822 this.Core.Write(ErrorMessages.IllegalAttributeValue(childSourceLineNumbers, child.Name.LocalName, "Category", categoryValue,
3823 "text", "upperCase", "lowerCase", "integer", "doubleInteger", "timeDate", "identifier", "property", "filename",
3824 "wildCardFilename", "path", "paths", "anyPath", "defaultDir", "regPath", "formatted", "formattedSddl", "template",
3825 "condition", "guid", "version", "language", "binary", "customSource", "cabinet", "shortcut"));
3826 columnType = IntermediateFieldType.String; // set a value to prevent expected attribute error below.
3827 break;
3828 }
3739 break; 3829 break;
3740 case "Description": 3830 case "Description":
3741 description = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib); 3831 description = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib);
@@ -3854,11 +3944,11 @@ namespace WixToolset.Core
3854 } 3944 }
3855 else if (columnType == IntermediateFieldType.Path) 3945 else if (columnType == IntermediateFieldType.Path)
3856 { 3946 {
3857 if (String.IsNullOrEmpty(category)) 3947 if (!category.HasValue)
3858 { 3948 {
3859 category = "Binary"; 3949 category = WixCustomTableColumnCategoryType.Binary;
3860 } 3950 }
3861 else if (category != "Binary") 3951 else if (category != WixCustomTableColumnCategoryType.Binary)
3862 { 3952 {
3863 this.Core.Write(ErrorMessages.ExpectedBinaryCategory(childSourceLineNumbers)); 3953 this.Core.Write(ErrorMessages.ExpectedBinaryCategory(childSourceLineNumbers));
3864 } 3954 }
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 @@
1// 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.
2
3namespace WixToolsetTest.CoreIntegration
4{
5 using System.IO;
6 using Microsoft.Build.Tasks;
7 using WixBuildTools.TestSupport;
8 using WixToolset.Core.TestPackage;
9 using Xunit;
10
11 public class CustomTableFixture
12 {
13 [Fact]
14 public void PopulatesCustomTable1()
15 {
16 var folder = TestData.Get(@"TestData");
17
18 using (var fs = new DisposableFileSystem())
19 {
20 var baseFolder = fs.GetFolder();
21 var intermediateFolder = Path.Combine(baseFolder, "obj");
22 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
23
24 var result = WixRunner.Execute(new[]
25 {
26 "build",
27 Path.Combine(folder, "CustomTable", "CustomTable.wxs"),
28 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
29 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
30 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
31 "-intermediateFolder", intermediateFolder,
32 "-o", msiPath
33 });
34
35 result.AssertSuccess();
36
37 Assert.True(File.Exists(msiPath));
38 var results = Query.QueryDatabase(msiPath, new[] { "CustomTable1" });
39 Assert.Equal(new[]
40 {
41 "CustomTable1:Row1\ttest.txt",
42 "CustomTable1:Row2\ttest.txt",
43 }, results);
44 }
45 }
46
47 [Fact]
48 public void PopulatesCustomTableWithLocalization()
49 {
50 var folder = TestData.Get(@"TestData");
51
52 using (var fs = new DisposableFileSystem())
53 {
54 var baseFolder = fs.GetFolder();
55 var intermediateFolder = Path.Combine(baseFolder, "obj");
56 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
57
58 var result = WixRunner.Execute(new[]
59 {
60 "build",
61 Path.Combine(folder, "CustomTable", "LocalizedCustomTable.wxs"),
62 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
63 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
64 "-loc", Path.Combine(folder, "CustomTable", "LocalizedCustomTable.en-us.wxl"),
65 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
66 "-intermediateFolder", intermediateFolder,
67 "-o", msiPath
68 });
69
70 result.AssertSuccess();
71
72 Assert.True(File.Exists(msiPath));
73 var results = Query.QueryDatabase(msiPath, new[] { "CustomTableLocalized" });
74 Assert.Equal(new[]
75 {
76 "CustomTableLocalized:Row1\tThis is row one",
77 "CustomTableLocalized:Row2\tThis is row two",
78 }, results);
79 }
80 }
81
82 [Fact]
83 public void PopulatesCustomTableWithFilePath()
84 {
85 var folder = TestData.Get(@"TestData");
86
87 using (var fs = new DisposableFileSystem())
88 {
89 var baseFolder = fs.GetFolder();
90 var intermediateFolder = Path.Combine(baseFolder, "obj");
91 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
92
93 var result = WixRunner.Execute(new[]
94 {
95 "build",
96 Path.Combine(folder, "CustomTable", "CustomTableWithFile.wxs"),
97 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
98 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
99 "-bindpath", Path.Combine(folder, "CustomTable", "data"),
100 "-intermediateFolder", intermediateFolder,
101 "-o", msiPath
102 });
103
104 result.AssertSuccess();
105
106 Assert.True(File.Exists(msiPath));
107 var results = Query.QueryDatabase(msiPath, new[] { "CustomTableWithFile" });
108 Assert.Equal(new[]
109 {
110 "CustomTableWithFile:Row1\t[Binary data]",
111 "CustomTableWithFile:Row2\t[Binary data]",
112 }, results);
113 }
114 }
115
116 [Fact]
117 public void PopulatesCustomTableWithFilePathSerialized()
118 {
119 var folder = TestData.Get(@"TestData");
120
121 using (var fs = new DisposableFileSystem())
122 {
123 var baseFolder = fs.GetFolder();
124 var intermediateFolder = Path.Combine(baseFolder, "obj");
125 var wixlibPath = Path.Combine(baseFolder, @"bin\test.wixlib");
126 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
127
128 var result = WixRunner.Execute(new[]
129 {
130 "build",
131 Path.Combine(folder, "CustomTable", "CustomTableWithFile.wxs"),
132 "-bindpath", Path.Combine(folder, "CustomTable", "data"),
133 "-intermediateFolder", intermediateFolder,
134 "-o", wixlibPath
135 });
136
137 result.AssertSuccess();
138
139 result = WixRunner.Execute(new[]
140 {
141 "build",
142 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
143 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
144 "-lib", wixlibPath,
145 "-bindpath", Path.Combine(folder, "CustomTable", "data"),
146 "-intermediateFolder", intermediateFolder,
147 "-o", msiPath
148 });
149
150 result.AssertSuccess();
151
152 Assert.True(File.Exists(msiPath));
153 var results = Query.QueryDatabase(msiPath, new[] { "CustomTableWithFile" });
154 Assert.Equal(new[]
155 {
156 "CustomTableWithFile:Row1\t[Binary data]",
157 "CustomTableWithFile:Row2\t[Binary data]",
158 }, results);
159 }
160 }
161
162 [Fact]
163 public void UnrealCustomTableIsNotPresentInMsi()
164 {
165 var folder = TestData.Get(@"TestData");
166
167 using (var fs = new DisposableFileSystem())
168 {
169 var baseFolder = fs.GetFolder();
170 var intermediateFolder = Path.Combine(baseFolder, "obj");
171 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
172
173 var result = WixRunner.Execute(new[]
174 {
175 "build",
176 Path.Combine(folder, "CustomTable", "CustomTable.wxs"),
177 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
178 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
179 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
180 "-intermediateFolder", intermediateFolder,
181 "-o", msiPath
182 });
183
184 result.AssertSuccess();
185
186 Assert.True(File.Exists(msiPath));
187 var results = Query.QueryDatabase(msiPath, new[] { "CustomTable2" });
188 Assert.Empty(results);
189 }
190 }
191
192 [Fact]
193 public void CanCompileAndDecompile()
194 {
195 var folder = TestData.Get(@"TestData");
196 var expectedFile = Path.Combine(folder, "CustomTable", "CustomTable-Expected.wxs");
197
198 using (var fs = new DisposableFileSystem())
199 {
200 var baseFolder = fs.GetFolder();
201 var intermediateFolder = Path.Combine(baseFolder, "obj");
202 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
203 var decompiledWxsPath = Path.Combine(baseFolder, @"decompiled.wxs");
204
205 var result = WixRunner.Execute(new[]
206 {
207 "build",
208 Path.Combine(folder, "CustomTable", "CustomTable.wxs"),
209 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
210 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
211 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
212 "-intermediateFolder", intermediateFolder,
213 "-o", msiPath
214 });
215
216 result.AssertSuccess();
217 Assert.True(File.Exists(msiPath));
218
219 result = WixRunner.Execute(new[]
220 {
221 "decompile", msiPath,
222 "-intermediateFolder", intermediateFolder,
223 "-o", decompiledWxsPath
224 });
225
226 result.AssertSuccess();
227
228 CompareLineByLine(expectedFile, decompiledWxsPath);
229 }
230 }
231
232 private static void CompareLineByLine(string expectedFile, string actualFile)
233 {
234 var expectedLines = File.ReadAllLines(expectedFile);
235 var actualLines = File.ReadAllLines(actualFile);
236 for (var i = 0; i < expectedLines.Length; ++i)
237 {
238 Assert.True(actualLines.Length > i, $"{i}: Expected file longer than actual file");
239 Assert.Equal($"{i}: {expectedLines[i]}", $"{i}: {actualLines[i]}");
240 }
241 Assert.True(expectedLines.Length == actualLines.Length, "Actual file longer than expected file");
242 }
243 }
244}
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
@@ -439,185 +439,6 @@ namespace WixToolsetTest.CoreIntegration
439 } 439 }
440 440
441 [Fact] 441 [Fact]
442 public void PopulatesCustomTable1()
443 {
444 var folder = TestData.Get(@"TestData");
445
446 using (var fs = new DisposableFileSystem())
447 {
448 var baseFolder = fs.GetFolder();
449 var intermediateFolder = Path.Combine(baseFolder, "obj");
450 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
451
452 var result = WixRunner.Execute(new[]
453 {
454 "build",
455 Path.Combine(folder, "CustomTable", "CustomTable.wxs"),
456 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
457 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
458 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
459 "-intermediateFolder", intermediateFolder,
460 "-o", msiPath
461 });
462
463 result.AssertSuccess();
464
465 Assert.True(File.Exists(msiPath));
466 var results = Query.QueryDatabase(msiPath, new[] { "CustomTable1" });
467 Assert.Equal(new[]
468 {
469 "CustomTable1:Row1\ttest.txt",
470 "CustomTable1:Row2\ttest.txt",
471 }, results);
472 }
473 }
474
475 [Fact]
476 public void PopulatesCustomTableWithLocalization()
477 {
478 var folder = TestData.Get(@"TestData");
479
480 using (var fs = new DisposableFileSystem())
481 {
482 var baseFolder = fs.GetFolder();
483 var intermediateFolder = Path.Combine(baseFolder, "obj");
484 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
485
486 var result = WixRunner.Execute(new[]
487 {
488 "build",
489 Path.Combine(folder, "CustomTable", "LocalizedCustomTable.wxs"),
490 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
491 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
492 "-loc", Path.Combine(folder, "CustomTable", "LocalizedCustomTable.en-us.wxl"),
493 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
494 "-intermediateFolder", intermediateFolder,
495 "-o", msiPath
496 });
497
498 result.AssertSuccess();
499
500 Assert.True(File.Exists(msiPath));
501 var results = Query.QueryDatabase(msiPath, new[] { "CustomTableLocalized" });
502 Assert.Equal(new[]
503 {
504 "CustomTableLocalized:Row1\tThis is row one",
505 "CustomTableLocalized:Row2\tThis is row two",
506 }, results);
507 }
508 }
509
510 [Fact]
511 public void PopulatesCustomTableWithFilePath()
512 {
513 var folder = TestData.Get(@"TestData");
514
515 using (var fs = new DisposableFileSystem())
516 {
517 var baseFolder = fs.GetFolder();
518 var intermediateFolder = Path.Combine(baseFolder, "obj");
519 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
520
521 var result = WixRunner.Execute(new[]
522 {
523 "build",
524 Path.Combine(folder, "CustomTable", "CustomTableWithFile.wxs"),
525 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
526 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
527 "-bindpath", Path.Combine(folder, "CustomTable", "data"),
528 "-intermediateFolder", intermediateFolder,
529 "-o", msiPath
530 });
531
532 result.AssertSuccess();
533
534 Assert.True(File.Exists(msiPath));
535 var results = Query.QueryDatabase(msiPath, new[] { "CustomTableWithFile" });
536 Assert.Equal(new[]
537 {
538 "CustomTableWithFile:Row1\t[Binary data]",
539 "CustomTableWithFile:Row2\t[Binary data]",
540 }, results);
541 }
542 }
543
544 [Fact]
545 public void PopulatesCustomTableWithFilePathSerialized()
546 {
547 var folder = TestData.Get(@"TestData");
548
549 using (var fs = new DisposableFileSystem())
550 {
551 var baseFolder = fs.GetFolder();
552 var intermediateFolder = Path.Combine(baseFolder, "obj");
553 var wixlibPath = Path.Combine(baseFolder, @"bin\test.wixlib");
554 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
555
556 var result = WixRunner.Execute(new[]
557 {
558 "build",
559 Path.Combine(folder, "CustomTable", "CustomTableWithFile.wxs"),
560 "-bindpath", Path.Combine(folder, "CustomTable", "data"),
561 "-intermediateFolder", intermediateFolder,
562 "-o", wixlibPath
563 });
564
565 result.AssertSuccess();
566
567 result = WixRunner.Execute(new[]
568 {
569 "build",
570 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
571 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
572 "-lib", wixlibPath,
573 "-bindpath", Path.Combine(folder, "CustomTable", "data"),
574 "-intermediateFolder", intermediateFolder,
575 "-o", msiPath
576 });
577
578 result.AssertSuccess();
579
580 Assert.True(File.Exists(msiPath));
581 var results = Query.QueryDatabase(msiPath, new[] { "CustomTableWithFile" });
582 Assert.Equal(new[]
583 {
584 "CustomTableWithFile:Row1\t[Binary data]",
585 "CustomTableWithFile:Row2\t[Binary data]",
586 }, results);
587 }
588 }
589
590 [Fact]
591 public void UnrealCustomTableIsNotPresentInMsi()
592 {
593 var folder = TestData.Get(@"TestData");
594
595 using (var fs = new DisposableFileSystem())
596 {
597 var baseFolder = fs.GetFolder();
598 var intermediateFolder = Path.Combine(baseFolder, "obj");
599 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
600
601 var result = WixRunner.Execute(new[]
602 {
603 "build",
604 Path.Combine(folder, "CustomTable", "CustomTable.wxs"),
605 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
606 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
607 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
608 "-intermediateFolder", intermediateFolder,
609 "-o", msiPath
610 });
611
612 result.AssertSuccess();
613
614 Assert.True(File.Exists(msiPath));
615 var results = Query.QueryDatabase(msiPath, new[] { "CustomTable2" });
616 Assert.Empty(results);
617 }
618 }
619
620 [Fact]
621 public void PopulatesDirectoryTableWithValidDefaultDir() 442 public void PopulatesDirectoryTableWithValidDefaultDir()
622 { 443 {
623 var folder = TestData.Get(@"TestData"); 444 var folder = TestData.Get(@"TestData");
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 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 <Product Id="{83F9C623-26FE-42AB-951E-170022117F54}" Codepage="1252" Language="1033" Manufacturer="Example Corporation" Name="MsiPackage" UpgradeCode="{12E4699F-E774-4D05-8A01-5BDD41BBA127}" Version="1.0.0.0">
4 <Package Description="MsiPackage" InstallerVersion="500" Languages="1033" Manufacturer="Example Corporation" Platform="x86" />
5 <CustomTable Id="CustomTable1">
6 <Column Id="Column1" PrimaryKey="yes" Type="string" Width="0" Category="text" Description="The first custom column." />
7 <Column Id="Component_" Type="string" Width="72" KeyTable="Component" KeyColumn="1" Description="The custom table's Component reference" />
8 <Row>
9 <Data Column="Column1">Row1</Data>
10 <Data Column="Component_">test.txt</Data>
11 </Row>
12 <Row>
13 <Data Column="Column1">Row2</Data>
14 <Data Column="Component_">test.txt</Data>
15 </Row>
16 </CustomTable>
17 <Directory Id="TARGETDIR" Name="SourceDir">
18 <Directory Id="ProgramFilesFolder">
19 <Directory Id="INSTALLFOLDER" Name="MsiPackage" ShortName="oekcr5lq">
20 <Component Id="filcV1yrx0x8wJWj4qMzcH21jwkPko" Guid="{E597A58A-03CB-50D8-93E3-DABA263F233A}" Win64="no">
21 <File Id="filcV1yrx0x8wJWj4qMzcH21jwkPko" Name="test.txt" KeyPath="yes" Source="SourceDir\\MsiPackage\test.txt" />
22 </Component>
23 </Directory>
24 </Directory>
25 </Directory>
26 <Feature Id="ProductFeature" Level="1" Title="MsiPackageTitle">
27 <ComponentRef Id="filcV1yrx0x8wJWj4qMzcH21jwkPko" />
28 </Feature>
29 <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
30 <Media Id="1" />
31 <Property Id="ALLUSERS" Value="1" />
32 </Product>
33</Wix>
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 @@
6 </ComponentGroup> 6 </ComponentGroup>
7 7
8 <CustomTable Id="CustomTable1"> 8 <CustomTable Id="CustomTable1">
9 <Column Id="Column1" Type="string" PrimaryKey="yes" /> 9 <Column Id="Column1" Type="string" PrimaryKey="yes" Category="text" Modularize="column" Description="The first custom column." />
10 <Column Id="Component_" Type="string" Width="72" KeyTable="Component" KeyColumn="1" /> 10 <Column Id="Component_" Type="string" Width="72" KeyTable="Component" KeyColumn="1" Description="The custom table's Component reference" />
11 <Row> 11 <Row>
12 <Data Column="Column1">Row1</Data> 12 <Data Column="Column1">Row1</Data>
13 <Data Column="Component_">test.txt</Data> 13 <Data Column="Component_">test.txt</Data>
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 @@
1<?xml version="1.0" encoding="utf-8"?> 1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> 2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 <Product Id="*" Name="MsiPackage" Codepage="1252" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="12E4699F-E774-4D05-8A01-5BDD41BBA127"> 3 <Product Id="83f9c623-26fe-42ab-951e-170022117f54" Name="MsiPackage" Codepage="1252" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="12E4699F-E774-4D05-8A01-5BDD41BBA127">
4 <Package InstallerVersion="500" Compressed="no" InstallScope="perMachine" /> 4 <Package InstallerVersion="500" Compressed="no" InstallScope="perMachine" />
5 5
6 <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." /> 6 <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
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 @@
34 <Content Include="TestData\Class\IconIndex0.wxs" CopyToOutputDirectory="PreserveNewest" /> 34 <Content Include="TestData\Class\IconIndex0.wxs" CopyToOutputDirectory="PreserveNewest" />
35 <Content Include="TestData\Class\OldClassTableDef.msi" CopyToOutputDirectory="PreserveNewest" /> 35 <Content Include="TestData\Class\OldClassTableDef.msi" CopyToOutputDirectory="PreserveNewest" />
36 <Content Include="TestData\CustomAction\UnscheduledCustomAction.wxs" CopyToOutputDirectory="PreserveNewest" /> 36 <Content Include="TestData\CustomAction\UnscheduledCustomAction.wxs" CopyToOutputDirectory="PreserveNewest" />
37 <Content Include="TestData\CustomTable\CustomTable-Expected.wxs" CopyToOutputDirectory="PreserveNewest" />
37 <Content Include="TestData\CustomTable\CustomTableWithFile.wxs" CopyToOutputDirectory="PreserveNewest" /> 38 <Content Include="TestData\CustomTable\CustomTableWithFile.wxs" CopyToOutputDirectory="PreserveNewest" />
38 <Content Include="TestData\CustomTable\data\file1.txt" CopyToOutputDirectory="PreserveNewest" /> 39 <Content Include="TestData\CustomTable\data\file1.txt" CopyToOutputDirectory="PreserveNewest" />
39 <Content Include="TestData\CustomTable\data\test.txt" CopyToOutputDirectory="PreserveNewest" /> 40 <Content Include="TestData\CustomTable\data\test.txt" CopyToOutputDirectory="PreserveNewest" />