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