• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "schedule_node_test.h"
17 
18 #include "iam_ptr.h"
19 #include "schedule_node.h"
20 
21 #include "mock_executor_callback.h"
22 #include "mock_resource_node.h"
23 #include "mock_schedule_node_callback.h"
24 #include "mock_thread_handler.h"
25 #include "relative_timer.h"
26 
27 namespace OHOS {
28 namespace UserIam {
29 namespace UserAuth {
30 using namespace testing;
31 using namespace testing::ext;
32 
SetUpTestCase()33 void ScheduleNodeTest::SetUpTestCase()
34 {
35 }
36 
TearDownTestCase()37 void ScheduleNodeTest::TearDownTestCase()
38 {
39 }
40 
SetUp()41 void ScheduleNodeTest::SetUp()
42 {
43 }
44 
TearDown()45 void ScheduleNodeTest::TearDown()
46 {
47 }
48 
49 HWTEST_F(ScheduleNodeTest, ScheduleNodeBuilderWithNullptr, TestSize.Level0)
50 {
51     auto builder = ScheduleNode::Builder::New(nullptr, nullptr);
52     EXPECT_EQ(builder, nullptr);
53 }
54 
55 HWTEST_F(ScheduleNodeTest, ScheduleNodeBuilderOneCollectorFailed, TestSize.Level0)
56 {
57     {
58         auto faceCollector = MockResourceNode::CreateWithExecuteIndex(1, FACE, COLLECTOR);
59         auto builder = ScheduleNode::Builder::New(faceCollector, faceCollector);
60         EXPECT_EQ(builder, nullptr);
61     }
62     {
63         auto faceVerifier = MockResourceNode::CreateWithExecuteIndex(1, FACE, VERIFIER);
64         auto builder = ScheduleNode::Builder::New(faceVerifier, faceVerifier);
65         EXPECT_EQ(builder, nullptr);
66     }
67 
68     {
69         auto faceAllInOne = MockResourceNode::CreateWithExecuteIndex(1, FACE, ALL_IN_ONE);
70         auto builder = ScheduleNode::Builder::New(faceAllInOne, faceAllInOne);
71         ASSERT_NE(builder, nullptr);
72         auto scheduleNode = builder->Build();
73         ASSERT_NE(scheduleNode, nullptr);
74 
75         EXPECT_EQ(scheduleNode->GetCollectorExecutor().lock(), faceAllInOne);
76         EXPECT_EQ(scheduleNode->GetVerifyExecutor().lock(), faceAllInOne);
77     }
78 
79     {
80         auto faceAllInOne = MockResourceNode::CreateWithExecuteIndex(1, FACE, ALL_IN_ONE);
81         auto faceVerifier = MockResourceNode::CreateWithExecuteIndex(1, FACE, VERIFIER);
82         auto builder = ScheduleNode::Builder::New(faceVerifier, faceAllInOne);
83         EXPECT_EQ(builder, nullptr);
84     }
85 
86     {
87         auto faceAllInOne = MockResourceNode::CreateWithExecuteIndex(1, FACE, ALL_IN_ONE);
88         auto faceVerifier = MockResourceNode::CreateWithExecuteIndex(1, FACE, VERIFIER);
89         auto builder = ScheduleNode::Builder::New(faceAllInOne, faceVerifier);
90         EXPECT_EQ(builder, nullptr);
91     }
92 
93     {
94         auto faceAllInOne = MockResourceNode::CreateWithExecuteIndex(1, FACE, ALL_IN_ONE);
95         auto faceCollector = MockResourceNode::CreateWithExecuteIndex(1, FACE, COLLECTOR);
96         auto builder = ScheduleNode::Builder::New(faceCollector, faceAllInOne);
97         EXPECT_EQ(builder, nullptr);
98     }
99 
100     {
101         auto faceAllInOne = MockResourceNode::CreateWithExecuteIndex(1, FACE, ALL_IN_ONE);
102         auto faceCollector = MockResourceNode::CreateWithExecuteIndex(1, FACE, COLLECTOR);
103         auto builder = ScheduleNode::Builder::New(faceAllInOne, faceCollector);
104         EXPECT_EQ(builder, nullptr);
105     }
106 }
107 
108 HWTEST_F(ScheduleNodeTest, ScheduleNodeBuilderOneCollectorSuccess, TestSize.Level0)
109 {
110     {
111         auto faceAllInOne = MockResourceNode::CreateWithExecuteIndex(1, FACE, ALL_IN_ONE);
112         auto builder = ScheduleNode::Builder::New(faceAllInOne, faceAllInOne);
113         ASSERT_NE(builder, nullptr);
114         auto scheduleNode = builder->Build();
115         ASSERT_NE(scheduleNode, nullptr);
116 
117         EXPECT_EQ(scheduleNode->GetCollectorExecutor().lock(), faceAllInOne);
118         EXPECT_EQ(scheduleNode->GetVerifyExecutor().lock(), faceAllInOne);
119     }
120 }
121 
122 HWTEST_F(ScheduleNodeTest, ScheduleNodeBuilderTwoExecutorsFailed, TestSize.Level0)
123 {
124     {
125         auto faceCollector = MockResourceNode::CreateWithExecuteIndex(1, FACE, COLLECTOR);
126         auto builder = ScheduleNode::Builder::New(faceCollector, faceCollector);
127         EXPECT_EQ(builder, nullptr);
128     }
129 
130     {
131         auto faceVerifier = MockResourceNode::CreateWithExecuteIndex(1, FACE, VERIFIER);
132         auto builder = ScheduleNode::Builder::New(faceVerifier, faceVerifier);
133         EXPECT_EQ(builder, nullptr);
134     }
135 
136     {
137         auto faceCollector = MockResourceNode::CreateWithExecuteIndex(1, FACE, COLLECTOR);
138         auto faceVerifier = MockResourceNode::CreateWithExecuteIndex(1, FACE, VERIFIER);
139         // test paras error
140         auto builder = ScheduleNode::Builder::New(faceVerifier, faceCollector);
141         EXPECT_EQ(builder, nullptr);
142     }
143 
144     {
145         auto faceCollector = MockResourceNode::CreateWithExecuteIndex(1, FACE, COLLECTOR);
146         auto pinVerifier = MockResourceNode::CreateWithExecuteIndex(1, PIN, VERIFIER);
147         auto builder = ScheduleNode::Builder::New(faceCollector, pinVerifier);
148         EXPECT_EQ(builder, nullptr);
149     }
150 }
151 
152 HWTEST_F(ScheduleNodeTest, ScheduleNodeBuilderTwoExecutorsSuccess, TestSize.Level0)
153 {
154     {
155         auto faceCollector = MockResourceNode::CreateWithExecuteIndex(1, FACE, COLLECTOR);
156         auto faceVerifier = MockResourceNode::CreateWithExecuteIndex(1, FACE, VERIFIER);
157         auto builder = ScheduleNode::Builder::New(faceCollector, faceVerifier);
158         ASSERT_NE(builder, nullptr);
159 
160         auto scheduleNode = builder->Build();
161         ASSERT_NE(scheduleNode, nullptr);
162 
163         EXPECT_EQ(scheduleNode->GetCollectorExecutor().lock(), faceCollector);
164         EXPECT_EQ(scheduleNode->GetVerifyExecutor().lock(), faceVerifier);
165     }
166 }
167 
168 HWTEST_F(ScheduleNodeTest, ScheduleNodeBuilderMismatchAuthType, TestSize.Level0)
169 {
170     {
171         auto faceAllInOne = MockResourceNode::CreateWithExecuteIndex(1, FACE, ALL_IN_ONE);
172         auto builder = ScheduleNode::Builder::New(faceAllInOne, faceAllInOne);
173         ASSERT_NE(builder, nullptr);
174         auto scheduleNode = builder->Build();
175         ASSERT_NE(scheduleNode, nullptr);
176     }
177 
178     {
179         auto faceAllInOne = MockResourceNode::CreateWithExecuteIndex(1, FACE, ALL_IN_ONE);
180         auto builder = ScheduleNode::Builder::New(faceAllInOne, faceAllInOne);
181         ASSERT_NE(builder, nullptr);
182         builder->SetAuthType(PIN);
183         auto scheduleNode = builder->Build();
184         ASSERT_EQ(scheduleNode, nullptr);
185     }
186 }
187 
188 HWTEST_F(ScheduleNodeTest, ScheduleNodeBuilderOtherParameters, TestSize.Level0)
189 {
190     {
191         constexpr uint32_t EXECUTOR_MATCHER = 0xDEEDBEEF;
192         constexpr uint32_t SCHEDULE_ID = 0xBEEFABCD;
193         std::vector<uint64_t> TEMPLATE_LIST = {1, 2, 3, 4};
194         auto faceAllInOne = MockResourceNode::CreateWithExecuteIndex(1, FACE, ALL_IN_ONE);
195         auto builder = ScheduleNode::Builder::New(faceAllInOne, faceAllInOne);
196         ASSERT_NE(builder, nullptr);
197 
198         builder->SetExecutorMatcher(EXECUTOR_MATCHER);
199         builder->SetScheduleId(SCHEDULE_ID);
200         builder->SetScheduleMode(IDENTIFY);
201         builder->SetTemplateIdList(TEMPLATE_LIST);
202 
203         auto scheduleNode = builder->Build();
204         ASSERT_NE(scheduleNode, nullptr);
205 
206         EXPECT_EQ(scheduleNode->GetCollectorExecutor().lock(), faceAllInOne);
207         EXPECT_EQ(scheduleNode->GetVerifyExecutor().lock(), faceAllInOne);
208 
209         EXPECT_EQ(scheduleNode->GetAuthType(), FACE);
210         EXPECT_EQ(scheduleNode->GetExecutorMatcher(), EXECUTOR_MATCHER);
211         EXPECT_EQ(scheduleNode->GetScheduleId(), SCHEDULE_ID);
212         EXPECT_EQ(scheduleNode->GetScheduleMode(), IDENTIFY);
213         EXPECT_TRUE(scheduleNode->GetTemplateIdList().has_value());
214         EXPECT_THAT(scheduleNode->GetTemplateIdList().value(), ElementsAreArray(TEMPLATE_LIST));
215     }
216 }
217 
218 HWTEST_F(ScheduleNodeTest, ScheduleNodeBuilderOtherParametersNoTemplate, TestSize.Level0)
219 {
220     {
221         constexpr uint32_t EXECUTOR_MATCHER = 0xDEEDBEEF;
222         constexpr uint32_t SCHEDULE_ID = 0xBEEFABCD;
223         auto faceAllInOne = MockResourceNode::CreateWithExecuteIndex(1, FACE, ALL_IN_ONE);
224         auto builder = ScheduleNode::Builder::New(faceAllInOne, faceAllInOne);
225         ASSERT_NE(builder, nullptr);
226         builder->SetExecutorMatcher(EXECUTOR_MATCHER);
227         builder->SetScheduleId(SCHEDULE_ID);
228         builder->SetScheduleMode(IDENTIFY);
229         auto scheduleNode = builder->Build();
230         ASSERT_NE(scheduleNode, nullptr);
231 
232         EXPECT_EQ(scheduleNode->GetCollectorExecutor().lock(), faceAllInOne);
233         EXPECT_EQ(scheduleNode->GetVerifyExecutor().lock(), faceAllInOne);
234 
235         EXPECT_EQ(scheduleNode->GetAuthType(), FACE);
236         EXPECT_EQ(scheduleNode->GetExecutorMatcher(), EXECUTOR_MATCHER);
237         EXPECT_EQ(scheduleNode->GetScheduleId(), SCHEDULE_ID);
238         EXPECT_EQ(scheduleNode->GetScheduleMode(), IDENTIFY);
239         EXPECT_FALSE(scheduleNode->GetTemplateIdList().has_value());
240     }
241 }
242 
243 HWTEST_F(ScheduleNodeTest, ScheduleNodeStartAllInOneFailed, TestSize.Level0)
244 {
245     MockExecutorCallback executor;
246     EXPECT_CALL(executor, OnBeginExecute(_, _, _)).WillOnce(Return(1));
247 
248     auto callback = MockScheduleNodeCallback::Create();
249     EXPECT_CALL(*callback, OnScheduleStarted()).Times(0);
250     EXPECT_CALL(*callback, OnScheduleStoped(_, _)).Times(1);
251 
252     auto handler = ThreadHandler::GetSingleThreadInstance();
253     {
254         constexpr uint32_t EXECUTOR_INDEX = 0xAAAAAAA;
255         constexpr uint32_t EXECUTOR_MATCHER = 0xDEEDBEEF;
256         constexpr uint32_t SCHEDULE_ID = 0xBEEFABCD;
257         auto faceAllInOne = MockResourceNode::CreateWithExecuteIndex(EXECUTOR_INDEX, FACE, ALL_IN_ONE, executor);
258         auto builder = ScheduleNode::Builder::New(faceAllInOne, faceAllInOne);
259         ASSERT_NE(builder, nullptr);
260         builder->SetThreadHandler(handler);
261         builder->SetExecutorMatcher(EXECUTOR_MATCHER);
262         builder->SetScheduleId(SCHEDULE_ID);
263         builder->SetScheduleMode(IDENTIFY);
264         builder->SetScheduleCallback(callback);
265 
266         auto scheduleNode = builder->Build();
267         ASSERT_NE(scheduleNode, nullptr);
268 
269         EXPECT_TRUE(scheduleNode->StartSchedule());
270         handler->EnsureTask(nullptr);
271 
272         EXPECT_EQ(scheduleNode->GetCurrentScheduleState(), ScheduleNode::S_END);
273     }
274     handler->EnsureTask(nullptr);
275 }
276 
277 HWTEST_F(ScheduleNodeTest, ScheduleNodeStartAllInOneSuccess, TestSize.Level0)
278 {
279     MockExecutorCallback executor;
280     EXPECT_CALL(executor, OnBeginExecute(_, _, _)).WillOnce(Return(0));
281 
282     auto callback = MockScheduleNodeCallback::Create();
283     EXPECT_CALL(*callback, OnScheduleStarted()).Times(1);
284 
285     auto handler = ThreadHandler::GetSingleThreadInstance();
286     {
287         constexpr uint32_t EXECUTOR_INDEX = 0xAAAAAAA;
288         constexpr uint32_t EXECUTOR_MATCHER = 0xDEEDBEEF;
289         constexpr uint32_t SCHEDULE_ID = 0xBEEFABCD;
290         auto faceAllInOne = MockResourceNode::CreateWithExecuteIndex(EXECUTOR_INDEX, FACE, ALL_IN_ONE, executor);
291         auto builder = ScheduleNode::Builder::New(faceAllInOne, faceAllInOne);
292         ASSERT_NE(builder, nullptr);
293         builder->SetExecutorMatcher(EXECUTOR_MATCHER);
294         builder->SetThreadHandler(handler);
295         builder->SetScheduleId(SCHEDULE_ID);
296         builder->SetScheduleMode(IDENTIFY);
297         builder->SetScheduleCallback(callback);
298 
299         auto scheduleNode = builder->Build();
300         ASSERT_NE(scheduleNode, nullptr);
301 
302         EXPECT_TRUE(scheduleNode->StartSchedule());
303         handler->EnsureTask(nullptr);
304         EXPECT_EQ(scheduleNode->GetCurrentScheduleState(), ScheduleNode::S_AUTH_PROCESSING);
305     }
306     handler->EnsureTask(nullptr);
307 }
308 
309 HWTEST_F(ScheduleNodeTest, ScheduleNodeStartAllInOneSuccessButTimeout, TestSize.Level0)
310 {
311     using namespace std::chrono;
312 
313     std::promise<void> ensure;
314     MockExecutorCallback executor;
315     auto callback = MockScheduleNodeCallback::Create();
316     ON_CALL(*callback, OnScheduleStoped(_, _))
317         .WillByDefault(
__anon7044e28e0102(int32_t resultCode, const std::shared_ptr<Attributes> &finalResult) 318             [&ensure](int32_t resultCode, const std::shared_ptr<Attributes> &finalResult) { ensure.set_value(); });
319 
320     auto handler = ThreadHandler::GetSingleThreadInstance();
321     {
322         constexpr uint32_t EXECUTOR_INDEX = 0xAAAAAAA;
323         constexpr uint32_t EXECUTOR_MATCHER = 0xDEEDBEEF;
324         constexpr uint32_t SCHEDULE_ID = 0xBEEFABCD;
325         auto faceAllInOne = MockResourceNode::CreateWithExecuteIndex(EXECUTOR_INDEX, FACE, ALL_IN_ONE, executor);
326         auto builder = ScheduleNode::Builder::New(faceAllInOne, faceAllInOne);
327         ASSERT_NE(builder, nullptr);
328         builder->SetExecutorMatcher(EXECUTOR_MATCHER);
329         builder->SetThreadHandler(handler);
330         builder->SetScheduleId(SCHEDULE_ID);
331         builder->SetScheduleMode(IDENTIFY);
332         builder->SetExpiredTime(550);
333         builder->SetScheduleCallback(callback);
334 
335         auto scheduleNode = builder->Build();
336         ASSERT_NE(scheduleNode, nullptr);
337 
338         InSequence s; // the following four method will be invoke in sequence
339         EXPECT_CALL(executor, OnBeginExecute(_, _, _)).WillOnce(Return(0));
340         EXPECT_CALL(*callback, OnScheduleStarted()).Times(1);
341         EXPECT_CALL(executor, OnEndExecute(_, _)).WillOnce(Return(0));
342         EXPECT_CALL(*callback, OnScheduleStoped(TIMEOUT, _)).Times(1);
343 
344         const time_point<system_clock> start = system_clock::now();
345         EXPECT_TRUE(scheduleNode->StartSchedule());
346         handler->EnsureTask(nullptr);
347         EXPECT_EQ(scheduleNode->GetCurrentScheduleState(), ScheduleNode::S_AUTH_PROCESSING);
348         ensure.get_future().get();
349         EXPECT_EQ(scheduleNode->GetCurrentScheduleState(), ScheduleNode::S_END);
350         time_point<system_clock> finish = system_clock::now();
351         auto cost = duration_cast<milliseconds>(finish - start).count();
352         EXPECT_GT(cost, 540);
353         EXPECT_LT(cost, 560);
354     }
355     handler->EnsureTask(nullptr);
356 }
357 
358 HWTEST_F(ScheduleNodeTest, ScheduleNodeStartAllInOneSuccessButTimeoutAndEndFail, TestSize.Level0)
359 {
360     using namespace std::chrono;
361 
362     std::promise<void> ensure;
363     MockExecutorCallback executor;
364     auto callback = MockScheduleNodeCallback::Create();
365     ON_CALL(*callback, OnScheduleStoped(_, _))
366         .WillByDefault(
__anon7044e28e0202(int32_t resultCode, const std::shared_ptr<Attributes> &finalResult) 367             [&ensure](int32_t resultCode, const std::shared_ptr<Attributes> &finalResult) { ensure.set_value(); });
368 
369     auto handler = ThreadHandler::GetSingleThreadInstance();
370     {
371         constexpr uint32_t EXECUTOR_INDEX = 0xAAAAAAA;
372         constexpr uint32_t EXECUTOR_MATCHER = 0xDEEDBEEF;
373         constexpr uint32_t SCHEDULE_ID = 0xBEEFABCD;
374         std::vector<uint64_t> TEMPLATE_LIST = {1};
375         auto faceAllInOne = MockResourceNode::CreateWithExecuteIndex(EXECUTOR_INDEX, FACE, ALL_IN_ONE, executor);
376         auto builder = ScheduleNode::Builder::New(faceAllInOne, faceAllInOne);
377         ASSERT_NE(builder, nullptr);
378         builder->SetExecutorMatcher(EXECUTOR_MATCHER);
379         builder->SetThreadHandler(handler);
380         builder->SetScheduleId(SCHEDULE_ID);
381         builder->SetScheduleMode(IDENTIFY);
382         builder->SetExpiredTime(550);
383         builder->SetScheduleCallback(callback);
384         auto parameters = Common::MakeShared<Attributes>();
385         EXPECT_NE(parameters, nullptr);
386         builder->SetParametersAttributes(parameters);
387         builder->SetTemplateIdList(TEMPLATE_LIST);
388 
389         auto scheduleNode = builder->Build();
390         ASSERT_NE(scheduleNode, nullptr);
391 
392         InSequence s; // the following four method will be invoke in sequence
393         EXPECT_CALL(executor, OnBeginExecute(_, _, _)).WillOnce(Return(0));
394         EXPECT_CALL(*callback, OnScheduleStarted()).Times(1);
395         EXPECT_CALL(executor, OnEndExecute(_, _)).WillOnce(Return(1)); // mock end failed
396         EXPECT_CALL(*callback, OnScheduleStoped(TIMEOUT, _)).Times(1);
397 
398         const time_point<system_clock> start = system_clock::now();
399         EXPECT_TRUE(scheduleNode->StartSchedule());
400         handler->EnsureTask(nullptr);
401         EXPECT_EQ(scheduleNode->GetCurrentScheduleState(), ScheduleNode::S_AUTH_PROCESSING);
402         ensure.get_future().get();
403         EXPECT_EQ(scheduleNode->GetCurrentScheduleState(), ScheduleNode::S_END);
404         time_point<system_clock> finish = system_clock::now();
405         auto cost = duration_cast<milliseconds>(finish - start).count();
406         EXPECT_GT(cost, 540);
407         EXPECT_LT(cost, 560);
408     }
409     handler->EnsureTask(nullptr);
410 }
411 
412 HWTEST_F(ScheduleNodeTest, ScheduleNodeStartAllInOneSuccessGetResult, TestSize.Level0)
413 {
414     using namespace std::chrono;
415 
416     std::promise<void> ensure;
417     MockExecutorCallback executor;
418     auto callback = MockScheduleNodeCallback::Create();
419     ON_CALL(*callback, OnScheduleStoped(_, _))
420         .WillByDefault(
__anon7044e28e0302(int32_t resultCode, const std::shared_ptr<Attributes> &finalResult) 421             [&ensure](int32_t resultCode, const std::shared_ptr<Attributes> &finalResult) { ensure.set_value(); });
422 
423     auto handler = ThreadHandler::GetSingleThreadInstance();
424     {
425         constexpr uint32_t EXECUTOR_INDEX = 0xAAAAAAA;
426         constexpr uint32_t EXECUTOR_MATCHER = 0xDEEDBEEF;
427         constexpr uint32_t SCHEDULE_ID = 0xBEEFABCD;
428         auto faceAllInOne = MockResourceNode::CreateWithExecuteIndex(EXECUTOR_INDEX, FACE, ALL_IN_ONE, executor);
429         auto builder = ScheduleNode::Builder::New(faceAllInOne, faceAllInOne);
430         ASSERT_NE(builder, nullptr);
431         builder->SetExecutorMatcher(EXECUTOR_MATCHER);
432         builder->SetThreadHandler(handler);
433         builder->SetScheduleId(SCHEDULE_ID);
434         builder->SetScheduleMode(IDENTIFY);
435         builder->SetScheduleCallback(callback);
436         std::shared_ptr<Attributes> parameters = nullptr;
437         builder->SetParametersAttributes(parameters);
438 
439         auto scheduleNode = builder->Build();
440         ASSERT_NE(scheduleNode, nullptr);
441 
442         InSequence s; // the following four method will be invoke in sequence
443         EXPECT_CALL(executor, OnBeginExecute(_, _, _)).WillOnce(Return(0));
444         EXPECT_CALL(*callback, OnScheduleStarted()).Times(1);
445         EXPECT_CALL(*callback, OnScheduleStoped(SUCCESS, _)).Times(1);
446 
447         const time_point<system_clock> start = system_clock::now();
448 
449         // return success after 550ms
__anon7044e28e0402() 450         RelativeTimer::GetInstance().Register([&scheduleNode]() { scheduleNode->ContinueSchedule(SUCCESS, nullptr); },
451             550);
452 
453         EXPECT_TRUE(scheduleNode->StartSchedule());
454         handler->EnsureTask(nullptr);
455         EXPECT_EQ(scheduleNode->GetCurrentScheduleState(), ScheduleNode::S_AUTH_PROCESSING);
456         ensure.get_future().get();
457         EXPECT_EQ(scheduleNode->GetCurrentScheduleState(), ScheduleNode::S_END);
458         time_point<system_clock> finish = system_clock::now();
459         auto cost = duration_cast<milliseconds>(finish - start).count();
460         EXPECT_GT(cost, 540);
461         EXPECT_LT(cost, 560);
462     }
463     handler->EnsureTask(nullptr);
464 }
465 
466 HWTEST_F(ScheduleNodeTest, ScheduleNodeStartAllInOneUserStop, TestSize.Level0)
467 {
468     using namespace std::chrono;
469 
470     std::promise<void> ensure;
471     MockExecutorCallback executor;
472     auto callback = MockScheduleNodeCallback::Create();
473     ON_CALL(*callback, OnScheduleStoped(_, _))
474         .WillByDefault(
__anon7044e28e0502(int32_t resultCode, const std::shared_ptr<Attributes> &finalResult) 475             [&ensure](int32_t resultCode, const std::shared_ptr<Attributes> &finalResult) { ensure.set_value(); });
476 
477     auto handler = ThreadHandler::GetSingleThreadInstance();
478     {
479         constexpr uint32_t EXECUTOR_INDEX = 0xAAAAAAA;
480         constexpr uint32_t EXECUTOR_MATCHER = 0xDEEDBEEF;
481         constexpr uint32_t SCHEDULE_ID = 0xBEEFABCD;
482         auto faceAllInOne = MockResourceNode::CreateWithExecuteIndex(EXECUTOR_INDEX, FACE, ALL_IN_ONE, executor);
483         auto builder = ScheduleNode::Builder::New(faceAllInOne, faceAllInOne);
484         ASSERT_NE(builder, nullptr);
485         builder->SetExecutorMatcher(EXECUTOR_MATCHER);
486         builder->SetThreadHandler(handler);
487         builder->SetScheduleId(SCHEDULE_ID);
488         builder->SetScheduleMode(IDENTIFY);
489         builder->SetScheduleCallback(callback);
490 
491         auto scheduleNode = builder->Build();
492         ASSERT_NE(scheduleNode, nullptr);
493 
494         InSequence s; // the following four method will be invoke in sequence
495         EXPECT_CALL(executor, OnBeginExecute(_, _, _)).WillOnce(Return(0));
496         EXPECT_CALL(*callback, OnScheduleStarted()).Times(1);
497         EXPECT_CALL(executor, OnEndExecute(_, _)).WillOnce(Return(0));
498         EXPECT_CALL(*callback, OnScheduleStoped(CANCELED, _)).Times(1);
499 
500         const time_point<system_clock> start = system_clock::now();
501 
502         // stop schedule after 550ms
__anon7044e28e0602() 503         RelativeTimer::GetInstance().Register([&scheduleNode]() { scheduleNode->StopSchedule(); }, 550);
504 
505         EXPECT_TRUE(scheduleNode->StartSchedule());
506         handler->EnsureTask(nullptr);
507         EXPECT_EQ(scheduleNode->GetCurrentScheduleState(), ScheduleNode::S_AUTH_PROCESSING);
508         ensure.get_future().get();
509         EXPECT_EQ(scheduleNode->GetCurrentScheduleState(), ScheduleNode::S_END);
510         time_point<system_clock> finish = system_clock::now();
511         auto cost = duration_cast<milliseconds>(finish - start).count();
512         EXPECT_GT(cost, 540);
513         EXPECT_LT(cost, 560);
514     }
515     handler->EnsureTask(nullptr);
516 }
517 
518 HWTEST_F(ScheduleNodeTest, ScheduleNodeStartAllInOneUserStopAndEndFailed, TestSize.Level0)
519 {
520     using namespace std::chrono;
521 
522     std::promise<void> ensure;
523     MockExecutorCallback executor;
524     auto callback = MockScheduleNodeCallback::Create();
525     ON_CALL(*callback, OnScheduleStoped(_, _))
526         .WillByDefault(
__anon7044e28e0702(int32_t resultCode, const std::shared_ptr<Attributes> &finalResult) 527             [&ensure](int32_t resultCode, const std::shared_ptr<Attributes> &finalResult) { ensure.set_value(); });
528 
529     auto handler = ThreadHandler::GetSingleThreadInstance();
530     {
531         constexpr uint32_t EXECUTOR_INDEX = 0xAAAAAAA;
532         constexpr uint32_t EXECUTOR_MATCHER = 0xDEEDBEEF;
533         constexpr uint32_t SCHEDULE_ID = 0xBEEFABCD;
534         auto faceAllInOne = MockResourceNode::CreateWithExecuteIndex(EXECUTOR_INDEX, FACE, ALL_IN_ONE, executor);
535         auto builder = ScheduleNode::Builder::New(faceAllInOne, faceAllInOne);
536         ASSERT_NE(builder, nullptr);
537         builder->SetExecutorMatcher(EXECUTOR_MATCHER);
538         builder->SetThreadHandler(handler);
539         builder->SetScheduleId(SCHEDULE_ID);
540         builder->SetScheduleMode(IDENTIFY);
541         builder->SetScheduleCallback(callback);
542         builder->SetAccessTokenId(12330);
543         builder->SetPinSubType(PIN_SIX);
544 
545         auto scheduleNode = builder->Build();
546         ASSERT_NE(scheduleNode, nullptr);
547 
548         InSequence s; // the following four method will be invoke in sequence
549         EXPECT_CALL(executor, OnBeginExecute(_, _, _)).WillOnce(Return(0));
550         EXPECT_CALL(*callback, OnScheduleStarted()).Times(1);
551         EXPECT_CALL(executor, OnEndExecute(_, _)).WillOnce(Return(1)); // Mock end failed
552         EXPECT_CALL(*callback, OnScheduleStoped(CANCELED, _)).Times(1);
553 
554         const time_point<system_clock> start = system_clock::now();
555 
556         // stop schedule after 550ms
__anon7044e28e0802() 557         RelativeTimer::GetInstance().Register([&scheduleNode]() { scheduleNode->StopSchedule(); }, 550);
558 
559         EXPECT_TRUE(scheduleNode->StartSchedule());
560         handler->EnsureTask(nullptr);
561         EXPECT_EQ(scheduleNode->GetCurrentScheduleState(), ScheduleNode::S_AUTH_PROCESSING);
562         ensure.get_future().get();
563         EXPECT_EQ(scheduleNode->GetCurrentScheduleState(), ScheduleNode::S_END);
564         time_point<system_clock> finish = system_clock::now();
565         auto cost = duration_cast<milliseconds>(finish - start).count();
566         EXPECT_GT(cost, 540);
567         EXPECT_LT(cost, 560);
568     }
569     handler->EnsureTask(nullptr);
570 }
571 
572 HWTEST_F(ScheduleNodeTest, ScheduleNodeTestContinueSchedule, TestSize.Level0)
573 {
574     ExecutorRole testSrcRole = COLLECTOR;
575     ExecutorRole testDstRole = COLLECTOR;
576     uint64_t testTransNum = 58786;
577     std::vector<uint8_t> testMsg;
578 
579     constexpr uint32_t EXECUTOR_INDEX = 0xAAAAAAA;
580     constexpr uint32_t EXECUTOR_MATCHER = 0xDEEDBEEF;
581     constexpr uint32_t SCHEDULE_ID = 0xBEEFABCD;
582     MockExecutorCallback executor;
583     auto faceAllInOne = MockResourceNode::CreateWithExecuteIndex(EXECUTOR_INDEX, FACE, ALL_IN_ONE, executor);
584     auto builder = ScheduleNode::Builder::New(faceAllInOne, faceAllInOne);
585     EXPECT_NE(builder, nullptr);
586     builder->SetExecutorMatcher(EXECUTOR_MATCHER);
587     builder->SetScheduleId(SCHEDULE_ID);
588     builder->SetScheduleMode(IDENTIFY);
589     std::shared_ptr<MockScheduleNodeCallback> callback = nullptr;
590     builder->SetScheduleCallback(callback);
591 
592     auto scheduleNode = builder->Build();
593     EXPECT_NE(scheduleNode, nullptr);
594 
595     EXPECT_FALSE(scheduleNode->ContinueSchedule(testSrcRole, testDstRole, testTransNum, testMsg));
596     testDstRole = SCHEDULER;
597     scheduleNode = builder->Build();
598     EXPECT_NE(scheduleNode, nullptr);
599     EXPECT_TRUE(scheduleNode->ContinueSchedule(testSrcRole, testDstRole, testTransNum, testMsg));
600     callback = Common::MakeShared<MockScheduleNodeCallback>();
601     EXPECT_NE(callback, nullptr);
602     EXPECT_CALL(*callback, OnScheduleProcessed(_, _, _)).Times(1);
603     builder->SetScheduleCallback(callback);
604     builder->SetAuthType(FACE);
605     scheduleNode = builder->Build();
606     EXPECT_NE(scheduleNode, nullptr);
607     EXPECT_TRUE(scheduleNode->ContinueSchedule(testSrcRole, testDstRole, testTransNum, testMsg));
608 }
609 } // namespace UserAuth
610 } // namespace UserIam
611 } // namespace OHOS
612