main
cs 151 lines 7.06 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.IO;
6 using System.Linq;
7 using WixInternal.Core.TestPackage;
8 using WixInternal.TestSupport;
9 using WixToolset.Data;
10 using Xunit;
11
12 public class FeatureFixture
13 {
14 [Fact]
15 public void CanDetectMissingFeatureComponentMapping()
16 {
17 var folder = TestData.Get(@"TestData");
18
19 using (var fs = new DisposableFileSystem())
20 {
21 var baseFolder = fs.GetFolder();
22 var intermediateFolder = Path.Combine(baseFolder, "obj");
23 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
24
25 var result = WixRunner.Execute(new[]
26 {
27 "build",
28 Path.Combine(folder, "Feature", "PackageMissingFeatureComponentMapping.wxs"),
29 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
30 "-intermediateFolder", intermediateFolder,
31 "-o", msiPath
32 });
33
34 var messages = result.Messages.Select(m => m.ToString()).ToList();
35 messages.Sort();
36
37 WixAssert.CompareLineByLine(new[]
38 {
39 "Found orphaned Component 'filit6MyH46zIGKsPPPXDZDfeNrfVY'. If this is a Package, every Component must have at least one parent Feature. To include a Component in a Module, you must include it directly as a Component element of the Module element or indirectly via ComponentRef, ComponentGroup, or ComponentGroupRef elements.",
40 }, messages.ToArray());
41
42 Assert.Equal(267, result.ExitCode);
43 }
44 }
45
46 [Fact]
47 public void CanAutomaticallyCreateDefaultFeature()
48 {
49 var folder = TestData.Get(@"TestData");
50
51 using (var fs = new DisposableFileSystem())
52 {
53 var baseFolder = fs.GetFolder();
54 var intermediateFolder = Path.Combine(baseFolder, "obj");
55 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
56
57 var result = WixRunner.Execute(new[]
58 {
59 "build",
60 Path.Combine(folder, "Feature", "PackageDefaultFeature.wxs"),
61 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
62 "-intermediateFolder", intermediateFolder,
63 "-o", msiPath
64 });
65
66 Assert.Empty(result.Messages);
67
68 Assert.True(File.Exists(msiPath));
69 var results = Query.QueryDatabase(msiPath, new[] { "Feature", "FeatureComponents", "Shortcut" });
70 WixAssert.CompareLineByLine(new[]
71 {
72 "Feature:WixDefaultFeature\t\t\t\t0\t1\t\t0",
73 "FeatureComponents:WixDefaultFeature\tAnotherComponentInAFragment",
74 "FeatureComponents:WixDefaultFeature\tComponentInAFragment",
75 "FeatureComponents:WixDefaultFeature\tfil6J6CHYPBCOMYclNjnqn0afimmzM",
76 "FeatureComponents:WixDefaultFeature\tfilcV1yrx0x8wJWj4qMzcH21jwkPko",
77 "FeatureComponents:WixDefaultFeature\tfilj.cb0sFWqIPHPFSKJSEEaPDuAQ4",
78 "Shortcut:AdvertisedShortcut\tINSTALLFOLDER\tShortcut\tAnotherComponentInAFragment\tWixDefaultFeature\t\t\t\t\t\t\t\t\t\t\t",
79 }, results);
80 }
81 }
82
83 [Fact]
84 public void WontAutomaticallyCreateDefaultFeature()
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, "Feature", "PackageBadDefaultFeature.wxs"),
98 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
99 "-intermediateFolder", intermediateFolder,
100 "-o", msiPath
101 });
102
103 var messages = result.Messages.Select(m => m.ToString()).ToList();
104 messages.Sort();
105
106 WixAssert.CompareLineByLine(new[]
107 {
108 "Found orphaned Component 'fil6J6CHYPBCOMYclNjnqn0afimmzM'. If this is a Package, every Component must have at least one parent Feature. To include a Component in a Module, you must include it directly as a Component element of the Module element or indirectly via ComponentRef, ComponentGroup, or ComponentGroupRef elements.",
109 "Found orphaned Component 'filcV1yrx0x8wJWj4qMzcH21jwkPko'. If this is a Package, every Component must have at least one parent Feature. To include a Component in a Module, you must include it directly as a Component element of the Module element or indirectly via ComponentRef, ComponentGroup, or ComponentGroupRef elements.",
110 "Found orphaned Component 'filj.cb0sFWqIPHPFSKJSEEaPDuAQ4'. If this is a Package, every Component must have at least one parent Feature. To include a Component in a Module, you must include it directly as a Component element of the Module element or indirectly via ComponentRef, ComponentGroup, or ComponentGroupRef elements.",
111 }, messages.ToArray());
112
113 Assert.Equal(267, result.ExitCode);
114 }
115 }
116
117 [Fact]
118 public void CannotBuildMsiWithTooLargeFeatureDepth()
119 {
120 var folder = TestData.Get(@"TestData");
121
122 using (var fs = new DisposableFileSystem())
123 {
124 var baseFolder = fs.GetFolder();
125 var intermediateFolder = Path.Combine(baseFolder, "obj");
126 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
127
128 var result = WixRunner.Execute(new[]
129 {
130 "build",
131 Path.Combine(folder, "Feature", "PackageWithExcessiveFeatureDepth.wxs"),
132 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
133 "-intermediateFolder", intermediateFolder,
134 "-o", msiPath
135 });
136
137 Assert.Equal(7503, result.ExitCode);
138
139 var errors = result.Messages.Where(m => m.Level == MessageLevel.Error);
140 Assert.Equal(new[]
141 {
142 7503
143 }, errors.Select(e => e.Id).ToArray());
144 WixAssert.CompareLineByLine(new[]
145 {
146 "Maximum depth of the Feature tree allowed in an MSI was exceeded. An MSI does not support a Feature tree with depth greater than 16. The Feature 'Depth17' is at depth 17.",
147 }, result.Messages.Select(m => m.ToString()).ToArray());
148 }
149 }
150 }
151 }