main
cs 385 lines 15.1 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 System.Text.RegularExpressions;
9 using Example.Extension;
10 using WixInternal.TestSupport;
11 using WixInternal.Core.TestPackage;
12 using WixToolset.Data;
13 using WixToolset.Data.Symbols;
14 using Xunit;
15 using System.Diagnostics;
16 using System.Reflection;
17
18 public class ExtensionFixture
19 {
20 [Fact]
21 public void CanBuildAndQuery()
22 {
23 var folder = TestData.Get("TestData", "ExampleExtension");
24 var build = new Builder(folder, typeof(ExampleExtensionFactory), new[] { Path.Combine(folder, "data") });
25
26 var results = build.BuildAndQuery(Build, "Wix4Example");
27 WixAssert.CompareLineByLine(new[]
28 {
29 "Wix4Example:Foo\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo\tBar <optimized>"
30 }, results);
31 }
32
33 [Fact]
34 public void CanRoundtripExampleExtension()
35 {
36 var folder = TestData.Get(@"TestData", "ExampleExtension");
37 var expectedOutputPath = Path.Combine(folder, "Decompiled-Expected.xml");
38
39 var build = new Builder(folder, typeof(ExampleExtensionFactory), new[] { Path.Combine(folder, "data") });
40 using (var fs = new DisposableFileSystem())
41 {
42 var decompileFolder = fs.GetFolder();
43 var actualOutputPath = Path.Combine(decompileFolder, "decompiled.xml");
44
45 build.BuildAndDecompileAndBuild(Build, Decompile, actualOutputPath);
46
47 var expected = File.ReadAllLines(expectedOutputPath);
48 var actual = File.ReadAllLines(actualOutputPath).Select(ReplaceGuids).ToArray();
49 WixAssert.CompareLineByLine(expected, actual);
50 }
51 }
52
53 private static string ReplaceGuids(string value)
54 {
55 value = String.IsNullOrWhiteSpace(value) ? value : Regex.Replace(value, @" ProductCode=\""\{[a-fA-F0-9\-]+\}\""", " ProductCode=\"{GUID}\"");
56 return String.IsNullOrWhiteSpace(value) ? value : Regex.Replace(value, @" Guid=\""\{[a-fA-F0-9\-]+\}\""", " Guid=\"{GUID}\"");
57
58 }
59
60 [Fact]
61 public void CanBuildWithExampleExtension()
62 {
63 var folder = TestData.Get("TestData", "ExampleExtension");
64
65 using (var fs = new DisposableFileSystem())
66 {
67 var intermediateFolder = fs.GetFolder();
68
69 var result = WixRunner.Execute(new[]
70 {
71 "build",
72 Path.Combine(folder, "Package.wxs"),
73 Path.Combine(folder, "PackageComponents.wxs"),
74 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
75 "-ext", ExtensionPaths.ExampleExtensionPath,
76 "-bindpath", Path.Combine(folder, "data"),
77 "-intermediateFolder", intermediateFolder,
78 "-o", Path.Combine(intermediateFolder, @"bin\extest.msi")
79 });
80
81 result.AssertSuccess();
82
83 Assert.True(File.Exists(Path.Combine(intermediateFolder, @"bin\extest.msi")));
84 Assert.True(File.Exists(Path.Combine(intermediateFolder, @"bin\extest.wixpdb")));
85 Assert.True(File.Exists(Path.Combine(intermediateFolder, @"bin\PFiles\MsiPackage\example.txt")));
86
87 var intermediate = Intermediate.Load(Path.Combine(intermediateFolder, @"bin\extest.wixpdb"));
88 var section = intermediate.Sections.Single();
89
90 var fileSymbol = section.Symbols.OfType<FileSymbol>().Single();
91 WixAssert.StringEqual(Path.Combine(folder, @"data\example.txt"), fileSymbol[FileSymbolFields.Source].AsPath().Path);
92 WixAssert.StringEqual(@"example.txt", fileSymbol[FileSymbolFields.Source].PreviousValue.AsPath().Path);
93
94 var example = section.Symbols.Where(t => t.Definition.Type == SymbolDefinitionType.MustBeFromAnExtension).Single();
95 WixAssert.StringEqual("Foo", example.Id?.Id);
96 WixAssert.StringEqual("filF5_pLhBuF5b4N9XEo52g_hUM5Lo", example[0].AsString());
97 WixAssert.StringEqual("Bar <optimized>", example[1].AsString());
98 }
99 }
100
101 [Fact]
102 public void CanBuildWithExampleExtensionWithFilePossibleKeyPath()
103 {
104 var folder = TestData.Get("TestData", "ExampleExtensionUsingPossibleKeyPath");
105
106 using (var fs = new DisposableFileSystem())
107 {
108 var intermediateFolder = fs.GetFolder();
109
110 var result = WixRunner.Execute(new[]
111 {
112 "build",
113 Path.Combine(folder, "PackageWithFile.wxs"),
114 "-ext", ExtensionPaths.ExampleExtensionPath,
115 "-bindpath", Path.Combine(folder, "data"),
116 "-intermediateFolder", intermediateFolder,
117 "-o", Path.Combine(intermediateFolder, "bin", "extest.msi")
118 });
119
120 result.AssertSuccess();
121
122 var intermediate = Intermediate.Load(Path.Combine(intermediateFolder, "bin", "extest.wixpdb"));
123 var section = intermediate.Sections.Single();
124
125 var componentSymbol = section.Symbols.OfType<ComponentSymbol>().Single();
126 Assert.Equal("ExampleFile", componentSymbol.KeyPath);
127 Assert.Equal(ComponentKeyPathType.File, componentSymbol.KeyPathType);
128 }
129 }
130
131 [Fact]
132 public void CanBuildWithExampleExtensionWithRegistryPossibleKeyPath()
133 {
134 var folder = TestData.Get("TestData", "ExampleExtensionUsingPossibleKeyPath");
135
136 using (var fs = new DisposableFileSystem())
137 {
138 var intermediateFolder = fs.GetFolder();
139
140 var result = WixRunner.Execute(new[]
141 {
142 "build",
143 Path.Combine(folder, "PackageWithRegistry.wxs"),
144 "-ext", ExtensionPaths.ExampleExtensionPath,
145 "-bindpath", Path.Combine(folder, "data"),
146 "-intermediateFolder", intermediateFolder,
147 "-o", Path.Combine(intermediateFolder, "bin", "extest.msi")
148 });
149
150 result.AssertSuccess();
151
152 var intermediate = Intermediate.Load(Path.Combine(intermediateFolder, "bin", "extest.wixpdb"));
153 var section = intermediate.Sections.Single();
154
155 var componentSymbol = section.Symbols.OfType<ComponentSymbol>().Single();
156 Assert.Equal("RegMadeKeyPath", componentSymbol.KeyPath);
157 Assert.Equal(ComponentKeyPathType.Registry, componentSymbol.KeyPathType);
158 }
159 }
160
161 [Fact]
162 public void CanBuildWithExampleExtensionLocalizedDefault()
163 {
164 var folder = TestData.Get("TestData", "ExampleExtensionLocalized");
165
166 using (var fs = new DisposableFileSystem())
167 {
168 var intermediateFolder = fs.GetFolder();
169
170 var result = WixRunner.Execute(new[]
171 {
172 "build",
173 Path.Combine(folder, "LocalizedPackage.wxs"),
174 "-ext", ExtensionPaths.ExampleExtensionPath,
175 "-bindpath", Path.Combine(folder, "data"),
176 "-intermediateFolder", intermediateFolder,
177 "-o", Path.Combine(intermediateFolder, "bin", "extest.msi")
178 });
179
180 result.AssertSuccess();
181
182 var pdb = Intermediate.Load(Path.Combine(intermediateFolder, "bin", "extest.wixpdb"));
183 var section = pdb.Sections.Single();
184
185 var property = section.Symbols.OfType<PropertySymbol>().Single(t => t.Id.Id == "LocalizedProperty");
186 WixAssert.StringEqual("en-us", property.Value);
187 }
188 }
189
190 [Fact]
191 public void CanBuildWithExampleExtensionLocalizedNonDefault()
192 {
193 var folder = TestData.Get("TestData", "ExampleExtensionLocalized");
194
195 using (var fs = new DisposableFileSystem())
196 {
197 var intermediateFolder = fs.GetFolder();
198
199 var result = WixRunner.Execute(new[]
200 {
201 "build",
202 Path.Combine(folder, "LocalizedPackage.wxs"),
203 "-culture", "ja-jp",
204 "-ext", ExtensionPaths.ExampleExtensionPath,
205 "-bindpath", Path.Combine(folder, "data"),
206 "-intermediateFolder", intermediateFolder,
207 "-o", Path.Combine(intermediateFolder, "bin", "extest.msi")
208 });
209
210 result.AssertSuccess();
211
212 var pdb = Intermediate.Load(Path.Combine(intermediateFolder, "bin", "extest.wixpdb"));
213 var section = pdb.Sections.Single();
214
215 var property = section.Symbols.OfType<PropertySymbol>().Single(t => t.Id.Id == "LocalizedProperty");
216 WixAssert.StringEqual("ja-jp", property.Value);
217 }
218 }
219
220 [Fact]
221 public void CanParseCommandLineWithExtension()
222 {
223 var folder = TestData.Get(@"TestData\ExampleExtension");
224
225 using (var fs = new DisposableFileSystem())
226 {
227 var intermediateFolder = fs.GetFolder();
228
229 var result = WixRunner.Execute(new[]
230 {
231 "build",
232 Path.Combine(folder, "Package.wxs"),
233 Path.Combine(folder, "PackageComponents.wxs"),
234 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
235 "-ext", ExtensionPaths.ExampleExtensionPath,
236 "-bindpath", Path.Combine(folder, "data"),
237 "-intermediateFolder", intermediateFolder,
238 "-example", "test",
239 "-o", Path.Combine(intermediateFolder, @"bin\extest.msi")
240 });
241
242 result.AssertSuccess();
243
244 var intermediate = Intermediate.Load(Path.Combine(intermediateFolder, @"bin\extest.wixpdb"));
245 var section = intermediate.Sections.Single();
246
247 var property = section.Symbols.OfType<PropertySymbol>().Where(p => p.Id.Id == "ExampleProperty").Single();
248 WixAssert.StringEqual("ExampleProperty", property.Id.Id);
249 WixAssert.StringEqual("test", property.Value);
250 }
251 }
252
253 [Fact]
254 public void CannotBuildWithMissingExtension()
255 {
256 var folder = TestData.Get("TestData", "ExampleExtension");
257
258 using (var fs = new DisposableFileSystem())
259 {
260 var intermediateFolder = fs.GetFolder();
261
262 var exception = Assert.Throws<WixException>(() =>
263 WixRunner.Execute(new[]
264 {
265 "build",
266 Path.Combine(folder, "Package.wxs"),
267 "-ext", "ExampleExtension.DoesNotExist"
268 }));
269
270 Assert.StartsWith("The extension 'ExampleExtension.DoesNotExist' could not be found. Checked paths: ", exception.Message);
271 }
272 }
273
274 [Fact]
275 public void CannotBuildWithMissingVersionedExtension()
276 {
277 var folder = TestData.Get("TestData", "ExampleExtension");
278
279 using (var fs = new DisposableFileSystem())
280 {
281 var intermediateFolder = fs.GetFolder();
282
283 var exception = Assert.Throws<WixException>(() =>
284 WixRunner.Execute(new[]
285 {
286 "build",
287 Path.Combine(folder, "Package.wxs"),
288 "-ext", "ExampleExtension.DoesNotExist/1.0.0"
289 }));
290
291 Assert.StartsWith("The extension 'ExampleExtension.DoesNotExist/1.0.0' could not be found. Checked paths: ", exception.Message);
292 }
293 }
294
295 [Fact(Skip = "Depends on a v5 extension being available, which isn't true for nuget.org yet or this early in the build.")]
296 public void CanManipulateExtensionCache()
297 {
298 var currentFolder = Environment.CurrentDirectory;
299
300 try
301 {
302 using (var fs = new DisposableFileSystem())
303 {
304 var folder = fs.GetFolder(true);
305 Environment.CurrentDirectory = folder;
306
307 var result = WixRunner.Execute(new[]
308 {
309 "extension", "add", "WixToolset.UI.wixext",
310 });
311
312 result.AssertSuccess();
313
314 var cacheFolder = Path.Combine(folder, ".wix", "extensions", "WixToolset.UI.wixext");
315 Assert.True(Directory.Exists(cacheFolder), $"Expected folder '{cacheFolder}' to exist");
316
317 result = WixRunner.Execute(new[]
318 {
319 "extension", "list"
320 });
321
322 result.AssertSuccess();
323
324 var output = result.Messages.Select(m => m.ToString()).Single();
325 var executingAssembly = Assembly.GetExecutingAssembly();
326 var fileVersion = FileVersionInfo.GetVersionInfo(executingAssembly.Location);
327
328 Assert.StartsWith($"WixToolset.UI.wixext {fileVersion.FileMajorPart}", output);
329 Assert.DoesNotContain("damaged", output);
330
331 result = WixRunner.Execute(new[]
332 {
333 "extension", "remove", "WixToolset.UI.wixext"
334 });
335
336 result.AssertSuccess();
337 Assert.False(Directory.Exists(cacheFolder), $"Expected folder '{cacheFolder}' to NOT exist");
338 }
339 }
340 finally
341 {
342 Environment.CurrentDirectory = currentFolder;
343 }
344 }
345
346 [Fact]
347 public void TryingToAddAV4ExtensionFails()
348 {
349 var currentFolder = Environment.CurrentDirectory;
350
351 try
352 {
353 using (var fs = new DisposableFileSystem())
354 {
355 var folder = fs.GetFolder(true);
356 Environment.CurrentDirectory = folder;
357
358 var result = WixRunner.Execute(new[]
359 {
360 "extension", "add", "WixToolset.UI.wixext/4.0.4",
361 });
362
363 Assert.Equal(2, result.ExitCode);
364 Assert.Equal(6101, result.Messages.Single().Id);
365 }
366 }
367 finally
368 {
369 Environment.CurrentDirectory = currentFolder;
370 }
371 }
372
373 private static void Build(string[] args)
374 {
375 var result = WixRunner.Execute(args);
376 result.AssertSuccess();
377 }
378
379 private static void Decompile(string[] args)
380 {
381 var result = WixRunner.Execute(args);
382 result.AssertSuccess();
383 }
384 }
385 }