summaryrefslogtreecommitdiff
path: root/src/burn/test/BurnUnitTest/VariableTest.cpp
diff options
context:
space:
mode:
authorRob Mensching <rob@firegiant.com>2021-04-22 17:06:54 -0700
committerRob Mensching <rob@firegiant.com>2021-04-29 16:36:06 -0700
commitaf10c45d7b3a44af0b461a557847fe03263dcc10 (patch)
tree6a5c1532304782c36ffe4200b38f3afb76789a43 /src/burn/test/BurnUnitTest/VariableTest.cpp
parent9c2aed97299fb96aeee3f1471ce40225437aaecf (diff)
downloadwix-af10c45d7b3a44af0b461a557847fe03263dcc10.tar.gz
wix-af10c45d7b3a44af0b461a557847fe03263dcc10.tar.bz2
wix-af10c45d7b3a44af0b461a557847fe03263dcc10.zip
Move burn into burn
Diffstat (limited to 'src/burn/test/BurnUnitTest/VariableTest.cpp')
-rw-r--r--src/burn/test/BurnUnitTest/VariableTest.cpp532
1 files changed, 532 insertions, 0 deletions
diff --git a/src/burn/test/BurnUnitTest/VariableTest.cpp b/src/burn/test/BurnUnitTest/VariableTest.cpp
new file mode 100644
index 00000000..5c9dce03
--- /dev/null
+++ b/src/burn/test/BurnUnitTest/VariableTest.cpp
@@ -0,0 +1,532 @@
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
7namespace Microsoft
8{
9namespace Tools
10{
11namespace WindowsInstallerXml
12{
13namespace Test
14{
15namespace 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 finally
125 {
126 ReleaseObject(pixeBundle);
127 VariablesUninitialize(&variables);
128 }
129 }
130
131 [Fact]
132 void VariablesFormatTest()
133 {
134 HRESULT hr = S_OK;
135 BURN_VARIABLES variables = { };
136 LPWSTR scz = NULL;
137 SIZE_T cch = 0;
138 BOOL fContainsHiddenData = FALSE;
139 try
140 {
141 hr = VariableInitialize(&variables);
142 TestThrowOnFailure(hr, L"Failed to initialize variables.");
143
144 // set variables
145 VariableSetStringHelper(&variables, L"PROP1", L"VAL1", FALSE);
146 VariableSetStringHelper(&variables, L"PROP2", L"VAL2", FALSE);
147 VariableSetNumericHelper(&variables, L"PROP3", 3);
148 VariableSetStringHelper(&variables, L"PROP4", L"[PROP1]", FALSE);
149 VariableSetStringHelper(&variables, L"PROP5", L"[PROP2]", FALSE);
150 VariableSetStringHelper(&variables, L"PROP6", L"[PROP4]", TRUE);
151 VariableSetStringHelper(&variables, L"PROP7", L"[PROP5]", TRUE);
152
153 // test string formatting
154 Assert::Equal<String^>(gcnew String(L"NOPROP"), VariableFormatStringHelper(&variables, L"NOPROP"));
155 Assert::Equal<String^>(gcnew String(L"VAL1"), VariableFormatStringHelper(&variables, L"[PROP1]"));
156 Assert::Equal<String^>(gcnew String(L" VAL1 "), VariableFormatStringHelper(&variables, L" [PROP1] "));
157 Assert::Equal<String^>(gcnew String(L"PRE VAL1"), VariableFormatStringHelper(&variables, L"PRE [PROP1]"));
158 Assert::Equal<String^>(gcnew String(L"VAL1 POST"), VariableFormatStringHelper(&variables, L"[PROP1] POST"));
159 Assert::Equal<String^>(gcnew String(L"PRE VAL1 POST"), VariableFormatStringHelper(&variables, L"PRE [PROP1] POST"));
160 Assert::Equal<String^>(gcnew String(L"VAL1 MID VAL2"), VariableFormatStringHelper(&variables, L"[PROP1] MID [PROP2]"));
161 Assert::Equal<String^>(gcnew String(L""), VariableFormatStringHelper(&variables, L"[NONE]"));
162 Assert::Equal<String^>(gcnew String(L""), VariableFormatStringHelper(&variables, L"[prop1]"));
163 Assert::Equal<String^>(gcnew String(L"["), VariableFormatStringHelper(&variables, L"[\\[]"));
164 Assert::Equal<String^>(gcnew String(L"]"), VariableFormatStringHelper(&variables, L"[\\]]"));
165 Assert::Equal<String^>(gcnew String(L"[]"), VariableFormatStringHelper(&variables, L"[]"));
166 Assert::Equal<String^>(gcnew String(L"[NONE"), VariableFormatStringHelper(&variables, L"[NONE"));
167 Assert::Equal<String^>(gcnew String(L"VAL2"), VariableGetFormattedHelper(&variables, L"PROP2", &fContainsHiddenData));
168 Assert::Equal<BOOL>(FALSE, fContainsHiddenData);
169 Assert::Equal<String^>(gcnew String(L"3"), VariableGetFormattedHelper(&variables, L"PROP3", &fContainsHiddenData));
170 Assert::Equal<BOOL>(FALSE, fContainsHiddenData);
171 Assert::Equal<String^>(gcnew String(L"[PROP1]"), VariableGetFormattedHelper(&variables, L"PROP4", &fContainsHiddenData));
172 Assert::Equal<BOOL>(FALSE, fContainsHiddenData);
173 Assert::Equal<String^>(gcnew String(L"[PROP2]"), VariableGetFormattedHelper(&variables, L"PROP5", &fContainsHiddenData));
174 Assert::Equal<BOOL>(FALSE, fContainsHiddenData);
175 Assert::Equal<String^>(gcnew String(L"[PROP1]"), VariableGetFormattedHelper(&variables, L"PROP6", &fContainsHiddenData));
176 Assert::Equal<BOOL>(FALSE, fContainsHiddenData);
177 Assert::Equal<String^>(gcnew String(L"[PROP2]"), VariableGetFormattedHelper(&variables, L"PROP7", &fContainsHiddenData));
178 Assert::Equal<BOOL>(FALSE, fContainsHiddenData);
179
180 hr = VariableFormatString(&variables, L"PRE [PROP1] POST", &scz, &cch);
181 TestThrowOnFailure(hr, L"Failed to format string");
182
183 Assert::Equal((SIZE_T)lstrlenW(scz), cch);
184
185 hr = VariableFormatString(&variables, L"PRE [PROP1] POST", NULL, &cch);
186 TestThrowOnFailure(hr, L"Failed to format string");
187
188 Assert::Equal((SIZE_T)lstrlenW(scz), cch);
189 }
190 finally
191 {
192 VariablesUninitialize(&variables);
193 ReleaseStr(scz);
194 }
195 }
196
197 [Fact]
198 void VariablesEscapeTest()
199 {
200 // test string escaping
201 Assert::Equal<String^>(gcnew String(L"[\\[]"), VariableEscapeStringHelper(L"["));
202 Assert::Equal<String^>(gcnew String(L"[\\]]"), VariableEscapeStringHelper(L"]"));
203 Assert::Equal<String^>(gcnew String(L" [\\[]TEXT[\\]] "), VariableEscapeStringHelper(L" [TEXT] "));
204 }
205
206 [Fact]
207 void VariablesConditionTest()
208 {
209 HRESULT hr = S_OK;
210 BURN_VARIABLES variables = { };
211 try
212 {
213 hr = VariableInitialize(&variables);
214 TestThrowOnFailure(hr, L"Failed to initialize variables.");
215
216 // set variables
217 VariableSetStringHelper(&variables, L"PROP1", L"VAL1", FALSE);
218 VariableSetStringHelper(&variables, L"PROP2", L"VAL2", FALSE);
219 VariableSetStringHelper(&variables, L"PROP3", L"VAL3", FALSE);
220 VariableSetStringHelper(&variables, L"PROP4", L"BEGIN MID END", FALSE);
221 VariableSetNumericHelper(&variables, L"PROP5", 5);
222 VariableSetNumericHelper(&variables, L"PROP6", 6);
223 VariableSetStringHelper(&variables, L"PROP7", L"", FALSE);
224 VariableSetNumericHelper(&variables, L"PROP8", 0);
225 VariableSetStringHelper(&variables, L"_PROP9", L"VAL9", FALSE);
226 VariableSetNumericHelper(&variables, L"PROP10", -10);
227 VariableSetNumericHelper(&variables, L"PROP11", 9223372036854775807ll);
228 VariableSetNumericHelper(&variables, L"PROP12", -9223372036854775808ll);
229 VariableSetNumericHelper(&variables, L"PROP13", 0x00010000);
230 VariableSetNumericHelper(&variables, L"PROP14", 0x00000001);
231 VariableSetNumericHelper(&variables, L"PROP15", 0x00010001);
232 VariableSetVersionHelper(&variables, L"PROP16", L"0.0.0.0");
233 VariableSetVersionHelper(&variables, L"PROP17", L"1.0.0.0");
234 VariableSetVersionHelper(&variables, L"PROP18", L"1.1.0.0");
235 VariableSetVersionHelper(&variables, L"PROP19", L"1.1.1.0");
236 VariableSetVersionHelper(&variables, L"PROP20", L"1.1.1.1");
237 VariableSetNumericHelper(&variables, L"vPROP21", 1);
238 VariableSetVersionHelper(&variables, L"PROP22", L"65535.65535.65535.65535");
239 VariableSetStringHelper(&variables, L"PROP23", L"1.1.1", FALSE);
240 VariableSetStringHelper(&variables, L"PROP24", L"[PROP1]", TRUE);
241 VariableSetStringHelper(&variables, L"PROP25", L"[PROP7]", TRUE);
242 VariableSetStringHelper(&variables, L"PROP26", L"[PROP8]", TRUE);
243 VariableSetStringHelper(&variables, L"PROP27", L"[PROP16]", TRUE);
244
245 // test conditions
246 Assert::True(EvaluateConditionHelper(&variables, L"PROP1"));
247 Assert::True(EvaluateConditionHelper(&variables, L"PROP5"));
248 Assert::False(EvaluateConditionHelper(&variables, L"PROP7"));
249 Assert::False(EvaluateConditionHelper(&variables, L"PROP8"));
250 Assert::True(EvaluateConditionHelper(&variables, L"_PROP9"));
251 Assert::True(EvaluateConditionHelper(&variables, L"PROP16"));
252 Assert::True(EvaluateConditionHelper(&variables, L"PROP17"));
253 Assert::True(EvaluateConditionHelper(&variables, L"PROP24=\"VAL1\""));
254 Assert::False(EvaluateConditionHelper(&variables, L"PROP25"));
255 Assert::True(EvaluateConditionHelper(&variables, L"PROP26"));
256 Assert::True(EvaluateConditionHelper(&variables, L"PROP27"));
257
258 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 = \"VAL1\""));
259 Assert::False(EvaluateConditionHelper(&variables, L"NONE = \"NOT\""));
260 Assert::False(EvaluateConditionHelper(&variables, L"PROP1 <> \"VAL1\""));
261 Assert::False(EvaluateConditionHelper(&variables, L"PROP1 ~<> \"VAL1\""));
262 Assert::False(EvaluateConditionHelper(&variables, L"PROP1 ~<> \"Val1\""));
263 Assert::True(EvaluateConditionHelper(&variables, L"NONE <> \"NOT\""));
264 Assert::True(EvaluateConditionHelper(&variables, L"NONE ~<> \"NOT\""));
265
266 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 ~= \"val1\""));
267 Assert::False(EvaluateConditionHelper(&variables, L"PROP1 = \"val1\""));
268 Assert::False(EvaluateConditionHelper(&variables, L"PROP1 ~<> \"val1\""));
269 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 <> \"val1\""));
270
271 Assert::True(EvaluateConditionHelper(&variables, L"PROP5 = 5"));
272 Assert::False(EvaluateConditionHelper(&variables, L"PROP5 = 0"));
273 Assert::False(EvaluateConditionHelper(&variables, L"PROP5 <> 5"));
274 Assert::True(EvaluateConditionHelper(&variables, L"PROP5 <> 0"));
275
276 Assert::True(EvaluateConditionHelper(&variables, L"PROP10 = -10"));
277 Assert::False(EvaluateConditionHelper(&variables, L"PROP10 <> -10"));
278
279 Assert::True(EvaluateConditionHelper(&variables, L"PROP17 = v1"));
280 Assert::False(EvaluateConditionHelper(&variables, L"PROP17 = v0"));
281 Assert::False(EvaluateConditionHelper(&variables, L"PROP17 <> v1"));
282 Assert::True(EvaluateConditionHelper(&variables, L"PROP17 <> v0"));
283
284 Assert::True(EvaluateConditionHelper(&variables, L"PROP16 = v0"));
285 Assert::True(EvaluateConditionHelper(&variables, L"PROP17 = v1"));
286 Assert::True(EvaluateConditionHelper(&variables, L"PROP18 = v1.1"));
287 Assert::True(EvaluateConditionHelper(&variables, L"PROP19 = v1.1.1"));
288 Assert::True(EvaluateConditionHelper(&variables, L"PROP20 = v1.1.1.1"));
289 Assert::True(EvaluateConditionHelper(&variables, L"PROP20 > v1.1.1.1.0"));
290 Assert::True(EvaluateConditionHelper(&variables, L"PROP20 > v1.1.1.1.1"));
291 Assert::True(EvaluateConditionHelper(&variables, L"vPROP21 = 1"));
292 Assert::True(EvaluateConditionHelper(&variables, L"PROP23 = v1.1.1"));
293 Assert::True(EvaluateConditionHelper(&variables, L"v1.1.1 = PROP23"));
294 Assert::False(EvaluateConditionHelper(&variables, L"v1.1.1<>PROP23"));
295 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 <> v1.1.1"));
296 Assert::True(EvaluateConditionHelper(&variables, L"v1.1.1 <> PROP1"));
297
298 Assert::False(EvaluateConditionHelper(&variables, L"PROP11 = 9223372036854775806"));
299 Assert::True(EvaluateConditionHelper(&variables, L"PROP11 = 9223372036854775807"));
300 Assert::True(EvaluateFailureConditionHelper(&variables, L"PROP11 = 9223372036854775808"));
301 Assert::True(EvaluateFailureConditionHelper(&variables, L"PROP11 = 92233720368547758070000"));
302
303 Assert::False(EvaluateConditionHelper(&variables, L"PROP12 = -9223372036854775807"));
304 Assert::True(EvaluateConditionHelper(&variables, L"PROP12 = -9223372036854775808"));
305 Assert::True(EvaluateFailureConditionHelper(&variables, L"PROP12 = -9223372036854775809"));
306 Assert::True(EvaluateFailureConditionHelper(&variables, L"PROP12 = -92233720368547758080000"));
307
308 Assert::True(EvaluateConditionHelper(&variables, L"PROP22 = v65535.65535.65535.65535"));
309 Assert::True(EvaluateConditionHelper(&variables, L"PROP22 < v65536.65535.65535.65535"));
310 Assert::True(EvaluateConditionHelper(&variables, L"PROP22 < v65535.655350000.65535.65535"));
311
312 Assert::True(EvaluateConditionHelper(&variables, L"PROP5 < 6"));
313 Assert::False(EvaluateConditionHelper(&variables, L"PROP5 < 5"));
314 Assert::True(EvaluateConditionHelper(&variables, L"PROP5 > 4"));
315 Assert::False(EvaluateConditionHelper(&variables, L"PROP5 > 5"));
316 Assert::True(EvaluateConditionHelper(&variables, L"PROP5 <= 6"));
317 Assert::True(EvaluateConditionHelper(&variables, L"PROP5 <= 5"));
318 Assert::False(EvaluateConditionHelper(&variables, L"PROP5 <= 4"));
319 Assert::True(EvaluateConditionHelper(&variables, L"PROP5 >= 4"));
320 Assert::True(EvaluateConditionHelper(&variables, L"PROP5 >= 5"));
321 Assert::False(EvaluateConditionHelper(&variables, L"PROP5 >= 6"));
322
323 Assert::True(EvaluateConditionHelper(&variables, L"PROP4 << \"BEGIN\""));
324 Assert::False(EvaluateConditionHelper(&variables, L"PROP4 << \"END\""));
325 Assert::True(EvaluateConditionHelper(&variables, L"PROP4 >> \"END\""));
326 Assert::False(EvaluateConditionHelper(&variables, L"PROP4 >> \"BEGIN\""));
327 Assert::True(EvaluateConditionHelper(&variables, L"PROP4 >< \"MID\""));
328 Assert::False(EvaluateConditionHelper(&variables, L"PROP4 >< \"NONE\""));
329
330 Assert::True(EvaluateConditionHelper(&variables, L"PROP16 < v1.1"));
331 Assert::False(EvaluateConditionHelper(&variables, L"PROP16 < v0"));
332 Assert::True(EvaluateConditionHelper(&variables, L"PROP17 > v0.12"));
333 Assert::False(EvaluateConditionHelper(&variables, L"PROP17 > v1"));
334 Assert::True(EvaluateConditionHelper(&variables, L"PROP18 >= v1.0"));
335 Assert::True(EvaluateConditionHelper(&variables, L"PROP18 >= v1.1"));
336 Assert::False(EvaluateConditionHelper(&variables, L"PROP18 >= v2.1"));
337 Assert::True(EvaluateConditionHelper(&variables, L"PROP19 <= v1.1234.1"));
338 Assert::True(EvaluateConditionHelper(&variables, L"PROP19 <= v1.1.1"));
339 Assert::False(EvaluateConditionHelper(&variables, L"PROP19 <= v1.0.123"));
340
341 Assert::True(EvaluateConditionHelper(&variables, L"PROP6 = \"6\""));
342 Assert::True(EvaluateConditionHelper(&variables, L"\"6\" = PROP6"));
343 Assert::False(EvaluateConditionHelper(&variables, L"PROP6 = \"ABC\""));
344 Assert::False(EvaluateConditionHelper(&variables, L"\"ABC\" = PROP6"));
345 Assert::False(EvaluateConditionHelper(&variables, L"\"ABC\" = PROP6"));
346
347 Assert::True(EvaluateConditionHelper(&variables, L"PROP13 << 1"));
348 Assert::False(EvaluateConditionHelper(&variables, L"PROP13 << 0"));
349 Assert::True(EvaluateConditionHelper(&variables, L"PROP14 >> 1"));
350 Assert::False(EvaluateConditionHelper(&variables, L"PROP14 >> 0"));
351 Assert::True(EvaluateConditionHelper(&variables, L"PROP15 >< 65537"));
352 Assert::False(EvaluateConditionHelper(&variables, L"PROP15 >< 0"));
353
354 Assert::False(EvaluateConditionHelper(&variables, L"NOT PROP1"));
355 Assert::True(EvaluateConditionHelper(&variables, L"NOT (PROP1 <> \"VAL1\")"));
356
357 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 = \"VAL1\" AND PROP2 = \"VAL2\""));
358 Assert::False(EvaluateConditionHelper(&variables, L"PROP1 = \"VAL1\" AND PROP2 = \"NOT\""));
359 Assert::False(EvaluateConditionHelper(&variables, L"PROP1 = \"NOT\" AND PROP2 = \"VAL2\""));
360 Assert::False(EvaluateConditionHelper(&variables, L"PROP1 = \"NOT\" AND PROP2 = \"NOT\""));
361
362 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 = \"VAL1\" OR PROP2 = \"VAL2\""));
363 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 = \"VAL1\" OR PROP2 = \"NOT\""));
364 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 = \"NOT\" OR PROP2 = \"VAL2\""));
365 Assert::False(EvaluateConditionHelper(&variables, L"PROP1 = \"NOT\" OR PROP2 = \"NOT\""));
366
367 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 = \"VAL1\" AND PROP2 = \"VAL2\" OR PROP3 = \"NOT\""));
368 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 = \"VAL1\" AND PROP2 = \"NOT\" OR PROP3 = \"VAL3\""));
369 Assert::False(EvaluateConditionHelper(&variables, L"PROP1 = \"VAL1\" AND PROP2 = \"NOT\" OR PROP3 = \"NOT\""));
370 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 = \"VAL1\" AND (PROP2 = \"NOT\" OR PROP3 = \"VAL3\")"));
371 Assert::True(EvaluateConditionHelper(&variables, L"(PROP1 = \"VAL1\" AND PROP2 = \"VAL2\") OR PROP3 = \"NOT\""));
372
373 Assert::True(EvaluateConditionHelper(&variables, L"PROP3 = \"NOT\" OR PROP1 = \"VAL1\" AND PROP2 = \"VAL2\""));
374 Assert::True(EvaluateConditionHelper(&variables, L"PROP3 = \"VAL3\" OR PROP1 = \"VAL1\" AND PROP2 = \"NOT\""));
375 Assert::False(EvaluateConditionHelper(&variables, L"PROP3 = \"NOT\" OR PROP1 = \"VAL1\" AND PROP2 = \"NOT\""));
376 Assert::True(EvaluateConditionHelper(&variables, L"(PROP3 = \"NOT\" OR PROP1 = \"VAL1\") AND PROP2 = \"VAL2\""));
377 Assert::True(EvaluateConditionHelper(&variables, L"PROP3 = \"NOT\" OR (PROP1 = \"VAL1\" AND PROP2 = \"VAL2\")"));
378
379 Assert::True(EvaluateFailureConditionHelper(&variables, L"="));
380 Assert::True(EvaluateFailureConditionHelper(&variables, L"(PROP1"));
381 Assert::True(EvaluateFailureConditionHelper(&variables, L"(PROP1 = \""));
382 Assert::True(EvaluateFailureConditionHelper(&variables, L"1A"));
383 Assert::True(EvaluateFailureConditionHelper(&variables, L"*"));
384
385 Assert::True(EvaluateFailureConditionHelper(&variables, L"1 == 1"));
386 }
387 finally
388 {
389 VariablesUninitialize(&variables);
390 }
391 }
392
393 [Fact]
394 void VariablesSerializationTest()
395 {
396 HRESULT hr = S_OK;
397 BYTE* pbBuffer = NULL;
398 SIZE_T cbBuffer = 0;
399 SIZE_T iBuffer = 0;
400 BURN_VARIABLES variables1 = { };
401 BURN_VARIABLES variables2 = { };
402 try
403 {
404 // serialize
405 hr = VariableInitialize(&variables1);
406 TestThrowOnFailure(hr, L"Failed to initialize variables.");
407
408 VariableSetStringHelper(&variables1, L"PROP1", L"VAL1", FALSE);
409 VariableSetNumericHelper(&variables1, L"PROP2", 2);
410 VariableSetVersionHelper(&variables1, L"PROP3", L"1.1.1.1");
411 VariableSetStringHelper(&variables1, L"PROP4", L"VAL4", FALSE);
412 VariableSetStringHelper(&variables1, L"PROP5", L"[PROP1]", TRUE);
413
414 hr = VariableSerialize(&variables1, FALSE, &pbBuffer, &cbBuffer);
415 TestThrowOnFailure(hr, L"Failed to serialize variables.");
416
417 // deserialize
418 hr = VariableInitialize(&variables2);
419 TestThrowOnFailure(hr, L"Failed to initialize variables.");
420
421 hr = VariableDeserialize(&variables2, FALSE, pbBuffer, cbBuffer, &iBuffer);
422 TestThrowOnFailure(hr, L"Failed to deserialize variables.");
423
424 Assert::Equal<String^>(gcnew String(L"VAL1"), VariableGetStringHelper(&variables2, L"PROP1"));
425 Assert::Equal(2ll, VariableGetNumericHelper(&variables2, L"PROP2"));
426 Assert::Equal<String^>(gcnew String(L"1.1.1.1"), VariableGetVersionHelper(&variables2, L"PROP3"));
427 Assert::Equal<String^>(gcnew String(L"VAL4"), VariableGetStringHelper(&variables2, L"PROP4"));
428 Assert::Equal<String^>(gcnew String(L"[PROP1]"), VariableGetStringHelper(&variables2, L"PROP5"));
429
430 Assert::Equal((int)BURN_VARIANT_TYPE_STRING, VariableGetTypeHelper(&variables2, L"PROP1"));
431 Assert::Equal((int)BURN_VARIANT_TYPE_NUMERIC, VariableGetTypeHelper(&variables2, L"PROP2"));
432 Assert::Equal((int)BURN_VARIANT_TYPE_VERSION, VariableGetTypeHelper(&variables2, L"PROP3"));
433 Assert::Equal((int)BURN_VARIANT_TYPE_STRING, VariableGetTypeHelper(&variables2, L"PROP4"));
434 Assert::Equal((int)BURN_VARIANT_TYPE_FORMATTED, VariableGetTypeHelper(&variables2, L"PROP5"));
435 }
436 finally
437 {
438 ReleaseBuffer(pbBuffer);
439 VariablesUninitialize(&variables1);
440 VariablesUninitialize(&variables2);
441 }
442 }
443
444 [Fact]
445 void VariablesBuiltInTest()
446 {
447 HRESULT hr = S_OK;
448 BURN_VARIABLES variables = { };
449 try
450 {
451 hr = VariableInitialize(&variables);
452 TestThrowOnFailure(hr, L"Failed to initialize variables.");
453
454 // VersionMsi
455 Assert::True(EvaluateConditionHelper(&variables, L"VersionMsi >= v1.1"));
456
457 // VersionNT
458 Assert::True(EvaluateConditionHelper(&variables, L"VersionNT <> v0.0.0.0"));
459
460 // VersionNT64
461 if (nullptr == Environment::GetEnvironmentVariable("ProgramFiles(x86)"))
462 {
463 Assert::False(EvaluateConditionHelper(&variables, L"VersionNT64"));
464 }
465 else
466 {
467 Assert::True(EvaluateConditionHelper(&variables, L"VersionNT64"));
468 }
469
470 // attempt to set a built-in property
471 hr = VariableSetString(&variables, L"VersionNT", L"VAL", FALSE, FALSE);
472 Assert::Equal(E_INVALIDARG, hr);
473 Assert::False(EvaluateConditionHelper(&variables, L"VersionNT = \"VAL\""));
474
475 VariableGetNumericHelper(&variables, L"NTProductType");
476 VariableGetNumericHelper(&variables, L"NTSuiteBackOffice");
477 VariableGetNumericHelper(&variables, L"NTSuiteDataCenter");
478 VariableGetNumericHelper(&variables, L"NTSuiteEnterprise");
479 VariableGetNumericHelper(&variables, L"NTSuitePersonal");
480 VariableGetNumericHelper(&variables, L"NTSuiteSmallBusiness");
481 VariableGetNumericHelper(&variables, L"NTSuiteSmallBusinessRestricted");
482 VariableGetNumericHelper(&variables, L"NTSuiteWebServer");
483 VariableGetNumericHelper(&variables, L"CompatibilityMode");
484 VariableGetNumericHelper(&variables, L"Privileged");
485 VariableGetNumericHelper(&variables, L"SystemLanguageID");
486 VariableGetNumericHelper(&variables, L"TerminalServer");
487 VariableGetNumericHelper(&variables, L"UserUILanguageID");
488 VariableGetNumericHelper(&variables, L"UserLanguageID");
489
490 // known folders
491 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::ApplicationData) + "\\", VariableGetStringHelper(&variables, L"AppDataFolder"));
492 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::CommonApplicationData) + "\\", VariableGetStringHelper(&variables, L"CommonAppDataFolder"));
493
494 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::ProgramFiles) + "\\", VariableGetStringHelper(&variables, L"ProgramFilesFolder"));
495 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::DesktopDirectory) + "\\", VariableGetStringHelper(&variables, L"DesktopFolder"));
496 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::Favorites) + "\\", VariableGetStringHelper(&variables, L"FavoritesFolder"));
497 VariableGetStringHelper(&variables, L"FontsFolder");
498 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::LocalApplicationData) + "\\", VariableGetStringHelper(&variables, L"LocalAppDataFolder"));
499 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::Personal) + "\\", VariableGetStringHelper(&variables, L"PersonalFolder"));
500 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::Programs) + "\\", VariableGetStringHelper(&variables, L"ProgramMenuFolder"));
501 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::SendTo) + "\\", VariableGetStringHelper(&variables, L"SendToFolder"));
502 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::StartMenu) + "\\", VariableGetStringHelper(&variables, L"StartMenuFolder"));
503 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::Startup) + "\\", VariableGetStringHelper(&variables, L"StartupFolder"));
504 VariableGetStringHelper(&variables, L"SystemFolder");
505 VariableGetStringHelper(&variables, L"WindowsFolder");
506 VariableGetStringHelper(&variables, L"WindowsVolume");
507
508 Assert::Equal<String^>(System::IO::Path::GetTempPath(), System::IO::Path::GetFullPath(VariableGetStringHelper(&variables, L"TempFolder")));
509
510 VariableGetStringHelper(&variables, L"AdminToolsFolder");
511 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::CommonProgramFiles) + "\\", VariableGetStringHelper(&variables, L"CommonFilesFolder"));
512 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::MyPictures) + "\\", VariableGetStringHelper(&variables, L"MyPicturesFolder"));
513 Assert::Equal<String^>(Environment::GetFolderPath(Environment::SpecialFolder::Templates) + "\\", VariableGetStringHelper(&variables, L"TemplateFolder"));
514
515 if (Environment::Is64BitOperatingSystem)
516 {
517 VariableGetStringHelper(&variables, L"ProgramFiles64Folder");
518 VariableGetStringHelper(&variables, L"CommonFiles64Folder");
519 VariableGetStringHelper(&variables, L"System64Folder");
520 }
521 }
522 finally
523 {
524 VariablesUninitialize(&variables);
525 }
526 }
527 };
528}
529}
530}
531}
532}