main
cpp 622 lines 37 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 #include "precomp.h"
4 #undef GetTempPath
5 #undef GetEnvironmentVariable
6
7 namespace Microsoft
8 {
9 namespace Tools
10 {
11 namespace WindowsInstallerXml
12 {
13 namespace Test
14 {
15 namespace Bootstrapper
16 {
17 using namespace System;
18 using namespace Xunit;
19
20 public ref class VariableTest : BurnUnitTest
21 {
22 public:
23 VariableTest(BurnTestFixture^ fixture) : BurnUnitTest(fixture)
24 {
25 }
26
27 [Fact]
28 void VariablesBasicTest()
29 {
30 HRESULT hr = S_OK;
31 BURN_VARIABLES variables = { };
32 try
33 {
34 hr = VariableInitialize(&variables);
35 TestThrowOnFailure(hr, L"Failed to initialize variables.");
36
37 // set variables
38 VariableSetStringHelper(&variables, L"PROP1", L"VAL1", FALSE);
39 VariableSetNumericHelper(&variables, L"PROP2", 2);
40 VariableSetStringHelper(&variables, L"PROP5", L"VAL5", FALSE);
41 VariableSetStringHelper(&variables, L"PROP3", L"VAL3", FALSE);
42 VariableSetStringHelper(&variables, L"PROP4", L"VAL4", FALSE);
43 VariableSetStringHelper(&variables, L"PROP6", L"VAL6", FALSE);
44 VariableSetStringHelper(&variables, L"PROP7", L"7", FALSE);
45 VariableSetVersionHelper(&variables, L"PROP8", L"1.1.0.0");
46 VariableSetStringHelper(&variables, L"PROP9", L"[VAL9]", TRUE);
47
48 // set overwritten variables
49 VariableSetStringHelper(&variables, L"OVERWRITTEN_STRING", L"ORIGINAL", FALSE);
50 VariableSetNumericHelper(&variables, L"OVERWRITTEN_STRING", 42);
51
52 VariableSetNumericHelper(&variables, L"OVERWRITTEN_NUMBER", 5);
53 VariableSetStringHelper(&variables, L"OVERWRITTEN_NUMBER", L"NEW", FALSE);
54
55 // get and verify variable values
56 Assert::Equal<String^>(gcnew String(L"VAL1"), VariableGetStringHelper(&variables, L"PROP1"));
57 Assert::Equal(2ll, VariableGetNumericHelper(&variables, L"PROP2"));
58 Assert::Equal<String^>(gcnew String(L"2"), VariableGetStringHelper(&variables, L"PROP2"));
59 Assert::Equal<String^>(gcnew String(L"VAL3"), VariableGetStringHelper(&variables, L"PROP3"));
60 Assert::Equal<String^>(gcnew String(L"VAL4"), VariableGetStringHelper(&variables, L"PROP4"));
61 Assert::Equal<String^>(gcnew String(L"VAL5"), VariableGetStringHelper(&variables, L"PROP5"));
62 Assert::Equal<String^>(gcnew String(L"VAL6"), VariableGetStringHelper(&variables, L"PROP6"));
63 Assert::Equal(7ll, VariableGetNumericHelper(&variables, L"PROP7"));
64 Assert::Equal<String^>(gcnew String(L"1.1.0.0"), VariableGetVersionHelper(&variables, L"PROP8"));
65 Assert::Equal<String^>(gcnew String(L"1.1.0.0"), VariableGetStringHelper(&variables, L"PROP8"));
66 Assert::Equal<String^>(gcnew String(L"[VAL9]"), VariableGetStringHelper(&variables, L"PROP9"));
67
68 Assert::Equal(42ll, VariableGetNumericHelper(&variables, L"OVERWRITTEN_STRING"));
69 Assert::Equal<String^>(gcnew String(L"NEW"), VariableGetStringHelper(&variables, L"OVERWRITTEN_NUMBER"));
70 }
71 finally
72 {
73 VariablesUninitialize(&variables);
74 }
75 }
76
77 [Fact]
78 void VariablesParseXmlTest()
79 {
80 HRESULT hr = S_OK;
81 IXMLDOMElement* pixeBundle = NULL;
82 BURN_VARIABLES variables = { };
83 BOOL fContainsHiddenData = FALSE;
84 try
85 {
86 LPCWSTR wzDocument =
87 L"<Bundle>"
88 L" <Variable Id='Var1' Type='numeric' Value='1' Hidden='no' Persisted='no' />"
89 L" <Variable Id='Var2' Type='string' Value='String value.' Hidden='no' Persisted='no' />"
90 L" <Variable Id='Var3' Type='version' Value='1.2.3.4' Hidden='no' Persisted='no' />"
91 L" <Variable Id='Var4' Hidden='no' Persisted='no' />"
92 L" <Variable Id='Var5' Type='string' Value='' Hidden='no' Persisted='no' />"
93 L" <Variable Id='Var6' Type='formatted' Value='[Formatted]' Hidden='no' Persisted='no' />"
94 L" <Variable Id='Formatted' Type='formatted' Value='supersecret' Hidden='yes' Persisted='no' />"
95 L"</Bundle>";
96
97 hr = VariableInitialize(&variables);
98 TestThrowOnFailure(hr, L"Failed to initialize variables.");
99
100 // load XML document
101 LoadBundleXmlHelper(wzDocument, &pixeBundle);
102
103 hr = VariablesParseFromXml(&variables, pixeBundle);
104 TestThrowOnFailure(hr, L"Failed to parse variables from XML.");
105
106 // get and verify variable values
107 Assert::Equal((int)BURN_VARIANT_TYPE_NUMERIC, VariableGetTypeHelper(&variables, L"Var1"));
108 Assert::Equal((int)BURN_VARIANT_TYPE_STRING, VariableGetTypeHelper(&variables, L"Var2"));
109 Assert::Equal((int)BURN_VARIANT_TYPE_VERSION, VariableGetTypeHelper(&variables, L"Var3"));
110 Assert::Equal((int)BURN_VARIANT_TYPE_NONE, VariableGetTypeHelper(&variables, L"Var4"));
111 Assert::Equal((int)BURN_VARIANT_TYPE_FORMATTED, VariableGetTypeHelper(&variables, L"Var6"));
112
113 Assert::Equal(1ll, VariableGetNumericHelper(&variables, L"Var1"));
114 Assert::Equal<String^>(gcnew String(L"String value."), VariableGetStringHelper(&variables, L"Var2"));
115 Assert::Equal<String^>(gcnew String(L"1.2.3.4"), VariableGetVersionHelper(&variables, L"Var3"));
116 Assert::Equal<String^>(gcnew String(L"[Formatted]"), VariableGetStringHelper(&variables, L"Var6"));
117 Assert::Equal<String^>(gcnew String(L"supersecret"), VariableGetFormattedHelper(&variables, L"Formatted", &fContainsHiddenData));
118 Assert::Equal<BOOL>(TRUE, fContainsHiddenData);
119 Assert::Equal<String^>(gcnew String(L"supersecret"), VariableGetFormattedHelper(&variables, L"Var6", &fContainsHiddenData));
120 Assert::Equal<BOOL>(TRUE, fContainsHiddenData);
121 Assert::Equal<String^>(gcnew String(L"String value."), VariableGetFormattedHelper(&variables, L"Var2", &fContainsHiddenData));
122 Assert::Equal<BOOL>(FALSE, fContainsHiddenData);
123
124 Assert::True(VariableIsHiddenCommandLine(&variables, L"Formatted"));
125 Assert::True(VariableIsHiddenCommandLine(&variables, L"FORMATTED"));
126 Assert::True(VariableIsHiddenCommandLine(&variables, L"formatted"));
127 Assert::False(VariableIsHiddenCommandLine(&variables, L"var6"));
128 }
129 finally
130 {
131 ReleaseObject(pixeBundle);
132 VariablesUninitialize(&variables);
133 }
134 }
135
136 [Fact]
137 void VariablesParseXmlFailureTest()
138 {
139 HRESULT hr = S_OK;
140 IXMLDOMElement* pixeBundle = NULL;
141 BURN_VARIABLES variables = { };
142
143 try
144 {
145 LPCWSTR wzDocument =
146 L"<Bundle>"
147 L" <Variable Id='WixCustomVariable' Type='numeric' Value='1' Hidden='no' Persisted='no' />"
148 L"</Bundle>";
149
150 hr = VariableInitialize(&variables);
151 TestThrowOnFailure(hr, L"Failed to initialize variables.");
152
153 // load XML document
154 LoadBundleXmlHelper(wzDocument, &pixeBundle);
155
156 hr = VariablesParseFromXml(&variables, pixeBundle);
157 NativeAssert::SpecificReturnCode(E_INVALIDARG, hr, "Should have failed due to 'WixCustomVariable' starting with Wix.");
158 }
159 finally
160 {
161 ReleaseObject(pixeBundle);
162 VariablesUninitialize(&variables);
163 }
164 }
165
166 [Fact]
167 void VariablesSetCustomWixVariableTest()
168 {
169 HRESULT hr = S_OK;
170 IXMLDOMElement* pixeBundle = NULL;
171 BURN_VARIABLES variables = { };
172
173 try
174 {
175 LPCWSTR wzDocument =
176 L"<Bundle>"
177 L"</Bundle>";
178
179 hr = VariableInitialize(&variables);
180 TestThrowOnFailure(hr, L"Failed to initialize variables.");
181
182 // load XML document
183 LoadBundleXmlHelper(wzDocument, &pixeBundle);
184
185 hr = VariablesParseFromXml(&variables, pixeBundle);
186 NativeAssert::Succeeded(hr, "Failed to parse variables from XML.");
187
188 hr = VariableSetString(&variables, L"WixCustomVariable", L"something", FALSE, FALSE);
189 NativeAssert::Succeeded(hr, "Failed to set 'WixCustomVariable' variable.");
190 }
191 finally
192 {
193 ReleaseObject(pixeBundle);
194 VariablesUninitialize(&variables);
195 }
196 }
197
198 [Fact]
199 void VariablesFormatTest()
200 {
201 HRESULT hr = S_OK;
202 BURN_VARIABLES variables = { };
203 LPWSTR scz = NULL;
204 SIZE_T cch = 0;
205 BOOL fContainsHiddenData = FALSE;
206 try
207 {
208 hr = VariableInitialize(&variables);
209 TestThrowOnFailure(hr, L"Failed to initialize variables.");
210
211 // set variables
212 VariableSetStringHelper(&variables, L"PROP1", L"VAL1", FALSE);
213 VariableSetStringHelper(&variables, L"PROP2", L"VAL2", FALSE);
214 VariableSetNumericHelper(&variables, L"PROP3", 3);
215 VariableSetStringHelper(&variables, L"PROP4", L"[PROP1]", FALSE);
216 VariableSetStringHelper(&variables, L"PROP5", L"[PROP2]", FALSE);
217 VariableSetStringHelper(&variables, L"PROP6", L"[PROP4]", TRUE);
218 VariableSetStringHelper(&variables, L"PROP7", L"[PROP5]", TRUE);
219
220 // test string formatting
221 Assert::Equal<String^>(gcnew String(L"NOPROP"), VariableFormatStringHelper(&variables, L"NOPROP"));
222 Assert::Equal<String^>(gcnew String(L"VAL1"), VariableFormatStringHelper(&variables, L"[PROP1]"));
223 Assert::Equal<String^>(gcnew String(L" VAL1 "), VariableFormatStringHelper(&variables, L" [PROP1] "));
224 Assert::Equal<String^>(gcnew String(L"PRE VAL1"), VariableFormatStringHelper(&variables, L"PRE [PROP1]"));
225 Assert::Equal<String^>(gcnew String(L"VAL1 POST"), VariableFormatStringHelper(&variables, L"[PROP1] POST"));
226 Assert::Equal<String^>(gcnew String(L"PRE VAL1 POST"), VariableFormatStringHelper(&variables, L"PRE [PROP1] POST"));
227 Assert::Equal<String^>(gcnew String(L"VAL1 MID VAL2"), VariableFormatStringHelper(&variables, L"[PROP1] MID [PROP2]"));
228 Assert::Equal<String^>(gcnew String(L""), VariableFormatStringHelper(&variables, L"[NONE]"));
229 Assert::Equal<String^>(gcnew String(L""), VariableFormatStringHelper(&variables, L"[prop1]"));
230 Assert::Equal<String^>(gcnew String(L"["), VariableFormatStringHelper(&variables, L"[\\[]"));
231 Assert::Equal<String^>(gcnew String(L"]"), VariableFormatStringHelper(&variables, L"[\\]]"));
232 Assert::Equal<String^>(gcnew String(L"[]"), VariableFormatStringHelper(&variables, L"[]"));
233 Assert::Equal<String^>(gcnew String(L"[NONE"), VariableFormatStringHelper(&variables, L"[NONE"));
234 Assert::Equal<String^>(gcnew String(L"VAL2"), VariableGetFormattedHelper(&variables, L"PROP2", &fContainsHiddenData));
235 Assert::Equal<BOOL>(FALSE, fContainsHiddenData);
236 Assert::Equal<String^>(gcnew String(L"3"), VariableGetFormattedHelper(&variables, L"PROP3", &fContainsHiddenData));
237 Assert::Equal<BOOL>(FALSE, fContainsHiddenData);
238 Assert::Equal<String^>(gcnew String(L"[PROP1]"), VariableGetFormattedHelper(&variables, L"PROP4", &fContainsHiddenData));
239 Assert::Equal<BOOL>(FALSE, fContainsHiddenData);
240 Assert::Equal<String^>(gcnew String(L"[PROP2]"), VariableGetFormattedHelper(&variables, L"PROP5", &fContainsHiddenData));
241 Assert::Equal<BOOL>(FALSE, fContainsHiddenData);
242 Assert::Equal<String^>(gcnew String(L"[PROP1]"), VariableGetFormattedHelper(&variables, L"PROP6", &fContainsHiddenData));
243 Assert::Equal<BOOL>(FALSE, fContainsHiddenData);
244 Assert::Equal<String^>(gcnew String(L"[PROP2]"), VariableGetFormattedHelper(&variables, L"PROP7", &fContainsHiddenData));
245 Assert::Equal<BOOL>(FALSE, fContainsHiddenData);
246
247 hr = VariableFormatString(&variables, L"PRE [PROP1] POST", &scz, &cch);
248 TestThrowOnFailure(hr, L"Failed to format string");
249
250 Assert::Equal((SIZE_T)lstrlenW(scz), cch);
251
252 hr = VariableFormatString(&variables, L"PRE [PROP1] POST", NULL, &cch);
253 TestThrowOnFailure(hr, L"Failed to format string");
254
255 Assert::Equal((SIZE_T)lstrlenW(scz), cch);
256 }
257 finally
258 {
259 VariablesUninitialize(&variables);
260 ReleaseStr(scz);
261 }
262 }
263
264 [Fact]
265 void VariablesEscapeTest()
266 {
267 // test string escaping
268 Assert::Equal<String^>(gcnew String(L"[\\[]"), VariableEscapeStringHelper(L"["));
269 Assert::Equal<String^>(gcnew String(L"[\\]]"), VariableEscapeStringHelper(L"]"));
270 Assert::Equal<String^>(gcnew String(L" [\\[]TEXT[\\]] "), VariableEscapeStringHelper(L" [TEXT] "));
271 }
272
273 [Fact]
274 void VariablesConditionTest()
275 {
276 HRESULT hr = S_OK;
277 BURN_VARIABLES variables = { };
278 try
279 {
280 hr = VariableInitialize(&variables);
281 TestThrowOnFailure(hr, L"Failed to initialize variables.");
282
283 // set variables
284 VariableSetStringHelper(&variables, L"PROP1", L"VAL1", FALSE);
285 VariableSetStringHelper(&variables, L"PROP2", L"VAL2", FALSE);
286 VariableSetStringHelper(&variables, L"PROP3", L"VAL3", FALSE);
287 VariableSetStringHelper(&variables, L"PROP4", L"BEGIN MID END", FALSE);
288 VariableSetNumericHelper(&variables, L"PROP5", 5);
289 VariableSetNumericHelper(&variables, L"PROP6", 6);
290 VariableSetStringHelper(&variables, L"PROP7", L"", FALSE);
291 VariableSetNumericHelper(&variables, L"PROP8", 0);
292 VariableSetStringHelper(&variables, L"_PROP9", L"VAL9", FALSE);
293 VariableSetNumericHelper(&variables, L"PROP10", -10);
294 VariableSetNumericHelper(&variables, L"PROP11", 9223372036854775807ll);
295 VariableSetNumericHelper(&variables, L"PROP12", -9223372036854775808ll);
296 VariableSetNumericHelper(&variables, L"PROP13", 0x00010000);
297 VariableSetNumericHelper(&variables, L"PROP14", 0x00000001);
298 VariableSetNumericHelper(&variables, L"PROP15", 0x00010001);
299 VariableSetVersionHelper(&variables, L"PROP16", L"0.0.0.0");
300 VariableSetVersionHelper(&variables, L"PROP17", L"1.0.0.0");
301 VariableSetVersionHelper(&variables, L"PROP18", L"1.1.0.0");
302 VariableSetVersionHelper(&variables, L"PROP19", L"1.1.1.0");
303 VariableSetVersionHelper(&variables, L"PROP20", L"1.1.1.1");
304 VariableSetNumericHelper(&variables, L"vPROP21", 1);
305 VariableSetVersionHelper(&variables, L"PROP22", L"65535.65535.65535.65535");
306 VariableSetStringHelper(&variables, L"PROP23", L"1.1.1", FALSE);
307 VariableSetStringHelper(&variables, L"PROP24", L"[PROP1]", TRUE);
308 VariableSetStringHelper(&variables, L"PROP25", L"[PROP7]", TRUE);
309 VariableSetStringHelper(&variables, L"PROP26", L"[PROP8]", TRUE);
310 VariableSetStringHelper(&variables, L"PROP27", L"[PROP16]", TRUE);
311
312 // test conditions
313 Assert::True(EvaluateConditionHelper(&variables, L"PROP1"));
314 Assert::True(EvaluateConditionHelper(&variables, L"PROP5"));
315 Assert::False(EvaluateConditionHelper(&variables, L"PROP7"));
316 Assert::False(EvaluateConditionHelper(&variables, L"PROP8"));
317 Assert::True(EvaluateConditionHelper(&variables, L"_PROP9"));
318 Assert::True(EvaluateConditionHelper(&variables, L"PROP16"));
319 Assert::True(EvaluateConditionHelper(&variables, L"PROP17"));
320 Assert::True(EvaluateConditionHelper(&variables, L"PROP24=\"VAL1\""));
321 Assert::False(EvaluateConditionHelper(&variables, L"PROP25"));
322 Assert::True(EvaluateConditionHelper(&variables, L"PROP26"));
323 Assert::True(EvaluateConditionHelper(&variables, L"PROP27"));
324
325 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 = \"VAL1\""));
326 Assert::False(EvaluateConditionHelper(&variables, L"NONE = \"NOT\""));
327 Assert::False(EvaluateConditionHelper(&variables, L"PROP1 <> \"VAL1\""));
328 Assert::False(EvaluateConditionHelper(&variables, L"PROP1 <>\n\"VAL1\""));
329 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 <> \"VAL1\nVAL2\""));
330 Assert::False(EvaluateConditionHelper(&variables, L"PROP1 ~<> \"VAL1\""));
331 Assert::False(EvaluateConditionHelper(&variables, L"PROP1 ~<> \"Val1\""));
332 Assert::True(EvaluateConditionHelper(&variables, L"NONE <> \"NOT\""));
333 Assert::True(EvaluateConditionHelper(&variables, L"NONE ~<> \"NOT\""));
334
335 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 ~= \"val1\""));
336 Assert::False(EvaluateConditionHelper(&variables, L"PROP1 = \"val1\""));
337 Assert::False(EvaluateConditionHelper(&variables, L"PROP1 ~<> \"val1\""));
338 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 <> \"val1\""));
339
340 Assert::True(EvaluateConditionHelper(&variables, L"PROP5 = 5"));
341 Assert::False(EvaluateConditionHelper(&variables, L"PROP5 = 0"));
342 Assert::False(EvaluateConditionHelper(&variables, L"PROP5 <> 5"));
343 Assert::True(EvaluateConditionHelper(&variables, L"PROP5 <> 0"));
344
345 Assert::True(EvaluateConditionHelper(&variables, L"PROP10 = -10"));
346 Assert::False(EvaluateConditionHelper(&variables, L"PROP10 <> -10"));
347
348 Assert::True(EvaluateConditionHelper(&variables, L"PROP17 = v1"));
349 Assert::False(EvaluateConditionHelper(&variables, L"PROP17 = v0"));
350 Assert::False(EvaluateConditionHelper(&variables, L"PROP17 <> v1"));
351 Assert::True(EvaluateConditionHelper(&variables, L"PROP17 <> v0"));
352
353 Assert::True(EvaluateConditionHelper(&variables, L"PROP16 = v0"));
354 Assert::True(EvaluateConditionHelper(&variables, L"PROP17 = v1"));
355 Assert::True(EvaluateConditionHelper(&variables, L"PROP18 = v1.1"));
356 Assert::True(EvaluateConditionHelper(&variables, L"PROP19 = v1.1.1"));
357 Assert::True(EvaluateConditionHelper(&variables, L"PROP20 = v1.1.1.1"));
358 Assert::True(EvaluateConditionHelper(&variables, L"PROP20 > v1.1.1.1.0"));
359 Assert::True(EvaluateConditionHelper(&variables, L"PROP20 > v1.1.1.1.1"));
360 Assert::True(EvaluateConditionHelper(&variables, L"vPROP21 = 1"));
361 Assert::True(EvaluateConditionHelper(&variables, L"PROP23 = v1.1.1"));
362 Assert::True(EvaluateConditionHelper(&variables, L"v1.1.1 = PROP23"));
363 Assert::False(EvaluateConditionHelper(&variables, L"v1.1.1<>PROP23"));
364 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 <> v1.1.1"));
365 Assert::True(EvaluateConditionHelper(&variables, L"v1.1.1 <> PROP1"));
366
367 Assert::False(EvaluateConditionHelper(&variables, L"PROP11 = 9223372036854775806"));
368 Assert::True(EvaluateConditionHelper(&variables, L"PROP11 = 9223372036854775807"));
369 Assert::True(EvaluateFailureConditionHelper(&variables, L"PROP11 = 9223372036854775808"));
370 Assert::True(EvaluateFailureConditionHelper(&variables, L"PROP11 = 92233720368547758070000"));
371
372 Assert::False(EvaluateConditionHelper(&variables, L"PROP12 = -9223372036854775807"));
373 Assert::True(EvaluateConditionHelper(&variables, L"PROP12 = -9223372036854775808"));
374 Assert::True(EvaluateFailureConditionHelper(&variables, L"PROP12 = -9223372036854775809"));
375 Assert::True(EvaluateFailureConditionHelper(&variables, L"PROP12 = -92233720368547758080000"));
376
377 Assert::True(EvaluateConditionHelper(&variables, L"PROP22 = v65535.65535.65535.65535"));
378 Assert::True(EvaluateConditionHelper(&variables, L"PROP22 < v65536.65535.65535.65535"));
379 Assert::True(EvaluateConditionHelper(&variables, L"PROP22 < v65535.655350000.65535.65535"));
380
381 Assert::True(EvaluateConditionHelper(&variables, L"PROP5 < 6"));
382 Assert::False(EvaluateConditionHelper(&variables, L"PROP5 < 5"));
383 Assert::True(EvaluateConditionHelper(&variables, L"PROP5 > 4"));
384 Assert::False(EvaluateConditionHelper(&variables, L"PROP5 > 5"));
385 Assert::True(EvaluateConditionHelper(&variables, L"PROP5 <= 6"));
386 Assert::True(EvaluateConditionHelper(&variables, L"PROP5 <= 5"));
387 Assert::False(EvaluateConditionHelper(&variables, L"PROP5 <= 4"));
388 Assert::True(EvaluateConditionHelper(&variables, L"PROP5 >= 4"));
389 Assert::True(EvaluateConditionHelper(&variables, L"PROP5 >= 5"));
390 Assert::False(EvaluateConditionHelper(&variables, L"PROP5 >= 6"));
391
392 Assert::True(EvaluateConditionHelper(&variables, L"PROP4 << \"BEGIN\""));
393 Assert::False(EvaluateConditionHelper(&variables, L"PROP4 << \"END\""));
394 Assert::True(EvaluateConditionHelper(&variables, L"PROP4 >> \"END\""));
395 Assert::False(EvaluateConditionHelper(&variables, L"PROP4 >> \"BEGIN\""));
396 Assert::True(EvaluateConditionHelper(&variables, L"PROP4 >< \"MID\""));
397 Assert::False(EvaluateConditionHelper(&variables, L"PROP4 >< \"NONE\""));
398
399 Assert::True(EvaluateConditionHelper(&variables, L"PROP16 < v1.1"));
400 Assert::False(EvaluateConditionHelper(&variables, L"PROP16 < v0"));
401 Assert::True(EvaluateConditionHelper(&variables, L"PROP17 > v0.12"));
402 Assert::False(EvaluateConditionHelper(&variables, L"PROP17 > v1"));
403 Assert::True(EvaluateConditionHelper(&variables, L"PROP18 >= v1.0"));
404 Assert::True(EvaluateConditionHelper(&variables, L"PROP18 >= v1.1"));
405 Assert::False(EvaluateConditionHelper(&variables, L"PROP18 >= v2.1"));
406 Assert::True(EvaluateConditionHelper(&variables, L"PROP19 <= v1.1234.1"));
407 Assert::True(EvaluateConditionHelper(&variables, L"PROP19 <= v1.1.1"));
408 Assert::False(EvaluateConditionHelper(&variables, L"PROP19 <= v1.0.123"));
409
410 Assert::True(EvaluateConditionHelper(&variables, L"PROP6 = \"6\""));
411 Assert::True(EvaluateConditionHelper(&variables, L"\"6\" = PROP6"));
412 Assert::False(EvaluateConditionHelper(&variables, L"PROP6 = \"ABC\""));
413 Assert::False(EvaluateConditionHelper(&variables, L"\"ABC\" = PROP6"));
414 Assert::False(EvaluateConditionHelper(&variables, L"\"ABC\" = PROP6"));
415
416 Assert::True(EvaluateConditionHelper(&variables, L"PROP13 << 1"));
417 Assert::False(EvaluateConditionHelper(&variables, L"PROP13 << 0"));
418 Assert::True(EvaluateConditionHelper(&variables, L"PROP14 >> 1"));
419 Assert::False(EvaluateConditionHelper(&variables, L"PROP14 >> 0"));
420 Assert::True(EvaluateConditionHelper(&variables, L"PROP15 >< 65537"));
421 Assert::False(EvaluateConditionHelper(&variables, L"PROP15 >< 0"));
422
423 Assert::False(EvaluateConditionHelper(&variables, L"NOT PROP1"));
424 Assert::True(EvaluateConditionHelper(&variables, L"NOT (PROP1 <> \"VAL1\")"));
425
426 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 = \"VAL1\" AND PROP2 = \"VAL2\""));
427 Assert::False(EvaluateConditionHelper(&variables, L"PROP1 = \"VAL1\" AND PROP2 = \"NOT\""));
428 Assert::False(EvaluateConditionHelper(&variables, L"PROP1 = \"NOT\" AND PROP2 = \"VAL2\""));
429 Assert::False(EvaluateConditionHelper(&variables, L"PROP1 = \"NOT\" AND PROP2 = \"NOT\""));
430
431 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 = \"VAL1\" OR PROP2 = \"VAL2\""));
432 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 = \"VAL1\" OR PROP2 = \"NOT\""));
433 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 = \"NOT\" OR PROP2 = \"VAL2\""));
434 Assert::False(EvaluateConditionHelper(&variables, L"PROP1 = \"NOT\" OR PROP2 = \"NOT\""));
435
436 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 = \"VAL1\" AND PROP2 = \"VAL2\" OR PROP3 = \"NOT\""));
437 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 = \"VAL1\" AND PROP2 = \"NOT\" OR PROP3 = \"VAL3\""));
438 Assert::False(EvaluateConditionHelper(&variables, L"PROP1 = \"VAL1\" AND PROP2 = \"NOT\" OR PROP3 = \"NOT\""));
439 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 = \"VAL1\" AND (PROP2 = \"NOT\" OR PROP3 = \"VAL3\")"));
440 Assert::True(EvaluateConditionHelper(&variables, L"(PROP1 = \"VAL1\" AND PROP2 = \"VAL2\") OR PROP3 = \"NOT\""));
441
442 Assert::True(EvaluateConditionHelper(&variables, L"PROP3 = \"NOT\" OR PROP1 = \"VAL1\" AND PROP2 = \"VAL2\""));
443 Assert::True(EvaluateConditionHelper(&variables, L"PROP3 = \"VAL3\" OR PROP1 = \"VAL1\" AND PROP2 = \"NOT\""));
444 Assert::False(EvaluateConditionHelper(&variables, L"PROP3 = \"NOT\" OR PROP1 = \"VAL1\" AND PROP2 = \"NOT\""));
445 Assert::True(EvaluateConditionHelper(&variables, L"(PROP3 = \"NOT\" OR PROP1 = \"VAL1\") AND PROP2 = \"VAL2\""));
446 Assert::True(EvaluateConditionHelper(&variables, L"PROP3 = \"NOT\" OR (PROP1 = \"VAL1\" AND PROP2 = \"VAL2\")"));
447
448 Assert::True(EvaluateFailureConditionHelper(&variables, L""));
449 Assert::True(EvaluateFailureConditionHelper(&variables, L"="));
450 Assert::True(EvaluateFailureConditionHelper(&variables, L"(PROP1"));
451 Assert::True(EvaluateFailureConditionHelper(&variables, L"(PROP1 = \""));
452 Assert::True(EvaluateFailureConditionHelper(&variables, L"1A"));
453 Assert::True(EvaluateFailureConditionHelper(&variables, L"*"));
454
455 Assert::False(EvaluateFailureConditionHelper(&variables, L"0"));
456 Assert::True(EvaluateFailureConditionHelper(&variables, L"1 == 1"));
457 }
458 finally
459 {
460 VariablesUninitialize(&variables);
461 }
462 }
463
464 [Fact]
465 void VariablesSerializationTest()
466 {
467 HRESULT hr = S_OK;
468 BYTE* pbBuffer = NULL;
469 SIZE_T cbBuffer = 0;
470 SIZE_T iBuffer = 0;
471 BURN_VARIABLES variables1 = { };
472 BURN_VARIABLES variables2 = { };
473 try
474 {
475 // serialize
476 hr = VariableInitialize(&variables1);
477 TestThrowOnFailure(hr, L"Failed to initialize variables.");
478
479 VariableSetStringHelper(&variables1, L"PROP1", L"VAL1", FALSE);
480 VariableSetNumericHelper(&variables1, L"PROP2", 2);
481 VariableSetVersionHelper(&variables1, L"PROP3", L"1.1.1.1");
482 VariableSetStringHelper(&variables1, L"PROP4", L"VAL4", FALSE);
483 VariableSetStringHelper(&variables1, L"PROP5", L"[PROP1]", TRUE);
484 VariableSetStringHelper(&variables1, L"WixBundleName", L"DifferentName", FALSE);
485 VariableSetStringHelper(&variables1, L"WixBundleLog_PackageA", L"C:\\path\\[to]\\log", FALSE);
486
487 hr = VariableSerialize(&variables1, FALSE, &pbBuffer, &cbBuffer);
488 TestThrowOnFailure(hr, L"Failed to serialize variables.");
489
490 // deserialize
491 hr = VariableInitialize(&variables2);
492 TestThrowOnFailure(hr, L"Failed to initialize variables.");
493
494 hr = VariableDeserialize(&variables2, FALSE, pbBuffer, cbBuffer, &iBuffer);
495 TestThrowOnFailure(hr, L"Failed to deserialize variables.");
496
497 Assert::Equal<String^>(gcnew String(L"VAL1"), VariableGetStringHelper(&variables2, L"PROP1"));
498 Assert::Equal(2ll, VariableGetNumericHelper(&variables2, L"PROP2"));
499 Assert::Equal<String^>(gcnew String(L"1.1.1.1"), VariableGetVersionHelper(&variables2, L"PROP3"));
500 Assert::Equal<String^>(gcnew String(L"VAL4"), VariableGetStringHelper(&variables2, L"PROP4"));
501 Assert::Equal<String^>(gcnew String(L"[PROP1]"), VariableGetStringHelper(&variables2, L"PROP5"));
502 Assert::Equal<String^>(gcnew String(L"DifferentName"), VariableGetStringHelper(&variables2, L"WixBundleName"));
503 Assert::Equal<String^>(gcnew String(L"C:\\path\\[to]\\log"), VariableGetStringHelper(&variables2, L"WixBundleLog_PackageA"));
504
505 Assert::Equal((int)BURN_VARIANT_TYPE_STRING, VariableGetTypeHelper(&variables2, L"PROP1"));
506 Assert::Equal((int)BURN_VARIANT_TYPE_NUMERIC, VariableGetTypeHelper(&variables2, L"PROP2"));
507 Assert::Equal((int)BURN_VARIANT_TYPE_VERSION, VariableGetTypeHelper(&variables2, L"PROP3"));
508 Assert::Equal((int)BURN_VARIANT_TYPE_STRING, VariableGetTypeHelper(&variables2, L"PROP4"));
509 Assert::Equal((int)BURN_VARIANT_TYPE_FORMATTED, VariableGetTypeHelper(&variables2, L"PROP5"));
510 Assert::Equal((int)BURN_VARIANT_TYPE_STRING, VariableGetTypeHelper(&variables2, L"WixBundleName"));
511 Assert::Equal((int)BURN_VARIANT_TYPE_STRING, VariableGetTypeHelper(&variables2, L"WixBundleLog_PackageA"));
512 }
513 finally
514 {
515 ReleaseMem(pbBuffer);
516 VariablesUninitialize(&variables1);
517 VariablesUninitialize(&variables2);
518 }
519 }
520
521 [Fact]
522 void VariablesBuiltInTest()
523 {
524 HRESULT hr = S_OK;
525 BURN_VARIABLES variables = { };
526 try
527 {
528 hr = VariableInitialize(&variables);
529 TestThrowOnFailure(hr, L"Failed to initialize variables.");
530
531 // VersionMsi
532 Assert::True(EvaluateConditionHelper(&variables, L"VersionMsi >= v1.1"));
533
534 // VersionNT
535 Assert::True(EvaluateConditionHelper(&variables, L"VersionNT <> v0.0.0.0"));
536
537 // VersionNT64
538 if (nullptr == Environment::GetEnvironmentVariable("ProgramFiles(x86)"))
539 {
540 Assert::False(EvaluateConditionHelper(&variables, L"VersionNT64"));
541 }
542 else
543 {
544 Assert::True(EvaluateConditionHelper(&variables, L"VersionNT64"));
545 }
546
547 // attempt to set a built-in property
548 hr = VariableSetString(&variables, L"VersionNT", L"VAL", FALSE, FALSE);
549 Assert::Equal(E_INVALIDARG, hr);
550 Assert::False(EvaluateConditionHelper(&variables, L"VersionNT = \"VAL\""));
551
552 VariableGetNumericHelper(&variables, L"NativeMachine");
553 VariableGetNumericHelper(&variables, L"NTProductType");
554 VariableGetNumericHelper(&variables, L"NTSuiteBackOffice");
555 VariableGetNumericHelper(&variables, L"NTSuiteDataCenter");
556 VariableGetNumericHelper(&variables, L"NTSuiteEnterprise");
557 VariableGetNumericHelper(&variables, L"NTSuitePersonal");
558 VariableGetNumericHelper(&variables, L"NTSuiteSmallBusiness");
559 VariableGetNumericHelper(&variables, L"NTSuiteSmallBusinessRestricted");
560 VariableGetNumericHelper(&variables, L"NTSuiteWebServer");
561 VariableGetNumericHelper(&variables, L"CompatibilityMode");
562 VariableGetNumericHelper(&variables, L"Privileged");
563 VariableGetNumericHelper(&variables, L"SystemLanguageID");
564 VariableGetNumericHelper(&variables, L"TerminalServer");
565 VariableGetNumericHelper(&variables, L"UserUILanguageID");
566 VariableGetNumericHelper(&variables, L"UserLanguageID");
567 VariableGetNumericHelper(&variables, L"WixCanRestart");
568
569 // known folders
570 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::ApplicationData) + "\\", VariableGetStringHelper(&variables, L"AppDataFolder"));
571 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::CommonApplicationData) + "\\", VariableGetStringHelper(&variables, L"CommonAppDataFolder"));
572
573 #if defined(_WIN64)
574 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::ProgramFiles) + "\\", VariableGetStringHelper(&variables, L"ProgramFiles64Folder"));
575 #else
576 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::ProgramFiles) + "\\", VariableGetStringHelper(&variables, L"ProgramFilesFolder"));
577 #endif
578 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::DesktopDirectory) + "\\", VariableGetStringHelper(&variables, L"DesktopFolder"));
579 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::Favorites) + "\\", VariableGetStringHelper(&variables, L"FavoritesFolder"));
580 VariableGetStringHelper(&variables, L"FontsFolder");
581 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::LocalApplicationData) + "\\", VariableGetStringHelper(&variables, L"LocalAppDataFolder"));
582 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::Personal) + "\\", VariableGetStringHelper(&variables, L"PersonalFolder"));
583 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::Programs) + "\\", VariableGetStringHelper(&variables, L"ProgramMenuFolder"));
584 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::SendTo) + "\\", VariableGetStringHelper(&variables, L"SendToFolder"));
585 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::StartMenu) + "\\", VariableGetStringHelper(&variables, L"StartMenuFolder"));
586 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::Startup) + "\\", VariableGetStringHelper(&variables, L"StartupFolder"));
587 VariableGetStringHelper(&variables, L"SystemFolder");
588 VariableGetStringHelper(&variables, L"WindowsFolder");
589 VariableGetStringHelper(&variables, L"WindowsVolume");
590
591 Assert::Equal<String^>(System::IO::Path::GetTempPath(), System::IO::Path::GetFullPath(VariableGetStringHelper(&variables, L"TempFolder")));
592
593 VariableGetStringHelper(&variables, L"AdminToolsFolder");
594 #if defined(_WIN64)
595 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::CommonProgramFiles) + "\\", VariableGetStringHelper(&variables, L"CommonFiles64Folder"));
596 #else
597 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::CommonProgramFiles) + "\\", VariableGetStringHelper(&variables, L"CommonFilesFolder"));
598 #endif
599 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::MyPictures) + "\\", VariableGetStringHelper(&variables, L"MyPicturesFolder"));
600 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::Templates) + "\\", VariableGetStringHelper(&variables, L"TemplateFolder"));
601
602 if (Environment::Is64BitOperatingSystem)
603 {
604 VariableGetStringHelper(&variables, L"ProgramFiles64Folder");
605 VariableGetStringHelper(&variables, L"CommonFiles64Folder");
606 VariableGetStringHelper(&variables, L"System64Folder");
607 }
608
609 Assert::Equal<String^>(wzVerMajorMinorBuild, VariableGetVersionHelper(&variables, L"InstallerVersion"));
610 Assert::Equal<String^>(wzInformationalVersion, VariableGetVersionHelper(&variables, L"InstallerInformationalVersion"));
611 }
612 finally
613 {
614 VariablesUninitialize(&variables);
615 }
616 }
617 };
618 }
619 }
620 }
621 }
622 }