1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
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 #include "focus_test_flow.h"
17
18 #include <string>
19
20 #include "report.h"
21 #include "wukong_define.h"
22 #include "ability_manager_client.h"
23 #include "component_manager.h"
24 #include "accessibility_ui_test_ability.h"
25 #include "component_input.h"
26 #include "tree_manager.h"
27
28 namespace OHOS {
29 namespace WuKong {
30 namespace {
31 const std::string FOCUS_TEST_HELP_MSG =
32 "usage: wukong focus [<arguments>]\n"
33 "These are wukong focus arguments list:\n"
34 " -h, --help random test help\n"
35 " -a, --appswitch appswitch event percent\n"
36 " -b, --bundle the bundle name of allowlist\n"
37 " -p, --prohibit the bundle name of blocklist\n"
38 " -d, --page block page list\n"
39 " -t, --touch touch event percent\n"
40 " -c, --count test count\n"
41 " -i, --interval interval\n"
42 " -s, --seed random seed\n"
43 " -m, --mouse mouse event percent\n"
44 " -k, --keyboard keyboard event percent\n"
45 " -H, --hardkey hardkey event percent\n"
46 " -S, --swap swap event percent\n"
47 " -T, --time test time\n"
48 " -C, --component component event percent\n"
49 " -r, --rotate rotate event percent\n"
50 " -n, --numberfocus the number of inputs to focus on some component one time\n"
51 " -f, --focustypes the component type to focus on\n"
52 " -e, --allow ability the ability name of allowlist\n"
53 " -E, --block ability the ability name of blocklist\n"
54 " -Y, --blockCompId the id list of block component\n"
55 " -y, --blockCompType the type list of block component\n"
56 " -I, --screenshot get screenshot\n";
57
58 const std::string SHORT_OPTIONS = "a:b:c:d:e:E:hIi:k:p:s:t:T:H:m:S:C:r:n:f:Y:y:";
59 const struct option LONG_OPTIONS[] = {
60 {"help", no_argument, nullptr, 'h'}, // help
61 {"seed", required_argument, nullptr, 's'}, // test seed
62 {"time", required_argument, nullptr, 'T'}, // test time
63 {"count", required_argument, nullptr, 'c'}, // test count
64 {"interval", required_argument, nullptr, 'i'}, // test interval
65 {"bundle", required_argument, nullptr, 'b'}, // test haps
66 {"appswitch", required_argument, nullptr, 'a'}, // switch app percent
67 {"keyboard", required_argument, nullptr, 'k'}, // keyboard percent
68 {"mouse", required_argument, nullptr, 'm'}, // mouse percent
69 {"touch", required_argument, nullptr, 't'}, // touch percent
70 {"swap", required_argument, nullptr, 'S'}, // swap percent
71 {"hardkey", required_argument, nullptr, 'H'}, // hardkey percent
72 {"prohibit", required_argument, nullptr, 'p'}, // prohibit
73 {"component", required_argument, nullptr, 'C'}, // prohibit
74 {"rotate", required_argument, nullptr, 'r'}, // rotate percent
75 {"numberfocus", required_argument, nullptr, 'n'}, // number focus
76 {"focustypes", required_argument, nullptr, 'f'}, // focus types
77 {"page", required_argument, nullptr, 'd'}, // block page
78 {"allow ability", required_argument, nullptr, 'e'},
79 {"block ability", required_argument, nullptr, 'E'},
80 {"blockCompId", required_argument, nullptr, 'Y'},
81 {"blockCompType", required_argument, nullptr, 'y'},
82 {"screenshot", no_argument, nullptr, 'I'}, // get screenshot
83 };
84
85 /**
86 * WuKong default input action percent.
87 */
88 const vector<int> DEFAULT_INPUT_PERCENT = {
89 10, // INPUTTYPE_TOUCHINPUT, input touch event
90 3, // INPUTTYPE_SWAPINPUT, input swap event
91 1, // INPUTTYPE_MOUSEINPUT, input mouse event
92 2, // INPUTTYPE_KEYBOARDINPUT, input keyboard event
93 70, // INPUTTYPE_ELEMENTINPUT, input element event
94 10, // INPUTTYPE_APPSWITCHINPUT, input appswitch event
95 2, // INPUTTYPE_HARDKEYINPUT, input hardkey event
96 2 // INPUTTYPE_ROTATE, input rotate event
97 };
98
99 const map<int, InputType> OPTION_INPUT_PERCENT = {
100 {'a', INPUTTYPE_APPSWITCHINPUT}, // input appswitch event
101 {'C', INPUTTYPE_ELEMENTINPUT}, // input element event
102 {'k', INPUTTYPE_KEYBOARDINPUT}, // input keyboard event
103 {'S', INPUTTYPE_SWAPINPUT}, // input swap event
104 {'m', INPUTTYPE_MOUSEINPUT}, // input mouse event
105 {'t', INPUTTYPE_TOUCHINPUT}, // input touch event
106 {'H', INPUTTYPE_HARDKEYINPUT}, // input hardkey event
107 {'r', INPUTTYPE_ROTATEINPUT} // input rotate event
108 };
109
110 const int ONE_HUNDRED_PERCENT = 100;
111 // one minute (ms)
112 const int ONE_MINUTE = 60000;
113 // rotate
114 const int ROTATE = 114;
115 bool g_commandSEEDENABLE = false;
116 bool g_commandHELPENABLE = false;
117 bool g_commandTIMEENABLE = false;
118 bool g_commandCOUNTENABLE = false;
119 bool g_isAppStarted = false;
120 bool g_commandSCREENSHOTENABLE = false;
121 bool g_commandALLOWABILITYENABLE = false;
122 bool g_commandBLOCKABILITYENABLE = false;
123 bool g_commandALLOWBUNDLEENABLE = false;
124 } // namespace
125 using namespace std;
126
FocusTestFlow(WuKongShellCommand & shellcommand)127 FocusTestFlow::FocusTestFlow(WuKongShellCommand &shellcommand)
128 : TestFlow(shellcommand),
129 inputPercent_(INPUTTYPE_INVALIDINPUT, 0)
130 {
131 }
132
~FocusTestFlow()133 FocusTestFlow::~FocusTestFlow()
134 {
135 if (timer_ != nullptr) {
136 timer_->Shutdown();
137 timer_->Unregister(timerId_);
138 timer_ = nullptr;
139 }
140 }
141
InitEventPercent()142 ErrCode FocusTestFlow::InitEventPercent()
143 {
144 int sumPercent = 0;
145 int sumLastDefaultPercent = ONE_HUNDRED_PERCENT;
146 vector<int> lastDefaultPercent = DEFAULT_INPUT_PERCENT;
147 for (auto input : inputPercent_) {
148 TRACK_LOG_STR("input: (%02d)", input);
149 }
150 for (int type = 0; type < INPUTTYPE_INVALIDINPUT; type++) {
151 // add type to count input list for random algorithm.
152 for (int index = 0; index < inputPercent_[type]; index++) {
153 eventList_.push_back(type);
154 }
155 // check argument percent, and set last default percent.
156 if (inputPercent_[type] > 0) {
157 sumLastDefaultPercent -= lastDefaultPercent[type];
158 lastDefaultPercent[type] = 0;
159 }
160 sumPercent += inputPercent_[type];
161 }
162 TRACK_LOG_STR("sumPercent: %d", sumPercent);
163 // check the sum percent more than 100%, and exit wukong.
164 if (sumPercent > ONE_HUNDRED_PERCENT) {
165 shellcommand_.ResultReceiverAppend("all event percentage more than 1, please reset params.\n");
166 shellcommand_.ResultReceiverAppend(FOCUS_TEST_HELP_MSG);
167 return OHOS::ERR_INVALID_VALUE;
168 }
169
170 // sum the last default percent for calculate last percent.
171 int lastPercent = ONE_HUNDRED_PERCENT - sumPercent;
172 int lastInputPercent = 0;
173 for (int type = 0; type < INPUTTYPE_INVALIDINPUT; type++) {
174 if (lastDefaultPercent[type] <= 0 || lastDefaultPercent[type] > ONE_HUNDRED_PERCENT ||
175 sumLastDefaultPercent <= 0) {
176 continue;
177 }
178 lastInputPercent = (int)(lastPercent * ((float)(lastDefaultPercent[type]) / sumLastDefaultPercent));
179 // add type to count input list for random algorithm.
180 for (int index = 0; index < lastInputPercent; index++) {
181 eventList_.push_back(type);
182 }
183 sumPercent += lastInputPercent;
184 }
185
186 // if the sumPercent less than 100%, add INPUTTYPE_TOUCHINPUT to random algorithm.
187 for (int index = 0; index < ONE_HUNDRED_PERCENT - sumPercent; index++) {
188 eventList_.push_back(INPUTTYPE_TOUCHINPUT);
189 }
190
191 return OHOS::ERR_OK;
192 }
193
EnvInit()194 ErrCode FocusTestFlow::EnvInit()
195 {
196 // init event list percent.
197 ErrCode result = InitEventPercent();
198 if (result != OHOS::ERR_OK) {
199 return result;
200 }
201
202 // init srand and print seed information.
203 if (g_commandSEEDENABLE) {
204 srand(seedArgs_);
205 } else {
206 time_t tempSeed = time(nullptr);
207 srand((unsigned int)tempSeed);
208 seedArgs_ = (int)time(nullptr);
209 }
210 Report::GetInstance()->SetSeed(std::to_string(seedArgs_));
211 Report::GetInstance()->SetIsFocusTest(true);
212 TEST_RUN_LOG(("Seed: " + std::to_string(seedArgs_)).c_str());
213
214 // shuffle the event list.
215 RandomShuffle();
216
217 // if time test flow, register timer.
218 if (g_commandTIMEENABLE) {
219 RegisterTimer();
220 }
221 return result;
222 }
223
SetInputPercent(const int option)224 ErrCode FocusTestFlow::SetInputPercent(const int option)
225 {
226 InputType inputType = INPUTTYPE_INVALIDINPUT;
227 auto it = OPTION_INPUT_PERCENT.find(option);
228 if (it == OPTION_INPUT_PERCENT.end()) {
229 return OHOS::ERR_INVALID_VALUE;
230 }
231
232 inputType = it->second;
233 float percent = 0.0;
234 try {
235 percent = std::stof(optarg);
236 if ((it->first) == ROTATE && percent == 1) {
237 g_isAppStarted = true;
238 }
239 } catch (const std::exception &e) {
240 // try the option argument string convert float.
241 shellcommand_.ResultReceiverAppend("error: option '");
242 shellcommand_.ResultReceiverAppend(string((char *)(&option)));
243 shellcommand_.ResultReceiverAppend("' requires a value.\n");
244 shellcommand_.ResultReceiverAppend(FOCUS_TEST_HELP_MSG);
245 return OHOS::ERR_INVALID_VALUE;
246 }
247 // check valid of the option argument
248 if (percent > 1 || percent < 0) {
249 shellcommand_.ResultReceiverAppend("the input percent more than 1 (100%).\n");
250 shellcommand_.ResultReceiverAppend(FOCUS_TEST_HELP_MSG);
251 return OHOS::ERR_INVALID_VALUE;
252 }
253
254 // convert float to int (0 ~ 100)
255 inputPercent_[inputType] = (int)(percent * ONE_HUNDRED_PERCENT);
256 return OHOS::ERR_OK;
257 }
258
SetBlackWhiteSheet(const int option)259 ErrCode FocusTestFlow::SetBlackWhiteSheet(const int option)
260 {
261 ErrCode result = OHOS::ERR_OK;
262 if (option == 'b') {
263 result = WuKongUtil::GetInstance()->SetAllowList(optarg);
264 g_commandALLOWBUNDLEENABLE = true;
265 } else if (option == 'p') {
266 result = WuKongUtil::GetInstance()->SetBlockList(optarg);
267 } else if (option == 'e') {
268 result = WuKongUtil::GetInstance()->SetAllowAbilityList(optarg);
269 if (result != OHOS::ERR_INVALID_VALUE) {
270 result = CheckArgument(option);
271 }
272 } else if (option == 'E') {
273 result = WuKongUtil::GetInstance()->SetBlockAbilityList(optarg);
274 if (result != OHOS::ERR_INVALID_VALUE) {
275 result = CheckArgument(option);
276 }
277 } else if (option == 'd') {
278 result = WuKongUtil::GetInstance()->SetBlockPageList(optarg);
279 } else if (option == 'Y') {
280 WuKongUtil::GetInstance()->SetCompIdBlockList(optarg);
281 } else if (option == 'y') {
282 WuKongUtil::GetInstance()->SetCompTypeBlockList(optarg);
283 }
284 return OHOS::ERR_OK;
285 }
286
SetRunningParam(const int option)287 ErrCode FocusTestFlow::SetRunningParam(const int option)
288 {
289 ErrCode result = OHOS::ERR_OK;
290 if (option == 'c' || option == 'T') {
291 result = CheckArgument(option);
292 } else if (option == 'i') {
293 intervalArgs_ = std::stoi(optarg);
294 TEST_RUN_LOG(("Interval: " + std::to_string(intervalArgs_)).c_str());
295 } else if (option == 's') {
296 seedArgs_ = std::stoi(optarg);
297 g_commandSEEDENABLE = true;
298 } else if (option == 'n') {
299 TreeManager::GetInstance()->SetFocusNum(optarg);
300 } else if (option == 'f') {
301 TreeManager::GetInstance()->SetFocusTypeList(optarg);
302 }
303 return OHOS::ERR_OK;
304 }
305
SetRunningIndicator(const int option)306 ErrCode FocusTestFlow::SetRunningIndicator(const int option)
307 {
308 ErrCode result = OHOS::ERR_OK;
309 if (option == 'h') {
310 shellcommand_.ResultReceiverAppend(FOCUS_TEST_HELP_MSG);
311 result = OHOS::ERR_NO_INIT;
312 g_commandHELPENABLE = true;
313 } else if (option == 'I') {
314 g_commandSCREENSHOTENABLE = true;
315 }
316 return OHOS::ERR_OK;
317 }
318
InputScene(std::shared_ptr<InputAction> inputaction,bool inputFlag)319 ErrCode FocusTestFlow::InputScene(std::shared_ptr<InputAction> inputaction, bool inputFlag)
320 {
321 ErrCode result = OHOS::ERR_OK;
322 if (inputFlag) {
323 TRACK_LOG("inputScene branck 1");
324 result = inputaction->FocusInput(g_commandSCREENSHOTENABLE);
325 } else {
326 TRACK_LOG("inputScene branck 2");
327 ComponentManager::GetInstance()->BackToPrePage();
328 }
329 return result;
330 }
331
SetBlockPage()332 bool FocusTestFlow::SetBlockPage()
333 {
334 auto root = std::make_shared<OHOS::Accessibility::AccessibilityElementInfo>();
335 auto accPtr = OHOS::Accessibility::AccessibilityUITestAbility::GetInstance();
336 // Get root AccessibilityElementInfo from Accessibility
337 accPtr->GetRoot(*(root.get()));
338 std::string path = root->GetPagePath();
339 bool inputFlag = true;
340 char const *systemPath = "pages/system";
341 char const *passwordPath = "pages/biometricsandpassword";
342 if (strstr(path.c_str(), systemPath) != NULL ||
343 strstr(path.c_str(), passwordPath) != NULL) {
344 inputFlag = false;
345 }
346 TRACK_LOG_STR("Componentpage path: (%s)", path.c_str());
347 return inputFlag;
348 }
349
RunStep()350 ErrCode FocusTestFlow::RunStep()
351 {
352 TRACK_LOG("RunStep Start");
353 ErrCode result;
354 // control the count test flow
355 if (g_commandCOUNTENABLE == true) {
356 totalCount_--;
357 if (totalCount_ < 0) {
358 isFinished_ = true;
359 return OHOS::ERR_OK;
360 }
361 }
362 bool inputFlag = SetBlockPage();
363 std::shared_ptr<InputAction> inputaction = nullptr;
364 if (!g_isAppStarted) {
365 TRACK_LOG("RunStep g_isAppStarted not start");
366 inputaction = InputFactory::GetInputAction(INPUTTYPE_APPSWITCHINPUT);
367 if (inputaction == nullptr) {
368 ERROR_LOG("inputaction is nullptr");
369 return OHOS::ERR_INVALID_VALUE;
370 }
371 result = InputScene(inputaction, inputFlag);
372 if (result != OHOS::ERR_OK) {
373 ERROR_LOG("launch app failed and exit");
374 return result;
375 }
376 inputaction = nullptr;
377 g_isAppStarted = true;
378 usleep(intervalArgs_ * oneSecond_);
379 }
380 TRACK_LOG("RunStep after g_isAppStarted ");
381 // input event, get event index form event list by random algorithm.
382 int eventindex = rand() % ONE_HUNDRED_PERCENT;
383 InputType eventTypeId = (InputType)(eventList_.at(eventindex));
384 inputaction = InputFactory::GetInputAction(eventTypeId);
385 if (inputaction == nullptr) {
386 ERROR_LOG("inputaction is nullptr");
387 return OHOS::ERR_INVALID_VALUE;
388 }
389 TRACK_LOG("RunStep before ProtectRightAbility");
390 if (ProtectRightAbility(inputaction, eventTypeId) == OHOS::ERR_INVALID_VALUE) {
391 return OHOS::ERR_INVALID_VALUE;
392 }
393
394 result = InputScene(inputaction, inputFlag);
395 usleep(intervalArgs_ * oneSecond_);
396 return result;
397 }
398
ProtectRightAbility(std::shared_ptr<InputAction> & inputaction,InputType & eventTypeId)399 ErrCode FocusTestFlow::ProtectRightAbility(std::shared_ptr<InputAction> &inputaction, InputType &eventTypeId)
400 {
401 std::vector<std::string> allowList;
402 WuKongUtil::GetInstance()->GetAllowList(allowList);
403 if (allowList.size() > 0) {
404 auto elementName = AAFwk::AbilityManagerClient::GetInstance()->GetTopAbility();
405
406 // allowList 数量大于0 并且 elementName.GetBundleName() 不在allowList里面,重新拉起一个应用
407 auto curBundleName = elementName.GetBundleName();
408 auto it = find(allowList.begin(), allowList.end(), curBundleName);
409 if (it == allowList.end()) {
410 inputaction = InputFactory::GetInputAction(INPUTTYPE_APPSWITCHINPUT);
411 if (inputaction == nullptr) {
412 ERROR_LOG("inputaction is nullptr");
413 return OHOS::ERR_INVALID_VALUE;
414 }
415 }
416 }
417 return OHOS::ERR_OK;
418 }
419
HandleNormalOption(const int option)420 ErrCode FocusTestFlow::HandleNormalOption(const int option)
421 {
422 ErrCode result = OHOS::ERR_OK;
423 if (option == 't' || option == 'm' || option == 'S' || option == 'k' || option == 'H' ||
424 option == 'a' || option == 'r' || option == 'C') {
425 result = SetInputPercent(option);
426 } else {
427 result = SetBlackWhiteSheet(option);
428 if (result != OHOS::ERR_OK) {
429 return result;
430 }
431 result = SetRunningParam(option);
432 if (result != OHOS::ERR_OK) {
433 return result;
434 }
435 result = SetRunningIndicator(option);
436 }
437 WuKongUtil::GetInstance()->SetOrderFlag(false);
438 return result;
439 }
440
CheckArgument(const int option)441 ErrCode FocusTestFlow::CheckArgument(const int option)
442 {
443 ErrCode result = OHOS::ERR_OK;
444 switch (option) {
445 case 'c': {
446 // check if the '-c' and 'T' is exist at the same time
447 if (g_commandTIMEENABLE == false) {
448 g_commandCOUNTENABLE = true;
449 countArgs_ = std::stoi(optarg);
450 TEST_RUN_LOG(("Count: " + std::to_string(countArgs_)).c_str());
451 totalCount_ = countArgs_;
452 } else {
453 DEBUG_LOG(PARAM_COUNT_TIME_ERROR);
454 shellcommand_.ResultReceiverAppend(std::string(PARAM_COUNT_TIME_ERROR) + "\n");
455 result = OHOS::ERR_INVALID_VALUE;
456 }
457 break;
458 }
459 case 'T': {
460 // check if the '-c' and 'T' is exist at the same time
461 if (g_commandCOUNTENABLE == false) {
462 totalTime_ = std::stof(optarg);
463 TEST_RUN_LOG(("Time: " + std::to_string(totalTime_)).c_str());
464 g_commandTIMEENABLE = true;
465 } else {
466 DEBUG_LOG(PARAM_TIME_COUNT_ERROR);
467 shellcommand_.ResultReceiverAppend(std::string(PARAM_TIME_COUNT_ERROR) + "\n");
468 result = OHOS::ERR_INVALID_VALUE;
469 }
470 break;
471 }
472 case 'e': {
473 result = CheckArgumentOptionOfe();
474 break;
475 }
476 case 'E': {
477 result = CheckArgumentOptionOfE();
478 break;
479 }
480 default: {
481 result = OHOS::ERR_INVALID_VALUE;
482 break;
483 }
484 }
485 return result;
486 }
487
GetOptionArguments(std::string & shortOpts)488 const struct option *FocusTestFlow::GetOptionArguments(std::string &shortOpts)
489 {
490 shortOpts = SHORT_OPTIONS;
491 return LONG_OPTIONS;
492 }
493
HandleUnknownOption(const char optopt)494 ErrCode FocusTestFlow::HandleUnknownOption(const char optopt)
495 {
496 ErrCode result = OHOS::ERR_OK;
497 switch (optopt) {
498 case 'a':
499 case 'b':
500 case 'c':
501 case 'i':
502 case 's':
503 case 't':
504 case 'r':
505 case 'S':
506 case 'p':
507 case 'k':
508 case 'H':
509 case 'T':
510 case 'm':
511 case 'C':
512 case 'n':
513 case 'f':
514 case 'Y':
515 case 'y':
516 // error: option 'x' requires a value.
517 shellcommand_.ResultReceiverAppend("error: option '-");
518 shellcommand_.ResultReceiverAppend(string(1, optopt));
519 shellcommand_.ResultReceiverAppend("' requires a value.\n");
520 result = OHOS::ERR_INVALID_VALUE;
521 break;
522 case 'h': {
523 result = OHOS::ERR_INVALID_VALUE;
524 break;
525 }
526 default: {
527 // 'wukong focus' with an unknown option: wukong focus -x
528 shellcommand_.ResultReceiverAppend(
529 "'wukong focus' with an unknown option, please reference help information:\n");
530 result = OHOS::ERR_INVALID_VALUE;
531 break;
532 }
533 }
534 shellcommand_.ResultReceiverAppend(FOCUS_TEST_HELP_MSG);
535 return result;
536 }
537
RandomShuffle()538 void FocusTestFlow::RandomShuffle()
539 {
540 for (uint32_t i = eventList_.size() - 1; i > 0; --i) {
541 std::swap(eventList_[i], eventList_[std::rand() % (i + 1)]);
542 }
543 }
544
RegisterTimer()545 void FocusTestFlow::RegisterTimer()
546 {
547 if (timer_ == nullptr) {
548 timer_ = std::make_shared<Utils::Timer>("wukong");
549 timerId_ = timer_->Register(std::bind(&FocusTestFlow::TestTimeout, this), totalTime_ * ONE_MINUTE, true);
550 timer_->Setup();
551 }
552 }
553
TestTimeout()554 void FocusTestFlow::TestTimeout()
555 {
556 g_commandTIMEENABLE = false;
557 isFinished_ = true;
558 }
559
CheckArgumentOptionOfe()560 ErrCode FocusTestFlow::CheckArgumentOptionOfe()
561 {
562 if (g_commandALLOWABILITYENABLE == false) {
563 g_commandALLOWABILITYENABLE = true;
564 if (g_commandALLOWBUNDLEENABLE == true) {
565 return OHOS::ERR_OK;
566 } else {
567 ERROR_LOG("invalid param : When -e is configured, -b must be configured.");
568 ERROR_LOG("invalid param : please ensure that the -b is before the -e");
569 return OHOS::ERR_INVALID_VALUE;
570 }
571 } else {
572 ERROR_LOG("invalid param : please check params of '-e'.");
573 return OHOS::ERR_INVALID_VALUE;
574 }
575 }
576
CheckArgumentOptionOfE()577 ErrCode FocusTestFlow::CheckArgumentOptionOfE()
578 {
579 if (g_commandBLOCKABILITYENABLE == false) {
580 g_commandBLOCKABILITYENABLE = true;
581 if (g_commandALLOWBUNDLEENABLE == true) {
582 return OHOS::ERR_OK;
583 } else {
584 ERROR_LOG("invalid param : When -E is configure, -b must be configured.");
585 ERROR_LOG("invalid param : Plese ensure that the -b is before the -E.");
586 return OHOS::ERR_INVALID_VALUE;
587 }
588 } else {
589 ERROR_LOG("invalid param : please check params of '-E'.");
590 return OHOS::ERR_INVALID_VALUE;
591 }
592 }
593 } // namespace WuKong
594 } // namespace OHOS
595