1 /*
2  * Copyright (c) 2023 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 <functional>
17 #include <gtest/gtest.h>
18 #define private public
19 #include "work_scheduler_service.h"
20 #include "work_status.h"
21 #include "work_bundle_group_change_callback.h"
22 #include "work_scheduler_connection.h"
23 #include "work_queue_event_handler.h"
24 #include "work_event_handler.h"
25 #include "conditions/battery_level_listener.h"
26 #include "common_event_manager.h"
27 #include "common_event_support.h"
28 #include "battery_info.h"
29 #include "conditions/battery_status_listener.h"
30 #include "conditions/charger_listener.h"
31 #include "event_publisher.h"
32 
33 #ifdef DEVICE_USAGE_STATISTICS_ENABLE
34 #include "bundle_active_client.h"
35 #endif
36 #ifdef DEVICE_STANDBY_ENABLE
37 #include "standby_service_client.h"
38 #include "allow_type.h"
39 #endif
40 #ifdef RESOURCESCHEDULE_BGTASKMGR_ENABLE
41 #include "scheduler_bg_task_subscriber.h"
42 #include "background_task_mgr_helper.h"
43 #include "resource_type.h"
44 #endif
45 #include "work_sched_errors.h"
46 #include "work_sched_hilog.h"
47 
48 #ifdef DEVICE_STANDBY_ENABLE
49 namespace OHOS {
50 namespace DevStandbyMgr {
SubscribeStandbyCallback(const sptr<IStandbyServiceSubscriber>& subscriber)51 ErrCode StandbyServiceClient::SubscribeStandbyCallback(const sptr<IStandbyServiceSubscriber>& subscriber)
52 {
53     return ERR_OK;
54 }
55 }
56 }
57 #endif
58 
59 #ifdef RESOURCESCHEDULE_BGTASKMGR_ENABLE
60 namespace OHOS {
61 namespace BackgroundTaskMgr {
SubscribeBackgroundTask(const BackgroundTaskSubscriber &subscriber)62 ErrCode BackgroundTaskMgrHelper::SubscribeBackgroundTask(const BackgroundTaskSubscriber &subscriber)
63 {
64     return ERR_OK;
65 }
66 }
67 }
68 #endif
69 
70 #ifdef DEVICE_USAGE_STATISTICS_ENABLE
71 namespace OHOS {
72 namespace DeviceUsageStats {
RegisterAppGroupCallBack(const sptr<IAppGroupCallback> &observer)73 ErrCode BundleActiveClient::RegisterAppGroupCallBack(const sptr<IAppGroupCallback> &observer)
74 {
75     return ERR_OK;
76 }
77 }
78 }
79 #endif
80 
81 namespace OHOS {
82 namespace WorkScheduler {
IsBaseAbilityReady()83 bool WorkSchedulerService::IsBaseAbilityReady()
84 {
85     return true;
86 }
87 }
88 }
89 
DecStrongRef(void const* obj)90 void OHOS::RefBase::DecStrongRef(void const* obj) {}
91 
92 using namespace testing::ext;
93 namespace OHOS {
94 namespace WorkScheduler {
95 class WorkSchedulerServiceTest : public testing::Test {
96 public:
SetUpTestCase()97     static void SetUpTestCase() {}
TearDownTestCase()98     static void TearDownTestCase() {}
SetUp()99     void SetUp() {}
TearDown()100     void TearDown() {}
101     static std::shared_ptr<WorkSchedulerService> workSchedulerService_;
102 };
103 
104 std::shared_ptr<WorkSchedulerService> WorkSchedulerServiceTest::workSchedulerService_ =
105     DelayedSingleton<WorkSchedulerService>::GetInstance();
106 
107 class MyWorkSchedulerService : public WorkSchedServiceStub {
StartWork(WorkInfo& workInfo)108     int32_t StartWork(WorkInfo& workInfo) { return 0; }
StopWork(WorkInfo& workInfo)109     int32_t StopWork(WorkInfo& workInfo) { return 0; };
StopAndCancelWork(WorkInfo& workInfo)110     int32_t StopAndCancelWork(WorkInfo& workInfo)  { return 0; }
StopAndClearWorks()111     int32_t StopAndClearWorks() { return 0; }
IsLastWorkTimeout(int32_t workId, bool &result)112     int32_t IsLastWorkTimeout(int32_t workId, bool &result) { return 0; }
ObtainAllWorks(std::list<std::shared_ptr<WorkInfo>>& workInfos)113     int32_t ObtainAllWorks(std::list<std::shared_ptr<WorkInfo>>& workInfos) { return 0; }
GetWorkStatus(int32_t &workId, std::shared_ptr<WorkInfo>& workInfo)114     int32_t GetWorkStatus(int32_t &workId, std::shared_ptr<WorkInfo>& workInfo) { return 0; }
GetAllRunningWorks(std::list<std::shared_ptr<WorkInfo>>& workInfos)115     int32_t GetAllRunningWorks(std::list<std::shared_ptr<WorkInfo>>& workInfos) { return 0; }
PauseRunningWorks(int32_t uid)116     int32_t PauseRunningWorks(int32_t uid) {return 0; }
ResumePausedWorks(int32_t uid)117     int32_t ResumePausedWorks(int32_t uid) {return 0; }
118 };
119 /**
120  * @tc.name: onStart_001
121  * @tc.desc: Test WorkSchedulerService OnStart.
122  * @tc.type: FUNC
123  * @tc.require: I8ZDJI
124  */
HWTEST_F(WorkSchedulerServiceTest, onStart_001, TestSize.Level1)125 HWTEST_F(WorkSchedulerServiceTest, onStart_001, TestSize.Level1)
126 {
127     workSchedulerService_->OnStart();
128     EXPECT_NE(workSchedulerService_, nullptr);
129 }
130 
131 /**
132  * @tc.name: startWork_001
133  * @tc.desc: Test WorkSchedulerService startWork.
134  * @tc.type: FUNC
135  * @tc.require: I8F08T
136  */
HWTEST_F(WorkSchedulerServiceTest, startWork_001, TestSize.Level1)137 HWTEST_F(WorkSchedulerServiceTest, startWork_001, TestSize.Level1)
138 {
139     int32_t ret;
140 
141     workSchedulerService_->ready_ = false;
142     WorkInfo workinfo = WorkInfo();
143     ret = workSchedulerService_->StartWork(workinfo);
144     EXPECT_EQ(ret, E_SERVICE_NOT_READY);
145 
146     workSchedulerService_->ready_ = true;
147     ret = workSchedulerService_->StartWork(workinfo);
148     EXPECT_EQ(ret, E_CHECK_WORKINFO_FAILED);
149 
150     workSchedulerService_->checkBundle_ = false;
151     ret = workSchedulerService_->StartWork(workinfo);
152     EXPECT_EQ(ret, E_REPEAT_CYCLE_TIME_ERR);
153 
154     workinfo.RequestStorageLevel(WorkCondition::Storage::STORAGE_LEVEL_LOW_OR_OKAY);
155     ret = workSchedulerService_->StartWork(workinfo);
156     EXPECT_EQ(ret, 0);
157     ret = workSchedulerService_->StartWork(workinfo);
158     EXPECT_EQ(ret, E_ADD_REPEAT_WORK_ERR);
159 }
160 
161 /**
162  * @tc.name: stopWork_001
163  * @tc.desc: Test WorkSchedulerService stopWork.
164  * @tc.type: FUNC
165  * @tc.require: I8F08T
166  */
HWTEST_F(WorkSchedulerServiceTest, stopWork_001, TestSize.Level1)167 HWTEST_F(WorkSchedulerServiceTest, stopWork_001, TestSize.Level1)
168 {
169     int32_t ret;
170 
171     WS_HILOGI("WorkSchedulerServiceTest.stopWork_001 begin");
172     workSchedulerService_->ready_ = false;
173     workSchedulerService_->checkBundle_ = true;
174     WorkInfo workinfo = WorkInfo();
175     ret = workSchedulerService_->StopWork(workinfo);
176     EXPECT_EQ(ret, E_SERVICE_NOT_READY);
177 
178     workSchedulerService_->ready_ = true;
179     ret = workSchedulerService_->StopWork(workinfo);
180     EXPECT_EQ(ret, E_CHECK_WORKINFO_FAILED);
181 
182     workSchedulerService_->checkBundle_ = false;
183     ret = workSchedulerService_->StopWork(workinfo);
184     EXPECT_EQ(ret, 0);
185     WS_HILOGI("WorkSchedulerServiceTest.stopWork_001 end");
186 }
187 
188 /**
189  * @tc.name: StopAndCancelWork_001
190  * @tc.desc: Test WorkSchedulerService StopAndCancelWork.
191  * @tc.type: FUNC
192  * @tc.require: I8F08T
193  */
HWTEST_F(WorkSchedulerServiceTest, StopAndCancelWork_001, TestSize.Level1)194 HWTEST_F(WorkSchedulerServiceTest, StopAndCancelWork_001, TestSize.Level1)
195 {
196     int32_t ret;
197 
198     WS_HILOGI("WorkSchedulerServiceTest.StopAndCancelWork_001 begin");
199     workSchedulerService_->ready_ = false;
200     workSchedulerService_->checkBundle_ = true;
201     WorkInfo workinfo = WorkInfo();
202     ret = workSchedulerService_->StopAndCancelWork(workinfo);
203     EXPECT_EQ(ret, E_SERVICE_NOT_READY);
204 
205     workSchedulerService_->ready_ = true;
206     ret = workSchedulerService_->StopAndCancelWork(workinfo);
207     EXPECT_EQ(ret, E_CHECK_WORKINFO_FAILED);
208 
209     workSchedulerService_->checkBundle_ = false;
210     ret = workSchedulerService_->StopAndCancelWork(workinfo);
211     EXPECT_EQ(ret, 0);
212     WS_HILOGI("WorkSchedulerServiceTest.StopAndCancelWork_001 end");
213 }
214 
215 /**
216  * @tc.name: StopAndClearWorks_001
217  * @tc.desc: Test WorkSchedulerService StopAndClearWorks.
218  * @tc.type: FUNC
219  * @tc.require: I8F08T
220  */
HWTEST_F(WorkSchedulerServiceTest, StopAndClearWorks_001, TestSize.Level1)221 HWTEST_F(WorkSchedulerServiceTest, StopAndClearWorks_001, TestSize.Level1)
222 {
223     int32_t ret;
224 
225     WS_HILOGI("WorkSchedulerServiceTest.StopAndClearWorks_001 begin");
226     workSchedulerService_->ready_ = false;
227     workSchedulerService_->checkBundle_ = true;
228     ret = workSchedulerService_->StopAndClearWorks();
229     EXPECT_EQ(ret, E_SERVICE_NOT_READY);
230 
231     workSchedulerService_->ready_ = true;
232     ret = workSchedulerService_->StopAndClearWorks();
233     EXPECT_EQ(ret, 0);
234     WS_HILOGI("WorkSchedulerServiceTest.StopAndClearWorks_001 end");
235 }
236 
237 /**
238  * @tc.name: IsLastWorkTimeout_001
239  * @tc.desc: Test WorkSchedulerService IsLastWorkTimeout.
240  * @tc.type: FUNC
241  * @tc.require: I8F08T
242  */
HWTEST_F(WorkSchedulerServiceTest, IsLastWorkTimeout_001, TestSize.Level1)243 HWTEST_F(WorkSchedulerServiceTest, IsLastWorkTimeout_001, TestSize.Level1)
244 {
245     bool result;
246     auto ret = workSchedulerService_->IsLastWorkTimeout(1, result);
247     EXPECT_EQ(ret, E_WORK_NOT_EXIST_FAILED);
248 }
249 
250 /**
251  * @tc.name: ObtainAllWorks_001
252  * @tc.desc: Test WorkSchedulerService ObtainAllWorks.
253  * @tc.type: FUNC
254  * @tc.require: IA4HTC
255  */
HWTEST_F(WorkSchedulerServiceTest, ObtainAllWorks_001, TestSize.Level1)256 HWTEST_F(WorkSchedulerServiceTest, ObtainAllWorks_001, TestSize.Level1)
257 {
258     std::list<std::shared_ptr<WorkInfo>> workInfos;
259     auto ret = workSchedulerService_->ObtainAllWorks(workInfos);
260     EXPECT_EQ(ret, 0);
261 }
262 
263 /**
264  * @tc.name: GetWorkStatus_001
265  * @tc.desc: Test WorkSchedulerService GetWorkStatus.
266  * @tc.type: FUNC
267  * @tc.require: IA4HTC
268  */
HWTEST_F(WorkSchedulerServiceTest, GetWorkStatus_001, TestSize.Level1)269 HWTEST_F(WorkSchedulerServiceTest, GetWorkStatus_001, TestSize.Level1)
270 {
271     std::shared_ptr<WorkInfo> workInfo = std::make_shared<WorkInfo>();
272     int32_t workId;
273     auto ret = workSchedulerService_->GetWorkStatus(workId, workInfo);
274     EXPECT_EQ(ret, 0);
275 }
276 
277 /**
278  * @tc.name: GetAllRunningWorks_001
279  * @tc.desc: Test WorkSchedulerService GetAllRunningWorks.
280  * @tc.type: FUNC
281  * @tc.require: I8F08T
282  */
HWTEST_F(WorkSchedulerServiceTest, GetAllRunningWorks_001, TestSize.Level1)283 HWTEST_F(WorkSchedulerServiceTest, GetAllRunningWorks_001, TestSize.Level1)
284 {
285     std::list<std::shared_ptr<WorkInfo>> workInfos;
286 
287     auto ret = workSchedulerService_->GetAllRunningWorks(workInfos);
288     EXPECT_EQ(ret, E_INVALID_PROCESS_NAME);
289 }
290 
291 /**
292  * @tc.name: Datashare_001
293  * @tc.desc: Test Datashare
294  * @tc.type: FUNC
295  * @tc.require: I8ZDJI
296  */
HWTEST_F(WorkSchedulerServiceTest, Datashare_001, TestSize.Level1)297 HWTEST_F(WorkSchedulerServiceTest, Datashare_001, TestSize.Level1)
298 {
299     WS_HILOGI("====== test begin ====== ");
300     std::vector<std::string> argsInStr;
301     argsInStr.push_back("-k");
302     argsInStr.push_back("settings.power.suspend_sources");
303     std::string result;
304     workSchedulerService_->DumpProcessForEngMode(argsInStr, result);
305     WS_HILOGI("%{public}s", result.c_str());
306     EXPECT_EQ(result.empty(), 0);
307     WS_HILOGI("====== test end ====== ");
308 }
309 
HWTEST_F(WorkSchedulerServiceTest, ListenerStart_001, TestSize.Level1)310 HWTEST_F(WorkSchedulerServiceTest, ListenerStart_001, TestSize.Level1)
311 {
312     WS_HILOGI("====== ListenerStart_001 begin====== ");
313     for (auto pair : workSchedulerService_->workQueueManager_->listenerMap_)
314     {
315         pair.second->Start();
316     }
317     std::vector<std::pair<string, string>> infos = {
318         {"event", "info"},
319         {"network", "wifi"},
320         {"network", "disconnect"},
321         {"network", "invalid"},
322         {"charging", "usb"},
323         {"charging", "ac"},
324         {"charging", "wireless"},
325         {"charging", "none"},
326         {"charging", "invalid"},
327         {"storage", "low"},
328         {"storage", "ok"},
329         {"storage", "invalid"},
330         {"batteryStatus", "low"},
331         {"batteryStatus", "ok"},
332         {"batteryStatus", "invalid"},
333     };
334     EventPublisher eventPublisher;
335     for (auto it : infos) {
336         std::string result;
337         std::string eventType = it.first;
338         std::string eventValue = it.second;
339         eventPublisher.Dump(result, eventType, eventValue);
340         WS_HILOGI("%{public}s", result.c_str());
341         EXPECT_EQ(!result.empty(), true);
342     }
343     WS_HILOGI("====== ListenerStart_001 end ====== ");
344 }
345 
HWTEST_F(WorkSchedulerServiceTest, Dump_001, TestSize.Level1)346 HWTEST_F(WorkSchedulerServiceTest, Dump_001, TestSize.Level1)
347 {
348     WS_HILOGI("====== WorkSchedulerServiceTest.Dump_001 begin ====== ");
349     std::vector<std::string> argsInStr;
350     std::string result;
351     workSchedulerService_->DumpProcessForEngMode(argsInStr, result);
352     WS_HILOGI("%{public}s", result.c_str());
353 
354     argsInStr.clear();
355     result.clear();
356     argsInStr.push_back("-h");
357     workSchedulerService_->DumpProcessForEngMode(argsInStr, result);
358     WS_HILOGI("%{public}s", result.c_str());
359 
360     result.clear();
361     argsInStr.clear();
362     argsInStr.push_back("-a");
363     workSchedulerService_->DumpProcessForEngMode(argsInStr, result);
364     WS_HILOGI("%{public}s", result.c_str());
365 
366     result.clear();
367     argsInStr.clear();
368     argsInStr.push_back("-x");
369     workSchedulerService_->DumpProcessForEngMode(argsInStr, result);
370     WS_HILOGI("%{public}s", result.c_str());
371 
372     result.clear();
373     argsInStr.clear();
374     argsInStr.push_back("-memory");
375     argsInStr.push_back("100");
376     workSchedulerService_->DumpProcessForEngMode(argsInStr, result);
377     WS_HILOGI("%{public}s", result.c_str());
378 
379     result.clear();
380     argsInStr.clear();
381     argsInStr.push_back("-watchdog_time");
382     argsInStr.push_back("100");
383     workSchedulerService_->DumpProcessForEngMode(argsInStr, result);
384     EXPECT_FALSE(result.empty());
385     WS_HILOGI("%{public}s", result.c_str());
386     WS_HILOGI("====== WorkSchedulerServiceTest.Dump_001 end ====== ");
387 }
388 
HWTEST_F(WorkSchedulerServiceTest, Dump_002, TestSize.Level1)389 HWTEST_F(WorkSchedulerServiceTest, Dump_002, TestSize.Level1)
390 {
391     WS_HILOGI("====== WorkSchedulerServiceTest.Dump_002 begin ====== ");
392     std::vector<std::string> argsInStr;
393     std::string result;
394     argsInStr.push_back("-repeat_time_min");
395     argsInStr.push_back("100");
396     workSchedulerService_->DumpProcessForEngMode(argsInStr, result);
397     WS_HILOGI("%{public}s", result.c_str());
398 
399     result.clear();
400     argsInStr.clear();
401     argsInStr.push_back("-min_interval");
402     argsInStr.push_back("100");
403     workSchedulerService_->DumpProcessForEngMode(argsInStr, result);
404     WS_HILOGI("%{public}s", result.c_str());
405 
406     result.clear();
407     argsInStr.clear();
408     argsInStr.push_back("-test");
409     argsInStr.push_back("100");
410     workSchedulerService_->DumpProcessForEngMode(argsInStr, result);
411     WS_HILOGI("%{public}s", result.c_str());
412     EXPECT_EQ(result.empty(), false);
413     WS_HILOGI("====== WorkSchedulerServiceTest.Dump_002 end ====== ");
414 }
415 
HWTEST_F(WorkSchedulerServiceTest, Dump_003, TestSize.Level1)416 HWTEST_F(WorkSchedulerServiceTest, Dump_003, TestSize.Level1)
417 {
418     WS_HILOGI("====== WorkSchedulerServiceTest.Dump_003 begin ====== ");
419     std::vector<std::string> argsInStr;
420     std::string result;
421 
422     argsInStr.clear();
423     result.clear();
424     argsInStr.push_back("-d");
425     argsInStr.push_back("storage");
426     argsInStr.push_back("ok");
427     workSchedulerService_->DumpProcessForEngMode(argsInStr, result);
428     WS_HILOGI("%{public}s", result.c_str());
429 
430     argsInStr.clear();
431     result.clear();
432     argsInStr.push_back("-t");
433     argsInStr.push_back("bundlename");
434     argsInStr.push_back("abilityname");
435     workSchedulerService_->DumpProcessForEngMode(argsInStr, result);
436     WS_HILOGI("%{public}s", result.c_str());
437 
438     WorkInfo workinfo = WorkInfo();
439     result.clear();
440     workinfo.RequestStorageLevel(WorkCondition::Storage::STORAGE_LEVEL_LOW_OR_OKAY);
441     workinfo.RefreshUid(2);
442     workinfo.SetElement("bundlename", "abilityname");
443     workSchedulerService_->AddWorkInner(workinfo);
444     workSchedulerService_->DumpProcessForEngMode(argsInStr, result);
445     EXPECT_TRUE(result.empty());
446     WS_HILOGI("%{public}s", result.c_str());
447     WS_HILOGI("====== WorkSchedulerServiceTest.Dump_003 end ====== ");
448 }
449 
HWTEST_F(WorkSchedulerServiceTest, Dump_004, TestSize.Level1)450 HWTEST_F(WorkSchedulerServiceTest, Dump_004, TestSize.Level1)
451 {
452     WS_HILOGI("====== WorkSchedulerServiceTest.Dump_004 begin ====== ");
453     std::vector<std::string> argsInStr;
454     std::string result;
455     argsInStr.push_back("-d");
456     argsInStr.push_back("storage");
457     argsInStr.push_back("ok");
458     workSchedulerService_->DumpProcessForEngMode(argsInStr, result);
459     WS_HILOGI("%{public}s", result.c_str());
460 
461     argsInStr.clear();
462     argsInStr.push_back("arg0");
463     argsInStr.push_back("arg1");
464     argsInStr.push_back("arg2");
465     argsInStr.push_back("arg3");
466     argsInStr.push_back("arg4");
467     result.clear();
468     workSchedulerService_->DumpProcessForEngMode(argsInStr, result);
469     WS_HILOGI("%{public}s", result.c_str());
470     EXPECT_EQ(result.empty(), false);
471     WS_HILOGI("====== WorkSchedulerServiceTest.Dump_004 end ====== ");
472 }
473 
474 /**
475  * @tc.name: Dump_005
476  * @tc.desc: Test WorkSchedulerService Dump.
477  * @tc.type: FUNC
478  * @tc.require: I9RYLE
479  */
HWTEST_F(WorkSchedulerServiceTest, Dump_005, TestSize.Level1)480 HWTEST_F(WorkSchedulerServiceTest, Dump_005, TestSize.Level1)
481 {
482     WS_HILOGI("====== WorkSchedulerServiceTest.Dump_005 begin ====== ");
483     std::vector<std::string> argsInStr;
484     std::string result;
485     argsInStr.push_back("-count");
486     argsInStr.push_back("1");
487     workSchedulerService_->DumpProcessForEngMode(argsInStr, result);
488     WS_HILOGI("%{public}s", result.c_str());
489     EXPECT_EQ(result.empty(), false);
490     WS_HILOGI("====== WorkSchedulerServiceTest.Dump_005 end ====== ");
491 }
492 
493 /**
494  * @tc.name: Dump_006
495  * @tc.desc: Test WorkSchedulerService Dump.
496  * @tc.type: FUNC
497  * @tc.require: IAHY0B
498  */
HWTEST_F(WorkSchedulerServiceTest, Dump_006, TestSize.Level1)499 HWTEST_F(WorkSchedulerServiceTest, Dump_006, TestSize.Level1)
500 {
501     WS_HILOGI("====== WorkSchedulerServiceTest.Dump_006 begin ====== ");
502     std::vector<std::string> argsInStr;
503     std::string result;
504     argsInStr.push_back("-s");
505     argsInStr.push_back("1");
506     workSchedulerService_->DumpProcessForEngMode(argsInStr, result);
507     WS_HILOGI("%{public}s", result.c_str());
508     EXPECT_EQ(result.empty(), false);
509 
510     argsInStr.clear();
511     result.clear();
512     argsInStr.push_back("-s");
513     argsInStr.push_back("1");
514     argsInStr.push_back("1");
515     workSchedulerService_->DumpProcessForEngMode(argsInStr, result);
516     WS_HILOGI("%{public}s", result.c_str());
517     EXPECT_EQ(result.empty(), false);
518 
519     argsInStr.clear();
520     result.clear();
521     argsInStr.push_back("-s");
522     argsInStr.push_back("1");
523     argsInStr.push_back("true");
524     workSchedulerService_->DumpProcessForEngMode(argsInStr, result);
525     WS_HILOGI("%{public}s", result.c_str());
526     EXPECT_EQ(result.empty(), true);
527 
528     argsInStr.clear();
529     result.clear();
530     argsInStr.push_back("-s");
531     argsInStr.push_back("1");
532     argsInStr.push_back("false");
533     workSchedulerService_->DumpProcessForEngMode(argsInStr, result);
534     WS_HILOGI("%{public}s", result.c_str());
535     EXPECT_EQ(result.empty(), true);
536     WS_HILOGI("====== WorkSchedulerServiceTest.Dump_006 end ====== ");
537 }
538 
539 /**
540  * @tc.name: Dump_007
541  * @tc.desc: Test WorkSchedulerService Dump.
542  * @tc.type: FUNC
543  * @tc.require: IAJSVG
544  */
HWTEST_F(WorkSchedulerServiceTest, Dump_007, TestSize.Level1)545 HWTEST_F(WorkSchedulerServiceTest, Dump_007, TestSize.Level1)
546 {
547     WS_HILOGI("====== WorkSchedulerServiceTest.Dump_007 begin ====== ");
548     std::vector<std::string> argsInStr;
549     std::string result;
550     argsInStr.push_back("-x");
551     argsInStr.push_back("1");
552     argsInStr.push_back("1");
553     workSchedulerService_->DumpProcessForEngMode(argsInStr, result);
554     WS_HILOGI("%{public}s", result.c_str());
555     EXPECT_EQ(result.empty(), false);
556 
557     argsInStr.clear();
558     result.clear();
559     argsInStr.push_back("-x");
560     argsInStr.push_back("1");
561     argsInStr.push_back("p");
562     workSchedulerService_->DumpProcessForEngMode(argsInStr, result);
563     WS_HILOGI("%{public}s", result.c_str());
564     EXPECT_EQ(result.empty(), false);
565 
566     argsInStr.clear();
567     result.clear();
568     argsInStr.push_back("-x");
569     argsInStr.push_back("1");
570     argsInStr.push_back("r");
571     workSchedulerService_->DumpProcessForEngMode(argsInStr, result);
572     WS_HILOGI("%{public}s", result.c_str());
573     EXPECT_EQ(result.empty(), false);
574 
575     argsInStr.clear();
576     result.clear();
577     argsInStr.push_back("-cpu");
578     argsInStr.push_back("1");
579     workSchedulerService_->DumpProcessForEngMode(argsInStr, result);
580     WS_HILOGI("%{public}s", result.c_str());
581     EXPECT_EQ(result.empty(), false);
582     WS_HILOGI("====== WorkSchedulerServiceTest.Dump_007 end ====== ");
583 }
584 
585 /**
586  * @tc.name: Dump_008
587  * @tc.desc: Test WorkSchedulerService Dump.
588  * @tc.type: FUNC
589  * @tc.require: IAJSVG
590  */
HWTEST_F(WorkSchedulerServiceTest, Dump_008, TestSize.Level1)591 HWTEST_F(WorkSchedulerServiceTest, Dump_008, TestSize.Level1)
592 {
593     WS_HILOGI("====== WorkSchedulerServiceTest.Dump_008 begin ====== ");
594     std::vector<std::string> argsInStr;
595     std::string result;
596     argsInStr.push_back("-t");
597     argsInStr.push_back("bundlename");
598     argsInStr.push_back("abilityname");
599     workSchedulerService_->DumpProcessForUserMode(argsInStr, result);
600     EXPECT_EQ(result.empty(), true);
601     WS_HILOGI("====== WorkSchedulerServiceTest.Dump_008 end ====== ");
602 }
603 
HWTEST_F(WorkSchedulerServiceTest, WorkStandbyStateChangeCallbackTest_001, TestSize.Level1)604 HWTEST_F(WorkSchedulerServiceTest, WorkStandbyStateChangeCallbackTest_001, TestSize.Level1)
605 {
606     WS_HILOGI("====== WorkSchedulerServiceTest.WorkStandbyStateChangeCallbackTest_001 begin ====== ");
607     workSchedulerService_->standbyStateObserver_->OnDeviceIdleMode(true, false);
608     workSchedulerService_->standbyStateObserver_->OnDeviceIdleMode(true, true);
609     workSchedulerService_->standbyStateObserver_->OnDeviceIdleMode(false, true);
610     workSchedulerService_->standbyStateObserver_->OnAllowListChanged(0, "bundlename", 0, true);
611     EXPECT_NE(workSchedulerService_, nullptr);
612     WS_HILOGI("====== WorkSchedulerServiceTest.WorkStandbyStateChangeCallbackTest_001 end ====== ");
613 }
614 
HWTEST_F(WorkSchedulerServiceTest, WorkBundleGroupChangeCallback_001, TestSize.Level1)615 HWTEST_F(WorkSchedulerServiceTest, WorkBundleGroupChangeCallback_001, TestSize.Level1)
616 {
617     WS_HILOGI("====== WorkSchedulerServiceTest.WorkBundleGroupChangeCallback_001 begin ====== ");
618     OHOS::DeviceUsageStats::AppGroupCallbackInfo appGroupCallbackInfo1(0, 1, 2, 0, "bundlename");
619     workSchedulerService_->groupObserver_->OnAppGroupChanged(appGroupCallbackInfo1);
620     OHOS::DeviceUsageStats::AppGroupCallbackInfo appGroupCallbackInfo2(0, 2, 1, 0, "bundlename");
621     workSchedulerService_->groupObserver_->OnAppGroupChanged(appGroupCallbackInfo2);
622     EXPECT_NE(workSchedulerService_, nullptr);
623     WS_HILOGI("====== WorkSchedulerServiceTest.WorkBundleGroupChangeCallback_001 end ====== ");
624 }
625 
HWTEST_F(WorkSchedulerServiceTest, WorkSchedulerConnection_001, TestSize.Level1)626 HWTEST_F(WorkSchedulerServiceTest, WorkSchedulerConnection_001, TestSize.Level1)
627 {
628     WS_HILOGI("====== WorkSchedulerServiceTest.WorkSchedulerConnection_001 begin ====== ");
629     auto workinfo = std::make_shared<WorkInfo>();
630     WorkSchedulerConnection conection(workinfo);
631     AppExecFwk::ElementName element;
632     conection.StopWork();
633     conection.OnAbilityDisconnectDone(element, 0);
634     EXPECT_EQ(conection.proxy_, nullptr);
635     WS_HILOGI("====== WorkSchedulerServiceTest.WorkSchedulerConnection_001 end ====== ");
636 }
637 
HWTEST_F(WorkSchedulerServiceTest, SchedulerBgTaskSubscriber_001, TestSize.Level1)638 HWTEST_F(WorkSchedulerServiceTest, SchedulerBgTaskSubscriber_001, TestSize.Level1)
639 {
640     WS_HILOGI("====== WorkSchedulerServiceTest.SchedulerBgTaskSubscriber_001 begin ====== ");
641     SchedulerBgTaskSubscriber subscriber;
642     subscriber.OnProcEfficiencyResourcesApply(nullptr);
643     subscriber.OnProcEfficiencyResourcesReset(nullptr);
644     subscriber.OnAppEfficiencyResourcesApply(nullptr);
645     subscriber.OnAppEfficiencyResourcesReset(nullptr);
646 
647     auto resourceInfo = std::make_shared<BackgroundTaskMgr::ResourceCallbackInfo>(0, 0, 0xFFFF, "name");
648     subscriber.OnProcEfficiencyResourcesApply(resourceInfo);
649     subscriber.OnProcEfficiencyResourcesReset(resourceInfo);
650     subscriber.OnAppEfficiencyResourcesApply(resourceInfo);
651     subscriber.OnAppEfficiencyResourcesReset(resourceInfo);
652     WS_HILOGI("====== WorkSchedulerServiceTest.SchedulerBgTaskSubscriber_001 end ====== ");
653 }
654 
HWTEST_F(WorkSchedulerServiceTest, WorkQueueEventHandler_001, TestSize.Level1)655 HWTEST_F(WorkSchedulerServiceTest, WorkQueueEventHandler_001, TestSize.Level1)
656 {
657     WS_HILOGI("====== WorkSchedulerServiceTest.WorkQueueEventHandler_001 begin ====== ");
658     WorkQueueEventHandler handler(nullptr, nullptr);
659     AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(0);
660     handler.ProcessEvent(event);
661     event = AppExecFwk::InnerEvent::Get(1);
662     handler.ProcessEvent(event);
663     event = AppExecFwk::InnerEvent::Get(2);
664     handler.ProcessEvent(event);
665     WS_HILOGI("====== WorkSchedulerServiceTest.WorkQueueEventHandler_001 end ====== ");
666 }
667 
HWTEST_F(WorkSchedulerServiceTest, WorkEventHandler_001, TestSize.Level1)668 HWTEST_F(WorkSchedulerServiceTest, WorkEventHandler_001, TestSize.Level1)
669 {
670     WS_HILOGI("====== WorkSchedulerServiceTest.WorkEventHandler_001 begin ====== ");
671     WorkEventHandler handler(workSchedulerService_->eventRunner_, workSchedulerService_);
672     AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(0);
673     handler.ProcessEvent(event);
674     event = AppExecFwk::InnerEvent::Get(1);
675     handler.ProcessEvent(event);
676     event = AppExecFwk::InnerEvent::Get(2);
677     handler.ProcessEvent(event);
678     event = AppExecFwk::InnerEvent::Get(3);
679     handler.ProcessEvent(event);
680     event = AppExecFwk::InnerEvent::Get(4);
681     handler.ProcessEvent(event);
682     event = AppExecFwk::InnerEvent::Get(5);
683     handler.ProcessEvent(event);
684     EXPECT_TRUE(workSchedulerService_->eventRunner_ != nullptr);
685     WS_HILOGI("====== WorkSchedulerServiceTest.WorkEventHandler_001 end ====== ");
686 }
687 
HWTEST_F(WorkSchedulerServiceTest, BatteryLevelListener_001, TestSize.Level1)688 HWTEST_F(WorkSchedulerServiceTest, BatteryLevelListener_001, TestSize.Level1)
689 {
690     WS_HILOGI("====== WorkSchedulerServiceTest.BatteryLevelListener_001 begin ====== ");
691 
692     BatteryLevelListener batteryLevelListener(workSchedulerService_->workQueueManager_, workSchedulerService_);
693 
694     batteryLevelListener.Start();
695     EXPECT_NE(batteryLevelListener.commonEventSubscriber, nullptr);
696 
697     EventFwk::CommonEventData data;
698     batteryLevelListener.commonEventSubscriber->OnReceiveEvent(data);
699 
700     EventFwk::Want want;
701     want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_BATTERY_CHANGED);
702     data.SetWant(want);
703     batteryLevelListener.commonEventSubscriber->OnReceiveEvent(data);
704 
705     want.SetParam(PowerMgr::BatteryInfo::COMMON_EVENT_KEY_CAPACITY, 20);
706     data.SetWant(want);
707     batteryLevelListener.commonEventSubscriber->OnReceiveEvent(data);
708     batteryLevelListener.Stop();
709 
710     WS_HILOGI("====== WorkSchedulerServiceTest.BatteryLevelListener_001 end ====== ");
711 }
712 
HWTEST_F(WorkSchedulerServiceTest, BatteryStatusListener_001, TestSize.Level1)713 HWTEST_F(WorkSchedulerServiceTest, BatteryStatusListener_001, TestSize.Level1)
714 {
715     WS_HILOGI("====== WorkSchedulerServiceTest.BatteryStatusListener_001 begin ====== ");
716     BatteryStatusListener batteryStatusListener(workSchedulerService_->workQueueManager_);
717 
718     batteryStatusListener.Start();
719     EXPECT_NE(batteryStatusListener.commonEventSubscriber, nullptr);
720 
721     EventFwk::CommonEventData data;
722     batteryStatusListener.commonEventSubscriber->OnReceiveEvent(data);
723 
724     EventFwk::Want want;
725     want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_BATTERY_LOW);
726     data.SetWant(want);
727     batteryStatusListener.commonEventSubscriber->OnReceiveEvent(data);
728 
729     want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_BATTERY_OKAY);
730     data.SetWant(want);
731     batteryStatusListener.commonEventSubscriber->OnReceiveEvent(data);
732     batteryStatusListener.Stop();
733 
734     WS_HILOGI("====== WorkSchedulerServiceTest.BatteryStatusListener_001 end ====== ");
735 }
736 
HWTEST_F(WorkSchedulerServiceTest, ChargerListener_001, TestSize.Level1)737 HWTEST_F(WorkSchedulerServiceTest, ChargerListener_001, TestSize.Level1)
738 {
739     WS_HILOGI("====== WorkSchedulerServiceTest.ChargerListener_001 begin ====== ");
740     ChargerListener chargerListener(workSchedulerService_->workQueueManager_);
741 
742     chargerListener.Start();
743     EXPECT_NE(chargerListener.commonEventSubscriber, nullptr);
744 
745     EventFwk::CommonEventData data;
746     chargerListener.commonEventSubscriber->OnReceiveEvent(data);
747 
748     EventFwk::Want want;
749     want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_POWER_CONNECTED);
750     data.SetWant(want);
751     data.SetCode(static_cast<uint32_t>(PowerMgr::BatteryPluggedType::PLUGGED_TYPE_AC));
752     chargerListener.commonEventSubscriber->OnReceiveEvent(data);
753 
754     data.SetCode(static_cast<uint32_t>(PowerMgr::BatteryPluggedType::PLUGGED_TYPE_USB));
755     chargerListener.commonEventSubscriber->OnReceiveEvent(data);
756 
757 
758     data.SetCode(static_cast<uint32_t>(PowerMgr::BatteryPluggedType::PLUGGED_TYPE_WIRELESS));
759     chargerListener.commonEventSubscriber->OnReceiveEvent(data);
760 
761     want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_POWER_DISCONNECTED);
762     data.SetWant(want);
763     data.SetCode(static_cast<uint32_t>(PowerMgr::BatteryPluggedType::PLUGGED_TYPE_NONE));
764     chargerListener.commonEventSubscriber->OnReceiveEvent(data);
765     chargerListener.Stop();
766 
767     WS_HILOGI("====== WorkSchedulerServiceTest.ChargerListener_001 end ====== ");
768 }
769 
HWTEST_F(WorkSchedulerServiceTest, ListenerStop_001, TestSize.Level1)770 HWTEST_F(WorkSchedulerServiceTest, ListenerStop_001, TestSize.Level1)
771 {
772     WS_HILOGI("====== ListenerStop_001 begin====== ");
773     for (auto pair : workSchedulerService_->workQueueManager_->listenerMap_)
774     {
775         pair.second->Stop();
776     }
777     WS_HILOGI("====== ListenerStop_001 end ====== ");
778 }
779 
HWTEST_F(WorkSchedulerServiceTest, WorkSchedServiceStub_001, TestSize.Level1)780 HWTEST_F(WorkSchedulerServiceTest, WorkSchedServiceStub_001, TestSize.Level1)
781 {
782     MyWorkSchedulerService s;
783     MessageParcel data, reply;
784     MessageOption option;
785     const int size = 11;
786     for (int i = 0; i < size; i++) {
787         s.HandleRequest(i, data, reply, option);
788         WorkInfo info;
789         info.Marshalling(data);
790         s.HandleRequest(i, data, reply, option);
791     }
792     s.OnRemoteRequest(0, data, reply, option);
793 }
794 
795 /**
796  * @tc.name: SendEvent_001
797  * @tc.desc: Test WorkSchedulerService SendEvent.
798  * @tc.type: FUNC
799  * @tc.require: I9J0A7
800  */
HWTEST_F(WorkSchedulerServiceTest, SendEvent_001, TestSize.Level1)801 HWTEST_F(WorkSchedulerServiceTest, SendEvent_001, TestSize.Level1)
802 {
803     int32_t initDelay = 2 * 1000;
804     workSchedulerService_->GetHandler()->
805         SendEvent(AppExecFwk::InnerEvent::Get(WorkEventHandler::SERVICE_INIT_MSG, 0), initDelay);
806     EXPECT_TRUE(workSchedulerService_->ready_);
807 }
808 
809 /**
810  * @tc.name: GetAppIndexAndBundleNameByUid_001
811  * @tc.desc: Test WorkSchedulerService GetAppIndexAndBundleNameByUid.
812  * @tc.type: FUNC
813  * @tc.require: I9TL53
814  */
HWTEST_F(WorkSchedulerServiceTest, GetAppIndexAndBundleNameByUid_001, TestSize.Level1)815 HWTEST_F(WorkSchedulerServiceTest, GetAppIndexAndBundleNameByUid_001, TestSize.Level1)
816 {
817     int32_t appIndex;
818     std::string bundleName;
819     int32_t uid = 1;
820     bool ret = workSchedulerService_->GetAppIndexAndBundleNameByUid(uid, appIndex, bundleName);
821     EXPECT_FALSE(ret);
822 }
823 
824 /**
825  * @tc.name: LoadSa_001
826  * @tc.desc: Test WorkSchedulerService LoadSa.
827  * @tc.type: FUNC
828  * @tc.require: IAHY0B
829  */
HWTEST_F(WorkSchedulerServiceTest, LoadSa_001, TestSize.Level1)830 HWTEST_F(WorkSchedulerServiceTest, LoadSa_001, TestSize.Level1)
831 {
832     workSchedulerService_->ready_ = false;
833     workSchedulerService_->LoadSa();
834 
835     workSchedulerService_->ready_ = true;
836     workSchedulerService_->saMap_.clear();
837     workSchedulerService_->LoadSa();
838 
839     int32_t saId1 = 401;
840     workSchedulerService_->saMap_.emplace(saId1, true);
841     workSchedulerService_->LoadSa();
842 
843     workSchedulerService_->saMap_.emplace(saId1, false);
844     workSchedulerService_->LoadSa();
845 
846     int32_t saId2 = 5300;
847     workSchedulerService_->saMap_.emplace(saId2, true);
848     workSchedulerService_->LoadSa();
849 
850     workSchedulerService_->saMap_.emplace(saId2, false);
851     workSchedulerService_->LoadSa();
852     EXPECT_FALSE(workSchedulerService_->saMap_.empty());
853 }
854 
855 /**
856  * @tc.name: CheckExtensionInfos_001
857  * @tc.desc: Test WorkSchedulerService CheckExtensionInfos.
858  * @tc.type: FUNC
859  * @tc.require: IAJVZG
860  */
HWTEST_F(WorkSchedulerServiceTest, CheckExtensionInfos_001, TestSize.Level1)861 HWTEST_F(WorkSchedulerServiceTest, CheckExtensionInfos_001, TestSize.Level1)
862 {
863     int32_t uid = 1;
864     WorkInfo workInfo = WorkInfo();
865     workInfo.SetWorkId(1);
866     workInfo.SetElement("bundleName", "abilityName");
867     bool ret = workSchedulerService_->CheckExtensionInfos(workInfo, uid);
868     EXPECT_TRUE(ret);
869 }
870 
871 /**
872  * @tc.name: InitBgTaskSubscriber_001
873  * @tc.desc: Test WorkSchedulerService InitBgTaskSubscriber.
874  * @tc.type: FUNC
875  * @tc.require: IAJSVG
876  */
HWTEST_F(WorkSchedulerServiceTest, InitBgTaskSubscriber_001, TestSize.Level1)877 HWTEST_F(WorkSchedulerServiceTest, InitBgTaskSubscriber_001, TestSize.Level1)
878 {
879     bool ret = workSchedulerService_->InitBgTaskSubscriber();
880     EXPECT_TRUE(ret);
881 }
882 
883 /**
884  * @tc.name: AllowDump_001
885  * @tc.desc: Test WorkSchedulerService AllowDump.
886  * @tc.type: FUNC
887  * @tc.require: IAJSVG
888  */
HWTEST_F(WorkSchedulerServiceTest, AllowDump_001, TestSize.Level1)889 HWTEST_F(WorkSchedulerServiceTest, AllowDump_001, TestSize.Level1)
890 {
891     bool ret = workSchedulerService_->AllowDump();
892     EXPECT_FALSE(ret);
893 }
894 
895 /**
896  * @tc.name: UpdateWorkBeforeRealStart_001
897  * @tc.desc: Test WorkSchedulerService UpdateWorkBeforeRealStart.
898  * @tc.type: FUNC
899  * @tc.require: IAJSVG
900  */
HWTEST_F(WorkSchedulerServiceTest, UpdateWorkBeforeRealStart_001, TestSize.Level1)901 HWTEST_F(WorkSchedulerServiceTest, UpdateWorkBeforeRealStart_001, TestSize.Level1)
902 {
903     std::shared_ptr<WorkStatus> workStatus = nullptr;
904     workSchedulerService_->UpdateWorkBeforeRealStart(workStatus);
905 
906     WorkInfo workInfo = WorkInfo();
907     workStatus = std::make_shared<WorkStatus>(workInfo, 1);
908     workStatus->conditionMap_.clear();
909     workSchedulerService_->UpdateWorkBeforeRealStart(workStatus);
910 
911     std::shared_ptr<Condition> repeatCycle = std::make_shared<Condition>();
912     repeatCycle->boolVal = true;
913     workStatus->conditionMap_.emplace(WorkCondition::Type::TIMER, repeatCycle);
914     workSchedulerService_->UpdateWorkBeforeRealStart(workStatus);
915     EXPECT_TRUE(repeatCycle->intVal == 0);
916 }
917 
918 /**
919  * @tc.name: CheckEffiResApplyInfo_001
920  * @tc.desc: Test WorkSchedulerService CheckEffiResApplyInfo.
921  * @tc.type: FUNC
922  * @tc.require: IAJSVG
923  */
HWTEST_F(WorkSchedulerServiceTest, CheckEffiResApplyInfo_001, TestSize.Level1)924 HWTEST_F(WorkSchedulerServiceTest, CheckEffiResApplyInfo_001, TestSize.Level1)
925 {
926     bool ret = workSchedulerService_->CheckEffiResApplyInfo(1);
927     EXPECT_FALSE(ret);
928 }
929 
930 /**
931  * @tc.name: PauseRunningWorks_001
932  * @tc.desc: Test WorkSchedulerService PauseRunningWorks.
933  * @tc.type: FUNC
934  * @tc.require: IAJSVG
935  */
HWTEST_F(WorkSchedulerServiceTest, PauseRunningWorks_001, TestSize.Level1)936 HWTEST_F(WorkSchedulerServiceTest, PauseRunningWorks_001, TestSize.Level1)
937 {
938     workSchedulerService_->TriggerWorkIfConditionReady();
939     workSchedulerService_->PauseRunningWorks(1);
940     workSchedulerService_->ResumePausedWorks(1);
941 }
942 
943 /**
944  * @tc.name: OnAddSystemAbility_001
945  * @tc.desc: Test WorkSchedulerService OnAddSystemAbility.
946  * @tc.type: FUNC
947  * @tc.require: IAJSVG
948  */
HWTEST_F(WorkSchedulerServiceTest, OnAddSystemAbility_001, TestSize.Level1)949 HWTEST_F(WorkSchedulerServiceTest, OnAddSystemAbility_001, TestSize.Level1)
950 {
951     std::string deviceId;
952     int32_t DEVICE_STANDBY_SERVICE_SYSTEM_ABILITY_ID = 1914;
953     int32_t DEVICE_USAGE_STATISTICS_SYS_ABILITY_ID = 1907;
954     workSchedulerService_->OnAddSystemAbility(DEVICE_USAGE_STATISTICS_SYS_ABILITY_ID, deviceId);
955     workSchedulerService_->OnRemoveSystemAbility(DEVICE_USAGE_STATISTICS_SYS_ABILITY_ID, deviceId);
956 
957     workSchedulerService_->OnAddSystemAbility(DEVICE_STANDBY_SERVICE_SYSTEM_ABILITY_ID, deviceId);
958     workSchedulerService_->OnRemoveSystemAbility(DEVICE_STANDBY_SERVICE_SYSTEM_ABILITY_ID, deviceId);
959 }
960 
961 /**
962  * @tc.name: IsDebugApp_001
963  * @tc.desc: Test WorkSchedulerService IsDebugApp.
964  * @tc.type: FUNC
965  * @tc.require: IAJSVG
966  */
HWTEST_F(WorkSchedulerServiceTest, IsDebugApp_001, TestSize.Level1)967 HWTEST_F(WorkSchedulerServiceTest, IsDebugApp_001, TestSize.Level1)
968 {
969     bool ret = workSchedulerService_->IsDebugApp("bundleName");
970     EXPECT_FALSE(ret);
971 }
972 }
973 }