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 <thread>
17 #include <uv.h>
18 
19 #include "ark_native_engine.h"
20 #include "message_queue.h"
21 #include "test.h"
22 #include "napi/native_api.h"
23 #include "napi/native_node_api.h"
24 #include "tools/log.h"
25 #include "worker.h"
26 
27 #define SELLP_MS 200
28 
29 #define ASSERT_CHECK_CALL(call)   \
30     {                             \
31         ASSERT_EQ(call, napi_ok); \
32     }
33 
34 #define ASSERT_CHECK_VALUE_TYPE(env, value, type)               \
35     {                                                           \
36         napi_valuetype valueType = napi_undefined;              \
37         ASSERT_TRUE(value != nullptr);                          \
38         ASSERT_CHECK_CALL(napi_typeof(env, value, &valueType)); \
39         ASSERT_EQ(valueType, type);                             \
40     }
41 
42 using namespace Commonlibrary::Concurrent::WorkerModule;
43 
44 namespace Commonlibrary::Concurrent::WorkerModule {
45 class WorkersTest : public testing::Test {
46 public:
SetUpTestSuite()47     static void SetUpTestSuite()
48     {
49         InitializeEngine();
50     }
51 
TearDownTestSuite()52     static void TearDownTestSuite()
53     {
54         DestroyEngine();
55     }
56 
InitializeEngine()57     static void InitializeEngine()
58     {
59         panda::RuntimeOption option;
60         option.SetGcType(panda::RuntimeOption::GC_TYPE::GEN_GC);
61         const int64_t poolSize = 0x1000000;  // 16M
62         option.SetGcPoolSize(poolSize);
63         option.SetLogLevel(panda::RuntimeOption::LOG_LEVEL::ERROR);
64         option.SetDebuggerLibraryPath("");
65         vm_ = panda::JSNApi::CreateJSVM(option);
66         ASSERT_TRUE(vm_ != nullptr);
67         engine_ = new ArkNativeEngine(vm_, nullptr);
68         engine_->SetInitWorkerFunc([](NativeEngine*) {});
69     }
70 
DestroyEngine()71     static void DestroyEngine()
72     {
73         if (engine_) {
74             delete engine_;
75             engine_ = nullptr;
76         }
77         panda::JSNApi::DestroyJSVM(vm_);
78     }
79 
GetEnv()80     static napi_env GetEnv()
81     {
82         return reinterpret_cast<napi_env>(engine_);
83     }
84 
WorkerOnMessage(const uv_async_t * req)85     static void WorkerOnMessage(const uv_async_t *req)
86     {
87         Worker *worker = static_cast<Worker*>(req->data);
88         ASSERT_NE(worker, nullptr);
89         napi_env workerEnv = worker->GetWorkerEnv();
90         void *data = nullptr;
91         while (worker->workerMessageQueue_.DeQueue(&data)) {
92             if (data == nullptr) {
93                 return;
94             }
95             napi_value result = nullptr;
96             napi_status status = napi_deserialize(workerEnv, data, &result);
97             ASSERT_TRUE(status == napi_ok);
98             uint32_t number = 0;
99             status = napi_get_value_uint32(workerEnv, result, &number);
100             ASSERT_TRUE(status == napi_ok);
101             ASSERT_TRUE(number != 0);
102             napi_delete_serialization_data(workerEnv, data);
103             number = 1000; // 1000 : test number
104             napi_value numVal = nullptr;
105             status = napi_create_uint32(workerEnv, number, &numVal);
106             ASSERT_TRUE(status == napi_ok);
107             napi_value undefined = nullptr;
108             napi_get_undefined(workerEnv, &undefined);
109             void *workerData = nullptr;
110             status = napi_serialize_inner(workerEnv, numVal, undefined, undefined, false, true, &workerData);
111             ASSERT_TRUE(status == napi_ok);
112             ASSERT_NE(workerData, nullptr);
113             worker->PostMessageToHostInner(workerData);
114         }
115     }
116 
HostOnMessage(const uv_async_t * req)117     static void HostOnMessage(const uv_async_t *req)
118     {
119         Worker *worker = static_cast<Worker*>(req->data);
120         ASSERT_NE(worker, nullptr);
121         void *data = nullptr;
122         while (worker->hostMessageQueue_.DeQueue(&data)) {
123             if (data == nullptr) {
124                 return;
125             }
126             napi_env hostEnv = worker->GetHostEnv();
127             napi_value result = nullptr;
128             napi_status status = napi_deserialize(hostEnv, data, &result);
129             ASSERT_TRUE(status == napi_ok);
130             uint32_t number = 0;
131             status = napi_get_value_uint32(hostEnv, result, &number);
132             ASSERT_TRUE(status == napi_ok);
133             ASSERT_EQ(number, 1000); // 1000 : test number
134             napi_delete_serialization_data(hostEnv, data);
135         }
136     }
137 
WorkerThreadFunction(void * data)138     static void WorkerThreadFunction(void *data)
139     {
140         auto worker = reinterpret_cast<Worker*>(data);
141         napi_env hostEnv = worker->GetHostEnv();
142         ASSERT_NE(hostEnv, nullptr);
143         napi_env workerEnv  = nullptr;
144         napi_status status = napi_create_runtime(hostEnv, &workerEnv);
145         ASSERT_TRUE(status == napi_ok);
146         worker->SetWorkerEnv(workerEnv);
147         uv_loop_t *workerLoop = nullptr;
148         status = napi_get_uv_event_loop(workerEnv, &workerLoop);
149         ASSERT_TRUE(status == napi_ok);
150         worker->workerOnMessageSignal_ = new uv_async_t;
151         uv_async_init(workerLoop, worker->workerOnMessageSignal_, reinterpret_cast<uv_async_cb>(WorkerOnMessage));
152         worker->workerOnMessageSignal_->data = worker;
153         worker->Loop();
154     }
155 
UpdateMainThreadWorkerFlag(Worker * worker,bool isMainThreadWorker)156     static void UpdateMainThreadWorkerFlag(Worker *worker, bool isMainThreadWorker)
157     {
158         worker->isMainThreadWorker_ = isMainThreadWorker;
159     }
160 
InitHostHandle(Worker * worker,uv_loop_t * loop)161     static void InitHostHandle(Worker *worker, uv_loop_t *loop)
162     {
163         worker->hostOnMessageSignal_ = new uv_async_t;
164         uv_async_init(loop, worker->hostOnMessageSignal_, reinterpret_cast<uv_async_cb>(HostOnMessage));
165         worker->hostOnMessageSignal_->data = worker;
166     }
167 
PostMessage(Worker * worker,void * message)168     static void PostMessage(Worker *worker, void *message)
169     {
170         worker->PostMessageInner(message);
171     }
172 
UpdateWorkerState(Worker * worker,Worker::RunnerState state)173     static void UpdateWorkerState(Worker *worker, Worker::RunnerState state)
174     {
175         bool done = false;
176         do {
177             Worker::RunnerState oldState = worker->runnerState_.load(std::memory_order_acquire);
178             done = worker->runnerState_.compare_exchange_strong(oldState, state);
179         } while (!done);
180     }
181 
SetCloseWorkerProp(Worker * worker,napi_env env)182     static void SetCloseWorkerProp(Worker *worker, napi_env env)
183     {
184         worker->SetWorkerEnv(env);
185         uv_loop_t* loop = worker->GetWorkerLoop();
186         ASSERT_TRUE(loop != nullptr);
187         worker->workerOnMessageSignal_ = new uv_async_t;
188         uv_async_init(loop, worker->workerOnMessageSignal_, reinterpret_cast<uv_async_cb>(
189             UpdateMainThreadWorkerFlag));
190         worker->workerOnMessageSignal_->data = worker;
191         uv_async_init(loop, &worker->debuggerOnPostTaskSignal_, reinterpret_cast<uv_async_cb>(
192             UpdateWorkerState));
193     }
194 protected:
195     static thread_local NativeEngine *engine_;
196     static thread_local EcmaVM *vm_;
197 };
198 
199 thread_local NativeEngine *WorkersTest::engine_ = nullptr;
200 thread_local EcmaVM *WorkersTest::vm_ = nullptr;
201 }
202 
203 // worker constructor
Worker_Constructor(napi_env env,napi_value global)204 napi_value Worker_Constructor(napi_env env, napi_value global)
205 {
206     std::string funcName = "WorkerConstructor";
207     napi_value cb = nullptr;
208     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::WorkerConstructor, nullptr, &cb);
209 
210     napi_value result = nullptr;
211     napi_value argv[2] = { nullptr };
212     std::string script = "entry/ets/workers/@worker.ts";
213     napi_create_string_utf8(env, script.c_str(), script.length(), &argv[0]);
214     std::string type = "classic";
215     std::string name = "WorkerThread";
216     napi_value typeValue = nullptr;
217     napi_value nameValue = nullptr;
218     napi_create_string_utf8(env, name.c_str(), name.length(), &nameValue);
219     napi_create_string_utf8(env, type.c_str(), type.length(), &typeValue);
220 
221     napi_value object = nullptr;
222     napi_create_object(env, &object);
223 
224     napi_set_named_property(env, object, "name", nameValue);
225     napi_set_named_property(env, object, "type", typeValue);
226     argv[1]  = object;
227 
228     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
229     uv_sleep(SELLP_MS);
230     napi_env newEnv = nullptr;
231     napi_create_runtime(env, &newEnv);
232     return result;
233 }
234 
235 // worker terminate
Worker_Terminate(napi_env env,napi_value global)236 napi_value Worker_Terminate(napi_env env, napi_value global)
237 {
238     std::string funcName = "Terminate";
239     napi_value cb = nullptr;
240     napi_value result = nullptr;
241     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::Terminate, nullptr, &cb);
242     napi_call_function(env, global, cb, 0, nullptr, &result);
243     return result;
244 }
245 
246 // worker WorkerConstructor
247 HWTEST_F(WorkersTest, WorkerConstructorTest001, testing::ext::TestSize.Level0)
248 {
249     napi_env env = (napi_env)engine_;
250     napi_value global;
251     napi_get_global(env, &global);
252 
253     napi_value result = nullptr;
254     result = Worker_Constructor(env, global);
255 
256     Worker* worker = nullptr;
257     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
258     std::string nameResult = worker->GetName();
259     ASSERT_EQ(nameResult, "WorkerThread");
260     std::string scriptResult = worker->GetScript();
261     ASSERT_EQ(scriptResult, "entry/ets/workers/@worker.ts");
262     worker->EraseWorker();
263     result = Worker_Terminate(env, global);
264 
265     ASSERT_TRUE(result != nullptr);
266 }
267 
268 //worker PostMessage
269 HWTEST_F(WorkersTest, PostMessageTest001, testing::ext::TestSize.Level0)
270 {
271     napi_env env = (napi_env)engine_;
272     napi_value global;
273     napi_get_global(env, &global);
274 
275     napi_value result = nullptr;
276     result = Worker_Constructor(env, global);
277 
278     Worker* worker = nullptr;
279     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
280 
281     napi_value argv[1] = { nullptr };
282     std::string message = "host";
283     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
284     std::string funcName = "PostMessage";
285     napi_value cb = nullptr;
286     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessage, worker, &cb);
287     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
288     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
289     worker->EraseWorker();
290     result = Worker_Terminate(env, global);
291     ASSERT_TRUE(result != nullptr);
292 }
293 
294 //worker PostMessage
295 HWTEST_F(WorkersTest, PostMessageTest002, testing::ext::TestSize.Level0)
296 {
297     napi_env env = (napi_env)engine_;
298     napi_value global;
299     napi_get_global(env, &global);
300 
301     napi_value result = nullptr;
302     result = Worker_Constructor(env, global);
303     Worker* worker = nullptr;
304     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
305 
306     napi_value argv[1] = { nullptr };
307     std::string message = "host";
308     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
309 
310     std::string funcName = "PostMessage";
311     napi_value cb = nullptr;
312 
313     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessage, nullptr, &cb);
314     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
315 
316     worker->EraseWorker();
317     result = Worker_Terminate(env, global);
318     ASSERT_TRUE(result != nullptr);
319 }
320 
321 //worker PostMessage
322 HWTEST_F(WorkersTest, PostMessageTest003, testing::ext::TestSize.Level0)
323 {
324     napi_env env = (napi_env)engine_;
325     napi_value global;
326     napi_get_global(env, &global);
327 
328     napi_value result = nullptr;
329     result = Worker_Constructor(env, global);
330 
331     Worker* worker = nullptr;
332     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
333     worker->UpdateWorkerState(Worker::RunnerState::TERMINATED);
334 
335     napi_value argv[1] = { nullptr };
336     std::string message = "host";
337     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
338     std::string funcName = "PostMessage";
339     napi_value cb = nullptr;
340     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessage, worker, &cb);
341     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
342 
343     uv_async_t* req = new uv_async_t;
344     req->data = worker;
345     Worker::WorkerOnMessage(req);
346 
347     worker->EraseWorker();
348     result = Worker_Terminate(env, global);
349     ASSERT_TRUE(result != nullptr);
350 }
351 
352 //worker PostMessage
353 HWTEST_F(WorkersTest, PostMessageToHostTest001, testing::ext::TestSize.Level0)
354 {
355     napi_env env = (napi_env)engine_;
356     napi_value global;
357     napi_get_global(env, &global);
358 
359     napi_value result = nullptr;
360     result = Worker_Constructor(env, global);
361 
362     Worker* worker = nullptr;
363     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
364     napi_value argv[1] = { nullptr };
365     std::string message = "host";
366     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
367 
368     std::string funcName = "PostMessageToHost";
369     napi_value cb = nullptr;
370     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessageToHost, worker, &cb);
371     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
372     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
373     uv_async_t* req = new uv_async_t;
374     req->data = worker;
375     Worker::HostOnMessage(req);
376 
377     worker->EraseWorker();
378     result = Worker_Terminate(env, global);
379     ASSERT_TRUE(result != nullptr);
380 }
381 
382 //worker PostMessageToHost
383 HWTEST_F(WorkersTest, PostMessageToHostTest002, testing::ext::TestSize.Level0)
384 {
385     napi_env env = (napi_env)engine_;
386     napi_value global;
387     napi_get_global(env, &global);
388 
389     napi_value result = nullptr;
390     result = Worker_Constructor(env, global);
391     Worker* worker = nullptr;
392     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
393 
394     napi_value argv[1] = { nullptr };
395     std::string message = "host";
396     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
397 
398     std::string funcName = "PostMessageToHost";
399     napi_value cb = nullptr;
400     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessageToHost, nullptr, &cb);
401     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
402 
403     worker->EraseWorker();
404     result = Worker_Terminate(env, global);
405     ASSERT_TRUE(result != nullptr);
406 }
407 
408 //worker PostMessageToHost
409 HWTEST_F(WorkersTest, PostMessageToHostTest003, testing::ext::TestSize.Level0)
410 {
411     napi_env env = (napi_env)engine_;
412     napi_value global;
413     napi_get_global(env, &global);
414 
415     napi_value arrayresult = nullptr;
416     ASSERT_CHECK_CALL(napi_create_object(env, &arrayresult));
417     ASSERT_CHECK_VALUE_TYPE(env, arrayresult, napi_object);
418     const char testStr[] = "1234567";
419     napi_value strAttribute = nullptr;
420     ASSERT_CHECK_CALL(napi_create_string_utf8(env, testStr, strlen(testStr), &strAttribute));
421     ASSERT_CHECK_VALUE_TYPE(env, strAttribute, napi_string);
422     ASSERT_CHECK_CALL(napi_set_named_property(env, arrayresult, "strAttribute", strAttribute));
423 
424     napi_value retStrAttribute = nullptr;
425     ASSERT_CHECK_CALL(napi_get_named_property(env, arrayresult, "strAttribute", &retStrAttribute));
426     ASSERT_CHECK_VALUE_TYPE(env, retStrAttribute, napi_string);
427 
428     int32_t testNumber = 12345; // 12345 : indicates any number
429     napi_value numberAttribute = nullptr;
430     ASSERT_CHECK_CALL(napi_create_int32(env, testNumber, &numberAttribute));
431     ASSERT_CHECK_VALUE_TYPE(env, numberAttribute, napi_number);
432     ASSERT_CHECK_CALL(napi_set_named_property(env, arrayresult, "numberAttribute", numberAttribute));
433 
434     napi_value propNames = nullptr;
435     ASSERT_CHECK_CALL(napi_get_property_names(env, arrayresult, &propNames));
436     ASSERT_CHECK_VALUE_TYPE(env, propNames, napi_object);
437 
438     napi_value result = nullptr;
439     result = Worker_Constructor(env, global);
440 
441     Worker* worker = nullptr;
442     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
443     napi_value argv[2] = { nullptr };
444     std::string message = "";
445     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
446     std::string funcName = "PostMessageToHost";
447     argv[1] = propNames;
448     napi_value cb = nullptr;
449     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessageToHost, worker, &cb);
450     UpdateWorkerState(worker, Worker::RunnerState::STARTING);
451     worker->UpdateWorkerState(Worker::RunnerState::RUNNING);
452     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
453     worker->EraseWorker();
454     result = Worker_Terminate(env, global);
455     ASSERT_TRUE(result != nullptr);
456 }
457 
458 //worker EventListener
459 HWTEST_F(WorkersTest, EventListenerTest001, testing::ext::TestSize.Level0)
460 {
461     napi_env env = (napi_env)engine_;
462     napi_value global;
463     napi_get_global(env, &global);
464     napi_value result = nullptr;
465     result = Worker_Constructor(env, global);
466     Worker* worker = nullptr;
467     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
468 
469     napi_value argv[2] = {nullptr};
470     std::string message = "host";
471     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
__anon81fda76e0202(napi_env env, napi_callback_info info) 472     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
473         return nullptr;
474     };
475     napi_value funcValue = nullptr;
476     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
477     argv[1] = funcValue;
478 
479     std::string funcName = "On";
480     napi_value cb = nullptr;
481     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::On, worker, &cb);
482     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
483 
484     funcName = "Once";
485     cb = nullptr;
486     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::Once, worker, &cb);
487     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
488 
489     funcName = "AddEventListener";
490     cb = nullptr;
491     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::AddEventListener, worker, &cb);
492     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
493 
494     funcName = "RemoveEventListener";
495     cb = nullptr;
496     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::RemoveEventListener, worker, &cb);
497     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
498 
499     funcName = "Off";
500     cb = nullptr;
501     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::Off, worker, &cb);
502     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
503 
504     worker->EraseWorker();
505     result = Worker_Terminate(env, global);
506     ASSERT_TRUE(result != nullptr);
507 }
508 
509 //worker EventListener
510 HWTEST_F(WorkersTest, EventListenerTest002, testing::ext::TestSize.Level0)
511 {
512     napi_env env = (napi_env)engine_;
513     napi_value global;
514     napi_get_global(env, &global);
515     napi_value result = nullptr;
516     result = Worker_Constructor(env, global);
517     Worker* worker = nullptr;
518     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
519     napi_value argv[3] = {nullptr};
520     std::string message = "host";
521     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
__anon81fda76e0302(napi_env env, napi_callback_info info) 522     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
523         return nullptr;
524     };
525     napi_value funcValue = nullptr;
526     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
527     argv[1] = funcValue;
528     std::string funcName = "On";
529     napi_value cb = nullptr;
530     funcName = "Once";
531     cb = nullptr;
532     napi_value myobject = nullptr;
533     napi_create_object(env, &myobject);
534 
535     argv[2] = myobject;
536     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::Once, worker, &cb);
537     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
538     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
539     worker->EraseWorker();
540     result = Worker_Terminate(env, global);
541     ASSERT_TRUE(result != nullptr);
542 }
543 
544 //worker DispatchEvent
545 HWTEST_F(WorkersTest, DispatchEventTest001, testing::ext::TestSize.Level0)
546 {
547     napi_env env = (napi_env)engine_;
548     napi_value global;
549     napi_get_global(env, &global);
550     napi_value result = nullptr;
551     result = Worker_Constructor(env, global);
552     Worker* worker = nullptr;
553     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
554     napi_value argv1[2] = {nullptr};
555     std::string message = "host";
556     napi_create_string_utf8(env, message.c_str(), message.length(), &argv1[0]);
__anon81fda76e0402(napi_env env, napi_callback_info info) 557     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
558         return nullptr;
559     };
560     napi_value funcValue = nullptr;
561     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
562     argv1[1] = funcValue;
563 
564     std::string funcName = "Once";
565     napi_value cb = nullptr;
566     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::Once, worker, &cb);
567     napi_call_function(env, global, cb, sizeof(argv1) / sizeof(argv1[0]), argv1, &result);
568     napi_value argv[1] = {nullptr};
569 
570     napi_value typeValue = nullptr;
571     std::string type = "message";
572     napi_create_string_utf8(env, type.c_str(), type.length(), &typeValue);
573 
574     napi_value object = nullptr;
575     napi_create_object(env, &object);
576     napi_set_named_property(env, object, "type", typeValue);
577     argv[0] = object;
578 
579     funcName = "DispatchEvent";
580     cb = nullptr;
581     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::DispatchEvent, worker, &cb);
582     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
583     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
584     worker->EraseWorker();
585     result = Worker_Terminate(env, global);
586     ASSERT_TRUE(result != nullptr);
587 }
588 
589 //worker ParentPortAddEventListener
590 HWTEST_F(WorkersTest, ParentPortAddEventListenerTest001, testing::ext::TestSize.Level0)
591 {
592     napi_env env = (napi_env)engine_;
593     napi_value global;
594     napi_get_global(env, &global);
595     napi_value result = nullptr;
596     result = Worker_Constructor(env, global);
597     Worker* worker = nullptr;
598     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
599     napi_value argv[3] = {nullptr};
600     std::string message = "host";
601     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
__anon81fda76e0502(napi_env env, napi_callback_info info) 602     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
603         return nullptr;
604     };
605 
606     std::string funcName = "ParentPortAddEventListener";
607     napi_value cb = nullptr;
608     napi_value funcValue = nullptr;
609     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
610     argv[1] = funcValue;
611     ASSERT_TRUE(funcValue != nullptr);
612     napi_value myobject = nullptr;
613     napi_create_object(env, &myobject);
614     argv[2] = myobject;
615     napi_value callResult = nullptr;
616     // ------- workerEnv---------
617     napi_create_function(env, funcName.c_str(), funcName.size(),
618                          Worker::ParentPortAddEventListener, worker, &cb);
619     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
620     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
621     worker->EraseWorker();
622     result = Worker_Terminate(env, global);
623     ASSERT_TRUE(result != nullptr);
624 }
625 
626 //worker ParentPortRemoveAllListener
627 HWTEST_F(WorkersTest, ParentPortRemoveAllListenerTest001, testing::ext::TestSize.Level0)
628 {
629     napi_env env = (napi_env)engine_;
630     napi_value global;
631     napi_get_global(env, &global);
632     napi_value result = nullptr;
633     result = Worker_Constructor(env, global);
634     Worker* worker = nullptr;
635     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
636     // ------- workerEnv---------
637     napi_env workerEnv = nullptr;
638     napi_create_runtime(env, &workerEnv);
639     napi_value workerGlobal = nullptr;
640     napi_get_global(workerEnv, &workerGlobal);
641     napi_value argv[1] = {nullptr};
642     std::string message = "host";
643     napi_create_string_utf8(workerEnv, message.c_str(), message.length(), &argv[0]);
644     std::string funcName = "ParentPortRemoveAllListener";
645     napi_value cb = nullptr;
646 
647     napi_value callResult = nullptr;
648     // ------- workerEnv---------
649     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
650                          Worker::ParentPortRemoveAllListener, worker, &cb);
651     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
652     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
653     worker->EraseWorker();
654     result = Worker_Terminate(env, global);
655     ASSERT_TRUE(result != nullptr);
656 }
657 
658 //worker ParentPortDispatchEvent
659 HWTEST_F(WorkersTest, ParentPortDispatchEventTest001, testing::ext::TestSize.Level0)
660 {
661     napi_env env = (napi_env)engine_;
662     napi_value global;
663     napi_get_global(env, &global);
664     napi_value result = nullptr;
665     result = Worker_Constructor(env, global);
666     Worker* worker = nullptr;
667     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
668     // ------- workerEnv---------
669     napi_env workerEnv = nullptr;
670     napi_create_runtime(env, &workerEnv);
671     napi_value workerGlobal = nullptr;
672     napi_get_global(workerEnv, &workerGlobal);
673 
674     napi_value argv[1] = {nullptr};
675     napi_value objresult = nullptr;
676     napi_create_object(workerEnv, &objresult);
677     napi_value cb = nullptr;
678     std::string funcName = "ParentPortDispatchEvent";
679     napi_value messageKey = nullptr;
680     const char* messageKeyStr = "type";
681     napi_create_string_latin1(workerEnv, messageKeyStr, strlen(messageKeyStr), &messageKey);
682     napi_value messageValue = nullptr;
683     const char* messageValueStr = "message";
684     napi_create_string_latin1(workerEnv, messageValueStr, strlen(messageValueStr), &messageValue);
685     napi_set_property(workerEnv, objresult, messageKey, messageValue);
686     argv[0] = objresult;
687     napi_value callResult = nullptr;
688     // ------- workerEnv---------
689     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
690                          Worker::ParentPortDispatchEvent, worker, &cb);
691     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
692     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
693     worker->EraseWorker();
694     result = Worker_Terminate(env, global);
695     ASSERT_TRUE(result != nullptr);
696 }
697 
698 //worker ParentPortRemoveEventListener
699 HWTEST_F(WorkersTest, ParentPortRemoveEventListenerTest001, testing::ext::TestSize.Level0)
700 {
701     napi_env env = (napi_env)engine_;
702     napi_value global;
703     napi_get_global(env, &global);
704     napi_value result = nullptr;
705     result = Worker_Constructor(env, global);
706     Worker* worker = nullptr;
707     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
708     // ------- workerEnv---------
709     napi_env workerEnv = nullptr;
710     napi_create_runtime(env, &workerEnv);
711     napi_value workerGlobal = nullptr;
712     napi_get_global(workerEnv, &workerGlobal);
713 
714     napi_value argv[2] = {nullptr};
715     std::string message = "host";
716     napi_create_string_utf8(workerEnv, message.c_str(), message.length(), &argv[0]);
__anon81fda76e0602(napi_env env, napi_callback_info info) 717     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
718         return nullptr;
719     };
720     std::string funcName = "ParentPortRemoveEventListener";
721     napi_value cb = nullptr;
722     napi_value funcValue = nullptr;
723     napi_create_function(workerEnv, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
724     argv[1] = funcValue;
725 
726     napi_value callResult = nullptr;
727     // ------- workerEnv---------
728     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
729                          Worker::ParentPortRemoveEventListener, worker, &cb);
730     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
731     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
732     worker->EraseWorker();
733     result = Worker_Terminate(env, global);
734     ASSERT_TRUE(result != nullptr);
735 }
736 
737 //worker GlobalCall
738 HWTEST_F(WorkersTest, GlobalCallTest001, testing::ext::TestSize.Level0)
739 {
740     napi_env env = (napi_env)engine_;
741     napi_value global;
742     napi_get_global(env, &global);
743     napi_value result = nullptr;
744     result = Worker_Constructor(env, global);
745     Worker* worker = nullptr;
746     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
747     // ------- workerEnv---------
748     napi_env workerEnv = nullptr;
749     napi_create_runtime(env, &workerEnv);
750     napi_value workerGlobal = nullptr;
751     napi_get_global(workerEnv, &workerGlobal);
752 
753     napi_value argv[3] = {nullptr};
754     std::string instanceName = "host";
755     std::string methodName = "postMessage";
756     int32_t timeout = 300;
757     napi_create_string_utf8(workerEnv, instanceName.c_str(), instanceName.length(), &argv[0]);
758     napi_create_string_utf8(workerEnv, methodName.c_str(), methodName.length(), &argv[1]);
759     napi_create_int32(workerEnv, timeout, &argv[2]);
760 
761     std::string funcName = "GlobalCall";
762     napi_value cb = nullptr;
763     napi_value callResult = nullptr;
764     // ------- workerEnv---------
765     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
766                          Worker::GlobalCall, worker, &cb);
767     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
768     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
769     uv_async_t* req = new uv_async_t;
770     req->data = worker;
771     Worker::HostOnGlobalCall(req);
772     worker->EraseWorker();
773     result = Worker_Terminate(env, global);
774     ASSERT_TRUE(result != nullptr);
775 }
776 
777 //messageQueue DeQueue_QUEUE_IS_NULL
778 HWTEST_F(WorkersTest, MessageQueueTest001, testing::ext::TestSize.Level0)
779 {
780     MessageQueue queue;
781     ASSERT_TRUE(queue.IsEmpty());
782     MessageDataType data = nullptr;
783     ASSERT_FALSE(queue.DeQueue(&data));
784 }
785 
786 //messageQueue DeQueue_DATA_IS_NULL
787 HWTEST_F(WorkersTest, MessageQueueTest002, testing::ext::TestSize.Level0)
788 {
789     napi_env env = (napi_env)engine_;
790     MessageQueue queue;
791     MessageDataType data = nullptr;
792     napi_value undefined = NapiHelper::GetUndefinedValue(env);
793     napi_serialize_inner(env, undefined, undefined, undefined, false, true, &data);
794     queue.EnQueue(data);
795     ASSERT_TRUE(queue.DeQueue(nullptr));
796     queue.Clear(env);
797 }
798 
799 //messageQueue MARKEDMESSAGEQUEUE
800 HWTEST_F(WorkersTest, MarkedMessageQueue001, testing::ext::TestSize.Level0)
801 {
802     napi_env env = (napi_env)engine_;
803     MarkedMessageQueue queue;
804     MessageDataType data = nullptr;
805     napi_value undefined = NapiHelper::GetUndefinedValue(env);
806     napi_serialize_inner(env, undefined, undefined, undefined, false, true, &data);
807     queue.Push(1, data);
808     queue.Pop();
809     ASSERT_TRUE(queue.IsEmpty());
810 
811     MessageDataType dataType = nullptr;
812     napi_serialize_inner(env, undefined, undefined, undefined, false, true, &dataType);
813     queue.Push(2, dataType);
814     std::pair<uint32_t, MessageDataType> pair = queue.Front();
815     ASSERT_EQ(pair.first, 2);
816     queue.Clear(env);
817     ASSERT_TRUE(queue.IsEmpty());
818 }
819 
820 HWTEST_F(WorkersTest, WorkerTest001, testing::ext::TestSize.Level0)
821 {
822     napi_env env = (napi_env)engine_;
823     napi_value global;
824     napi_get_global(env, &global);
825     napi_value result = nullptr;
826     result = Worker_Constructor(env, global);
827     Worker* worker = nullptr;
828     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
829     napi_env workerEnv = nullptr;
830     napi_create_runtime(env, &workerEnv);
831     napi_value exports = nullptr;
832     napi_create_object(workerEnv, &exports);
833     Worker::InitWorker(workerEnv, exports);
834     worker->EraseWorker();
835     result = Worker_Terminate(env, global);
836     ASSERT_TRUE(result != nullptr);
837 }
838 
839 HWTEST_F(WorkersTest, WorkerTest002, testing::ext::TestSize.Level0)
840 {
841     napi_env env = (napi_env)engine_;
842     napi_value global;
843     napi_get_global(env, &global);
844     napi_value result = nullptr;
845     result = Worker_Constructor(env, global);
846     Worker* worker = nullptr;
847     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
848 
849     napi_value argv[2] = {nullptr};
850     std::string instanceName = "MainThread";
851     napi_create_string_utf8(env, instanceName.c_str(), instanceName.length(), &argv[0]);
852     napi_value obj = nullptr;
853     napi_create_object(env, &obj);
854     argv[1] = obj;
855 
856     std::string funcName = "RegisterGlobalCallObject";
857     napi_value cb = nullptr;
858     napi_value callResult = nullptr;
859     // ------- workerEnv---------
860     napi_create_function(env, funcName.c_str(), funcName.size(),
861                          Worker::RegisterGlobalCallObject, worker, &cb);
862     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
863     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
864     worker->EraseWorker();
865     result = Worker_Terminate(env, global);
866     ASSERT_TRUE(result != nullptr);
867 }
868 
869 HWTEST_F(WorkersTest, WorkerTest003, testing::ext::TestSize.Level0)
870 {
871     napi_env env = (napi_env)engine_;
872     napi_value global;
873     napi_get_global(env, &global);
874     napi_value result = nullptr;
875     result = Worker_Constructor(env, global);
876     Worker* worker = nullptr;
877     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
878 
879     napi_value argv[1] = {nullptr};
880     std::string instanceName = "MainThread";
881     napi_create_string_utf8(env, instanceName.c_str(), instanceName.length(), &argv[0]);
882 
883     std::string funcName = "UnregisterGlobalCallObject";
884     napi_value cb = nullptr;
885     napi_value callResult = nullptr;
886     // ------- workerEnv---------
887     napi_create_function(env, funcName.c_str(), funcName.size(),
888                         Worker::UnregisterGlobalCallObject, worker, &cb);
889     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
890     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
891     worker->EraseWorker();
892     result = Worker_Terminate(env, global);
893     ASSERT_TRUE(result != nullptr);
894 }
895 
896 HWTEST_F(WorkersTest, WorkerTest004, testing::ext::TestSize.Level0)
897 {
898     napi_env env = (napi_env)engine_;
899     napi_env workerEnv = nullptr;
900     napi_create_runtime(env, &workerEnv);
901     napi_value workerGlobal = nullptr;
902     napi_get_global(workerEnv, &workerGlobal);
903     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
904     std::string funcName = "LimitedWorkerConstructor";
905     napi_value cb = nullptr;
906     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::LimitedWorkerConstructor, nullptr, &cb);
907 
908     napi_value result = nullptr;
909     napi_value argv[2] = { nullptr };
910     std::string script = "entry/ets/workers/@worker.ts";
911     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
912     std::string type = "classic";
913     std::string name = "WorkerThread";
914     napi_value typeValue = nullptr;
915     napi_value nameValue = nullptr;
916     napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
917     napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
918 
919     napi_value object = nullptr;
920     napi_create_object(workerEnv, &object);
921 
922     napi_set_named_property(workerEnv, object, "name", nameValue);
923     napi_set_named_property(workerEnv, object, "type", typeValue);
924     argv[1] = object;
925 
926     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
927     uv_sleep(200);
928     Worker* worker = nullptr;
929     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
930     worker->EraseWorker();
931     result = Worker_Terminate(workerEnv, workerGlobal);
932     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
933     ASSERT_TRUE(result != nullptr);
934 }
935 
936 HWTEST_F(WorkersTest, WorkerTest005, testing::ext::TestSize.Level0)
937 {
938     napi_env env = (napi_env)engine_;
939     napi_env workerEnv = nullptr;
940     napi_create_runtime(env, &workerEnv);
941     napi_value workerGlobal = nullptr;
942     napi_get_global(workerEnv, &workerGlobal);
943     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
944     std::string funcName = "ThreadWorkerConstructor";
945     napi_value cb = nullptr;
946     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
947 
948     napi_value result = nullptr;
949     napi_value argv[2] = { nullptr };
950     std::string script = "entry/ets/workers/@worker.ts";
951     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
952     std::string type = "classic";
953     std::string name = "WorkerThread";
954     napi_value typeValue = nullptr;
955     napi_value nameValue = nullptr;
956     napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
957     napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
958 
959     napi_value object = nullptr;
960     napi_create_object(workerEnv, &object);
961 
962     napi_set_named_property(workerEnv, object, "name", nameValue);
963     napi_set_named_property(workerEnv, object, "type", typeValue);
964     argv[1] = object;
965 
966     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
967     uv_sleep(200);
968     Worker* worker = nullptr;
969     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
970     worker->EraseWorker();
971     result = Worker_Terminate(workerEnv, workerGlobal);
972     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
973     ASSERT_TRUE(result != nullptr);
974 }
975 
976 HWTEST_F(WorkersTest, WorkerTest006, testing::ext::TestSize.Level0)
977 {
978     napi_env env = (napi_env)engine_;
979     napi_value global;
980     napi_get_global(env, &global);
981 
982     napi_value result = nullptr;
983     result = Worker_Constructor(env, global);
984 
985     Worker* worker = nullptr;
986     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
987 
988     napi_value argv[1] = { nullptr };
989     std::string message = "host";
990     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
991     std::string funcName = "PostMessageWithSharedSendable";
992     napi_value cb = nullptr;
993     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessageWithSharedSendable, worker, &cb);
994     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
995     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
996 
997     worker->EraseWorker();
998     result = Worker_Terminate(env, global);
999     ASSERT_TRUE(result != nullptr);
1000 }
1001 
1002 HWTEST_F(WorkersTest, WorkerTest007, testing::ext::TestSize.Level0)
1003 {
1004     napi_env env = (napi_env)engine_;
1005     napi_value global;
1006     napi_get_global(env, &global);
1007 
1008     napi_value result = nullptr;
1009     result = Worker_Constructor(env, global);
1010 
1011     Worker* worker = nullptr;
1012     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1013 
1014     napi_value argv[1] = { nullptr };
1015 
1016     std::string funcName = "RemoveAllListener";
1017     napi_value cb = nullptr;
1018     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::RemoveAllListener, worker, &cb);
1019     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1020     napi_call_function(env, global, cb, 1, argv, &result);
1021     worker->EraseWorker();
1022     result = Worker_Terminate(env, global);
1023     ASSERT_TRUE(result != nullptr);
1024 }
1025 
1026 HWTEST_F(WorkersTest, WorkerTest008, testing::ext::TestSize.Level0)
1027 {
1028     napi_env env = (napi_env)engine_;
1029     napi_value global;
1030     napi_get_global(env, &global);
1031 
1032     napi_value result = nullptr;
1033     result = Worker_Constructor(env, global);
1034 
1035     Worker* worker = nullptr;
1036     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1037 
1038     napi_value argv[1] = { nullptr };
1039     std::string message = "host";
1040     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
1041 
1042     std::string funcName = "CancelTask";
1043     napi_value cb = nullptr;
1044     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::CancelTask, worker, &cb);
1045     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1046     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1047     worker->EraseWorker();
1048     result = Worker_Terminate(env, global);
1049     ASSERT_TRUE(result != nullptr);
1050 }
1051 
1052 HWTEST_F(WorkersTest, WorkerTest009, testing::ext::TestSize.Level0)
1053 {
1054     napi_env env = (napi_env)engine_;
1055     napi_value global;
1056     napi_get_global(env, &global);
1057 
1058     napi_value result = nullptr;
1059     result = Worker_Constructor(env, global);
1060 
1061     Worker* worker = nullptr;
1062     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1063     napi_value argv[1] = { nullptr };
1064     std::string message = "host";
1065     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
1066 
1067     std::string funcName = "PostMessageWithSharedSendableToHost";
1068     napi_value cb = nullptr;
1069     napi_create_function(env, funcName.c_str(), funcName.size(),
1070                          Worker::PostMessageWithSharedSendableToHost, worker, &cb);
1071     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1072     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1073     uv_async_t* req = new uv_async_t;
1074     req->data = worker;
1075     Worker::HostOnMessage(req);
1076 
1077     worker->EraseWorker();
1078     result = Worker_Terminate(env, global);
1079     ASSERT_TRUE(result != nullptr);
1080 }
1081 
1082 HWTEST_F(WorkersTest, WorkerTest010, testing::ext::TestSize.Level0)
1083 {
1084     napi_env env = (napi_env)engine_;
1085     napi_value global;
1086     napi_get_global(env, &global);
1087 
1088     napi_value result = nullptr;
1089     result = Worker_Constructor(env, global);
1090 
1091     Worker* worker = nullptr;
1092     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1093     napi_value argv[1] = { nullptr };
1094     std::string message = "host";
1095     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
1096 
1097     std::string funcName = "ParentPortCancelTask";
1098     napi_value cb = nullptr;
1099     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::ParentPortCancelTask, worker, &cb);
1100     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1101     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1102     worker->EraseWorker();
1103     result = Worker_Terminate(env, global);
1104     ASSERT_TRUE(result != nullptr);
1105 }
1106 
1107 HWTEST_F(WorkersTest, WorkerTest011, testing::ext::TestSize.Level0)
1108 {
1109     napi_env env = (napi_env)engine_;
1110     napi_value global;
1111     napi_get_global(env, &global);
1112 
1113     napi_value result = nullptr;
1114     result = Worker_Constructor(env, global);
1115 
1116     Worker* worker = nullptr;
1117     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1118     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1119     uv_async_t* req = new uv_async_t;
1120     req->data = nullptr;
1121     Worker::HostOnError(req);
1122     req->data = worker;
1123     Worker::HostOnError(req);
1124     worker->EraseWorker();
1125     ASSERT_TRUE(result != nullptr);
1126 }
1127 
1128 //worker PostMessage
1129 HWTEST_F(WorkersTest, WorkerTest012, testing::ext::TestSize.Level0)
1130 {
1131     napi_env env = (napi_env)engine_;
1132     napi_value global;
1133     napi_get_global(env, &global);
1134 
1135     napi_value result = nullptr;
1136     result = Worker_Constructor(env, global);
1137 
1138     Worker* worker = nullptr;
1139     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1140 
1141     napi_value argv[1] = { nullptr };
1142     std::string message = "host";
1143     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
1144     std::string funcName = "PostMessage";
1145     napi_value cb = nullptr;
1146     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessage, worker, &cb);
1147     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1148     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1149 
1150     worker->EraseWorker();
1151     result = Worker_Terminate(env, global);
1152     ASSERT_TRUE(result != nullptr);
1153 }
1154 
1155 
1156 HWTEST_F(WorkersTest, CloseWorkerTest001, testing::ext::TestSize.Level0)
1157 {
1158     napi_env env = (napi_env)engine_;
1159     napi_value global;
1160     napi_get_global(env, &global);
1161     napi_value result = nullptr;
1162     std::string funcName = "CloseWorker";
1163     napi_value cb = nullptr;
1164     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::CloseWorker, nullptr, &cb);
1165     napi_call_function(env, global, cb, 0, nullptr, &result);
1166     ASSERT_TRUE(result != nullptr);
1167 }
1168 
1169 HWTEST_F(WorkersTest, CloseWorkerTest002, testing::ext::TestSize.Level0)
1170 {
1171     napi_env env = (napi_env)engine_;
1172     napi_value global;
1173     napi_get_global(env, &global);
1174 
1175     napi_value result = nullptr;
1176     result = Worker_Constructor(env, global);
1177 
1178     Worker* worker = nullptr;
1179     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1180     ASSERT_TRUE(worker != nullptr);
1181 
1182     std::string funcName = "CloseWorker";
1183     napi_value cb = nullptr;
1184     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::CloseWorker, worker, &cb);
1185     SetCloseWorkerProp(worker, env);
1186     napi_call_function(env, global, cb, 0, nullptr, &result);
1187     worker->EraseWorker();
1188     ASSERT_TRUE(result != nullptr);
1189 }
1190 
1191 HWTEST_F(WorkersTest, InitWorkerTest001, testing::ext::TestSize.Level0)
1192 {
1193     napi_env env = (napi_env)engine_;
1194     napi_value exports = nullptr;
1195     napi_create_object(env, &exports);
1196     Worker::InitWorker(env, exports);
1197     ASSERT_TRUE(exports != nullptr);
1198 }
1199 
1200 HWTEST_F(WorkersTest, InitWorkerTest002, testing::ext::TestSize.Level0)
1201 {
1202     napi_env env = (napi_env)engine_;
1203     napi_env workerEnv = nullptr;
1204     napi_create_runtime(env, &workerEnv);
1205     napi_value workerGlobal = nullptr;
1206     napi_get_global(workerEnv, &workerGlobal);
1207     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
1208     std::string funcName = "ThreadWorkerConstructor";
1209     napi_value cb = nullptr;
1210     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
1211 
1212     napi_value result = nullptr;
1213     napi_value argv[2] = { nullptr };
1214     std::string script = "entry/ets/workers/@worker.ts";
1215     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
1216     std::string type = "classic";
1217     std::string name = "WorkerThread";
1218     napi_value typeValue = nullptr;
1219     napi_value nameValue = nullptr;
1220     napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
1221     napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
1222 
1223     napi_value object = nullptr;
1224     napi_create_object(workerEnv, &object);
1225 
1226     napi_set_named_property(workerEnv, object, "name", nameValue);
1227     napi_set_named_property(workerEnv, object, "type", typeValue);
1228     argv[1] = object;
1229 
1230     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1231     uv_sleep(200);
1232     Worker* worker = nullptr;
1233     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1234     ASSERT_TRUE(worker != nullptr);
1235     worker->SetWorkerEnv(workerEnv);
1236     NativeEngine* workerEngine = reinterpret_cast<NativeEngine*>(workerEnv);
1237     workerEngine->MarkRestrictedWorkerThread();
1238     napi_value exports = nullptr;
1239     napi_create_object(env, &exports);
1240     Worker::InitWorker(workerEnv, exports);
1241     worker->EraseWorker();
1242     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
1243     ASSERT_TRUE(result != nullptr);
1244 }
1245 
1246 HWTEST_F(WorkersTest, InitWorkerTest003, testing::ext::TestSize.Level0)
1247 {
1248     napi_env env = (napi_env)engine_;
1249     napi_env workerEnv = nullptr;
1250     napi_create_runtime(env, &workerEnv);
1251     napi_value workerGlobal = nullptr;
1252     napi_get_global(workerEnv, &workerGlobal);
1253     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
1254     std::string funcName = "ThreadWorkerConstructor";
1255     napi_value cb = nullptr;
1256     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
1257 
1258     napi_value result = nullptr;
1259     napi_value argv[2] = { nullptr };
1260     std::string script = "entry/ets/workers/@worker.ts";
1261     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
1262     std::string type = "classic";
1263     std::string name = "WorkerThread";
1264     napi_value typeValue = nullptr;
1265     napi_value nameValue = nullptr;
1266     napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
1267     napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
1268 
1269     napi_value object = nullptr;
1270     napi_create_object(workerEnv, &object);
1271 
1272     napi_set_named_property(workerEnv, object, "name", nameValue);
1273     napi_set_named_property(workerEnv, object, "type", typeValue);
1274     argv[1] = object;
1275 
1276     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1277 
1278     uv_sleep(200);
1279     Worker* worker = new Worker(env, nullptr);
1280     napi_wrap(env, result, worker, nullptr, nullptr, nullptr);
1281     worker->SetWorkerEnv(workerEnv);
1282     NativeEngine* workerEngine = reinterpret_cast<NativeEngine*>(workerEnv);
1283     workerEngine->MarkTaskPoolThread();
1284     napi_value exports = nullptr;
1285     napi_create_object(env, &exports);
1286     Worker::InitWorker(workerEnv, exports);
1287     worker->EraseWorker();
1288     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
1289     ASSERT_TRUE(result != nullptr);
1290 }
1291 
1292 HWTEST_F(WorkersTest, InitWorkerTest004, testing::ext::TestSize.Level0)
1293 {
1294     napi_env env = (napi_env)engine_;
1295     napi_env workerEnv = nullptr;
1296     napi_create_runtime(env, &workerEnv);
1297     napi_value workerGlobal = nullptr;
1298     napi_get_global(workerEnv, &workerGlobal);
1299     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
1300     std::string funcName = "ThreadWorkerConstructor";
1301     napi_value cb = nullptr;
1302     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
1303 
1304     napi_value result = nullptr;
1305     napi_value argv[2] = { nullptr };
1306     std::string script = "entry/ets/workers/@worker.ts";
1307     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
1308     std::string type = "classic";
1309     std::string name = "WorkerThread";
1310     napi_value typeValue = nullptr;
1311     napi_value nameValue = nullptr;
1312     napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
1313     napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
1314 
1315     napi_value object = nullptr;
1316     napi_create_object(workerEnv, &object);
1317 
1318     napi_set_named_property(workerEnv, object, "name", nameValue);
1319     napi_set_named_property(workerEnv, object, "type", typeValue);
1320     argv[1] = object;
1321 
1322     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1323 
1324     uv_sleep(200);
1325     Worker* worker = nullptr;
1326     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1327     worker->SetWorkerEnv(workerEnv);
1328     NativeEngine* workerEngine = reinterpret_cast<NativeEngine*>(workerEnv);
1329     workerEngine->MarkWorkerThread();
1330     napi_value exports = nullptr;
1331     napi_create_object(workerEnv, &exports);
1332     Worker::InitWorker(workerEnv, exports);
1333     worker->EraseWorker();
1334     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
1335     ASSERT_TRUE(result != nullptr);
1336 }
1337 
1338 HWTEST_F(WorkersTest, InitWorkerTest005, testing::ext::TestSize.Level0)
1339 {
1340     napi_env env = (napi_env)engine_;
1341     napi_env workerEnv = nullptr;
1342     napi_create_runtime(env, &workerEnv);
1343     napi_value workerGlobal = nullptr;
1344     napi_get_global(workerEnv, &workerGlobal);
1345     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
1346 
1347     std::string funcName = "LimitedWorkerConstructor";
1348     napi_value cb = nullptr;
1349     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::LimitedWorkerConstructor, nullptr, &cb);
1350 
1351     napi_value result = nullptr;
1352     napi_value argv[2] = { nullptr };
1353     std::string script = "entry/ets/workers/@worker.ts";
1354     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
1355     std::string type = "classic";
1356     std::string name = "WorkerThread";
1357     napi_value typeValue = nullptr;
1358     napi_value nameValue = nullptr;
1359     napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
1360     napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
1361 
1362     napi_value object = nullptr;
1363     napi_create_object(workerEnv, &object);
1364 
1365     napi_set_named_property(workerEnv, object, "name", nameValue);
1366     napi_set_named_property(workerEnv, object, "type", typeValue);
1367     argv[1] = object;
1368 
1369     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1370 
1371     uv_sleep(200);
1372     Worker* worker = nullptr;
1373     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1374     worker->SetWorkerEnv(workerEnv);
1375     NativeEngine* workerEngine = reinterpret_cast<NativeEngine*>(workerEnv);
1376     workerEngine->MarkRestrictedWorkerThread();
1377     napi_value exports = nullptr;
1378     napi_create_object(workerEnv, &exports);
1379     Worker::InitWorker(workerEnv, exports);
1380     worker->EraseWorker();
1381     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
1382     ASSERT_TRUE(result != nullptr);
1383 }
1384 
1385 HWTEST_F(WorkersTest, ConstructorTest001, testing::ext::TestSize.Level0)
1386 {
1387     napi_env env = WorkersTest::GetEnv();
1388     Worker *worker = new Worker(env, nullptr);
1389     ASSERT_TRUE(worker != nullptr);
1390     napi_env hostEnv = worker->GetHostEnv();
1391     ASSERT_TRUE(env == hostEnv);
1392     napi_env workerEnv = worker->GetWorkerEnv();
1393     ASSERT_TRUE(workerEnv == nullptr);
1394     delete worker;
1395     worker = nullptr;
1396 }
1397 
1398 HWTEST_F(WorkersTest, ConstructorTest002, testing::ext::TestSize.Level0)
1399 {
1400     napi_env env = (napi_env)engine_;
1401     napi_value global = nullptr;
1402     napi_get_global(env, &global);
1403 
1404     std::string funcName = "LimitedWorkerConstructor";
1405     napi_value cb = nullptr;
1406     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::LimitedWorkerConstructor, nullptr, &cb);
1407 
1408     napi_value result = nullptr;
1409     napi_value argv[2] = { nullptr };
1410     std::string script = "entry/ets/workers/@worker.ts";
1411     napi_create_string_utf8(env, script.c_str(), script.length(), &argv[0]);
1412     std::string type = "classic";
1413     std::string name = "WorkerThread";
1414     napi_value typeValue = nullptr;
1415     napi_value nameValue = nullptr;
1416     napi_create_string_utf8(env, name.c_str(), name.length(), &nameValue);
1417     napi_create_string_utf8(env, type.c_str(), type.length(), &typeValue);
1418 
1419     napi_value object = nullptr;
1420     napi_create_object(env, &object);
1421 
1422     napi_set_named_property(env, object, "name", nameValue);
1423     napi_set_named_property(env, object, "type", typeValue);
1424     argv[1] = object;
1425 
1426     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1427     uv_sleep(200);
1428     ASSERT_TRUE(result == nullptr);
1429 }
1430 
1431 HWTEST_F(WorkersTest, ConstructorTest003, testing::ext::TestSize.Level0)
1432 {
1433     napi_env env = (napi_env)engine_;
1434     napi_value global = nullptr;
1435     napi_get_global(env, &global);
1436 
1437     std::string funcName = "ThreadWorkerConstructor";
1438     napi_value cb = nullptr;
1439     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
1440 
1441     napi_value result = nullptr;
1442     napi_value argv[2] = { nullptr };
1443     std::string script = "entry/ets/workers/@worker.ts";
1444     napi_create_string_utf8(env, script.c_str(), script.length(), &argv[0]);
1445     std::string type = "classic";
1446     std::string name = "WorkerThread";
1447     napi_value typeValue = nullptr;
1448     napi_value nameValue = nullptr;
1449     napi_create_string_utf8(env, name.c_str(), name.length(), &nameValue);
1450     napi_create_string_utf8(env, type.c_str(), type.length(), &typeValue);
1451 
1452     napi_value object = nullptr;
1453     napi_create_object(env, &object);
1454 
1455     napi_set_named_property(env, object, "name", nameValue);
1456     napi_set_named_property(env, object, "type", typeValue);
1457     argv[1] = object;
1458 
1459     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1460     uv_sleep(200);
1461     ASSERT_TRUE(result == nullptr);
1462 }
1463 
1464 HWTEST_F(WorkersTest, ConstructorTest004, testing::ext::TestSize.Level0)
1465 {
1466     napi_env env = (napi_env)engine_;
1467     napi_env workerEnv = nullptr;
1468     napi_create_runtime(env, &workerEnv);
1469     napi_value workerGlobal = nullptr;
1470     napi_get_global(workerEnv, &workerGlobal);
1471     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
1472     std::string funcName = "ThreadWorkerConstructor";
1473     napi_value cb = nullptr;
1474     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
1475 
1476     napi_value result = nullptr;
1477     napi_call_function(workerEnv, workerGlobal, cb, 0, nullptr, &result);
1478     uv_sleep(200);
1479     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
1480     ASSERT_TRUE(result == nullptr);
1481 }
1482 
1483 HWTEST_F(WorkersTest, ConstructorTest005, testing::ext::TestSize.Level0)
1484 {
1485     napi_env env = (napi_env)engine_;
1486     napi_env workerEnv = nullptr;
1487     napi_create_runtime(env, &workerEnv);
1488     napi_value workerGlobal = nullptr;
1489     napi_get_global(workerEnv, &workerGlobal);
1490     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
1491     std::string funcName = "ThreadWorkerConstructor";
1492     napi_value cb = nullptr;
1493     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
1494 
1495     napi_value result = nullptr;
1496     napi_value argv[2] = { nullptr };
1497     int32_t script = 200;
1498     napi_create_int32(workerEnv, script, &argv[0]);
1499     std::string type = "classic";
1500     std::string name = "WorkerThread";
1501     napi_value typeValue = nullptr;
1502     napi_value nameValue = nullptr;
1503     napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
1504     napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
1505 
1506     napi_value object = nullptr;
1507     napi_create_object(workerEnv, &object);
1508 
1509     napi_set_named_property(workerEnv, object, "name", nameValue);
1510     napi_set_named_property(workerEnv, object, "type", typeValue);
1511     argv[1] = object;
1512 
1513     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1514     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
1515     uv_sleep(200);
1516     ASSERT_TRUE(result == nullptr);
1517 }
1518 
1519 HWTEST_F(WorkersTest, PostMessageTest004, testing::ext::TestSize.Level0)
1520 {
1521     napi_env env = WorkersTest::GetEnv();
1522     Worker *worker = new Worker(env, nullptr);
1523     UpdateMainThreadWorkerFlag(worker, false);
1524     ASSERT_TRUE(worker != nullptr);
1525     uv_loop_t *loop = nullptr;
1526     napi_status status = napi_get_uv_event_loop(env, &loop);
1527     ASSERT_TRUE(status == napi_ok);
1528     InitHostHandle(worker, loop);
1529 
1530     std::thread t(WorkerThreadFunction, worker);
1531     t.detach();
1532     uint32_t number = 200; // 200 : test number
1533     napi_value numVal = nullptr;
1534     status = napi_create_uint32(env, number, &numVal);
1535     ASSERT_TRUE(status == napi_ok);
1536     void *data = nullptr;
1537     napi_value undefined = nullptr;
1538     napi_get_undefined(env, &undefined);
1539     status = napi_serialize(env, numVal, undefined, undefined, &data);
1540     ASSERT_TRUE(status == napi_ok);
1541     uv_sleep(1000); // 1000 : for post and receive message
1542     PostMessage(worker, data);
1543     uv_sleep(1000); // 1000 : for post and receive message
1544 }