aboutsummaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2020-07-31 17:06:35 -0600
committerSean Hall <r.sean.hall@gmail.com>2020-08-09 10:33:49 -0600
commitd21eed76c48960707561c45c492c10a6a23c052e (patch)
treeebab09d099a699a24801fcfb4d7152cf82cc4a06 /src/test
parentad80d6dc10f9bd6cb6a084857a8fb546cc55e756 (diff)
downloadwix-d21eed76c48960707561c45c492c10a6a23c052e.tar.gz
wix-d21eed76c48960707561c45c492c10a6a23c052e.tar.bz2
wix-d21eed76c48960707561c45c492c10a6a23c052e.zip
WIXFEAT:4763 Change "string" variable type to literal and add "formatted".
Diffstat (limited to 'src/test')
-rw-r--r--src/test/BurnUnitTest/SearchTest.cpp87
-rw-r--r--src/test/BurnUnitTest/VariableHelpers.cpp4
-rw-r--r--src/test/BurnUnitTest/VariableHelpers.h2
-rw-r--r--src/test/BurnUnitTest/VariableTest.cpp69
-rw-r--r--src/test/BurnUnitTest/VariantTest.cpp56
5 files changed, 181 insertions, 37 deletions
diff --git a/src/test/BurnUnitTest/SearchTest.cpp b/src/test/BurnUnitTest/SearchTest.cpp
index 48ab60aa..32107d87 100644
--- a/src/test/BurnUnitTest/SearchTest.cpp
+++ b/src/test/BurnUnitTest/SearchTest.cpp
@@ -66,8 +66,8 @@ namespace Bootstrapper
66 pin_ptr<const WCHAR> wzDirectory1 = PtrToStringChars(this->TestContext->TestDirectory); 66 pin_ptr<const WCHAR> wzDirectory1 = PtrToStringChars(this->TestContext->TestDirectory);
67 pin_ptr<const WCHAR> wzDirectory2 = PtrToStringChars(System::IO::Path::Combine(this->TestContext->TestDirectory, gcnew String(L"none"))); 67 pin_ptr<const WCHAR> wzDirectory2 = PtrToStringChars(System::IO::Path::Combine(this->TestContext->TestDirectory, gcnew String(L"none")));
68 68
69 VariableSetStringHelper(&variables, L"Directory1", wzDirectory1); 69 VariableSetStringHelper(&variables, L"Directory1", wzDirectory1, FALSE);
70 VariableSetStringHelper(&variables, L"Directory2", wzDirectory2); 70 VariableSetStringHelper(&variables, L"Directory2", wzDirectory2, FALSE);
71 71
72 LPCWSTR wzDocument = 72 LPCWSTR wzDocument =
73 L"<Bundle>" 73 L"<Bundle>"
@@ -117,8 +117,8 @@ namespace Bootstrapper
117 hr = FileVersion(wzFile2, &uliVersion.HighPart, &uliVersion.LowPart); 117 hr = FileVersion(wzFile2, &uliVersion.HighPart, &uliVersion.LowPart);
118 TestThrowOnFailure(hr, L"Failed to get DLL version."); 118 TestThrowOnFailure(hr, L"Failed to get DLL version.");
119 119
120 VariableSetStringHelper(&variables, L"File1", wzFile1); 120 VariableSetStringHelper(&variables, L"File1", wzFile1, FALSE);
121 VariableSetStringHelper(&variables, L"File2", wzFile2); 121 VariableSetStringHelper(&variables, L"File2", wzFile2, FALSE);
122 122
123 LPCWSTR wzDocument = 123 LPCWSTR wzDocument =
124 L"<Bundle>" 124 L"<Bundle>"
@@ -191,8 +191,8 @@ namespace Bootstrapper
191 Assert::True(SUCCEEDED(hr)); 191 Assert::True(SUCCEEDED(hr));
192 } 192 }
193 193
194 VariableSetStringHelper(&variables, L"MyKey", L"SOFTWARE\\Microsoft\\WiX_Burn_UnitTest\\Value"); 194 VariableSetStringHelper(&variables, L"MyKey", L"SOFTWARE\\Microsoft\\WiX_Burn_UnitTest\\Value", FALSE);
195 VariableSetStringHelper(&variables, L"MyValue", L"String"); 195 VariableSetStringHelper(&variables, L"MyValue", L"String", FALSE);
196 196
197 LPCWSTR wzDocument = 197 LPCWSTR wzDocument =
198 L"<Bundle>" 198 L"<Bundle>"
@@ -219,8 +219,9 @@ namespace Bootstrapper
219 L" <RegistrySearch Id='Search21' Type='value' Root='HKCU' Key='SOFTWARE\\Classes\\CLSID\\WiX_Burn_UnitTest\\Bitness' Value='TestStringSpecificToBitness' Variable='Variable21' VariableType='string' Win64='no' />" 219 L" <RegistrySearch Id='Search21' Type='value' Root='HKCU' Key='SOFTWARE\\Classes\\CLSID\\WiX_Burn_UnitTest\\Bitness' Value='TestStringSpecificToBitness' Variable='Variable21' VariableType='string' Win64='no' />"
220 L" <RegistrySearch Id='Search22' Type='value' Root='HKCU' Key='SOFTWARE\\Classes\\CLSID\\WiX_Burn_UnitTest\\Bitness' Value='TestStringSpecificToBitness' Variable='Variable22' VariableType='string' Win64='yes' />" 220 L" <RegistrySearch Id='Search22' Type='value' Root='HKCU' Key='SOFTWARE\\Classes\\CLSID\\WiX_Burn_UnitTest\\Bitness' Value='TestStringSpecificToBitness' Variable='Variable22' VariableType='string' Win64='yes' />"
221 L" <RegistrySearch Id='Search23' Type='exists' Root='HKU' Key='.DEFAULT\\Environment' Variable='Variable23' />" 221 L" <RegistrySearch Id='Search23' Type='exists' Root='HKU' Key='.DEFAULT\\Environment' Variable='Variable23' />"
222 L" <RegistrySearch Id='Search23' Type='exists' Root='HKU' Key='.DEFAULT\\System\\NetworkServiceSidSubkeyDoesNotExist' Variable='Variable24' />" 222 L" <RegistrySearch Id='Search24' Type='exists' Root='HKU' Key='.DEFAULT\\System\\NetworkServiceSidSubkeyDoesNotExist' Variable='Variable24' />"
223 L" <RegistrySearch Id='Search24' Type='value' Root='HKCR' Key='.msi' Variable='Variable25' VariableType='string' />" 223 L" <RegistrySearch Id='Search25' Type='value' Root='HKCR' Key='.msi' Variable='Variable25' VariableType='string' />"
224 L" <RegistrySearch Id='Search26' Type='value' Root='HKCR' Key='.msi' Variable='Variable26' VariableType='formatted' />"
224 L"</Bundle>"; 225 L"</Bundle>";
225 226
226 // load XML document 227 // load XML document
@@ -263,6 +264,7 @@ namespace Bootstrapper
263 Assert::Equal(1ll, VariableGetNumericHelper(&variables, L"Variable23")); 264 Assert::Equal(1ll, VariableGetNumericHelper(&variables, L"Variable23"));
264 Assert::Equal(0ll, VariableGetNumericHelper(&variables, L"Variable24")); 265 Assert::Equal(0ll, VariableGetNumericHelper(&variables, L"Variable24"));
265 Assert::Equal<String^>(gcnew String(L"Msi.Package"), VariableGetStringHelper(&variables, L"Variable25")); 266 Assert::Equal<String^>(gcnew String(L"Msi.Package"), VariableGetStringHelper(&variables, L"Variable25"));
267 Assert::Equal<String^>(gcnew String(L"Msi.Package"), VariableGetStringHelper(&variables, L"Variable26"));
266 } 268 }
267 finally 269 finally
268 { 270 {
@@ -525,6 +527,75 @@ namespace Bootstrapper
525 SearchesUninitialize(&searches); 527 SearchesUninitialize(&searches);
526 } 528 }
527 } 529 }
530
531 [Fact]
532 void SetVariableSearchTest()
533 {
534 HRESULT hr = S_OK;
535 IXMLDOMElement* pixeBundle = NULL;
536 BURN_VARIABLES variables = { };
537 BURN_SEARCHES searches = { };
538 BURN_EXTENSIONS burnExtensions = { };
539 try
540 {
541 LPCWSTR wzDocument =
542 L"<Bundle>"
543 L" <SetVariable Id='Search1' Type='string' Value='VAL1' Variable='PROP1' />"
544 L" <SetVariable Id='Search2' Type='numeric' Value='2' Variable='PROP2' />"
545 L" <SetVariable Id='Search3' Type='string' Value='VAL3' Variable='PROP3' />"
546 L" <SetVariable Id='Search4' Type='string' Value='VAL4' Variable='PROP4' />"
547 L" <SetVariable Id='Search5' Type='string' Value='VAL5' Variable='PROP5' />"
548 L" <SetVariable Id='Search6' Type='string' Value='VAL6' Variable='PROP6' />"
549 L" <SetVariable Id='Search7' Type='string' Value='7' Variable='PROP7' />"
550 L" <SetVariable Id='Search8' Type='version' Value='1.1.0.0' Variable='PROP8' />"
551 L" <SetVariable Id='Search9' Type='formatted' Value='[VAL9]' Variable='PROP9' />"
552 L" <SetVariable Id='Search10' Type='numeric' Value='42' Variable='OVERWRITTEN_STRING' />"
553 L" <SetVariable Id='Search11' Type='string' Value='NEW' Variable='OVERWRITTEN_NUMBER' />"
554 L" <SetVariable Id='Search12' Variable='REMOVED_NUMBER' />"
555 L"</Bundle>";
556
557 hr = VariableInitialize(&variables);
558 TestThrowOnFailure(hr, L"Failed to initialize variables.");
559
560 // set variables
561 VariableSetStringHelper(&variables, L"OVERWRITTEN_STRING", L"ORIGINAL", FALSE);
562 VariableSetNumericHelper(&variables, L"OVERWRITTEN_NUMBER", 5);
563 VariableSetNumericHelper(&variables, L"REMOVED_NUMBER", 22);
564
565 // load XML document
566 LoadBundleXmlHelper(wzDocument, &pixeBundle);
567
568 hr = SearchesParseFromXml(&searches, &burnExtensions, pixeBundle);
569 TestThrowOnFailure(hr, L"Failed to parse searches from XML.");
570
571 // execute searches
572 hr = SearchesExecute(&searches, &variables);
573 TestThrowOnFailure(hr, L"Failed to execute searches.");
574
575 // check variable values
576 Assert::Equal<String^>(gcnew String(L"VAL1"), VariableGetStringHelper(&variables, L"PROP1"));
577 Assert::Equal(2ll, VariableGetNumericHelper(&variables, L"PROP2"));
578 Assert::Equal<String^>(gcnew String(L"2"), VariableGetStringHelper(&variables, L"PROP2"));
579 Assert::Equal<String^>(gcnew String(L"VAL3"), VariableGetStringHelper(&variables, L"PROP3"));
580 Assert::Equal<String^>(gcnew String(L"VAL4"), VariableGetStringHelper(&variables, L"PROP4"));
581 Assert::Equal<String^>(gcnew String(L"VAL5"), VariableGetStringHelper(&variables, L"PROP5"));
582 Assert::Equal<String^>(gcnew String(L"VAL6"), VariableGetStringHelper(&variables, L"PROP6"));
583 Assert::Equal(7ll, VariableGetNumericHelper(&variables, L"PROP7"));
584 Assert::Equal(MAKEQWORDVERSION(1, 1, 0, 0), VariableGetVersionHelper(&variables, L"PROP8"));
585 Assert::Equal<String^>(gcnew String(L"1.1.0.0"), VariableGetStringHelper(&variables, L"PROP8"));
586 Assert::Equal<String^>(gcnew String(L"[VAL9]"), VariableGetStringHelper(&variables, L"PROP9"));
587
588 Assert::Equal(42ll, VariableGetNumericHelper(&variables, L"OVERWRITTEN_STRING"));
589 Assert::Equal<String^>(gcnew String(L"NEW"), VariableGetStringHelper(&variables, L"OVERWRITTEN_NUMBER"));
590 Assert::Equal((int)BURN_VARIANT_TYPE_NONE, VariableGetTypeHelper(&variables, L"REMOVED_NUMBER"));
591 }
592 finally
593 {
594 ReleaseObject(pixeBundle);
595 VariablesUninitialize(&variables);
596 SearchesUninitialize(&searches);
597 }
598 }
528 }; 599 };
529} 600}
530} 601}
diff --git a/src/test/BurnUnitTest/VariableHelpers.cpp b/src/test/BurnUnitTest/VariableHelpers.cpp
index 9ce46a76..fdfb9191 100644
--- a/src/test/BurnUnitTest/VariableHelpers.cpp
+++ b/src/test/BurnUnitTest/VariableHelpers.cpp
@@ -17,11 +17,11 @@ namespace Test
17{ 17{
18namespace Bootstrapper 18namespace Bootstrapper
19{ 19{
20 void VariableSetStringHelper(BURN_VARIABLES* pVariables, LPCWSTR wzVariable, LPCWSTR wzValue) 20 void VariableSetStringHelper(BURN_VARIABLES* pVariables, LPCWSTR wzVariable, LPCWSTR wzValue, BOOL fFormatted)
21 { 21 {
22 HRESULT hr = S_OK; 22 HRESULT hr = S_OK;
23 23
24 hr = VariableSetString(pVariables, wzVariable, wzValue, FALSE); 24 hr = VariableSetString(pVariables, wzVariable, wzValue, FALSE, fFormatted);
25 TestThrowOnFailure2(hr, L"Failed to set %s to: %s", wzVariable, wzValue); 25 TestThrowOnFailure2(hr, L"Failed to set %s to: %s", wzVariable, wzValue);
26 } 26 }
27 27
diff --git a/src/test/BurnUnitTest/VariableHelpers.h b/src/test/BurnUnitTest/VariableHelpers.h
index 98c52649..8c2b081a 100644
--- a/src/test/BurnUnitTest/VariableHelpers.h
+++ b/src/test/BurnUnitTest/VariableHelpers.h
@@ -14,7 +14,7 @@ namespace Bootstrapper
14{ 14{
15 15
16 16
17void VariableSetStringHelper(BURN_VARIABLES* pVariables, LPCWSTR wzVariable, LPCWSTR wzValue); 17void VariableSetStringHelper(BURN_VARIABLES* pVariables, LPCWSTR wzVariable, LPCWSTR wzValue, BOOL fFormatted);
18void VariableSetNumericHelper(BURN_VARIABLES* pVariables, LPCWSTR wzVariable, LONGLONG llValue); 18void VariableSetNumericHelper(BURN_VARIABLES* pVariables, LPCWSTR wzVariable, LONGLONG llValue);
19void VariableSetVersionHelper(BURN_VARIABLES* pVariables, LPCWSTR wzVariable, DWORD64 qwValue); 19void VariableSetVersionHelper(BURN_VARIABLES* pVariables, LPCWSTR wzVariable, DWORD64 qwValue);
20System::String^ VariableGetStringHelper(BURN_VARIABLES* pVariables, LPCWSTR wzVariable); 20System::String^ VariableGetStringHelper(BURN_VARIABLES* pVariables, LPCWSTR wzVariable);
diff --git a/src/test/BurnUnitTest/VariableTest.cpp b/src/test/BurnUnitTest/VariableTest.cpp
index 7d670744..0b49a530 100644
--- a/src/test/BurnUnitTest/VariableTest.cpp
+++ b/src/test/BurnUnitTest/VariableTest.cpp
@@ -35,21 +35,22 @@ namespace Bootstrapper
35 TestThrowOnFailure(hr, L"Failed to initialize variables."); 35 TestThrowOnFailure(hr, L"Failed to initialize variables.");
36 36
37 // set variables 37 // set variables
38 VariableSetStringHelper(&variables, L"PROP1", L"VAL1"); 38 VariableSetStringHelper(&variables, L"PROP1", L"VAL1", FALSE);
39 VariableSetNumericHelper(&variables, L"PROP2", 2); 39 VariableSetNumericHelper(&variables, L"PROP2", 2);
40 VariableSetStringHelper(&variables, L"PROP5", L"VAL5"); 40 VariableSetStringHelper(&variables, L"PROP5", L"VAL5", FALSE);
41 VariableSetStringHelper(&variables, L"PROP3", L"VAL3"); 41 VariableSetStringHelper(&variables, L"PROP3", L"VAL3", FALSE);
42 VariableSetStringHelper(&variables, L"PROP4", L"VAL4"); 42 VariableSetStringHelper(&variables, L"PROP4", L"VAL4", FALSE);
43 VariableSetStringHelper(&variables, L"PROP6", L"VAL6"); 43 VariableSetStringHelper(&variables, L"PROP6", L"VAL6", FALSE);
44 VariableSetStringHelper(&variables, L"PROP7", L"7"); 44 VariableSetStringHelper(&variables, L"PROP7", L"7", FALSE);
45 VariableSetVersionHelper(&variables, L"PROP8", MAKEQWORDVERSION(1,1,0,0)); 45 VariableSetVersionHelper(&variables, L"PROP8", MAKEQWORDVERSION(1,1,0,0));
46 VariableSetStringHelper(&variables, L"PROP9", L"[VAL9]", TRUE);
46 47
47 // set overwritten variables 48 // set overwritten variables
48 VariableSetStringHelper(&variables, L"OVERWRITTEN_STRING", L"ORIGINAL"); 49 VariableSetStringHelper(&variables, L"OVERWRITTEN_STRING", L"ORIGINAL", FALSE);
49 VariableSetNumericHelper(&variables, L"OVERWRITTEN_STRING", 42); 50 VariableSetNumericHelper(&variables, L"OVERWRITTEN_STRING", 42);
50 51
51 VariableSetNumericHelper(&variables, L"OVERWRITTEN_NUMBER", 5); 52 VariableSetNumericHelper(&variables, L"OVERWRITTEN_NUMBER", 5);
52 VariableSetStringHelper(&variables, L"OVERWRITTEN_NUMBER", L"NEW"); 53 VariableSetStringHelper(&variables, L"OVERWRITTEN_NUMBER", L"NEW", FALSE);
53 54
54 // get and verify variable values 55 // get and verify variable values
55 Assert::Equal<String^>(gcnew String(L"VAL1"), VariableGetStringHelper(&variables, L"PROP1")); 56 Assert::Equal<String^>(gcnew String(L"VAL1"), VariableGetStringHelper(&variables, L"PROP1"));
@@ -62,6 +63,7 @@ namespace Bootstrapper
62 Assert::Equal(7ll, VariableGetNumericHelper(&variables, L"PROP7")); 63 Assert::Equal(7ll, VariableGetNumericHelper(&variables, L"PROP7"));
63 Assert::Equal(MAKEQWORDVERSION(1,1,0,0), VariableGetVersionHelper(&variables, L"PROP8")); 64 Assert::Equal(MAKEQWORDVERSION(1,1,0,0), VariableGetVersionHelper(&variables, L"PROP8"));
64 Assert::Equal<String^>(gcnew String(L"1.1.0.0"), VariableGetStringHelper(&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"));
65 67
66 Assert::Equal(42ll, VariableGetNumericHelper(&variables, L"OVERWRITTEN_STRING")); 68 Assert::Equal(42ll, VariableGetNumericHelper(&variables, L"OVERWRITTEN_STRING"));
67 Assert::Equal<String^>(gcnew String(L"NEW"), VariableGetStringHelper(&variables, L"OVERWRITTEN_NUMBER")); 69 Assert::Equal<String^>(gcnew String(L"NEW"), VariableGetStringHelper(&variables, L"OVERWRITTEN_NUMBER"));
@@ -87,6 +89,7 @@ namespace Bootstrapper
87 L" <Variable Id='Var3' Type='version' Value='1.2.3.4' Hidden='no' Persisted='no' />" 89 L" <Variable Id='Var3' Type='version' Value='1.2.3.4' Hidden='no' Persisted='no' />"
88 L" <Variable Id='Var4' Hidden='no' Persisted='no' />" 90 L" <Variable Id='Var4' Hidden='no' Persisted='no' />"
89 L" <Variable Id='Var5' Type='string' Value='' Hidden='no' Persisted='no' />" 91 L" <Variable Id='Var5' Type='string' Value='' Hidden='no' Persisted='no' />"
92 L" <Variable Id='Var6' Type='formatted' Value='[Formatted]' Hidden='no' Persisted='no' />"
90 L"</Bundle>"; 93 L"</Bundle>";
91 94
92 hr = VariableInitialize(&variables); 95 hr = VariableInitialize(&variables);
@@ -103,10 +106,12 @@ namespace Bootstrapper
103 Assert::Equal((int)BURN_VARIANT_TYPE_STRING, VariableGetTypeHelper(&variables, L"Var2")); 106 Assert::Equal((int)BURN_VARIANT_TYPE_STRING, VariableGetTypeHelper(&variables, L"Var2"));
104 Assert::Equal((int)BURN_VARIANT_TYPE_VERSION, VariableGetTypeHelper(&variables, L"Var3")); 107 Assert::Equal((int)BURN_VARIANT_TYPE_VERSION, VariableGetTypeHelper(&variables, L"Var3"));
105 Assert::Equal((int)BURN_VARIANT_TYPE_NONE, VariableGetTypeHelper(&variables, L"Var4")); 108 Assert::Equal((int)BURN_VARIANT_TYPE_NONE, VariableGetTypeHelper(&variables, L"Var4"));
109 Assert::Equal((int)BURN_VARIANT_TYPE_FORMATTED, VariableGetTypeHelper(&variables, L"Var6"));
106 110
107 Assert::Equal(1ll, VariableGetNumericHelper(&variables, L"Var1")); 111 Assert::Equal(1ll, VariableGetNumericHelper(&variables, L"Var1"));
108 Assert::Equal<String^>(gcnew String(L"String value."), VariableGetStringHelper(&variables, L"Var2")); 112 Assert::Equal<String^>(gcnew String(L"String value."), VariableGetStringHelper(&variables, L"Var2"));
109 Assert::Equal(MAKEQWORDVERSION(1,2,3,4), VariableGetVersionHelper(&variables, L"Var3")); 113 Assert::Equal(MAKEQWORDVERSION(1,2,3,4), VariableGetVersionHelper(&variables, L"Var3"));
114 Assert::Equal<String^>(gcnew String(L"[Formatted]"), VariableGetStringHelper(&variables, L"Var6"));
110 } 115 }
111 finally 116 finally
112 { 117 {
@@ -128,9 +133,13 @@ namespace Bootstrapper
128 TestThrowOnFailure(hr, L"Failed to initialize variables."); 133 TestThrowOnFailure(hr, L"Failed to initialize variables.");
129 134
130 // set variables 135 // set variables
131 VariableSetStringHelper(&variables, L"PROP1", L"VAL1"); 136 VariableSetStringHelper(&variables, L"PROP1", L"VAL1", FALSE);
132 VariableSetStringHelper(&variables, L"PROP2", L"VAL2"); 137 VariableSetStringHelper(&variables, L"PROP2", L"VAL2", FALSE);
133 VariableSetNumericHelper(&variables, L"PROP3", 3); 138 VariableSetNumericHelper(&variables, L"PROP3", 3);
139 VariableSetStringHelper(&variables, L"PROP4", L"[PROP1]", FALSE);
140 VariableSetStringHelper(&variables, L"PROP5", L"[PROP2]", FALSE);
141 VariableSetStringHelper(&variables, L"PROP6", L"[PROP4]", TRUE);
142 VariableSetStringHelper(&variables, L"PROP7", L"[PROP5]", TRUE);
134 143
135 // test string formatting 144 // test string formatting
136 Assert::Equal<String^>(gcnew String(L"NOPROP"), VariableFormatStringHelper(&variables, L"NOPROP")); 145 Assert::Equal<String^>(gcnew String(L"NOPROP"), VariableFormatStringHelper(&variables, L"NOPROP"));
@@ -148,6 +157,10 @@ namespace Bootstrapper
148 Assert::Equal<String^>(gcnew String(L"[NONE"), VariableFormatStringHelper(&variables, L"[NONE")); 157 Assert::Equal<String^>(gcnew String(L"[NONE"), VariableFormatStringHelper(&variables, L"[NONE"));
149 Assert::Equal<String^>(gcnew String(L"VAL2"), VariableGetFormattedHelper(&variables, L"PROP2")); 158 Assert::Equal<String^>(gcnew String(L"VAL2"), VariableGetFormattedHelper(&variables, L"PROP2"));
150 Assert::Equal<String^>(gcnew String(L"3"), VariableGetFormattedHelper(&variables, L"PROP3")); 159 Assert::Equal<String^>(gcnew String(L"3"), VariableGetFormattedHelper(&variables, L"PROP3"));
160 Assert::Equal<String^>(gcnew String(L"[PROP1]"), VariableGetFormattedHelper(&variables, L"PROP4"));
161 Assert::Equal<String^>(gcnew String(L"[PROP2]"), VariableGetFormattedHelper(&variables, L"PROP5"));
162 Assert::Equal<String^>(gcnew String(L"[PROP1]"), VariableGetFormattedHelper(&variables, L"PROP6"));
163 Assert::Equal<String^>(gcnew String(L"[PROP2]"), VariableGetFormattedHelper(&variables, L"PROP7"));
151 164
152 hr = VariableFormatString(&variables, L"PRE [PROP1] POST", &scz, &cch); 165 hr = VariableFormatString(&variables, L"PRE [PROP1] POST", &scz, &cch);
153 TestThrowOnFailure(hr, L"Failed to format string"); 166 TestThrowOnFailure(hr, L"Failed to format string");
@@ -186,15 +199,15 @@ namespace Bootstrapper
186 TestThrowOnFailure(hr, L"Failed to initialize variables."); 199 TestThrowOnFailure(hr, L"Failed to initialize variables.");
187 200
188 // set variables 201 // set variables
189 VariableSetStringHelper(&variables, L"PROP1", L"VAL1"); 202 VariableSetStringHelper(&variables, L"PROP1", L"VAL1", FALSE);
190 VariableSetStringHelper(&variables, L"PROP2", L"VAL2"); 203 VariableSetStringHelper(&variables, L"PROP2", L"VAL2", FALSE);
191 VariableSetStringHelper(&variables, L"PROP3", L"VAL3"); 204 VariableSetStringHelper(&variables, L"PROP3", L"VAL3", FALSE);
192 VariableSetStringHelper(&variables, L"PROP4", L"BEGIN MID END"); 205 VariableSetStringHelper(&variables, L"PROP4", L"BEGIN MID END", FALSE);
193 VariableSetNumericHelper(&variables, L"PROP5", 5); 206 VariableSetNumericHelper(&variables, L"PROP5", 5);
194 VariableSetNumericHelper(&variables, L"PROP6", 6); 207 VariableSetNumericHelper(&variables, L"PROP6", 6);
195 VariableSetStringHelper(&variables, L"PROP7", L""); 208 VariableSetStringHelper(&variables, L"PROP7", L"", FALSE);
196 VariableSetNumericHelper(&variables, L"PROP8", 0); 209 VariableSetNumericHelper(&variables, L"PROP8", 0);
197 VariableSetStringHelper(&variables, L"_PROP9", L"VAL9"); 210 VariableSetStringHelper(&variables, L"_PROP9", L"VAL9", FALSE);
198 VariableSetNumericHelper(&variables, L"PROP10", -10); 211 VariableSetNumericHelper(&variables, L"PROP10", -10);
199 VariableSetNumericHelper(&variables, L"PROP11", 9223372036854775807ll); 212 VariableSetNumericHelper(&variables, L"PROP11", 9223372036854775807ll);
200 VariableSetNumericHelper(&variables, L"PROP12", -9223372036854775808ll); 213 VariableSetNumericHelper(&variables, L"PROP12", -9223372036854775808ll);
@@ -208,7 +221,11 @@ namespace Bootstrapper
208 VariableSetVersionHelper(&variables, L"PROP20", MAKEQWORDVERSION(1,1,1,1)); 221 VariableSetVersionHelper(&variables, L"PROP20", MAKEQWORDVERSION(1,1,1,1));
209 VariableSetNumericHelper(&variables, L"vPROP21", 1); 222 VariableSetNumericHelper(&variables, L"vPROP21", 1);
210 VariableSetVersionHelper(&variables, L"PROP22", MAKEQWORDVERSION(65535,65535,65535,65535)); 223 VariableSetVersionHelper(&variables, L"PROP22", MAKEQWORDVERSION(65535,65535,65535,65535));
211 VariableSetStringHelper(&variables, L"PROP23", L"1.1.1"); 224 VariableSetStringHelper(&variables, L"PROP23", L"1.1.1", FALSE);
225 VariableSetStringHelper(&variables, L"PROP24", L"[PROP1]", TRUE);
226 VariableSetStringHelper(&variables, L"PROP25", L"[PROP7]", TRUE);
227 VariableSetStringHelper(&variables, L"PROP26", L"[PROP8]", TRUE);
228 VariableSetStringHelper(&variables, L"PROP27", L"[PROP16]", TRUE);
212 229
213 // test conditions 230 // test conditions
214 Assert::True(EvaluateConditionHelper(&variables, L"PROP1")); 231 Assert::True(EvaluateConditionHelper(&variables, L"PROP1"));
@@ -218,6 +235,10 @@ namespace Bootstrapper
218 Assert::True(EvaluateConditionHelper(&variables, L"_PROP9")); 235 Assert::True(EvaluateConditionHelper(&variables, L"_PROP9"));
219 Assert::False(EvaluateConditionHelper(&variables, L"PROP16")); 236 Assert::False(EvaluateConditionHelper(&variables, L"PROP16"));
220 Assert::True(EvaluateConditionHelper(&variables, L"PROP17")); 237 Assert::True(EvaluateConditionHelper(&variables, L"PROP17"));
238 Assert::True(EvaluateConditionHelper(&variables, L"PROP24"));
239 Assert::True(EvaluateConditionHelper(&variables, L"PROP25"));
240 Assert::True(EvaluateConditionHelper(&variables, L"PROP26"));
241 Assert::True(EvaluateConditionHelper(&variables, L"PROP27"));
221 242
222 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 = \"VAL1\"")); 243 Assert::True(EvaluateConditionHelper(&variables, L"PROP1 = \"VAL1\""));
223 Assert::False(EvaluateConditionHelper(&variables, L"NONE = \"NOT\"")); 244 Assert::False(EvaluateConditionHelper(&variables, L"NONE = \"NOT\""));
@@ -365,10 +386,11 @@ namespace Bootstrapper
365 hr = VariableInitialize(&variables1); 386 hr = VariableInitialize(&variables1);
366 TestThrowOnFailure(hr, L"Failed to initialize variables."); 387 TestThrowOnFailure(hr, L"Failed to initialize variables.");
367 388
368 VariableSetStringHelper(&variables1, L"PROP1", L"VAL1"); 389 VariableSetStringHelper(&variables1, L"PROP1", L"VAL1", FALSE);
369 VariableSetNumericHelper(&variables1, L"PROP2", 2); 390 VariableSetNumericHelper(&variables1, L"PROP2", 2);
370 VariableSetVersionHelper(&variables1, L"PROP3", MAKEQWORDVERSION(1,1,1,1)); 391 VariableSetVersionHelper(&variables1, L"PROP3", MAKEQWORDVERSION(1,1,1,1));
371 VariableSetStringHelper(&variables1, L"PROP4", L"VAL4"); 392 VariableSetStringHelper(&variables1, L"PROP4", L"VAL4", FALSE);
393 VariableSetStringHelper(&variables1, L"PROP5", L"[PROP1]", TRUE);
372 394
373 hr = VariableSerialize(&variables1, FALSE, &pbBuffer, &cbBuffer); 395 hr = VariableSerialize(&variables1, FALSE, &pbBuffer, &cbBuffer);
374 TestThrowOnFailure(hr, L"Failed to serialize variables."); 396 TestThrowOnFailure(hr, L"Failed to serialize variables.");
@@ -384,6 +406,13 @@ namespace Bootstrapper
384 Assert::Equal(2ll, VariableGetNumericHelper(&variables2, L"PROP2")); 406 Assert::Equal(2ll, VariableGetNumericHelper(&variables2, L"PROP2"));
385 Assert::Equal(MAKEQWORDVERSION(1,1,1,1), VariableGetVersionHelper(&variables2, L"PROP3")); 407 Assert::Equal(MAKEQWORDVERSION(1,1,1,1), VariableGetVersionHelper(&variables2, L"PROP3"));
386 Assert::Equal<String^>(gcnew String(L"VAL4"), VariableGetStringHelper(&variables2, L"PROP4")); 408 Assert::Equal<String^>(gcnew String(L"VAL4"), VariableGetStringHelper(&variables2, L"PROP4"));
409 Assert::Equal<String^>(gcnew String(L"[PROP1]"), VariableGetStringHelper(&variables2, L"PROP5"));
410
411 Assert::Equal((int)BURN_VARIANT_TYPE_STRING, VariableGetTypeHelper(&variables2, L"PROP1"));
412 Assert::Equal((int)BURN_VARIANT_TYPE_NUMERIC, VariableGetTypeHelper(&variables2, L"PROP2"));
413 Assert::Equal((int)BURN_VARIANT_TYPE_VERSION, VariableGetTypeHelper(&variables2, L"PROP3"));
414 Assert::Equal((int)BURN_VARIANT_TYPE_STRING, VariableGetTypeHelper(&variables2, L"PROP4"));
415 Assert::Equal((int)BURN_VARIANT_TYPE_FORMATTED, VariableGetTypeHelper(&variables2, L"PROP5"));
387 } 416 }
388 finally 417 finally
389 { 418 {
@@ -420,7 +449,7 @@ namespace Bootstrapper
420 } 449 }
421 450
422 // attempt to set a built-in property 451 // attempt to set a built-in property
423 hr = VariableSetString(&variables, L"VersionNT", L"VAL", FALSE); 452 hr = VariableSetString(&variables, L"VersionNT", L"VAL", FALSE, FALSE);
424 Assert::Equal(E_INVALIDARG, hr); 453 Assert::Equal(E_INVALIDARG, hr);
425 Assert::False(EvaluateConditionHelper(&variables, L"VersionNT = \"VAL\"")); 454 Assert::False(EvaluateConditionHelper(&variables, L"VersionNT = \"VAL\""));
426 455
diff --git a/src/test/BurnUnitTest/VariantTest.cpp b/src/test/BurnUnitTest/VariantTest.cpp
index d16ac699..c982db72 100644
--- a/src/test/BurnUnitTest/VariantTest.cpp
+++ b/src/test/BurnUnitTest/VariantTest.cpp
@@ -25,9 +25,9 @@ namespace Bootstrapper
25 [Fact] 25 [Fact]
26 void VariantBasicTest() 26 void VariantBasicTest()
27 { 27 {
28 BURN_VARIANT expectedVariants[8]; 28 BURN_VARIANT expectedVariants[10];
29 BURN_VARIANT actualVariants[8]; 29 BURN_VARIANT actualVariants[10];
30 for (DWORD i = 0; i < 8; i++) 30 for (DWORD i = 0; i < 10; i++)
31 { 31 {
32 BVariantUninitialize(expectedVariants + i); 32 BVariantUninitialize(expectedVariants + i);
33 BVariantUninitialize(actualVariants + i); 33 BVariantUninitialize(actualVariants + i);
@@ -43,6 +43,8 @@ namespace Bootstrapper
43 InitVersionValue(expectedVariants + 5, MAKEQWORDVERSION(1, 1, 1, 0), TRUE, L"PROP6", actualVariants + 5); 43 InitVersionValue(expectedVariants + 5, MAKEQWORDVERSION(1, 1, 1, 0), TRUE, L"PROP6", actualVariants + 5);
44 InitStringValue(expectedVariants + 6, L"7", TRUE, L"PROP7", actualVariants + 6); 44 InitStringValue(expectedVariants + 6, L"7", TRUE, L"PROP7", actualVariants + 6);
45 InitNumericValue(expectedVariants + 7, 11, TRUE, L"PROP8", actualVariants + 7); 45 InitNumericValue(expectedVariants + 7, 11, TRUE, L"PROP8", actualVariants + 7);
46 InitFormattedValue(expectedVariants + 8, L"VAL9", FALSE, L"PROP9", actualVariants + 8);
47 InitFormattedValue(expectedVariants + 9, L"VAL10", TRUE, L"PROP10", actualVariants + 9);
46 48
47 VerifyNumericValue(expectedVariants + 0, actualVariants + 0); 49 VerifyNumericValue(expectedVariants + 0, actualVariants + 0);
48 VerifyStringValue(expectedVariants + 1, actualVariants + 1); 50 VerifyStringValue(expectedVariants + 1, actualVariants + 1);
@@ -52,10 +54,12 @@ namespace Bootstrapper
52 VerifyVersionValue(expectedVariants + 5, actualVariants + 5); 54 VerifyVersionValue(expectedVariants + 5, actualVariants + 5);
53 VerifyStringValue(expectedVariants + 6, actualVariants + 6); 55 VerifyStringValue(expectedVariants + 6, actualVariants + 6);
54 VerifyNumericValue(expectedVariants + 7, actualVariants + 7); 56 VerifyNumericValue(expectedVariants + 7, actualVariants + 7);
57 VerifyFormattedValue(expectedVariants + 8, actualVariants + 8);
58 VerifyFormattedValue(expectedVariants + 9, actualVariants + 9);
55 } 59 }
56 finally 60 finally
57 { 61 {
58 for (DWORD i = 0; i < 8; i++) 62 for (DWORD i = 0; i < 10; i++)
59 { 63 {
60 BVariantUninitialize(expectedVariants + i); 64 BVariantUninitialize(expectedVariants + i);
61 BVariantUninitialize(actualVariants + i); 65 BVariantUninitialize(actualVariants + i);
@@ -64,6 +68,26 @@ namespace Bootstrapper
64 } 68 }
65 69
66 private: 70 private:
71 void InitFormattedValue(BURN_VARIANT* pValue, LPWSTR wzValue, BOOL fHidden, LPCWSTR wz, BURN_VARIANT* pActualValue)
72 {
73 HRESULT hr = S_OK;
74 pValue->Type = BURN_VARIANT_TYPE_FORMATTED;
75
76 hr = StrAllocString(&pValue->sczValue, wzValue, 0);
77 NativeAssert::Succeeded(hr, "Failed to alloc string: {0}", wzValue);
78
79 hr = BVariantCopy(pValue, pActualValue);
80 NativeAssert::Succeeded(hr, "Failed to copy variant {0}", wz);
81
82 if (fHidden)
83 {
84 hr = BVariantSetEncryption(pActualValue, TRUE);
85 NativeAssert::Succeeded(hr, "Failed to encrypt variant {0}", wz);
86
87 NativeAssert::True(pActualValue->fEncryptString);
88 }
89 }
90
67 void InitNoneValue(BURN_VARIANT* pValue, BOOL fHidden, LPCWSTR wz, BURN_VARIANT* pActualValue) 91 void InitNoneValue(BURN_VARIANT* pValue, BOOL fHidden, LPCWSTR wz, BURN_VARIANT* pActualValue)
68 { 92 {
69 HRESULT hr = S_OK; 93 HRESULT hr = S_OK;
@@ -137,6 +161,26 @@ namespace Bootstrapper
137 } 161 }
138 } 162 }
139 163
164 void VerifyFormattedValue(BURN_VARIANT* pExpectedValue, BURN_VARIANT* pActualValue)
165 {
166 HRESULT hr = S_OK;
167 LPWSTR sczValue = NULL;
168 NativeAssert::Equal<DWORD>(BURN_VARIANT_TYPE_FORMATTED, pExpectedValue->Type);
169 NativeAssert::Equal<DWORD>(BURN_VARIANT_TYPE_FORMATTED, pActualValue->Type);
170
171 try
172 {
173 hr = BVariantGetString(pActualValue, &sczValue);
174 NativeAssert::Succeeded(hr, "Failed to get string value");
175
176 NativeAssert::StringEqual(pExpectedValue->sczValue, sczValue);
177 }
178 finally
179 {
180 ReleaseStr(sczValue);
181 }
182 }
183
140 void VerifyNumericValue(BURN_VARIANT* pExpectedValue, BURN_VARIANT* pActualValue) 184 void VerifyNumericValue(BURN_VARIANT* pExpectedValue, BURN_VARIANT* pActualValue)
141 { 185 {
142 HRESULT hr = S_OK; 186 HRESULT hr = S_OK;
@@ -167,7 +211,7 @@ namespace Bootstrapper
167 try 211 try
168 { 212 {
169 hr = BVariantGetString(pActualValue, &sczValue); 213 hr = BVariantGetString(pActualValue, &sczValue);
170 NativeAssert::Succeeded(hr, "Failed to get numeric value"); 214 NativeAssert::Succeeded(hr, "Failed to get string value");
171 215
172 NativeAssert::StringEqual(pExpectedValue->sczValue, sczValue); 216 NativeAssert::StringEqual(pExpectedValue->sczValue, sczValue);
173 } 217 }
@@ -185,7 +229,7 @@ namespace Bootstrapper
185 NativeAssert::Equal<DWORD>(BURN_VARIANT_TYPE_VERSION, pActualValue->Type); 229 NativeAssert::Equal<DWORD>(BURN_VARIANT_TYPE_VERSION, pActualValue->Type);
186 230
187 hr = BVariantGetVersion(pActualValue, &qwValue); 231 hr = BVariantGetVersion(pActualValue, &qwValue);
188 NativeAssert::Succeeded(hr, "Failed to get numeric value"); 232 NativeAssert::Succeeded(hr, "Failed to get version value");
189 233
190 NativeAssert::Equal<DWORD64>(pExpectedValue->qwValue, qwValue); 234 NativeAssert::Equal<DWORD64>(pExpectedValue->qwValue, qwValue);
191 } 235 }