main
cs 358 lines 15.5 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 WixToolset.Data;
12 using WixToolset.Data.Symbols;
13 using Xunit;
14
15 public class WixlibFixture
16 {
17 [Fact]
18 public void CanBuildSimpleBundleUsingWixlib()
19 {
20 var folder = TestData.Get(@"TestData\SimpleBundle");
21
22 using (var fs = new DisposableFileSystem())
23 {
24 var baseFolder = fs.GetFolder();
25 var intermediateFolder = Path.Combine(baseFolder, "obj");
26
27 var result = WixRunner.Execute(new[]
28 {
29 "build",
30 Path.Combine(folder, "MultiFileBootstrapperApplication.wxs"),
31 "-intermediateFolder", intermediateFolder,
32 "-o", Path.Combine(intermediateFolder, @"test.wixlib")
33 });
34
35 result.AssertSuccess();
36
37 result = WixRunner.Execute(new[]
38 {
39 "build",
40 Path.Combine(folder, "MultiFileBundle.wxs"),
41 "-loc", Path.Combine(folder, "Bundle.en-us.wxl"),
42 "-lib", Path.Combine(intermediateFolder, @"test.wixlib"),
43 "-bindpath", Path.Combine(folder, "data"),
44 "-intermediateFolder", intermediateFolder,
45 "-o", Path.Combine(baseFolder, @"bin\test.exe")
46 });
47
48 result.AssertSuccess();
49
50 Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.exe")));
51 Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.wixpdb")));
52 }
53 }
54
55 [Fact]
56 public void CanBuildMultiarchWixlib()
57 {
58 var folder = TestData.Get(@"TestData", "WixlibMultiarch");
59
60 using (var fs = new DisposableFileSystem())
61 {
62 var baseFolder = fs.GetFolder();
63 var intermediateFolder = Path.Combine(baseFolder, "obj");
64 var wixlibPath = Path.Combine(intermediateFolder, @"test.wixlib");
65
66 var result = WixRunner.Execute(new[]
67 {
68 "build",
69 Path.Combine(folder, "MultiarchFile.wxs"),
70 "-intermediateFolder", intermediateFolder,
71 "-o", wixlibPath
72 });
73
74 result.AssertSuccess();
75
76 result = WixRunner.Execute(new[]
77 {
78 "build",
79 "-arch", "x64",
80 Path.Combine(folder, "MultiarchFile.wxs"),
81 wixlibPath,
82 "-intermediateFolder", intermediateFolder,
83 "-o", wixlibPath
84 });
85
86 result.AssertSuccess();
87
88 var wixlib = Intermediate.Load(wixlibPath);
89 var componentSymbols = wixlib.Sections.SelectMany(s => s.Symbols).OfType<ComponentSymbol>().ToList();
90 WixAssert.CompareLineByLine(new[]
91 {
92 "x64 filcV1yrx0x8wJWj4qMzcH21jwkPko",
93 "x86 filcV1yrx0x8wJWj4qMzcH21jwkPko",
94 }, componentSymbols.Select(c => (c.Win64 ? "x64 " : "x86 ") + c.Id.Id).OrderBy(s => s).ToArray());
95 }
96 }
97
98 [Fact]
99 public void CanBuildWixlibWithBinariesFromNamedBindPaths()
100 {
101 var folder = TestData.Get(@"TestData\WixlibWithBinaries");
102
103 using (var fs = new DisposableFileSystem())
104 {
105 var baseFolder = fs.GetFolder();
106 var intermediateFolder = Path.Combine(baseFolder, "obj");
107 var wixlibPath = Path.Combine(intermediateFolder, @"test.wixlib");
108
109 var result = WixRunner.Execute(new[]
110 {
111 "build",
112 Path.Combine(folder, "PackageComponents.wxs"),
113 "-bf",
114 "-bindpath", Path.Combine(folder, "data"),
115 // Use names that aren't excluded in default .gitignores.
116 "-bindpath", $"AlphaBits={Path.Combine(folder, "data", "alpha")}",
117 "-bindpath", $"MipsBits={Path.Combine(folder, "data", "mips")}",
118 "-bindpath", $"PowerBits={Path.Combine(folder, "data", "powerpc")}",
119 "-intermediateFolder", intermediateFolder,
120 "-o", wixlibPath,
121 });
122
123 result.AssertSuccess();
124
125 var wixlib = Intermediate.Load(wixlibPath);
126 var binarySymbols = wixlib.Sections.SelectMany(s => s.Symbols).OfType<BinarySymbol>().ToList();
127 Assert.Equal(3, binarySymbols.Count);
128 Assert.Single(binarySymbols.Where(t => t.Data.Path == "wix-ir/foo.dll"));
129 Assert.Single(binarySymbols.Where(t => t.Data.Path == "wix-ir/foo.dll-1"));
130 Assert.Single(binarySymbols.Where(t => t.Data.Path == "wix-ir/foo.dll-2"));
131 }
132 }
133
134 [Fact]
135 public void CanBuildSingleFileUsingWixlib()
136 {
137 var folder = TestData.Get(@"TestData\SingleFile");
138
139 using (var fs = new DisposableFileSystem())
140 {
141 var baseFolder = fs.GetFolder();
142 var intermediateFolder = Path.Combine(baseFolder, "obj");
143 var wixlibPath = Path.Combine(intermediateFolder, @"test.wixlib");
144
145 var result = WixRunner.Execute(new[]
146 {
147 "build",
148 Path.Combine(folder, "PackageComponents.wxs"),
149 "-intermediateFolder", intermediateFolder,
150 "-o", wixlibPath,
151 });
152
153 result.AssertSuccess();
154
155 var wixlib = Intermediate.Load(wixlibPath);
156
157 Assert.True(wixlib.HasLevel(IntermediateLevels.Compiled));
158 Assert.True(wixlib.HasLevel(IntermediateLevels.Combined));
159 Assert.False(wixlib.HasLevel(IntermediateLevels.Linked));
160 Assert.False(wixlib.HasLevel(IntermediateLevels.Resolved));
161
162 result = WixRunner.Execute(new[]
163 {
164 "build",
165 Path.Combine(folder, "Package.wxs"),
166 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
167 "-lib", Path.Combine(intermediateFolder, @"test.wixlib"),
168 "-bindpath", Path.Combine(folder, "data"),
169 "-intermediateFolder", intermediateFolder,
170 "-o", Path.Combine(baseFolder, @"bin\test.msi")
171 });
172
173 result.AssertSuccess();
174
175 var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb"));
176
177 Assert.False(intermediate.HasLevel(IntermediateLevels.Compiled));
178 Assert.False(intermediate.HasLevel(IntermediateLevels.Combined));
179 Assert.True(intermediate.HasLevel(IntermediateLevels.Linked));
180 Assert.True(intermediate.HasLevel(IntermediateLevels.Resolved));
181
182 var section = intermediate.Sections.Single();
183
184 var wixFile = section.Symbols.OfType<FileSymbol>().First();
185 WixAssert.StringEqual(Path.Combine(folder, @"data\test.txt"), wixFile[FileSymbolFields.Source].AsPath().Path);
186 WixAssert.StringEqual(@"test.txt", wixFile[FileSymbolFields.Source].PreviousValue.AsPath().Path);
187 }
188 }
189
190 [Fact]
191 public void CanOverridePathWixVariable()
192 {
193 var folder = TestData.Get(@"TestData\WixVariableOverride");
194
195 using (var fs = new DisposableFileSystem())
196 {
197 var baseFolder = fs.GetFolder();
198 var intermediateFolder = Path.Combine(baseFolder, "obj");
199 var wixlibPath = Path.Combine(intermediateFolder, @"test.wixlib");
200
201 var result = WixRunner.Execute(new[]
202 {
203 "build",
204 Path.Combine(folder, "PackageComponents.wxs"),
205 "-bf",
206 "-bindpath", Path.Combine(folder, "data"),
207 "-intermediateFolder", intermediateFolder,
208 "-o", wixlibPath,
209 });
210
211 result.AssertSuccess();
212
213 var wixlib = Intermediate.Load(wixlibPath);
214
215 Assert.True(wixlib.HasLevel(IntermediateLevels.Compiled));
216 Assert.True(wixlib.HasLevel(IntermediateLevels.Combined));
217 Assert.False(wixlib.HasLevel(IntermediateLevels.Linked));
218 Assert.False(wixlib.HasLevel(IntermediateLevels.Resolved));
219
220 result = WixRunner.Execute(new[]
221 {
222 "build",
223 Path.Combine(folder, "Package.wxs"),
224 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
225 "-lib", Path.Combine(intermediateFolder, @"test.wixlib"),
226 "-bindpath", Path.Combine(folder, "data"),
227 "-intermediateFolder", intermediateFolder,
228 "-o", Path.Combine(baseFolder, @"bin\test.msi")
229 });
230
231 result.AssertSuccess();
232
233 var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb"));
234
235 Assert.False(intermediate.HasLevel(IntermediateLevels.Compiled));
236 Assert.False(intermediate.HasLevel(IntermediateLevels.Combined));
237 Assert.True(intermediate.HasLevel(IntermediateLevels.Linked));
238 Assert.True(intermediate.HasLevel(IntermediateLevels.Resolved));
239
240 var section = intermediate.Sections.Single();
241
242 var wixFile = section.Symbols.OfType<BinarySymbol>().First();
243 WixAssert.StringEqual(Path.Combine(folder, @"data\test2.txt"), wixFile.Data.Path);
244 }
245 }
246
247 [Fact]
248 public void CanBuildWithExtensionUsingWixlib()
249 {
250 var folder = TestData.Get(@"TestData\ExampleExtension");
251
252 using (var fs = new DisposableFileSystem())
253 {
254 var baseFolder = fs.GetFolder();
255 var intermediateFolder = Path.Combine(baseFolder, "obj");
256
257 var result = WixRunner.Execute(new[]
258 {
259 "build",
260 Path.Combine(folder, "PackageComponents.wxs"),
261 "-ext", ExtensionPaths.ExampleExtensionPath,
262 "-intermediateFolder", intermediateFolder,
263 "-o", Path.Combine(intermediateFolder, @"test.wixlib")
264 });
265
266 result.AssertSuccess();
267
268 result = WixRunner.Execute(new[]
269 {
270 "build",
271 Path.Combine(folder, "Package.wxs"),
272 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
273 "-lib", Path.Combine(intermediateFolder, @"test.wixlib"),
274 "-ext", ExtensionPaths.ExampleExtensionPath,
275 "-bindpath", Path.Combine(folder, "data"),
276 "-intermediateFolder", intermediateFolder,
277 "-o", Path.Combine(intermediateFolder, @"bin\test.msi")
278 });
279
280 result.AssertSuccess();
281
282 var intermediate = Intermediate.Load(Path.Combine(intermediateFolder, @"bin\test.wixpdb"));
283 var section = intermediate.Sections.Single();
284
285 var fileSymbol = section.Symbols.OfType<FileSymbol>().Single();
286 WixAssert.StringEqual(Path.Combine(folder, @"data\example.txt"), fileSymbol[FileSymbolFields.Source].AsPath().Path);
287 WixAssert.StringEqual(@"example.txt", fileSymbol[FileSymbolFields.Source].PreviousValue.AsPath().Path);
288
289 var example = section.Symbols.Where(t => t.Definition.Type == SymbolDefinitionType.MustBeFromAnExtension).Single();
290 WixAssert.StringEqual("Foo", example.Id?.Id);
291 WixAssert.StringEqual("Bar <optimized>", example[1].AsString());
292 }
293 }
294
295 [Fact]
296 public void CanBuildWithExtensionUsingMultipleWixlibs()
297 {
298 var folder = TestData.Get(@"TestData\ComplexExampleExtension");
299
300 using (var fs = new DisposableFileSystem())
301 {
302 var baseFolder = fs.GetFolder();
303 var intermediateFolder = Path.Combine(baseFolder, "obj");
304
305 var result = WixRunner.Execute(new[]
306 {
307 "build",
308 Path.Combine(folder, "PackageComponents.wxs"),
309 "-ext", ExtensionPaths.ExampleExtensionPath,
310 "-intermediateFolder", intermediateFolder,
311 "-o", Path.Combine(intermediateFolder, @"components.wixlib")
312 });
313
314 result.AssertSuccess();
315
316 result = WixRunner.Execute(new[]
317 {
318 "build",
319 Path.Combine(folder, "OtherComponents.wxs"),
320 "-ext", ExtensionPaths.ExampleExtensionPath,
321 "-intermediateFolder", intermediateFolder,
322 "-o", Path.Combine(intermediateFolder, @"other.wixlib")
323 });
324
325 result.AssertSuccess();
326
327 result = WixRunner.Execute(new[]
328 {
329 "build",
330 Path.Combine(folder, "Package.wxs"),
331 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
332 "-lib", Path.Combine(intermediateFolder, @"components.wixlib"),
333 "-lib", Path.Combine(intermediateFolder, @"other.wixlib"),
334 "-ext", ExtensionPaths.ExampleExtensionPath,
335 "-bindpath", Path.Combine(folder, "data"),
336 "-intermediateFolder", intermediateFolder,
337 "-o", Path.Combine(intermediateFolder, @"bin\test.msi")
338 });
339
340 result.AssertSuccess();
341
342 var intermediate = Intermediate.Load(Path.Combine(intermediateFolder, @"bin\test.wixpdb"));
343 var section = intermediate.Sections.Single();
344
345 var fileSymbols = section.Symbols.OfType<FileSymbol>().OrderBy(t => Path.GetFileName(t.Source.Path)).ToArray();
346 WixAssert.StringEqual(Path.Combine(folder, @"data\example.txt"), fileSymbols[0][FileSymbolFields.Source].AsPath().Path);
347 WixAssert.StringEqual(@"example.txt", fileSymbols[0][FileSymbolFields.Source].PreviousValue.AsPath().Path);
348 WixAssert.StringEqual(Path.Combine(folder, @"data\other.txt"), fileSymbols[1][FileSymbolFields.Source].AsPath().Path);
349 WixAssert.StringEqual(@"other.txt", fileSymbols[1][FileSymbolFields.Source].PreviousValue.AsPath().Path);
350
351 var examples = section.Symbols.Where(t => t.Definition.Type == SymbolDefinitionType.MustBeFromAnExtension).ToArray();
352 WixAssert.CompareLineByLine(new[] { "Foo", "Other" }, examples.Select(t => t.Id?.Id).ToArray());
353 WixAssert.CompareLineByLine(new[] { "filF5_pLhBuF5b4N9XEo52g_hUM5Lo", "filvxdStJhRE_M5kbpLsTZJXbs34Sg" }, examples.Select(t => t[0].AsString()).ToArray());
354 WixAssert.CompareLineByLine(new[] { "Bar <optimized>", "Value <optimized>" }, examples.Select(t => t[1].AsString()).ToArray());
355 }
356 }
357 }
358 }