main
cs 284 lines 14 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.Collections.Generic;
7 using System.IO;
8 using System.Linq;
9 using System.Xml;
10 using WixInternal.TestSupport;
11 using WixInternal.Core.TestPackage;
12 using WixToolset.Data;
13 using WixToolset.Data.Symbols;
14 using Xunit;
15
16 public class PayloadFixture
17 {
18 [Fact]
19 public void CanParseValidName()
20 {
21 var folder = TestData.Get(@"TestData\Payload");
22
23 using (var fs = new DisposableFileSystem())
24 {
25 var baseFolder = fs.GetFolder();
26 var intermediateFolder = Path.Combine(baseFolder, "obj");
27 var wixlibPath = Path.Combine(intermediateFolder, @"test.wixlib");
28
29 var result = WixRunner.Execute(new[]
30 {
31 "build",
32 Path.Combine(folder, "ValidName.wxs"),
33 "-intermediateFolder", intermediateFolder,
34 "-o", wixlibPath,
35 });
36
37 result.AssertSuccess();
38
39 Assert.Empty(result.Messages);
40
41 var intermediate = Intermediate.Load(wixlibPath);
42 var allSymbols = intermediate.Sections.SelectMany(s => s.Symbols);
43 var payloadSymbol = allSymbols.OfType<WixBundlePayloadSymbol>()
44 .SingleOrDefault();
45 Assert.NotNull(payloadSymbol);
46
47 var fields = payloadSymbol.Fields.Select(field => field?.Type == IntermediateFieldType.Bool
48 ? field.AsNullableNumber()?.ToString()
49 : field?.AsString())
50 .ToList();
51 WixAssert.StringEqual(@"dir\file.ext", fields[(int)WixBundlePayloadSymbolFields.Name]);
52 }
53 }
54
55 [Fact]
56 public void CanCanonicalizeName()
57 {
58 var folder = TestData.Get(@"TestData\Payload");
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(warningsAsErrors: false, new[]
67 {
68 "build",
69 Path.Combine(folder, "CanonicalizeName.wxs"),
70 "-intermediateFolder", intermediateFolder,
71 "-o", wixlibPath,
72 });
73
74 result.AssertSuccess();
75
76 Assert.Single(result.Messages, m => m.Id == (int)WarningMessages.Ids.PathCanonicalized);
77
78 var intermediate = Intermediate.Load(wixlibPath);
79 var allSymbols = intermediate.Sections.SelectMany(s => s.Symbols);
80 var payloadSymbol = allSymbols.OfType<WixBundlePayloadSymbol>()
81 .SingleOrDefault();
82 Assert.NotNull(payloadSymbol);
83
84 var fields = payloadSymbol.Fields.Select(field => field?.Type == IntermediateFieldType.Bool
85 ? field.AsNullableNumber()?.ToString()
86 : field?.AsString())
87 .ToList();
88 WixAssert.StringEqual(@"c\d\e\f.exe", fields[(int)WixBundlePayloadSymbolFields.Name]);
89 }
90 }
91
92 [Fact]
93 public void RejectsAbsoluteName()
94 {
95 var folder = TestData.Get(@"TestData\Payload");
96
97 using (var fs = new DisposableFileSystem())
98 {
99 var baseFolder = fs.GetFolder();
100 var intermediateFolder = Path.Combine(baseFolder, "obj");
101 var wixlibPath = Path.Combine(intermediateFolder, @"test.wixlib");
102
103 var result = WixRunner.Execute(new[]
104 {
105 "build",
106 Path.Combine(folder, "AbsoluteName.wxs"),
107 "-intermediateFolder", intermediateFolder,
108 "-o", wixlibPath,
109 });
110
111 Assert.InRange(result.ExitCode, 2, Int32.MaxValue);
112
113 var expectedIllegalRelativeLongFileName = 1;
114 var expectedPayloadMustBeRelativeToCache = 2;
115 Assert.Equal(expectedIllegalRelativeLongFileName, result.Messages.Where(m => m.Id == (int)ErrorMessages.Ids.IllegalRelativeLongFilename).Count());
116 Assert.Equal(expectedPayloadMustBeRelativeToCache, result.Messages.Where(m => m.Id == (int)ErrorMessages.Ids.PayloadMustBeRelativeToCache).Count());
117 }
118 }
119
120 [Fact]
121 public void RejectsPayloadSharedBetweenPackageAndBA()
122 {
123 var folder = TestData.Get(@"TestData");
124
125 using (var fs = new DisposableFileSystem())
126 {
127 var baseFolder = fs.GetFolder();
128 var intermediateFolder = Path.Combine(baseFolder, "obj");
129 var bundlePath = Path.Combine(baseFolder, @"bin", "test.exe");
130
131 var result = WixRunner.Execute(new[]
132 {
133 "build",
134 Path.Combine(folder, "Payload", "SharedBAAndPackagePayloadBundle.wxs"),
135 Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
136 "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
137 "-bindpath", Path.Combine(folder, ".Data"),
138 "-intermediateFolder", intermediateFolder,
139 "-o", bundlePath,
140 });
141
142 var messages = result.Messages.Select(WixMessageFormatter.FormatMessage).OrderBy(m => m).ToArray();
143 WixAssert.CompareLineByLine(new string[]
144 {
145 "Error 7002: The Payload 'paybrzYNo9tnpTN4NnUuXkoauGUDe8' is shared with the BootstrapperApplication. This is not currently supported.",
146 }, messages);
147 }
148 }
149
150 [Fact]
151 public void ReplacesDownloadUrlPlaceholders()
152 {
153 var folder = TestData.Get(@"TestData");
154
155 using (var fs = new DisposableFileSystem())
156 {
157 var baseFolder = fs.GetFolder();
158 var intermediateFolder = Path.Combine(baseFolder, "obj");
159 var bundlePath = Path.Combine(baseFolder, @"bin\test.exe");
160 var baFolderPath = Path.Combine(baseFolder, "ba");
161 var extractFolderPath = Path.Combine(baseFolder, "extract");
162
163 var result = WixRunner.Execute(false, new[]
164 {
165 "build",
166 Path.Combine(folder, "Payload", "DownloadUrlPlaceholdersBundle.wxs"),
167 Path.Combine(folder, "SimpleBundle", "MultiFileBootstrapperApplication.wxs"),
168 "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
169 "-bindpath", Path.Combine(folder, ".Data"),
170 "-intermediateFolder", intermediateFolder,
171 "-o", bundlePath,
172 });
173
174 result.AssertSuccess();
175
176 Assert.True(File.Exists(bundlePath));
177
178 var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath);
179 extractResult.AssertSuccess();
180
181 var ignoreAttributesByElementName = new Dictionary<string, List<string>>
182 {
183 { "Container", new List<string> { "FileSize", "Hash" } },
184 { "Payload", new List<string> { "FileSize", "Hash" } },
185 };
186 var payloads = extractResult.GetManifestTestXmlLines("/burn:BurnManifest/burn:Payload", ignoreAttributesByElementName);
187 WixAssert.CompareLineByLine(new[]
188 {
189 "<Payload Id='burn.exe' FilePath='burn.exe' FileSize='*' Hash='*' Packaging='embedded' SourcePath='a0' Container='PackagesContainer' />",
190 "<Payload Id='test.msi' FilePath='test.msi' FileSize='*' Hash='*' DownloadUrl='http://example.com/id/test.msi/test.msi' Packaging='external' SourcePath='test.msi' />",
191 "<Payload Id='LayoutOnlyPayload' FilePath='DownloadUrlPlaceholdersBundle.wxs' FileSize='*' Hash='*' LayoutOnly='yes' DownloadUrl='http://example.com/id/LayoutOnlyPayload/DownloadUrlPlaceholdersBundle.wxs' Packaging='external' SourcePath='DownloadUrlPlaceholdersBundle.wxs' />",
192 @"<Payload Id='fhuZsOcBDTuIX8rF96kswqI6SnuI' FilePath='MsiPackage\test.txt' FileSize='*' Hash='*' DownloadUrl='http://example.com/test.msiid/fhuZsOcBDTuIX8rF96kswqI6SnuI/MsiPackage/test.txt' Packaging='external' SourcePath='MsiPackage\test.txt' />",
193 @"<Payload Id='faf_OZ741BG7SJ6ZkcIvivZ2Yzo8' FilePath='MsiPackage\Shared.dll' FileSize='*' Hash='*' DownloadUrl='http://example.com/test.msiid/faf_OZ741BG7SJ6ZkcIvivZ2Yzo8/MsiPackage/Shared.dll' Packaging='external' SourcePath='MsiPackage\Shared.dll' />",
194 }, payloads);
195
196 var containers = extractResult.GetManifestTestXmlLines("/burn:BurnManifest/burn:Container", ignoreAttributesByElementName);
197 WixAssert.CompareLineByLine(new[]
198 {
199 "<Container Id='PackagesContainer' FileSize='*' Hash='*' DownloadUrl='http://example.com/id/PackagesContainer/packages.cab' FilePath='packages.cab' />",
200 }, containers);
201 }
202 }
203
204 [Fact]
205 public void CanBuildBundleWithRemotePackagePaylod()
206 {
207 var folder = TestData.Get(@"TestData");
208
209 using (var fs = new DisposableFileSystem())
210 {
211 var baseFolder = fs.GetFolder();
212 var intermediateFolder = Path.Combine(baseFolder, "obj");
213 var bundlePath = Path.Combine(baseFolder, @"bin\test.exe");
214 var baFolderPath = Path.Combine(baseFolder, "ba");
215 var extractFolderPath = Path.Combine(baseFolder, "extract");
216
217 var result = WixRunner.Execute(false, new[]
218 {
219 "build",
220 Path.Combine(folder, "Payload", "RemotePayloadInPackage.wxs"),
221 Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
222 "-bindpath", Path.Combine(folder, ".Data"),
223 "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
224 "-intermediateFolder", intermediateFolder,
225 "-o", bundlePath
226 });
227
228 result.AssertSuccess();
229
230 Assert.True(File.Exists(bundlePath));
231
232 var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath);
233 extractResult.AssertSuccess();
234
235 var payloadElements = extractResult.GetManifestTestXmlLines("/burn:BurnManifest/burn:Payload");
236 WixAssert.CompareLineByLine(new[]
237 {
238 "<Payload Id='payU3zeF5QWZvsWVEfgPVoFiuo65qQ' FilePath='reallybig.dat' FileSize='100000000' Hash='4312abcef' DownloadUrl='example.com/reallybig.dat' Packaging='external' SourcePath='reallybig.dat' />",
239 "<Payload Id='burn.exe' FilePath='burn.exe' FileSize='463360' Hash='F6E722518AC3AB7E31C70099368D5770788C179AA23226110DCF07319B1E1964E246A1E8AE72E2CF23E0138AFC281BAFDE45969204405E114EB20C8195DA7E5E' Packaging='embedded' SourcePath='a0' Container='WixAttachedContainer' />",
240 "<Payload Id='payIswsNTCI1qS7UYl_lydLSgHt2Aw' FilePath='fake.txt' FileSize='1' Hash='bcadef' DownloadUrl='example.com/fake.txt' Packaging='external' SourcePath='fake.txt' />",
241 "<Payload Id='RemotePayloadExe' FilePath='fake.exe' FileSize='1' Hash='a' DownloadUrl='example.com' Packaging='external' SourcePath='fake.exe' />",
242 }, payloadElements);
243
244 var payloadRefElements = extractResult.GetManifestTestXmlLines("/burn:BurnManifest/burn:Chain/burn:ExePackage/burn:PayloadRef");
245 WixAssert.CompareLineByLine(new[]
246 {
247 "<PayloadRef Id='burn.exe' />",
248 "<PayloadRef Id='payU3zeF5QWZvsWVEfgPVoFiuo65qQ' />",
249 "<PayloadRef Id='RemotePayloadExe' />",
250 "<PayloadRef Id='payIswsNTCI1qS7UYl_lydLSgHt2Aw' />"
251 }, payloadRefElements);
252 }
253 }
254
255 [Fact]
256 public void CannotBuildRemotePayloadInBootstrapperApplication()
257 {
258 var folder = TestData.Get(@"TestData");
259
260 using (var fs = new DisposableFileSystem())
261 {
262 var baseFolder = fs.GetFolder();
263 var intermediateFolder = Path.Combine(baseFolder, "obj");
264 var bundlePath = Path.Combine(baseFolder, "bin", "test.exe");
265
266 var result = WixRunner.Execute(false, new[]
267 {
268 "build",
269 Path.Combine(folder, "Payload", "RemotePayloadInBootstrapperApplication.wxs"),
270 Path.Combine(folder, "SimpleBundle", "MultiFileBootstrapperApplication.wxs"),
271 "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
272 "-bindpath", Path.Combine(folder, ".Data"),
273 "-intermediateFolder", intermediateFolder,
274 "-o", bundlePath,
275 });
276
277 WixAssert.CompareLineByLine(new[]
278 {
279 "Bootstrapper application and bundle extension payloads must be embedded in the bundle. The payload 'someremotefile.txt' is remote thus cannot be found for embedding. Provide a full path to the payload via the Payload/@SourceFile attribute."
280 }, result.Messages.Select(m => m.ToString()).ToArray());
281 }
282 }
283 }
284 }