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