aboutsummaryrefslogtreecommitdiff
path: root/src/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs')
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs1040
1 files changed, 0 insertions, 1040 deletions
diff --git a/src/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs b/src/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs
deleted file mode 100644
index 71edddc6..00000000
--- a/src/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs
+++ /dev/null
@@ -1,1040 +0,0 @@
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;
6 using System.IO;
7 using System.Linq;
8 using Example.Extension;
9 using WixBuildTools.TestSupport;
10 using WixToolset.Core.TestPackage;
11 using WixToolset.Data;
12 using WixToolset.Data.Symbols;
13 using WixToolset.Data.WindowsInstaller;
14 using Xunit;
15
16 public class MsiQueryFixture
17 {
18 [Fact]
19 public void PopulatesAppIdTableWhenAdvertised()
20 {
21 var folder = TestData.Get(@"TestData");
22
23 using (var fs = new DisposableFileSystem())
24 {
25 var baseFolder = fs.GetFolder();
26 var intermediateFolder = Path.Combine(baseFolder, "obj");
27 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
28
29 var result = WixRunner.Execute(new[]
30 {
31 "build",
32 Path.Combine(folder, "AppId", "Advertised.wxs"),
33 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
34 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
35 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
36 "-intermediateFolder", intermediateFolder,
37 "-o", msiPath
38 });
39
40 result.AssertSuccess();
41
42 Assert.True(File.Exists(msiPath));
43 var results = Query.QueryDatabase(msiPath, new[] { "AppId" });
44 WixAssert.CompareLineByLine(new[]
45 {
46 "AppId:{D6040299-B15C-4C94-AE26-0C9B60D14C35}\t\t\t\t\t\t",
47 }, results);
48 }
49 }
50
51 [Fact]
52 public void PopulatesAppSearchTablesFromComponentSearch()
53 {
54 var folder = TestData.Get(@"TestData");
55
56 using (var fs = new DisposableFileSystem())
57 {
58 var baseFolder = fs.GetFolder();
59 var intermediateFolder = Path.Combine(baseFolder, "obj");
60 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
61
62 var result = WixRunner.Execute(new[]
63 {
64 "build",
65 Path.Combine(folder, "AppSearch", "ComponentSearch.wxs"),
66 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
67 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
68 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
69 "-intermediateFolder", intermediateFolder,
70 "-o", msiPath
71 });
72
73 result.AssertSuccess();
74
75 Assert.True(File.Exists(msiPath));
76 var results = Query.QueryDatabase(msiPath, new[] { "AppSearch", "CompLocator" });
77 WixAssert.CompareLineByLine(new[]
78 {
79 "AppSearch:SAMPLECOMPFOUND\tSampleCompSearch",
80 "CompLocator:SampleCompSearch\t{4D9A0D20-D0CC-40DE-B580-EAD38B985217}\t1",
81 }, results);
82 }
83 }
84
85 [Fact]
86 public void PopulatesAppSearchTablesFromDirectorySearch()
87 {
88 var folder = TestData.Get(@"TestData");
89
90 using (var fs = new DisposableFileSystem())
91 {
92 var baseFolder = fs.GetFolder();
93 var intermediateFolder = Path.Combine(baseFolder, "obj");
94 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
95
96 var result = WixRunner.Execute(new[]
97 {
98 "build",
99 Path.Combine(folder, "AppSearch", "DirectorySearch.wxs"),
100 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
101 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
102 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
103 "-intermediateFolder", intermediateFolder,
104 "-o", msiPath
105 });
106
107 result.AssertSuccess();
108
109 Assert.True(File.Exists(msiPath));
110 var results = Query.QueryDatabase(msiPath, new[] { "AppSearch", "DrLocator" });
111 WixAssert.CompareLineByLine(new[]
112 {
113 "AppSearch:SAMPLEDIRFOUND\tSampleDirSearch",
114 "DrLocator:SampleDirSearch\t\tC:\\SampleDir\t",
115 }, results);
116 }
117 }
118
119 [Fact]
120 public void PopulatesAppSearchTablesFromFileSearch()
121 {
122 var folder = TestData.Get(@"TestData");
123
124 using (var fs = new DisposableFileSystem())
125 {
126 var baseFolder = fs.GetFolder();
127 var intermediateFolder = Path.Combine(baseFolder, "obj");
128 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
129
130 var result = WixRunner.Execute(new[]
131 {
132 "build",
133 Path.Combine(folder, "AppSearch", "FileSearch.wxs"),
134 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
135 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
136 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
137 "-intermediateFolder", intermediateFolder,
138 "-o", msiPath
139 });
140
141 result.AssertSuccess();
142
143 Assert.True(File.Exists(msiPath));
144 var results = Query.QueryDatabase(msiPath, new[] { "AppSearch", "DrLocator", "IniLocator" });
145 WixAssert.CompareLineByLine(new[]
146 {
147 "AppSearch:SAMPLEFILEFOUND\tSampleFileSearch",
148 "DrLocator:SampleFileSearch\tSampleIniFileSearch\t\t",
149 "IniLocator:SampleFileSearch\tsample.fil\tMySection\tMyKey\t\t1",
150 }, results);
151 }
152 }
153
154 [Fact]
155 public void PopulatesAppSearchTablesFromRegistrySearch()
156 {
157 var folder = TestData.Get(@"TestData");
158
159 using (var fs = new DisposableFileSystem())
160 {
161 var baseFolder = fs.GetFolder();
162 var intermediateFolder = Path.Combine(baseFolder, "obj");
163 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
164
165 var result = WixRunner.Execute(new[]
166 {
167 "build",
168 Path.Combine(folder, "AppSearch", "RegistrySearch.wxs"),
169 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
170 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
171 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
172 "-intermediateFolder", intermediateFolder,
173 "-o", msiPath
174 });
175
176 result.AssertSuccess();
177
178 Assert.True(File.Exists(msiPath));
179 var results = Query.QueryDatabase(msiPath, new[] { "AppSearch", "RegLocator" });
180 WixAssert.CompareLineByLine(new[]
181 {
182 "AppSearch:SAMPLEREGFOUND\tSampleRegSearch",
183 "RegLocator:SampleRegSearch\t2\tSampleReg\t\t2",
184 }, results);
185 }
186 }
187
188 [Fact]
189 public void PopulatesAppSearchTablesFromRegistrySearch64()
190 {
191 var folder = TestData.Get(@"TestData");
192
193 using (var fs = new DisposableFileSystem())
194 {
195 var baseFolder = fs.GetFolder();
196 var intermediateFolder = Path.Combine(baseFolder, "obj");
197 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
198
199 var result = WixRunner.Execute(new[]
200 {
201 "build",
202 Path.Combine(folder, "AppSearch", "RegistrySearch64.wxs"),
203 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
204 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
205 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
206 "-intermediateFolder", intermediateFolder,
207 "-o", msiPath
208 });
209
210 result.AssertSuccess();
211
212 Assert.True(File.Exists(msiPath));
213 var results = Query.QueryDatabase(msiPath, new[] { "AppSearch", "RegLocator" });
214 WixAssert.CompareLineByLine(new[]
215 {
216 "AppSearch:SAMPLEREGFOUND\tSampleRegSearch",
217 "RegLocator:SampleRegSearch\t2\tSampleReg\t\t18",
218 }, results);
219 }
220 }
221
222 [Fact]
223 public void PopulatesClassTablesWhenIconIndexIsZero()
224 {
225 var folder = TestData.Get(@"TestData");
226
227 using (var fs = new DisposableFileSystem())
228 {
229 var baseFolder = fs.GetFolder();
230 var intermediateFolder = Path.Combine(baseFolder, "obj");
231 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
232
233 var result = WixRunner.Execute(new[]
234 {
235 "build",
236 Path.Combine(folder, "Class", "IconIndex0.wxs"),
237 Path.Combine(folder, "Icon", "SampleIcon.wxs"),
238 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
239 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
240 "-bindpath", Path.Combine(folder, ".Data"),
241 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
242 "-intermediateFolder", intermediateFolder,
243 "-o", msiPath
244 });
245
246 result.AssertSuccess();
247
248 Assert.True(File.Exists(msiPath));
249 var results = Query.QueryDatabase(msiPath, new[] { "Class" });
250 WixAssert.CompareLineByLine(new[]
251 {
252 "Class:{3FAED4CC-C473-4B8A-BE8B-303871377A4A}\tLocalServer32\tClassComp\t\tFakeClass3FAE\t\t\tSampleIcon\t0\t\t\tProductFeature\t",
253 }, results);
254 }
255 }
256
257 [Fact]
258 public void PopulatesClassTablesWhenProgIdIsNestedUnderAdvertisedClass()
259 {
260 var folder = TestData.Get(@"TestData");
261
262 using (var fs = new DisposableFileSystem())
263 {
264 var baseFolder = fs.GetFolder();
265 var intermediateFolder = Path.Combine(baseFolder, "obj");
266 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
267
268 var result = WixRunner.Execute(new[]
269 {
270 "build",
271 Path.Combine(folder, "ProgId", "NestedUnderClass.wxs"),
272 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
273 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
274 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
275 "-intermediateFolder", intermediateFolder,
276 "-o", msiPath
277 });
278
279 result.AssertSuccess();
280
281 Assert.True(File.Exists(msiPath));
282 var results = Query.QueryDatabase(msiPath, new[] { "Class", "ProgId", "Registry" });
283 WixAssert.CompareLineByLine(new[]
284 {
285 "Class:{F12A6F69-117F-471F-AE73-F8E74218F498}\tLocalServer32\tProgIdComp\t73E7DF7E-EFAC-4E11-90E2-6EBAEB8DE58D\tFakeClassF12A\t\t\t\t\t\t\tProductFeature\t",
286 "ProgId:73E7DF7E-EFAC-4E11-90E2-6EBAEB8DE58D\t\t{F12A6F69-117F-471F-AE73-F8E74218F498}\tFakeClassF12A\t\t",
287 "Registry:regUIIK326nDZpkWHuexeF58EikQvA\t0\t73E7DF7E-EFAC-4E11-90E2-6EBAEB8DE58D\tNoOpen\tNoOpen73E7\tProgIdComp",
288 "Registry:regvrhMurMp98anbQJkpgA8yJCefdM\t0\tCLSID\\{F12A6F69-117F-471F-AE73-F8E74218F498}\\Version\t\t0.0.0.1\tProgIdComp",
289 "Registry:regY1F4E2lvu_Up6gV6c3jeN5ukn8s\t0\tCLSID\\{F12A6F69-117F-471F-AE73-F8E74218F498}\\LocalServer32\tThreadingModel\tApartment\tProgIdComp",
290 }, results);
291 }
292 }
293
294 [Fact]
295 public void PopulatesControlTables()
296 {
297 var folder = TestData.Get(@"TestData");
298
299 using (var fs = new DisposableFileSystem())
300 {
301 var baseFolder = fs.GetFolder();
302 var intermediateFolder = Path.Combine(baseFolder, "obj");
303 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
304
305 var result = WixRunner.Execute(new[]
306 {
307 "build",
308 Path.Combine(folder, "DialogsInInstallUISequence", "PackageComponents.wxs"),
309 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
310 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
311 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
312 "-intermediateFolder", intermediateFolder,
313 "-o", msiPath,
314 });
315
316 result.AssertSuccess();
317
318 Assert.True(File.Exists(msiPath));
319
320 var results = Query.QueryDatabase(msiPath, new[] { "CheckBox", "Control", "ControlCondition", "InstallUISequence" });
321 WixAssert.CompareLineByLine(new[]
322 {
323 "CheckBox:WIXUI_EXITDIALOGOPTIONALCHECKBOX\t1",
324 "Control:FirstDialog\tHeader\tText\t0\t13\t90\t13\t3\t\tFirstDialogHeader\tTitle\t",
325 "Control:FirstDialog\tTitle\tText\t0\t0\t90\t13\t3\t\tFirstDialogTitle\tHeader\t",
326 "Control:SecondDialog\tOptionalCheckBox\tCheckBox\t0\t13\t100\t40\t2\tWIXUI_EXITDIALOGOPTIONALCHECKBOX\t[WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT]\tTitle\tOptional checkbox|Check this box for fun",
327 "Control:SecondDialog\tTitle\tText\t0\t0\t90\t13\t3\t\tSecondDialogTitle\tOptionalCheckBox\t",
328 "ControlCondition:FirstDialog\tHeader\tDisable\tInstalled",
329 "ControlCondition:FirstDialog\tHeader\tHide\tInstalled",
330 "ControlCondition:SecondDialog\tOptionalCheckBox\tShow\tWIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT AND NOT Installed",
331 "InstallUISequence:CostFinalize\t\t1000",
332 "InstallUISequence:CostInitialize\t\t800",
333 "InstallUISequence:ExecuteAction\t\t1300",
334 "InstallUISequence:FileCost\t\t900",
335 "InstallUISequence:FindRelatedProducts\t\t25",
336 "InstallUISequence:FirstDialog\tInstalled AND PATCH\t1298",
337 "InstallUISequence:LaunchConditions\t\t100",
338 "InstallUISequence:MigrateFeatureStates\t\t1200",
339 "InstallUISequence:SecondDialog\tNOT Installed\t1299",
340 "InstallUISequence:ValidateProductID\t\t700",
341 }, results);
342 }
343 }
344
345 [Fact]
346 public void PopulatesCreateFolderTableForNullKeypathComponents()
347 {
348 var folder = TestData.Get(@"TestData\Components");
349
350 using (var fs = new DisposableFileSystem())
351 {
352 var baseFolder = fs.GetFolder();
353 var intermediateFolder = Path.Combine(baseFolder, "obj");
354 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
355
356 var result = WixRunner.Execute(new[]
357 {
358 "build",
359 Path.Combine(folder, "Package.wxs"),
360 Path.Combine(folder, "PackageComponents.wxs"),
361 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
362 "-bindpath", Path.Combine(folder, "data"),
363 "-intermediateFolder", intermediateFolder,
364 "-o", msiPath
365 });
366
367 result.AssertSuccess();
368
369 Assert.True(File.Exists(msiPath));
370 var results = Query.QueryDatabase(msiPath, new[] { "CreateFolder" });
371 WixAssert.CompareLineByLine(new[]
372 {
373 "CreateFolder:INSTALLFOLDER\tNullKeypathComponent",
374 }, results);
375 }
376 }
377
378 [Fact]
379 public void PopulatesDirectoryTableWithValidDefaultDir()
380 {
381 var folder = TestData.Get(@"TestData");
382
383 using (var fs = new DisposableFileSystem())
384 {
385 var baseFolder = fs.GetFolder();
386 var intermediateFolder = Path.Combine(baseFolder, "obj");
387 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
388
389 var result = WixRunner.Execute(new[]
390 {
391 "build",
392 "-sw1031", // this is expected for this test
393 Path.Combine(folder, "DefaultDir", "DefaultDir.wxs"),
394 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
395 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
396 "-intermediateFolder", intermediateFolder,
397 "-o", msiPath
398 });
399
400 result.AssertSuccess();
401
402 Assert.True(File.Exists(msiPath));
403 var results = Query.QueryDatabase(msiPath, new[] { "Directory" });
404 WixAssert.CompareLineByLine(new[]
405 {
406 "Directory:DUPLICATENAMEANDSHORTNAME\tINSTALLFOLDER\tduplicat",
407 "Directory:Folder1\tINSTALLFOLDER\tFolder.1",
408 "Directory:Folder12\tINSTALLFOLDER\tFolder.12",
409 "Directory:Folder123\tINSTALLFOLDER\tFolder.123",
410 "Directory:Folder1234\tINSTALLFOLDER\tyakwclwy|Folder.1234",
411 "Directory:INSTALLFOLDER\tProgramFiles6432Folder\t1egc1laj|MsiPackage",
412 "Directory:NAMEANDSHORTNAME\tINSTALLFOLDER\tSHORTNAM|NameAndShortName",
413 "Directory:NAMEANDSHORTSOURCENAME\tINSTALLFOLDER\tNAMEASSN|NameAndShortSourceName",
414 "Directory:NAMEWITHSHORTVALUE\tINSTALLFOLDER\tSHORTVAL",
415 "Directory:ProgramFiles6432Folder\tProgramFilesFolder\t.",
416 "Directory:ProgramFilesFolder\tTARGETDIR\tPFiles",
417 "Directory:SHORTNAMEANDLONGSOURCENAME\tINSTALLFOLDER\tSHNALSNM:6ukthv5q|ShortNameAndLongSourceName",
418 "Directory:SHORTNAMEONLY\tINSTALLFOLDER\tSHORTONL",
419 "Directory:SOURCENAME\tINSTALLFOLDER\ts2s5bq-i|NameAndSourceName:dhnqygng|SourceNameWithName",
420 "Directory:SOURCENAMESONLY\tINSTALLFOLDER\t.:SRCNAMON|SourceNameOnly",
421 "Directory:SOURCENAMEWITHSHORTVALUE\tINSTALLFOLDER\t.:SRTSRCVL",
422 "Directory:TARGETDIR\t\tSourceDir",
423 }, results);
424 }
425 }
426
427 [Fact]
428 public void PopulatesEnvironmentTable()
429 {
430 var folder = TestData.Get(@"TestData");
431
432 using (var fs = new DisposableFileSystem())
433 {
434 var baseFolder = fs.GetFolder();
435 var intermediateFolder = Path.Combine(baseFolder, "obj");
436 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
437
438 var result = WixRunner.Execute(new[]
439 {
440 "build",
441 Path.Combine(folder, "Environment", "Environment.wxs"),
442 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
443 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
444 "-intermediateFolder", intermediateFolder,
445 "-o", msiPath
446 });
447
448 result.AssertSuccess();
449
450 Assert.True(File.Exists(msiPath));
451 var results = Query.QueryDatabase(msiPath, new[] { "Environment" });
452 WixAssert.CompareLineByLine(new[]
453 {
454 "Environment:PATH\t=-*PATH\t[INSTALLFOLDER]; ;[~]\tWixEnvironmentTest",
455 "Environment:WixEnvironmentTest1\t=-WixEnvTest1\t\tWixEnvironmentTest",
456 "Environment:WixEnvironmentTest2\t+-WixEnvTest1\t\tWixEnvironmentTest",
457 "Environment:WixEnvironmentTest3\t!-WixEnvTest1\t\tWixEnvironmentTest",
458 "Environment:WixEnvironmentTest4\t=-*WIX\t[INSTALLFOLDER]\tWixEnvironmentTest",
459 }, results);
460 }
461 }
462
463 [Fact(Skip = "Test demonstrates failure")]
464 public void PopulatesExampleTableBecauseOfEnsureTable()
465 {
466 var folder = TestData.Get(@"TestData");
467 var extensionPath = Path.GetFullPath(new Uri(typeof(ExampleExtensionFactory).Assembly.CodeBase).LocalPath);
468
469 using (var fs = new DisposableFileSystem())
470 {
471 var baseFolder = fs.GetFolder();
472 var intermediateFolder = Path.Combine(baseFolder, "obj");
473 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
474
475 var result = WixRunner.Execute(new[]
476 {
477 "build",
478 Path.Combine(folder, "EnsureTable", "EnsureTable.wxs"),
479 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
480 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
481 "-ext", extensionPath,
482 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
483 "-intermediateFolder", intermediateFolder,
484 "-o", msiPath
485 });
486
487 result.AssertSuccess();
488
489 Assert.True(File.Exists(msiPath));
490 var results = Query.QueryDatabaseByTable(msiPath, new[] { "Wix4Example" });
491 Assert.Empty(results["Wix4Example"]);
492 }
493 }
494
495 [Fact]
496 public void PopulatesFeatureTableWithParent()
497 {
498 var folder = TestData.Get(@"TestData");
499
500 using (var fs = new DisposableFileSystem())
501 {
502 var baseFolder = fs.GetFolder();
503 var intermediateFolder = Path.Combine(baseFolder, "obj");
504 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
505
506 var result = WixRunner.Execute(new[]
507 {
508 "build",
509 Path.Combine(folder, "FeatureGroup", "FeatureGroup.wxs"),
510 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
511 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
512 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
513 "-intermediateFolder", intermediateFolder,
514 "-o", msiPath
515 });
516
517 result.AssertSuccess();
518
519 Assert.True(File.Exists(msiPath));
520 var results = Query.QueryDatabase(msiPath, new[] { "Feature" });
521 WixAssert.CompareLineByLine(new[]
522 {
523 "Feature:ChildFeature\tParentFeature\tChildFeatureTitle\t\t2\t1\t\t0",
524 "Feature:ParentFeature\t\tParentFeatureTitle\t\t2\t1\t\t0",
525 "Feature:ProductFeature\t\tMsiPackageTitle\t\t2\t1\t\t0",
526 }, results);
527 }
528 }
529
530 [Fact]
531 public void PopulatesFontTableFromFontTitle()
532 {
533 var folder = TestData.Get(@"TestData");
534
535 using (var fs = new DisposableFileSystem())
536 {
537 var baseFolder = fs.GetFolder();
538 var intermediateFolder = Path.Combine(baseFolder, "obj");
539 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
540
541 var result = WixRunner.Execute(new[]
542 {
543 "build",
544 Path.Combine(folder, "Font", "FontTitle.wxs"),
545 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
546 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
547 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
548 "-intermediateFolder", intermediateFolder,
549 "-o", msiPath
550 });
551
552 result.AssertSuccess();
553
554 Assert.True(File.Exists(msiPath));
555 var results = Query.QueryDatabase(msiPath, new[] { "Font" });
556 WixAssert.CompareLineByLine(new[]
557 {
558 "Font:test.txt\tFakeFont",
559 }, results);
560 }
561 }
562
563 [Fact]
564 public void PopulatesFontTableFromTrueType()
565 {
566 var folder = TestData.Get(@"TestData");
567
568 using (var fs = new DisposableFileSystem())
569 {
570 var baseFolder = fs.GetFolder();
571 var intermediateFolder = Path.Combine(baseFolder, "obj");
572 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
573
574 var result = WixRunner.Execute(new[]
575 {
576 "build",
577 Path.Combine(folder, "Font", "TrueType.wxs"),
578 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
579 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
580 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
581 "-intermediateFolder", intermediateFolder,
582 "-o", msiPath
583 });
584
585 result.AssertSuccess();
586
587 Assert.True(File.Exists(msiPath));
588 var results = Query.QueryDatabase(msiPath, new[] { "Font" });
589 WixAssert.CompareLineByLine(new[]
590 {
591 "Font:TrueTypeFontFile\t",
592 }, results);
593 }
594 }
595
596 [Fact]
597 public void PopulatesInstallExecuteSequenceTable()
598 {
599 var folder = TestData.Get(@"TestData");
600
601 using (var fs = new DisposableFileSystem())
602 {
603 var baseFolder = fs.GetFolder();
604 var intermediateFolder = Path.Combine(baseFolder, "obj");
605 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
606
607 var result = WixRunner.Execute(new[]
608 {
609 "build",
610 Path.Combine(folder, "Upgrade", "DetectOnly.wxs"),
611 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
612 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
613 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
614 "-intermediateFolder", intermediateFolder,
615 "-o", msiPath
616 });
617
618 result.AssertSuccess();
619
620 Assert.True(File.Exists(msiPath));
621 var results = Query.QueryDatabase(msiPath, new[] { "InstallExecuteSequence" });
622 WixAssert.CompareLineByLine(new[]
623 {
624 "InstallExecuteSequence:CostFinalize\t\t1000",
625 "InstallExecuteSequence:CostInitialize\t\t800",
626 "InstallExecuteSequence:CreateFolders\t\t3700",
627 "InstallExecuteSequence:FileCost\t\t900",
628 "InstallExecuteSequence:FindRelatedProducts\t\t25",
629 "InstallExecuteSequence:InstallFiles\t\t4000",
630 "InstallExecuteSequence:InstallFinalize\t\t6600",
631 "InstallExecuteSequence:InstallInitialize\t\t1500",
632 "InstallExecuteSequence:InstallValidate\t\t1400",
633 "InstallExecuteSequence:LaunchConditions\t\t100",
634 "InstallExecuteSequence:MigrateFeatureStates\t\t1200",
635 "InstallExecuteSequence:ProcessComponents\t\t1600",
636 "InstallExecuteSequence:PublishFeatures\t\t6300",
637 "InstallExecuteSequence:PublishProduct\t\t6400",
638 "InstallExecuteSequence:RegisterProduct\t\t6100",
639 "InstallExecuteSequence:RegisterUser\t\t6000",
640 "InstallExecuteSequence:RemoveExistingProducts\t\t1401",
641 "InstallExecuteSequence:RemoveFiles\t\t3500",
642 "InstallExecuteSequence:RemoveFolders\t\t3600",
643 "InstallExecuteSequence:UnpublishFeatures\t\t1800",
644 "InstallExecuteSequence:ValidateProductID\t\t700",
645 }, results);
646 }
647 }
648
649 [Fact]
650 public void PopulatesLockPermissionsTableWithEmptyPermissions()
651 {
652 var folder = TestData.Get(@"TestData");
653
654 using (var fs = new DisposableFileSystem())
655 {
656 var baseFolder = fs.GetFolder();
657 var intermediateFolder = Path.Combine(baseFolder, "obj");
658 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
659
660 var result = WixRunner.Execute(new[]
661 {
662 "build",
663 Path.Combine(folder, "LockPermissions", "EmptyPermissions.wxs"),
664 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
665 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
666 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
667 "-intermediateFolder", intermediateFolder,
668 "-o", msiPath
669 });
670
671 result.AssertSuccess();
672
673 Assert.True(File.Exists(msiPath));
674 var results = Query.QueryDatabase(msiPath, new[] { "LockPermissions" });
675 WixAssert.CompareLineByLine(new[]
676 {
677 "LockPermissions:INSTALLFOLDER\tCreateFolder\t\tAdministrator\t0",
678 }, results);
679 }
680 }
681
682 [Fact]
683 public void PopulatesMsiAssemblyTables()
684 {
685 var folder = TestData.Get(@"TestData");
686
687 using (var fs = new DisposableFileSystem())
688 {
689 var baseFolder = fs.GetFolder();
690 var intermediateFolder = Path.Combine(baseFolder, "obj");
691 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
692
693 var result = WixRunner.Execute(new[]
694 {
695 "build",
696 Path.Combine(folder, "Assembly", "Win32Assembly.wxs"),
697 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
698 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
699 "-bindpath", Path.Combine(folder, "Assembly", "data"),
700 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
701 "-intermediateFolder", intermediateFolder,
702 "-o", msiPath
703 });
704
705 result.AssertSuccess();
706
707 Assert.True(File.Exists(msiPath));
708 var results = Query.QueryDatabase(msiPath, new[] { "MsiAssembly", "MsiAssemblyName" });
709 WixAssert.CompareLineByLine(new[]
710 {
711 "MsiAssembly:test.txt\tProductFeature\ttest.dll.manifest\t\t1",
712 "MsiAssemblyName:test.txt\tname\tMyApplication.app",
713 "MsiAssemblyName:test.txt\tversion\t1.0.0.0",
714 }, results);
715 }
716 }
717
718 [Fact]
719 public void PopulatesReserveCostTable()
720 {
721 var folder = TestData.Get(@"TestData");
722
723 using (var fs = new DisposableFileSystem())
724 {
725 var baseFolder = fs.GetFolder();
726 var intermediateFolder = Path.Combine(baseFolder, "obj");
727 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
728
729 var result = WixRunner.Execute(new[]
730 {
731 "build",
732 Path.Combine(folder, "ReserveCost", "ReserveCost.wxs"),
733 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
734 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
735 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
736 "-intermediateFolder", intermediateFolder,
737 "-o", msiPath
738 });
739
740 result.AssertSuccess();
741
742 Assert.True(File.Exists(msiPath));
743 var results = Query.QueryDatabase(msiPath, new[] { "ReserveCost" });
744 WixAssert.CompareLineByLine(new[]
745 {
746 "ReserveCost:TestCost\tReserveCostComp\tINSTALLFOLDER\t100\t200",
747 }, results);
748 }
749 }
750
751 [Fact]
752 public void PopulatesServiceTables()
753 {
754 var folder = TestData.Get(@"TestData");
755
756 using (var fs = new DisposableFileSystem())
757 {
758 var baseFolder = fs.GetFolder();
759 var intermediateFolder = Path.Combine(baseFolder, "obj");
760 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
761
762 var result = WixRunner.Execute(new[]
763 {
764 "build",
765 Path.Combine(folder, "ServiceInstall", "OwnProcess.wxs"),
766 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
767 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
768 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
769 "-intermediateFolder", intermediateFolder,
770 "-o", msiPath
771 });
772
773 result.AssertSuccess();
774
775 Assert.True(File.Exists(msiPath));
776 var results = Query.QueryDatabase(msiPath, new[] { "ServiceInstall", "ServiceControl" });
777 WixAssert.CompareLineByLine(new[]
778 {
779 "ServiceControl:SampleService\tSampleService\t161\t\t1\ttest.txt",
780 "ServiceInstall:SampleService\tSampleService\t\t16\t4\t0\t\t\t\t\t\ttest.txt\t",
781 }, results);
782 }
783 }
784
785 [Fact]
786 public void PopulatesTextStyleTableWhenColorIsNull()
787 {
788 var folder = TestData.Get(@"TestData");
789
790 using (var fs = new DisposableFileSystem())
791 {
792 var baseFolder = fs.GetFolder();
793 var intermediateFolder = Path.Combine(baseFolder, "obj");
794 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
795
796 var result = WixRunner.Execute(new[]
797 {
798 "build",
799 Path.Combine(folder, "TextStyle", "ColorNull.wxs"),
800 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
801 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
802 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
803 "-intermediateFolder", intermediateFolder,
804 "-o", msiPath
805 });
806
807 result.AssertSuccess();
808
809 Assert.True(File.Exists(msiPath));
810 var results = Query.QueryDatabase(msiPath, new[] { "TextStyle" });
811 WixAssert.CompareLineByLine(new[]
812 {
813 "TextStyle:FirstTextStyle\tArial\t2\t\t",
814 }, results);
815 }
816 }
817
818 [Fact]
819 public void PopulatesTextStyleTableWhenSizeIsLocalized()
820 {
821 var folder = TestData.Get(@"TestData");
822
823 using (var fs = new DisposableFileSystem())
824 {
825 var baseFolder = fs.GetFolder();
826 var intermediateFolder = Path.Combine(baseFolder, "obj");
827 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
828
829 var result = WixRunner.Execute(new[]
830 {
831 "build",
832 Path.Combine(folder, "TextStyle", "SizeLocalized.wxs"),
833 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
834 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
835 "-loc", Path.Combine(folder, "TextStyle", "SizeLocalized.en-us.wxl"),
836 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
837 "-intermediateFolder", intermediateFolder,
838 "-o", msiPath,
839 });
840
841 result.AssertSuccess();
842
843 Assert.True(File.Exists(msiPath));
844 var results = Query.QueryDatabase(msiPath, new[] { "TextStyle" });
845 WixAssert.CompareLineByLine(new[]
846 {
847 "TextStyle:CustomFont\tTahoma\t8\t\t",
848 }, results);
849 }
850 }
851
852 [Fact]
853 public void PopulatesTypeLibTableWhenLanguageIsZero()
854 {
855 var folder = TestData.Get(@"TestData");
856
857 using (var fs = new DisposableFileSystem())
858 {
859 var baseFolder = fs.GetFolder();
860 var intermediateFolder = Path.Combine(baseFolder, "obj");
861 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
862
863 var result = WixRunner.Execute(new[]
864 {
865 "build",
866 Path.Combine(folder, "TypeLib", "Language0.wxs"),
867 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
868 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
869 "-intermediateFolder", intermediateFolder,
870 "-o", msiPath
871 });
872
873 result.AssertSuccess();
874
875 Assert.True(File.Exists(msiPath));
876 var results = Query.QueryDatabase(msiPath, new[] { "TypeLib" });
877 WixAssert.CompareLineByLine(new[]
878 {
879 "TypeLib:{765BE8EE-BD7F-491E-90D2-C5A972462B50}\t0\tTypeLibComp\t\t\t\tProductFeature\t",
880 }, results);
881 }
882 }
883
884 [Fact]
885 public void PopulatesUpgradeTableFromManualUpgrade()
886 {
887 var folder = TestData.Get(@"TestData\ManualUpgrade");
888
889 using (var fs = new DisposableFileSystem())
890 {
891 var intermediateFolder = fs.GetFolder();
892 var msiPath = Path.Combine(intermediateFolder, @"bin\test.msi");
893
894 var result = WixRunner.Execute(new[]
895 {
896 "build",
897 Path.Combine(folder, "Package.wxs"),
898 Path.Combine(folder, "PackageComponents.wxs"),
899 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
900 "-bindpath", Path.Combine(folder, "data"),
901 "-intermediateFolder", intermediateFolder,
902 "-o", msiPath
903 }, out var messages);
904
905 Assert.Equal(0, result);
906
907 Assert.True(File.Exists(msiPath));
908 var results = Query.QueryDatabase(msiPath, new[] { "Upgrade" });
909 WixAssert.CompareLineByLine(new[]
910 {
911 "Upgrade:{01120000-00E0-0000-0000-0000000FF1CE}\t12.0.0\t13.0.0\t\t260\t\tBLAHBLAHBLAH",
912 }, results);
913 }
914 }
915
916 [Fact]
917 public void PopulatesUpgradeTableFromDetectOnlyUpgrade()
918 {
919 var folder = TestData.Get(@"TestData");
920
921 using (var fs = new DisposableFileSystem())
922 {
923 var baseFolder = fs.GetFolder();
924 var intermediateFolder = Path.Combine(baseFolder, "obj");
925 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
926
927 var result = WixRunner.Execute(new[]
928 {
929 "build",
930 Path.Combine(folder, "Upgrade", "DetectOnly.wxs"),
931 Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
932 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
933 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
934 "-intermediateFolder", intermediateFolder,
935 "-o", msiPath
936 });
937
938 result.AssertSuccess();
939
940 Assert.True(File.Exists(msiPath));
941 var results = Query.QueryDatabase(msiPath, new[] { "Upgrade" });
942 WixAssert.CompareLineByLine(new[]
943 {
944 "Upgrade:{12E4699F-E774-4D05-8A01-5BDD41BBA127}\t\t1.0.0.0\t1033\t1\t\tWIX_UPGRADE_DETECTED",
945 "Upgrade:{12E4699F-E774-4D05-8A01-5BDD41BBA127}\t1.0.0.0\t\t1033\t2\t\tWIX_DOWNGRADE_DETECTED",
946 "Upgrade:{B05772EA-82B8-4DE0-B7EB-45B5F0CCFE6D}\t1.0.0\t\t\t256\t\tRELPRODFOUND",
947 }, results);
948
949 var prefix = "Property:SecureCustomProperties\t";
950 var secureProperties = Query.QueryDatabase(msiPath, new[] { "Property" }).Where(p => p.StartsWith(prefix)).Single();
951 WixAssert.CompareLineByLine(new[]
952 {
953 "RELPRODFOUND",
954 "WIX_DOWNGRADE_DETECTED",
955 "WIX_UPGRADE_DETECTED",
956 }, secureProperties.Substring(prefix.Length).Split(';').OrderBy(p => p).ToArray());
957 }
958 }
959
960 [Fact]
961 public void CanMergeModule()
962 {
963 var folder = TestData.Get(@"TestData\SimpleMerge");
964
965 using (var fs = new DisposableFileSystem())
966 {
967 var intermediateFolder = fs.GetFolder();
968 var msiPath = Path.Combine(intermediateFolder, @"bin\test.msi");
969 var cabPath = Path.Combine(intermediateFolder, @"bin\cab1.cab");
970
971 var result = WixRunner.Execute(new[]
972 {
973 "build",
974 Path.Combine(folder, "Package.wxs"),
975 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
976 "-bindpath", Path.Combine(folder, ".data"),
977 "-intermediateFolder", intermediateFolder,
978 "-o", msiPath
979 });
980
981 result.AssertSuccess();
982
983 Assert.True(File.Exists(msiPath));
984 Assert.True(File.Exists(Path.Combine(intermediateFolder, @"bin\test.wixpdb")));
985
986 var intermediate = Intermediate.Load(Path.Combine(intermediateFolder, @"bin\test.wixpdb"));
987 var section = intermediate.Sections.Single();
988 Assert.Empty(section.Symbols.OfType<FileSymbol>());
989
990 var data = WindowsInstallerData.Load(Path.Combine(intermediateFolder, @"bin\test.wixpdb"));
991 Assert.Empty(data.Tables["File"].Rows);
992
993 var results = Query.QueryDatabase(msiPath, new[] { "File" });
994 WixAssert.CompareLineByLine(new[]
995 {
996 "File:filyIq8rqcxxf903Hsn5K9L0SWV73g.243FB739_4D05_472F_9CFB_EF6B1017B6DE\tModuleComponent.243FB739_4D05_472F_9CFB_EF6B1017B6DE\ttest.txt\t17\t\t\t512\t0"
997 }, results);
998
999 var files = Query.GetCabinetFiles(cabPath);
1000 WixAssert.CompareLineByLine(new[]
1001 {
1002 "filyIq8rqcxxf903Hsn5K9L0SWV73g.243FB739_4D05_472F_9CFB_EF6B1017B6DE"
1003 }, files.Select(f => f.Name).ToArray());
1004 }
1005 }
1006
1007 [Fact]
1008 public void CanPublishComponentWithMultipleFeatureComponents()
1009 {
1010 var folder = TestData.Get(@"TestData\PublishComponent");
1011
1012 using (var fs = new DisposableFileSystem())
1013 {
1014 var baseFolder = fs.GetFolder();
1015 var intermediateFolder = Path.Combine(baseFolder, "obj");
1016 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
1017
1018 var result = WixRunner.Execute(new[]
1019 {
1020 "build",
1021 Path.Combine(folder, "Package.wxs"),
1022 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
1023 "-bindpath", Path.Combine(folder, "data"),
1024 "-intermediateFolder", intermediateFolder,
1025 "-o", msiPath
1026 });
1027
1028 result.AssertSuccess();
1029
1030 Assert.True(File.Exists(msiPath));
1031 var results = Query.QueryDatabase(msiPath, new[] { "PublishComponent" });
1032 WixAssert.CompareLineByLine(new[]
1033 {
1034 "PublishComponent:{0A82C8F6-9CE9-4336-B8BE-91A39B5F7081} Qualifier2 Component2 AppData2 ProductFeature2",
1035 "PublishComponent:{BD245B5A-EC33-46ED-98FF-E9D3D416AD04} Qualifier1 Component1 AppData1 ProductFeature1",
1036 }, results);
1037 }
1038 }
1039 }
1040}