| OLD | NEW |
| (Empty) |
| 1 // Copyright 2006-2009 Google Inc. | |
| 2 // | |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | |
| 4 // you may not use this file except in compliance with the License. | |
| 5 // You may obtain a copy of the License at | |
| 6 // | |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | |
| 8 // | |
| 9 // Unless required by applicable law or agreed to in writing, software | |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | |
| 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 12 // See the License for the specific language governing permissions and | |
| 13 // limitations under the License. | |
| 14 // ======================================================================== | |
| 15 // | |
| 16 // Unit tests of command line options parsing | |
| 17 | |
| 18 #include <cstdio> | |
| 19 #include "omaha/base/commands.h" | |
| 20 #include "omaha/base/file.h" | |
| 21 #include "omaha/testing/unit_test.h" | |
| 22 | |
| 23 namespace omaha { | |
| 24 | |
| 25 #define kDash _T("-") | |
| 26 #define kBoolOption _T("bool") | |
| 27 #define kThreeOption _T("three") | |
| 28 #define kIntOption _T("int") | |
| 29 #define kUintOption _T("uint") | |
| 30 #define kStrOption _T("str") | |
| 31 | |
| 32 #define kIEBrowserExe \ | |
| 33 _T("C:\\PROGRAM FILES\\Internet Explorer\\iexplore.exe") | |
| 34 | |
| 35 #define kIEBrowserQuotedExe \ | |
| 36 _T("\"") kIEBrowserExe _T("\"") | |
| 37 | |
| 38 #define kIEBrowserQuotedArgs _T("-h \"%1\"") | |
| 39 #define kIEBrowserQuotedCommandLine \ | |
| 40 kIEBrowserQuotedExe _T(" ") kIEBrowserQuotedArgs | |
| 41 | |
| 42 #define kIEBrowserQuotedExeResult \ | |
| 43 _T("C:\\PROGRAM FILES\\Internet Explorer\\iexplore.exe") | |
| 44 #define kIEBrowserQuotedArgsResult _T("-h %1") | |
| 45 | |
| 46 #define kIEBrowserUnquotedCommandLine \ | |
| 47 _T("C:\\Program Files\\Internet Explorer\\iexplore.exe -nohome") | |
| 48 #define kIEBrowserUnquotedExe \ | |
| 49 _T("C:\\Program Files\\Internet Explorer\\iexplore.exe") | |
| 50 #define kIEBrowserUnquotedArgs _T("-nohome") | |
| 51 | |
| 52 #define kGEUninstallCommandLine _T("RunDll32 C:\\PROGRA~1\\COMMON~1\\INSTA
L~1\\PROFES~1\\RunTime\\10\\01\\Intel32\\Ctor.dll,LaunchSetup \"C:\\Program File
s\\InstallShield Installation Information\\{3DE5E7D4-7B88-403C-A3FD-2017A8240C5B
}\\setup.exe\" -l0x9 -removeonly") // NOLINT | |
| 53 #define kGEUninstallExe _T("RunDll32") | |
| 54 #define kGEUninstallArgs _T("C:\\PROGRA~1\\COMMON~1\\INSTAL~1\\PROF
ES~1\\RunTime\\10\\01\\Intel32\\Ctor.dll,LaunchSetup \"C:\\Program Files\\Instal
lShield Installation Information\\{3DE5E7D4-7B88-403C-A3FD-2017A8240C5B}\\setup.
exe\" -l0x9 -removeonly") // NOLINT | |
| 55 | |
| 56 | |
| 57 struct TestData { | |
| 58 TestData() { | |
| 59 Clear(); | |
| 60 } | |
| 61 | |
| 62 void Clear() { | |
| 63 bool_value = false; | |
| 64 three_value = VALUE_NOT_SET; | |
| 65 int_value = 0; | |
| 66 uint_value = 0; | |
| 67 str_value.Empty(); | |
| 68 } | |
| 69 | |
| 70 bool bool_value; | |
| 71 ThreeValue three_value; | |
| 72 int int_value; | |
| 73 uint32 uint_value; | |
| 74 CString str_value; | |
| 75 }; | |
| 76 | |
| 77 void FillTestData(TestData* data) { | |
| 78 data->bool_value = true; | |
| 79 data->three_value = FALSE_VALUE; | |
| 80 data->int_value = -128; | |
| 81 data->uint_value = 256; | |
| 82 data->str_value = _T("Foo"); | |
| 83 } | |
| 84 | |
| 85 void CheckTestData(const TestData& d1, const TestData& d2) { | |
| 86 EXPECT_EQ(d1.bool_value, d2.bool_value); | |
| 87 EXPECT_EQ(d1.three_value, d2.three_value); | |
| 88 EXPECT_EQ(d1.int_value, d2.int_value); | |
| 89 EXPECT_EQ(d1.uint_value, d2.uint_value); | |
| 90 EXPECT_STREQ(d1.str_value, d2.str_value); | |
| 91 } | |
| 92 | |
| 93 TEST(CommandsTest, TraditionalCommandLineOptionsParsingTest) { | |
| 94 TestData data; | |
| 95 FillTestData(&data); | |
| 96 CString cmd_line; | |
| 97 cmd_line.Format(_T("%s%s %s ") | |
| 98 _T("%s%s %d ") | |
| 99 _T("%s%s %u ") | |
| 100 _T("%s%s %s "), | |
| 101 kDash, kThreeOption, (data.three_value == TRUE_VALUE) ? _T("on
") : _T("off"), // NOLINT | |
| 102 kDash, kIntOption, data.int_value, | |
| 103 kDash, kUintOption, data.uint_value, | |
| 104 kDash, kStrOption, data.str_value); | |
| 105 if (data.bool_value) { | |
| 106 cmd_line.AppendFormat(_T("%s%s"), kDash, kBoolOption); | |
| 107 } | |
| 108 | |
| 109 TestData option_data; | |
| 110 CommandOption cmd_options[] = { | |
| 111 { kDash kBoolOption, COMMAND_OPTION_BOOL, &option_data.bool_value, -1 }, | |
| 112 { kDash kThreeOption, COMMAND_OPTION_THREE, &option_data.three_value, -1 }, | |
| 113 { kDash kIntOption, COMMAND_OPTION_INT, &option_data.int_value, -1 }, | |
| 114 { kDash kUintOption, COMMAND_OPTION_UINT, &option_data.uint_value, -1 }, | |
| 115 { kDash kStrOption, COMMAND_OPTION_STRING, &option_data.str_value, -1 } | |
| 116 }; | |
| 117 | |
| 118 option_data.Clear(); | |
| 119 CommandParsing cmd_parsing(cmd_options, arraysize(cmd_options)); | |
| 120 ASSERT_SUCCEEDED(cmd_parsing.Parse(cmd_line, false)); | |
| 121 | |
| 122 CheckTestData(option_data, data); | |
| 123 } | |
| 124 | |
| 125 TEST(CommandsTest, TraditionalIgnoreUnknownArgsParsingTest) { | |
| 126 TestData data; | |
| 127 FillTestData(&data); | |
| 128 CString cmd_line; | |
| 129 cmd_line.Format(_T("%s%s %s ") | |
| 130 _T("%s%s %d ") | |
| 131 _T("%s%s %u ") | |
| 132 _T("%s%s %s "), | |
| 133 kDash, kThreeOption, (data.three_value == TRUE_VALUE) ? _T("on
") : _T("off"), // NOLINT | |
| 134 kDash, kIntOption, data.int_value, | |
| 135 kDash, kUintOption, data.uint_value, | |
| 136 kDash, kStrOption, data.str_value); | |
| 137 if (data.bool_value) { | |
| 138 cmd_line.AppendFormat(_T("%s%s"), kDash, kBoolOption); | |
| 139 } | |
| 140 | |
| 141 TestData option_data; | |
| 142 CommandOption cmd_options[] = { | |
| 143 { kDash kThreeOption, COMMAND_OPTION_THREE, &option_data.three_value, -1 }, | |
| 144 { kDash kIntOption, COMMAND_OPTION_INT, &option_data.int_value, -1 }, | |
| 145 { kDash kUintOption, COMMAND_OPTION_UINT, &option_data.uint_value, -1 }, | |
| 146 { kDash kStrOption, COMMAND_OPTION_STRING, &option_data.str_value, -1 } | |
| 147 }; | |
| 148 | |
| 149 option_data.Clear(); | |
| 150 CommandParsing cmd_parsing(cmd_options, arraysize(cmd_options)); | |
| 151 ASSERT_FAILED(cmd_parsing.Parse(cmd_line, false)); | |
| 152 ASSERT_SUCCEEDED(cmd_parsing.Parse(cmd_line, true)); | |
| 153 | |
| 154 option_data.bool_value = data.bool_value; | |
| 155 CheckTestData(option_data, data); | |
| 156 } | |
| 157 | |
| 158 TEST(CommandsTest, NameValuePairCommandLineOptionsParsingTest) { | |
| 159 TestData data; | |
| 160 FillTestData(&data); | |
| 161 CString cmd_line; | |
| 162 cmd_line.Format( | |
| 163 _T("%s=%s&") | |
| 164 _T("%s=%d&") | |
| 165 _T("%s=%u&") | |
| 166 _T("%s=%s"), | |
| 167 kThreeOption, (data.three_value == TRUE_VALUE) ? _T("on") : _T("off"), | |
| 168 kIntOption, data.int_value, | |
| 169 kUintOption, data.uint_value, | |
| 170 kStrOption, data.str_value); | |
| 171 if (data.bool_value) { | |
| 172 cmd_line.AppendFormat(_T("&%s="), kBoolOption); | |
| 173 } | |
| 174 | |
| 175 TestData option_data; | |
| 176 CommandOption cmd_options[] = { | |
| 177 { kBoolOption, COMMAND_OPTION_BOOL, &option_data.bool_value, -1 }, | |
| 178 { kThreeOption, COMMAND_OPTION_THREE, &option_data.three_value, -1 }, | |
| 179 { kIntOption, COMMAND_OPTION_INT, &option_data.int_value, -1 }, | |
| 180 { kUintOption, COMMAND_OPTION_UINT, &option_data.uint_value, -1 }, | |
| 181 { kStrOption, COMMAND_OPTION_STRING, &option_data.str_value, -1 } | |
| 182 }; | |
| 183 | |
| 184 option_data.Clear(); | |
| 185 CommandParsing cmd_parsing(cmd_options, | |
| 186 arraysize(cmd_options), | |
| 187 _T('&'), | |
| 188 true); | |
| 189 ASSERT_SUCCEEDED(cmd_parsing.Parse(cmd_line, false)); | |
| 190 | |
| 191 CheckTestData(option_data, data); | |
| 192 } | |
| 193 | |
| 194 TEST(CommandsTest, NameValuePairIgnoreUnknownArgsParsingTest) { | |
| 195 TestData data; | |
| 196 FillTestData(&data); | |
| 197 CString cmd_line; | |
| 198 cmd_line.Format( | |
| 199 _T("%s=%s&") | |
| 200 _T("%s=%d&") | |
| 201 _T("%s=%u&") | |
| 202 _T("%s=%s"), | |
| 203 kThreeOption, (data.three_value == TRUE_VALUE) ? _T("on") : _T("off"), | |
| 204 kIntOption, data.int_value, | |
| 205 kUintOption, data.uint_value, | |
| 206 kStrOption, data.str_value); | |
| 207 if (data.bool_value) { | |
| 208 cmd_line.AppendFormat(_T("&%s="), kBoolOption); | |
| 209 } | |
| 210 | |
| 211 TestData option_data; | |
| 212 CommandOption cmd_options[] = { | |
| 213 { kBoolOption, COMMAND_OPTION_BOOL, &option_data.bool_value, -1 }, | |
| 214 { kThreeOption, COMMAND_OPTION_THREE, &option_data.three_value, -1 }, | |
| 215 { kUintOption, COMMAND_OPTION_UINT, &option_data.uint_value, -1 }, | |
| 216 { kStrOption, COMMAND_OPTION_STRING, &option_data.str_value, -1 } | |
| 217 }; | |
| 218 | |
| 219 option_data.Clear(); | |
| 220 CommandParsing cmd_parsing(cmd_options, | |
| 221 arraysize(cmd_options), | |
| 222 _T('&'), | |
| 223 true); | |
| 224 ASSERT_FAILED(cmd_parsing.Parse(cmd_line, false)); | |
| 225 ASSERT_SUCCEEDED(cmd_parsing.Parse(cmd_line, true)); | |
| 226 | |
| 227 option_data.int_value = data.int_value; | |
| 228 CheckTestData(option_data, data); | |
| 229 } | |
| 230 | |
| 231 TEST(CommandsTest, CommandParsingSimpleSplitTest) { | |
| 232 CString exe; | |
| 233 CString args; | |
| 234 | |
| 235 // Test to make sure SplitExeAndArgs correctly splits | |
| 236 // a properly constructed command line | |
| 237 ASSERT_SUCCEEDED( | |
| 238 CommandParsingSimple::SplitExeAndArgs(kIEBrowserQuotedCommandLine, | |
| 239 &exe, | |
| 240 &args)); | |
| 241 | |
| 242 EXPECT_STREQ(kIEBrowserQuotedExeResult, exe); | |
| 243 EXPECT_STREQ(kIEBrowserQuotedArgsResult, args); | |
| 244 } | |
| 245 | |
| 246 TEST(CommandsTest, CommandParsingGuessSplitTest) { | |
| 247 CString exe; | |
| 248 CString args; | |
| 249 | |
| 250 // Test to make sure SplitExeAndArgsGuess correctly splits | |
| 251 // a properly constructed command line | |
| 252 ASSERT_SUCCEEDED( | |
| 253 CommandParsingSimple::SplitExeAndArgsGuess(kIEBrowserQuotedCommandLine, | |
| 254 &exe, | |
| 255 &args)); | |
| 256 | |
| 257 EXPECT_STREQ(kIEBrowserQuotedExeResult, exe); | |
| 258 EXPECT_STREQ(kIEBrowserQuotedArgsResult, args); | |
| 259 | |
| 260 // Test to make sure SplitExeAndArgsGuess correctly splits | |
| 261 // an improperly constructed "Uninstall" command line | |
| 262 ASSERT_SUCCEEDED( | |
| 263 CommandParsingSimple::SplitExeAndArgsGuess(kIEBrowserUnquotedCommandLine, | |
| 264 &exe, | |
| 265 &args)); | |
| 266 | |
| 267 EXPECT_STREQ(kIEBrowserUnquotedExe, exe); | |
| 268 EXPECT_STREQ(kIEBrowserUnquotedArgs, args); | |
| 269 | |
| 270 // Test to make sure SplitExeAndArgsGuess correctly splits | |
| 271 // a properly constructed "Uninstall" command line, where | |
| 272 // the executable does not have a ".EXE" extension, and | |
| 273 // where there happens to be an argument which happens to | |
| 274 // be an executable | |
| 275 ASSERT_SUCCEEDED( | |
| 276 CommandParsingSimple::SplitExeAndArgsGuess(kGEUninstallCommandLine, | |
| 277 &exe, | |
| 278 &args)); | |
| 279 | |
| 280 EXPECT_STREQ(kGEUninstallExe, exe); | |
| 281 EXPECT_STREQ(kGEUninstallArgs, args); | |
| 282 } | |
| 283 | |
| 284 TEST(CommandsTest, CommandParsingGuessSplit_ExtraWhiteSpace) { | |
| 285 CString exe; | |
| 286 CString args; | |
| 287 | |
| 288 EXPECT_SUCCEEDED(CommandParsingSimple::SplitExeAndArgsGuess( | |
| 289 kIEBrowserUnquotedCommandLine _T(" "), | |
| 290 &exe, | |
| 291 &args)); | |
| 292 EXPECT_STREQ(kIEBrowserUnquotedExe, exe); | |
| 293 EXPECT_STREQ(kIEBrowserUnquotedArgs, args); | |
| 294 | |
| 295 EXPECT_SUCCEEDED(CommandParsingSimple::SplitExeAndArgsGuess( | |
| 296 kIEBrowserUnquotedCommandLine _T("\t"), | |
| 297 &exe, | |
| 298 &args)); | |
| 299 EXPECT_STREQ(kIEBrowserUnquotedExe, exe); | |
| 300 EXPECT_STREQ(kIEBrowserUnquotedArgs, args); | |
| 301 | |
| 302 EXPECT_SUCCEEDED(CommandParsingSimple::SplitExeAndArgsGuess( | |
| 303 _T(" ") kIEBrowserUnquotedCommandLine, | |
| 304 &exe, | |
| 305 &args)); | |
| 306 EXPECT_STREQ(kIEBrowserUnquotedExe, exe); | |
| 307 EXPECT_STREQ(kIEBrowserUnquotedArgs, args); | |
| 308 | |
| 309 // The following cases have unexpected results. | |
| 310 // Quoting a command line with args is not handled correctly. | |
| 311 // The entire thing is interpreted as an EXE. | |
| 312 | |
| 313 EXPECT_SUCCEEDED(CommandParsingSimple::SplitExeAndArgsGuess( | |
| 314 _T("\" ") kIEBrowserUnquotedCommandLine _T("\""), | |
| 315 &exe, | |
| 316 &args)); | |
| 317 EXPECT_STREQ(kIEBrowserUnquotedCommandLine, exe); | |
| 318 EXPECT_TRUE(args.IsEmpty()); | |
| 319 | |
| 320 EXPECT_SUCCEEDED(CommandParsingSimple::SplitExeAndArgsGuess( | |
| 321 _T("\"") kIEBrowserUnquotedCommandLine _T(" \""), | |
| 322 &exe, | |
| 323 &args)); | |
| 324 EXPECT_STREQ(kIEBrowserUnquotedCommandLine, exe); | |
| 325 EXPECT_TRUE(args.IsEmpty()); | |
| 326 | |
| 327 EXPECT_SUCCEEDED(CommandParsingSimple::SplitExeAndArgsGuess( | |
| 328 _T("\"") kIEBrowserUnquotedCommandLine _T("\t\""), | |
| 329 &exe, | |
| 330 &args)); | |
| 331 EXPECT_STREQ(kIEBrowserUnquotedCommandLine, exe); | |
| 332 EXPECT_TRUE(args.IsEmpty()); | |
| 333 } | |
| 334 | |
| 335 TEST(CommandsTest, CommandParsingGuessSplit_CommandLineIsExistingFile) { | |
| 336 CString exe; | |
| 337 CString args; | |
| 338 | |
| 339 EXPECT_TRUE(File::Exists(kIEBrowserExe)); | |
| 340 EXPECT_SUCCEEDED( | |
| 341 CommandParsingSimple::SplitExeAndArgsGuess(kIEBrowserExe, &exe, &args)); | |
| 342 EXPECT_STREQ(kIEBrowserExe, exe); | |
| 343 EXPECT_TRUE(args.IsEmpty()); | |
| 344 | |
| 345 // File::Exists does not handle enclosed paths. | |
| 346 EXPECT_FALSE(File::Exists(kIEBrowserQuotedExe)); | |
| 347 EXPECT_SUCCEEDED( | |
| 348 CommandParsingSimple::SplitExeAndArgsGuess(kIEBrowserQuotedExe, | |
| 349 &exe, | |
| 350 &args)); | |
| 351 EXPECT_STREQ(kIEBrowserExe, exe); | |
| 352 EXPECT_TRUE(args.IsEmpty()); | |
| 353 } | |
| 354 | |
| 355 TEST(CommandsTest, | |
| 356 CommandParsingGuessSplit_CommandLineIsExistingFileWithExtraWhiteSpace) { | |
| 357 CString exe; | |
| 358 CString args; | |
| 359 | |
| 360 EXPECT_TRUE(File::Exists(kIEBrowserExe)); | |
| 361 // File::Exists does not handle enclosed paths. | |
| 362 EXPECT_FALSE(File::Exists(kIEBrowserQuotedExe)); | |
| 363 | |
| 364 EXPECT_SUCCEEDED( | |
| 365 CommandParsingSimple::SplitExeAndArgsGuess(kIEBrowserExe _T(" "), | |
| 366 &exe, | |
| 367 &args)); | |
| 368 EXPECT_STREQ(kIEBrowserExe, exe); | |
| 369 EXPECT_TRUE(args.IsEmpty()); | |
| 370 | |
| 371 EXPECT_SUCCEEDED( | |
| 372 CommandParsingSimple::SplitExeAndArgsGuess(kIEBrowserQuotedExe _T(" "), | |
| 373 &exe, | |
| 374 &args)); | |
| 375 EXPECT_STREQ(kIEBrowserExe, exe); | |
| 376 EXPECT_TRUE(args.IsEmpty()); | |
| 377 | |
| 378 EXPECT_SUCCEEDED( | |
| 379 CommandParsingSimple::SplitExeAndArgsGuess(kIEBrowserExe _T("\t"), | |
| 380 &exe, | |
| 381 &args)); | |
| 382 EXPECT_STREQ(kIEBrowserExe, exe); | |
| 383 EXPECT_TRUE(args.IsEmpty()); | |
| 384 | |
| 385 EXPECT_SUCCEEDED( | |
| 386 CommandParsingSimple::SplitExeAndArgsGuess(kIEBrowserQuotedExe _T("\t"), | |
| 387 &exe, | |
| 388 &args)); | |
| 389 EXPECT_STREQ(kIEBrowserExe, exe); | |
| 390 // SplitExeAndArgs does not treat tab like whitespace and args aren't trimmed. | |
| 391 EXPECT_STREQ(_T("\t"), args); | |
| 392 | |
| 393 EXPECT_SUCCEEDED( | |
| 394 CommandParsingSimple::SplitExeAndArgsGuess(_T(" ") kIEBrowserExe, | |
| 395 &exe, | |
| 396 &args)); | |
| 397 EXPECT_STREQ(kIEBrowserExe, exe); | |
| 398 EXPECT_TRUE(args.IsEmpty()); | |
| 399 | |
| 400 EXPECT_SUCCEEDED( | |
| 401 CommandParsingSimple::SplitExeAndArgsGuess(_T(" ") kIEBrowserQuotedExe, | |
| 402 &exe, | |
| 403 &args)); | |
| 404 EXPECT_STREQ(kIEBrowserExe, exe); | |
| 405 EXPECT_TRUE(args.IsEmpty()); | |
| 406 | |
| 407 EXPECT_SUCCEEDED(CommandParsingSimple::SplitExeAndArgsGuess( | |
| 408 _T("\" ") kIEBrowserExe _T("\""), | |
| 409 &exe, | |
| 410 &args)); | |
| 411 EXPECT_STREQ(kIEBrowserExe, exe); | |
| 412 EXPECT_TRUE(args.IsEmpty()); | |
| 413 | |
| 414 EXPECT_SUCCEEDED(CommandParsingSimple::SplitExeAndArgsGuess( | |
| 415 _T("\"") kIEBrowserExe _T(" \""), | |
| 416 &exe, | |
| 417 &args)); | |
| 418 EXPECT_STREQ(kIEBrowserExe, exe); | |
| 419 EXPECT_TRUE(args.IsEmpty()); | |
| 420 | |
| 421 EXPECT_SUCCEEDED(CommandParsingSimple::SplitExeAndArgsGuess( | |
| 422 _T("\"") kIEBrowserExe _T("\t\""), | |
| 423 &exe, | |
| 424 &args)); | |
| 425 EXPECT_STREQ(kIEBrowserExe, exe); | |
| 426 EXPECT_TRUE(args.IsEmpty()); | |
| 427 } | |
| 428 | |
| 429 } // namespace omaha | |
| 430 | |
| OLD | NEW |