@joebigelow / wix-1 / commits / 49ce7795

Fix custom table column values case in compiler and decompiler

Rob Mensching committed Jun 12, 2020 at 06:51 UTC 49ce77951ca980848b275cef082309c49b117f47
9 files changed +429 -239
src/WixToolset.Core.WindowsInstaller/Bind/LoadTableDefinitionsCommand.cs
+27 -26
@@ -87,84 +87,85 @@ namespace WixToolset.Core.WindowsInstaller.Bind
87 var category = ColumnCategory.Unknown;
88 switch (column.Category)
89 {
90 - case "Text":
90 + case WixCustomTableColumnCategoryType.Text:
91 category = ColumnCategory.Text;
92 break;
93 - case "UpperCase":
93 + case WixCustomTableColumnCategoryType.UpperCase:
94 category = ColumnCategory.UpperCase;
95 break;
96 - case "LowerCase":
96 + case WixCustomTableColumnCategoryType.LowerCase:
97 category = ColumnCategory.LowerCase;
98 break;
99 - case "Integer":
99 + case WixCustomTableColumnCategoryType.Integer:
100 category = ColumnCategory.Integer;
101 break;
102 - case "DoubleInteger":
102 + case WixCustomTableColumnCategoryType.DoubleInteger:
103 category = ColumnCategory.DoubleInteger;
104 break;
105 - case "TimeDate":
105 + case WixCustomTableColumnCategoryType.TimeDate:
106 category = ColumnCategory.TimeDate;
107 break;
108 - case "Identifier":
108 + case WixCustomTableColumnCategoryType.Identifier:
109 category = ColumnCategory.Identifier;
110 break;
111 - case "Property":
111 + case WixCustomTableColumnCategoryType.Property:
112 category = ColumnCategory.Property;
113 break;
114 - case "Filename":
114 + case WixCustomTableColumnCategoryType.Filename:
115 category = ColumnCategory.Filename;
116 break;
117 - case "WildCardFilename":
117 + case WixCustomTableColumnCategoryType.WildCardFilename:
118 category = ColumnCategory.WildCardFilename;
119 break;
120 - case "Path":
120 + case WixCustomTableColumnCategoryType.Path:
121 category = ColumnCategory.Path;
122 break;
123 - case "Paths":
123 + case WixCustomTableColumnCategoryType.Paths:
124 category = ColumnCategory.Paths;
125 break;
126 - case "AnyPath":
126 + case WixCustomTableColumnCategoryType.AnyPath:
127 category = ColumnCategory.AnyPath;
128 break;
129 - case "DefaultDir":
129 + case WixCustomTableColumnCategoryType.DefaultDir:
130 category = ColumnCategory.DefaultDir;
131 break;
132 - case "RegPath":
132 + case WixCustomTableColumnCategoryType.RegPath:
133 category = ColumnCategory.RegPath;
134 break;
135 - case "Formatted":
135 + case WixCustomTableColumnCategoryType.Formatted:
136 category = ColumnCategory.Formatted;
137 break;
138 - case "FormattedSddl":
138 + case WixCustomTableColumnCategoryType.FormattedSddl:
139 category = ColumnCategory.FormattedSDDLText;
140 break;
141 - case "Template":
141 + case WixCustomTableColumnCategoryType.Template:
142 category = ColumnCategory.Template;
143 break;
144 - case "Condition":
144 + case WixCustomTableColumnCategoryType.Condition:
145 category = ColumnCategory.Condition;
146 break;
147 - case "Guid":
147 + case WixCustomTableColumnCategoryType.Guid:
148 category = ColumnCategory.Guid;
149 break;
150 - case "Version":
150 + case WixCustomTableColumnCategoryType.Version:
151 category = ColumnCategory.Version;
152 break;
153 - case "Language":
153 + case WixCustomTableColumnCategoryType.Language:
154 category = ColumnCategory.Language;
155 break;
156 - case "Binary":
156 + case WixCustomTableColumnCategoryType.Binary:
157 category = ColumnCategory.Binary;
158 break;
159 - case "CustomSource":
159 + case WixCustomTableColumnCategoryType.CustomSource:
160 category = ColumnCategory.CustomSource;
161 break;
162 - case "Cabinet":
162 + case WixCustomTableColumnCategoryType.Cabinet:
163 category = ColumnCategory.Cabinet;
164 break;
165 - case "Shortcut":
165 + case WixCustomTableColumnCategoryType.Shortcut:
166 category = ColumnCategory.Shortcut;
167 break;
168 + case null:
169 default:
170 break;
171 }
src/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs
+26 -26
@@ -4481,82 +4481,82 @@ namespace WixToolset.Core.WindowsInstaller
4481 switch (columnDefinition.Category)
4482 {
4483 case ColumnCategory.Text:
4484 - column.Category = Wix.Column.CategoryType.Text;
4484 + column.Category = Wix.Column.CategoryType.text;
4485 break;
4486 case ColumnCategory.UpperCase:
4487 - column.Category = Wix.Column.CategoryType.UpperCase;
4487 + column.Category = Wix.Column.CategoryType.upperCase;
4488 break;
4489 case ColumnCategory.LowerCase:
4490 - column.Category = Wix.Column.CategoryType.LowerCase;
4490 + column.Category = Wix.Column.CategoryType.lowerCase;
4491 break;
4492 case ColumnCategory.Integer:
4493 - column.Category = Wix.Column.CategoryType.Integer;
4493 + column.Category = Wix.Column.CategoryType.integer;
4494 break;
4495 case ColumnCategory.DoubleInteger:
4496 - column.Category = Wix.Column.CategoryType.DoubleInteger;
4496 + column.Category = Wix.Column.CategoryType.doubleInteger;
4497 break;
4498 case ColumnCategory.TimeDate:
4499 - column.Category = Wix.Column.CategoryType.TimeDate;
4499 + column.Category = Wix.Column.CategoryType.timeDate;
4500 break;
4501 case ColumnCategory.Identifier:
4502 - column.Category = Wix.Column.CategoryType.Identifier;
4502 + column.Category = Wix.Column.CategoryType.identifier;
4503 break;
4504 case ColumnCategory.Property:
4505 - column.Category = Wix.Column.CategoryType.Property;
4505 + column.Category = Wix.Column.CategoryType.property;
4506 break;
4507 case ColumnCategory.Filename:
4508 - column.Category = Wix.Column.CategoryType.Filename;
4508 + column.Category = Wix.Column.CategoryType.filename;
4509 break;
4510 case ColumnCategory.WildCardFilename:
4511 - column.Category = Wix.Column.CategoryType.WildCardFilename;
4511 + column.Category = Wix.Column.CategoryType.wildCardFilename;
4512 break;
4513 case ColumnCategory.Path:
4514 - column.Category = Wix.Column.CategoryType.Path;
4514 + column.Category = Wix.Column.CategoryType.path;
4515 break;
4516 case ColumnCategory.Paths:
4517 - column.Category = Wix.Column.CategoryType.Paths;
4517 + column.Category = Wix.Column.CategoryType.paths;
4518 break;
4519 case ColumnCategory.AnyPath:
4520 - column.Category = Wix.Column.CategoryType.AnyPath;
4520 + column.Category = Wix.Column.CategoryType.anyPath;
4521 break;
4522 case ColumnCategory.DefaultDir:
4523 - column.Category = Wix.Column.CategoryType.DefaultDir;
4523 + column.Category = Wix.Column.CategoryType.defaultDir;
4524 break;
4525 case ColumnCategory.RegPath:
4526 - column.Category = Wix.Column.CategoryType.RegPath;
4526 + column.Category = Wix.Column.CategoryType.regPath;
4527 break;
4528 case ColumnCategory.Formatted:
4529 - column.Category = Wix.Column.CategoryType.Formatted;
4529 + column.Category = Wix.Column.CategoryType.formatted;
4530 break;
4531 case ColumnCategory.FormattedSDDLText:
4532 - column.Category = Wix.Column.CategoryType.FormattedSddl;
4532 + column.Category = Wix.Column.CategoryType.formattedSddl;
4533 break;
4534 case ColumnCategory.Template:
4535 - column.Category = Wix.Column.CategoryType.Template;
4535 + column.Category = Wix.Column.CategoryType.template;
4536 break;
4537 case ColumnCategory.Condition:
4538 - column.Category = Wix.Column.CategoryType.Condition;
4538 + column.Category = Wix.Column.CategoryType.condition;
4539 break;
4540 case ColumnCategory.Guid:
4541 - column.Category = Wix.Column.CategoryType.Guid;
4541 + column.Category = Wix.Column.CategoryType.guid;
4542 break;
4543 case ColumnCategory.Version:
4544 - column.Category = Wix.Column.CategoryType.Version;
4544 + column.Category = Wix.Column.CategoryType.version;
4545 break;
4546 case ColumnCategory.Language:
4547 - column.Category = Wix.Column.CategoryType.Language;
4547 + column.Category = Wix.Column.CategoryType.language;
4548 break;
4549 case ColumnCategory.Binary:
4550 - column.Category = Wix.Column.CategoryType.Binary;
4550 + column.Category = Wix.Column.CategoryType.binary;
4551 break;
4552 case ColumnCategory.CustomSource:
4553 - column.Category = Wix.Column.CategoryType.CustomSource;
4553 + column.Category = Wix.Column.CategoryType.customSource;
4554 break;
4555 case ColumnCategory.Cabinet:
4556 - column.Category = Wix.Column.CategoryType.Cabinet;
4556 + column.Category = Wix.Column.CategoryType.cabinet;
4557 break;
4558 case ColumnCategory.Shortcut:
4559 - column.Category = Wix.Column.CategoryType.Shortcut;
4559 + column.Category = Wix.Column.CategoryType.shortcut;
4560 break;
4561 default:
4562 throw new InvalidOperationException($"Unknown custom column category '{columnDefinition.Category.ToString()}'.");
src/WixToolset.Core/Compiler.cs
+95 -5
@@ -3712,7 +3712,6 @@ namespace WixToolset.Core
3712 {
3713 case "Column":
3714 string columnName = null;
3715 - var category = String.Empty;
3715 IntermediateFieldType? columnType = null;
3716 var description = String.Empty;
3717 int? keyColumn = null;
@@ -3720,6 +3719,7 @@ namespace WixToolset.Core
3719 var localizable = false;
3720 long? maxValue = null;
3721 long? minValue = null;
3722 + WixCustomTableColumnCategoryType? category = null;
3723 var modularization = WixCustomTableColumnModularizeType.None;
3724 var nullable = false;
3725 var primaryKey = false;
@@ -3735,7 +3735,97 @@ namespace WixToolset.Core
3735 columnName = this.Core.GetAttributeIdentifierValue(childSourceLineNumbers, childAttrib);
3736 break;
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 + }
3829 break;
3830 case "Description":
3831 description = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib);
@@ -3854,11 +3944,11 @@ namespace WixToolset.Core
3944 }
3945 else if (columnType == IntermediateFieldType.Path)
3946 {
3857 - if (String.IsNullOrEmpty(category))
3947 + if (!category.HasValue)
3948 {
3859 - category = "Binary";
3949 + category = WixCustomTableColumnCategoryType.Binary;
3950 }
3861 - else if (category != "Binary")
3951 + else if (category != WixCustomTableColumnCategoryType.Binary)
3952 {
3953 this.Core.Write(ErrorMessages.ExpectedBinaryCategory(childSourceLineNumbers));
3954 }
src/test/WixToolsetTest.CoreIntegration/CustomTableFixture.cs new
+244
@@ -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 +
3 +namespace 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 +}
src/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs
-179
@@ -438,185 +438,6 @@ namespace WixToolsetTest.CoreIntegration
438 }
439 }
440
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 -
441 [Fact]
442 public void PopulatesDirectoryTableWithValidDefaultDir()
443 {
src/test/WixToolsetTest.CoreIntegration/TestData/CustomTable/CustomTable-Expected.wxs new
+33
@@ -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>
src/test/WixToolsetTest.CoreIntegration/TestData/CustomTable/CustomTable.wxs
+2 -2
@@ -6,8 +6,8 @@
6 </ComponentGroup>
7
8 <CustomTable Id="CustomTable1">
9 - <Column Id="Column1" Type="string" PrimaryKey="yes" />
10 - <Column Id="Component_" Type="string" Width="72" KeyTable="Component" KeyColumn="1" />
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" Description="The custom table's Component reference" />
11 <Row>
12 <Data Column="Column1">Row1</Data>
13 <Data Column="Component_">test.txt</Data>
src/test/WixToolsetTest.CoreIntegration/TestData/ProductWithComponentGroupRef/Product.wxs
+1 -1
@@ -1,6 +1,6 @@
1 <?xml version="1.0" encoding="utf-8"?>
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" />
5
6 <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
src/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj
+1
@@ -34,6 +34,7 @@
34 <Content Include="TestData\Class\IconIndex0.wxs" CopyToOutputDirectory="PreserveNewest" />
35 <Content Include="TestData\Class\OldClassTableDef.msi" CopyToOutputDirectory="PreserveNewest" />
36 <Content Include="TestData\CustomAction\UnscheduledCustomAction.wxs" CopyToOutputDirectory="PreserveNewest" />
37 + <Content Include="TestData\CustomTable\CustomTable-Expected.wxs" CopyToOutputDirectory="PreserveNewest" />
38 <Content Include="TestData\CustomTable\CustomTableWithFile.wxs" CopyToOutputDirectory="PreserveNewest" />
39 <Content Include="TestData\CustomTable\data\file1.txt" CopyToOutputDirectory="PreserveNewest" />
40 <Content Include="TestData\CustomTable\data\test.txt" CopyToOutputDirectory="PreserveNewest" />