• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <condition_variable>
17 #include <thread>
18 #include <uv.h>
19 #include <mutex>
20 #include <vector>
21 
22 #include "ark_native_engine.h"
23 #include "message_queue.h"
24 #include "test.h"
25 #include "napi/native_api.h"
26 #include "napi/native_node_api.h"
27 #include "../../common/helper/napi_helper.h"
28 #include "native_engine/native_create_env.h"
29 #include "tools/log.h"
30 #include "worker.h"
31 
32 #define SELLP_MS 200
33 
34 #define ASSERT_CHECK_CALL(call)   \
35     {                             \
36         ASSERT_EQ(call, napi_ok); \
37     }
38 
39 #define ASSERT_CHECK_VALUE_TYPE(env, value, type)               \
40     {                                                           \
41         napi_valuetype valueType = napi_undefined;              \
42         ASSERT_TRUE(value != nullptr);                          \
43         ASSERT_CHECK_CALL(napi_typeof(env, value, &valueType)); \
44         ASSERT_EQ(valueType, type);                             \
45     }
46 
47 using namespace Commonlibrary::Concurrent::WorkerModule;
48 
49 namespace Commonlibrary::Concurrent::WorkerModule {
50 
51 static constexpr int MAX_WORKERS_COUNT = 64;
52 static constexpr int MAX_ARKRUNTIME_COUNT = 64;
53 static constexpr int MAX_JSTHREAD_COUNT = 80;
54 static constexpr int NUM_10 = 10;
55 static constexpr int NUM_1 = 1;
56 static constexpr int TIME_1000MS = 1000;
57 static constexpr int TIME_500MS = 500;
58 static constexpr int TIME_100MS = 100;
59 
60 class ArkRuntimeChecker {
61 public:
62     ArkRuntimeChecker() = default;
63     static void CreateArkRuntimeEngine(napi_env& workerEnv);
64     void CreateArkRuntimeList(uint32_t runtimeCount);
65     void DeleteArkRuntimeList();
66     int32_t GetFailedCount();
67 
68     std::mutex mutexlock_;
69     std::condition_variable condition_;
70     std::thread* threadArray_[MAX_ARKRUNTIME_COUNT + NUM_10] = { nullptr };
71     std::atomic<uint32_t> failCount_{0};
72     bool notified_ = false;
73 };
74 
CreateArkRuntimeEngine(napi_env & workerEnv)75 void ArkRuntimeChecker::CreateArkRuntimeEngine(napi_env& workerEnv)
76 {
77     panda::RuntimeOption option;
78     option.SetGcType(panda::RuntimeOption::GC_TYPE::GEN_GC);
79     const int64_t poolSize = 0x1000000;
80     option.SetGcPoolSize(poolSize);
81     option.SetLogLevel(panda::RuntimeOption::LOG_LEVEL::ERROR);
82     option.SetDebuggerLibraryPath("");
83     panda::ecmascript::EcmaVM* vm = panda::JSNApi::CreateJSVM(option);
84     ASSERT_NE(vm, nullptr);
85     workerEnv = reinterpret_cast<napi_env>(new (std::nothrow) ArkNativeEngine(vm, nullptr));
86     auto cleanEnv = [vm]() {
87         if (vm != nullptr) {
88             panda::JSNApi::DestroyJSVM(vm);
89         }
90     };
91     ArkNativeEngine* arkEngine = (ArkNativeEngine*)workerEnv;
92     arkEngine->SetCleanEnv(cleanEnv);
93 }
94 
CreateArkRuntimeList(uint32_t runtimeCount)95 void ArkRuntimeChecker::CreateArkRuntimeList(uint32_t runtimeCount)
96 {
97     NativeCreateEnv::RegCreateNapiEnvCallback([] (napi_env *env) {
98         ArkRuntimeChecker::CreateArkRuntimeEngine(*env);
99         return napi_status::napi_ok;
100     });
101     NativeCreateEnv::RegDestroyNapiEnvCallback([] (napi_env *env) {
102         ArkNativeEngine* engine = reinterpret_cast<ArkNativeEngine*>(*env);
103         delete engine;
104         return napi_status::napi_ok;
105     });
106     for (int k = 0; k < runtimeCount; k++) {
107         threadArray_[k] = new std::thread([this] {
108             napi_env newenv = nullptr;
109             napi_create_ark_runtime(&newenv);
110             if (newenv == nullptr) {
111                 this->failCount_++;
112                 return;
113             }
114             std::unique_lock<std::mutex> lock(this->mutexlock_);
115             if (!this->notified_) {
116                 this->condition_.wait(lock);
117             }
118             if (newenv != nullptr) {
119                 napi_destroy_ark_runtime(&newenv);
120             }
121         });
122     }
123     uv_sleep(TIME_1000MS);
124 }
125 
DeleteArkRuntimeList()126 void ArkRuntimeChecker::DeleteArkRuntimeList()
127 {
128     mutexlock_.lock();
129     notified_ = true;
130     condition_.notify_all();
131     mutexlock_.unlock();
132     for (int k = 0; k < MAX_ARKRUNTIME_COUNT + NUM_10; k++) {
133         if (threadArray_[k] != nullptr) {
134             threadArray_[k]->join();
135         }
136     }
137 }
138 
GetFailedCount()139 int32_t ArkRuntimeChecker::GetFailedCount()
140 {
141     return failCount_.load();
142 }
143 
144 class WorkersTest : public testing::Test {
145 public:
SetUpTestSuite()146     static void SetUpTestSuite()
147     {
148         InitializeEngine();
149     }
150 
TearDownTestSuite()151     static void TearDownTestSuite()
152     {
153         DestroyEngine();
154     }
155 
InitializeEngine()156     static void InitializeEngine()
157     {
158         panda::RuntimeOption option;
159         option.SetGcType(panda::RuntimeOption::GC_TYPE::GEN_GC);
160         const int64_t poolSize = 0x1000000;  // 16M
161         option.SetGcPoolSize(poolSize);
162         option.SetLogLevel(panda::RuntimeOption::LOG_LEVEL::ERROR);
163         option.SetDebuggerLibraryPath("");
164         vm_ = panda::JSNApi::CreateJSVM(option);
165         ASSERT_TRUE(vm_ != nullptr);
166         engine_ = new ArkNativeEngine(vm_, nullptr);
167         engine_->SetInitWorkerFunc([](NativeEngine*) {});
168     }
169 
DestroyEngine()170     static void DestroyEngine()
171     {
172         if (engine_) {
173             delete engine_;
174             engine_ = nullptr;
175         }
176         panda::JSNApi::DestroyJSVM(vm_);
177     }
178 
GetEnv()179     static napi_env GetEnv()
180     {
181         return reinterpret_cast<napi_env>(engine_);
182     }
183 
WorkerOnMessage(const uv_async_t * req)184     static void WorkerOnMessage(const uv_async_t *req)
185     {
186         Worker *worker = static_cast<Worker*>(req->data);
187         ASSERT_NE(worker, nullptr);
188         napi_env workerEnv = worker->GetWorkerEnv();
189         void *data = nullptr;
190         while (worker->workerMessageQueue_.DeQueue(&data)) {
191             if (data == nullptr) {
192                 return;
193             }
194             napi_value result = nullptr;
195             napi_status status = napi_deserialize(workerEnv, data, &result);
196             ASSERT_TRUE(status == napi_ok);
197             uint32_t number = 0;
198             status = napi_get_value_uint32(workerEnv, result, &number);
199             ASSERT_TRUE(status == napi_ok);
200             ASSERT_TRUE(number != 0);
201             napi_delete_serialization_data(workerEnv, data);
202             number = 1000; // 1000 : test number
203             napi_value numVal = nullptr;
204             status = napi_create_uint32(workerEnv, number, &numVal);
205             ASSERT_TRUE(status == napi_ok);
206             napi_value undefined = nullptr;
207             napi_get_undefined(workerEnv, &undefined);
208             void *workerData = nullptr;
209             status = napi_serialize_inner(workerEnv, numVal, undefined, undefined, false, true, &workerData);
210             ASSERT_TRUE(status == napi_ok);
211             ASSERT_NE(workerData, nullptr);
212             worker->PostMessageToHostInner(workerData);
213         }
214     }
215 
HostOnMessage(const uv_async_t * req)216     static void HostOnMessage(const uv_async_t *req)
217     {
218         Worker *worker = static_cast<Worker*>(req->data);
219         ASSERT_NE(worker, nullptr);
220         void *data = nullptr;
221         while (worker->hostMessageQueue_.DeQueue(&data)) {
222             if (data == nullptr) {
223                 return;
224             }
225             napi_env hostEnv = worker->GetHostEnv();
226             napi_value result = nullptr;
227             napi_status status = napi_deserialize(hostEnv, data, &result);
228             ASSERT_TRUE(status == napi_ok);
229             uint32_t number = 0;
230             status = napi_get_value_uint32(hostEnv, result, &number);
231             ASSERT_TRUE(status == napi_ok);
232             ASSERT_EQ(number, 1000); // 1000 : test number
233             napi_delete_serialization_data(hostEnv, data);
234         }
235     }
236 
WorkerThreadFunction(void * data)237     static void WorkerThreadFunction(void *data)
238     {
239         auto worker = reinterpret_cast<Worker*>(data);
240         napi_env hostEnv = worker->GetHostEnv();
241         ASSERT_NE(hostEnv, nullptr);
242         napi_env workerEnv  = nullptr;
243         napi_status status = napi_create_runtime(hostEnv, &workerEnv);
244         ASSERT_TRUE(status == napi_ok);
245         worker->SetWorkerEnv(workerEnv);
246         uv_loop_t *workerLoop = nullptr;
247         status = napi_get_uv_event_loop(workerEnv, &workerLoop);
248         ASSERT_TRUE(status == napi_ok);
249         worker->workerOnMessageSignal_ = new uv_async_t;
250         uv_async_init(workerLoop, worker->workerOnMessageSignal_, reinterpret_cast<uv_async_cb>(WorkerOnMessage));
251         worker->workerOnMessageSignal_->data = worker;
252         worker->Loop();
253     }
254 
UpdateMainThreadWorkerFlag(Worker * worker,bool isMainThreadWorker)255     static void UpdateMainThreadWorkerFlag(Worker *worker, bool isMainThreadWorker)
256     {
257         worker->isMainThreadWorker_ = isMainThreadWorker;
258     }
259 
InitHostHandle(Worker * worker,uv_loop_t * loop)260     static void InitHostHandle(Worker *worker, uv_loop_t *loop)
261     {
262         worker->hostOnMessageSignal_ = new uv_async_t;
263         uv_async_init(loop, worker->hostOnMessageSignal_, reinterpret_cast<uv_async_cb>(HostOnMessage));
264         worker->hostOnMessageSignal_->data = worker;
265     }
266 
PostMessage(Worker * worker,void * message)267     static void PostMessage(Worker *worker, void *message)
268     {
269         worker->PostMessageInner(message);
270     }
271 
UpdateWorkerState(Worker * worker,Worker::RunnerState state)272     static void UpdateWorkerState(Worker *worker, Worker::RunnerState state)
273     {
274         bool done = false;
275         do {
276             Worker::RunnerState oldState = worker->runnerState_.load(std::memory_order_acquire);
277             done = worker->runnerState_.compare_exchange_strong(oldState, state);
278         } while (!done);
279     }
280 
SetCloseWorkerProp(Worker * worker,napi_env env)281     static void SetCloseWorkerProp(Worker *worker, napi_env env)
282     {
283         worker->SetWorkerEnv(env);
284         uv_loop_t* loop = worker->GetWorkerLoop();
285         ASSERT_TRUE(loop != nullptr);
286         worker->workerOnMessageSignal_ = new uv_async_t;
287         uv_async_init(loop, worker->workerOnMessageSignal_, reinterpret_cast<uv_async_cb>(
288             UpdateMainThreadWorkerFlag));
289         worker->workerOnMessageSignal_->data = worker;
290         uv_async_init(loop, &worker->debuggerOnPostTaskSignal_, reinterpret_cast<uv_async_cb>(
291             UpdateWorkerState));
292     }
293 
ClearWorkerHandle(Worker * worker)294     static void ClearWorkerHandle(Worker* worker)
295     {
296         worker->CloseHostHandle();
297         if (worker->isLimitedWorker_) {
298             napi_remove_env_cleanup_hook(worker->hostEnv_, Worker::LimitedWorkerHostEnvCleanCallback, worker);
299         } else {
300             napi_remove_env_cleanup_hook(worker->hostEnv_, Worker::WorkerHostEnvCleanCallback, worker);
301         }
302     }
303 protected:
304     static thread_local NativeEngine *engine_;
305     static thread_local EcmaVM *vm_;
306 };
307 
308 thread_local NativeEngine *WorkersTest::engine_ = nullptr;
309 thread_local EcmaVM *WorkersTest::vm_ = nullptr;
310 }
311 
312 // worker constructor
Worker_Constructor(napi_env env,napi_value global)313 napi_value Worker_Constructor(napi_env env, napi_value global)
314 {
315     std::string funcName = "WorkerConstructor";
316     napi_value cb = nullptr;
317     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::WorkerConstructor, nullptr, &cb);
318 
319     napi_value result = nullptr;
320     napi_value argv[2] = { nullptr };
321     std::string script = "entry/ets/workers/@worker.ts";
322     napi_create_string_utf8(env, script.c_str(), script.length(), &argv[0]);
323     std::string type = "classic";
324     std::string name = "WorkerThread";
325     napi_value typeValue = nullptr;
326     napi_value nameValue = nullptr;
327     napi_create_string_utf8(env, name.c_str(), name.length(), &nameValue);
328     napi_create_string_utf8(env, type.c_str(), type.length(), &typeValue);
329 
330     napi_value object = nullptr;
331     napi_create_object(env, &object);
332 
333     napi_set_named_property(env, object, "name", nameValue);
334     napi_set_named_property(env, object, "type", typeValue);
335     argv[1]  = object;
336 
337     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
338     uv_sleep(SELLP_MS);
339     napi_env newEnv = nullptr;
340     napi_create_runtime(env, &newEnv);
341     return result;
342 }
343 
344 // worker terminate
Worker_Terminate(napi_env env,napi_value global)345 napi_value Worker_Terminate(napi_env env, napi_value global)
346 {
347     std::string funcName = "Terminate";
348     napi_value cb = nullptr;
349     napi_value result = nullptr;
350     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::Terminate, nullptr, &cb);
351     napi_call_function(env, global, cb, 0, nullptr, &result);
352     return result;
353 }
354 
355 class WorkerChecker {
356 public:
357     WorkerChecker() = default;
358     void CreateWorkerHostEngine(napi_env& workerEnv);
359     static napi_value CreateWorker(bool limited, napi_env workerEnv, napi_value workerGlobal);
360     void CreateWorkerList(bool limited, uint32_t workerNum);
361     void DeleteWorkerList();
362     int32_t GetFailedCount();
363 
364     napi_env workerHostEnv_{nullptr};
365     std::atomic<uint32_t> failCount_{0};
366     std::vector<Worker*> workerlist_;
367 
368     bool notified_ = false;
369     std::mutex mutexlock_;
370     std::condition_variable condition_;
371 };
372 
CreateWorkerHostEngine(napi_env & workerEnv)373 void WorkerChecker::CreateWorkerHostEngine(napi_env& workerEnv)
374 {
375     panda::RuntimeOption option;
376     option.SetGcType(panda::RuntimeOption::GC_TYPE::GEN_GC);
377     const int64_t poolSize = 0x1000000;
378     option.SetGcPoolSize(poolSize);
379     option.SetLogLevel(panda::RuntimeOption::LOG_LEVEL::ERROR);
380     option.SetDebuggerLibraryPath("");
381     panda::ecmascript::EcmaVM* vm = panda::JSNApi::CreateJSVM(option);
382     ASSERT_NE(vm, nullptr);
383 
384     workerEnv = reinterpret_cast<napi_env>(new (std::nothrow) ArkNativeEngine(vm, nullptr));
385     ArkNativeEngine* arkEngine = (ArkNativeEngine*)workerEnv;
386     arkEngine->SetInitWorkerFunc([this](NativeEngine*) {
387         std::unique_lock<std::mutex> lock(this->mutexlock_);
388         if (!this->notified_) {
389             this->condition_.wait(lock);
390         }
391     });
392     auto cleanEnv = [vm]() {
393         if (vm != nullptr) {
394             panda::JSNApi::DestroyJSVM(vm);
395         }
396     };
397     arkEngine->SetCleanEnv(cleanEnv);
398 }
399 
CreateWorker(bool limited,napi_env workerEnv,napi_value workerGlobal)400 napi_value WorkerChecker::CreateWorker(bool limited, napi_env workerEnv, napi_value workerGlobal)
401 {
402     std::string funcName = "ThreadWorkerConstructor";
403     if (limited) {
404         funcName = "LimitedWorkerConstructor";
405     }
406     napi_value cb = nullptr;
407     if (!limited) {
408         napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
409             Worker::ThreadWorkerConstructor, nullptr, &cb);
410     } else {
411         napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
412             Worker::LimitedWorkerConstructor, nullptr, &cb);
413     }
414     napi_value result = nullptr;
415     napi_value argv[2] = { nullptr };
416     std::string script = "entry/ets/workers/@worker.ts";
417     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
418     std::string type = "classic";
419     std::string name = "WorkerThread";
420     napi_value typeValue = nullptr;
421     napi_value nameValue = nullptr;
422     napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
423     napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
424 
425     napi_value object = nullptr;
426     napi_create_object(workerEnv, &object);
427     napi_set_named_property(workerEnv, object, "name", nameValue);
428     napi_set_named_property(workerEnv, object, "type", typeValue);
429     argv[1] = object;
430 
431     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
432     return result;
433 }
434 
CreateWorkerList(bool limited,uint32_t workerNum)435 void WorkerChecker::CreateWorkerList(bool limited, uint32_t workerNum)
436 {
437     CreateWorkerHostEngine(workerHostEnv_);
438     ASSERT_NE(workerHostEnv_, nullptr);
439     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
440     napi_value workerGlobal = nullptr;
441     napi_get_global(workerHostEnv_, &workerGlobal);
442 
443     for (int k = 0; k < workerNum; k++) {
444         TryCatch tryCatch(workerHostEnv_);
445         napi_value result = WorkerChecker::CreateWorker(limited, workerHostEnv_, workerGlobal);
446         if (tryCatch.HasCaught()) {
447             tryCatch.ClearException();
448         }
449         if (result == nullptr) {
450             failCount_++;
451         } else {
452             Worker* worker = nullptr;
453             napi_unwrap(workerHostEnv_, result, reinterpret_cast<void**>(&worker));
454             if (worker != nullptr) {
455                 workerlist_.push_back(worker);
456             }
457         }
458     }
459     uv_sleep(TIME_100MS);
460 }
461 
DeleteWorkerList()462 void WorkerChecker::DeleteWorkerList()
463 {
464     ArkNativeEngine* workerHostEngine = reinterpret_cast<ArkNativeEngine*>(workerHostEnv_);
465     mutexlock_.lock();
466     notified_ = true;
467     condition_.notify_all();
468     mutexlock_.unlock();
469     uv_sleep(TIME_500MS);
470 
471     for (auto worker : workerlist_) {
472         worker->EraseWorker();
473         WorkersTest::ClearWorkerHandle(worker);
474     }
475     workerlist_.clear();
476     napi_value workerGlobal = nullptr;
477     napi_get_global(workerHostEnv_, &workerGlobal);
478     Worker_Terminate(workerHostEnv_, workerGlobal);
479     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
480     delete workerHostEngine;
481 }
482 
GetFailedCount()483 int32_t WorkerChecker::GetFailedCount()
484 {
485     return failCount_.load();
486 }
487 
488 // worker WorkerConstructor
489 HWTEST_F(WorkersTest, WorkerConstructorTest001, testing::ext::TestSize.Level0)
490 {
491     napi_env env = (napi_env)engine_;
492     napi_value global;
493     napi_get_global(env, &global);
494 
495     napi_value result = nullptr;
496     result = Worker_Constructor(env, global);
497 
498     Worker* worker = nullptr;
499     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
500     std::string nameResult = worker->GetName();
501     ASSERT_EQ(nameResult, "WorkerThread");
502     std::string scriptResult = worker->GetScript();
503     ASSERT_EQ(scriptResult, "entry/ets/workers/@worker.ts");
504     worker->EraseWorker();
505     result = Worker_Terminate(env, global);
506 
507     ASSERT_TRUE(result != nullptr);
508 }
509 
510 //worker PostMessage
511 HWTEST_F(WorkersTest, PostMessageTest001, testing::ext::TestSize.Level0)
512 {
513     napi_env env = (napi_env)engine_;
514     napi_value global;
515     napi_get_global(env, &global);
516 
517     napi_value result = nullptr;
518     result = Worker_Constructor(env, global);
519 
520     Worker* worker = nullptr;
521     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
522 
523     napi_value argv[1] = { nullptr };
524     std::string message = "host";
525     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
526     std::string funcName = "PostMessage";
527     napi_value cb = nullptr;
528     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessage, worker, &cb);
529     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
530     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
531     worker->EraseWorker();
532     result = Worker_Terminate(env, global);
533     ASSERT_TRUE(result != nullptr);
534 }
535 
536 //worker PostMessage
537 HWTEST_F(WorkersTest, PostMessageTest002, testing::ext::TestSize.Level0)
538 {
539     napi_env env = (napi_env)engine_;
540     napi_value global;
541     napi_get_global(env, &global);
542 
543     napi_value result = nullptr;
544     result = Worker_Constructor(env, global);
545     Worker* worker = nullptr;
546     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
547 
548     napi_value argv[1] = { nullptr };
549     std::string message = "host";
550     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
551 
552     std::string funcName = "PostMessage";
553     napi_value cb = nullptr;
554 
555     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessage, nullptr, &cb);
556     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
557 
558     worker->EraseWorker();
559     result = Worker_Terminate(env, global);
560     ASSERT_TRUE(result != nullptr);
561 }
562 
563 //worker PostMessage
564 HWTEST_F(WorkersTest, PostMessageTest003, testing::ext::TestSize.Level0)
565 {
566     napi_env env = (napi_env)engine_;
567     napi_value global;
568     napi_get_global(env, &global);
569 
570     napi_value result = nullptr;
571     result = Worker_Constructor(env, global);
572 
573     Worker* worker = nullptr;
574     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
575     worker->UpdateWorkerState(Worker::RunnerState::TERMINATED);
576 
577     napi_value argv[1] = { nullptr };
578     std::string message = "host";
579     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
580     std::string funcName = "PostMessage";
581     napi_value cb = nullptr;
582     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessage, worker, &cb);
583     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
584 
585     uv_async_t* req = new uv_async_t;
586     req->data = worker;
587     Worker::WorkerOnMessage(req);
588 
589     worker->EraseWorker();
590     result = Worker_Terminate(env, global);
591     ASSERT_TRUE(result != nullptr);
592 }
593 
594 //worker PostMessage
595 HWTEST_F(WorkersTest, PostMessageToHostTest001, testing::ext::TestSize.Level0)
596 {
597     napi_env env = (napi_env)engine_;
598     napi_value global;
599     napi_get_global(env, &global);
600 
601     napi_value result = nullptr;
602     result = Worker_Constructor(env, global);
603 
604     Worker* worker = nullptr;
605     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
606     napi_value argv[1] = { nullptr };
607     std::string message = "host";
608     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
609 
610     std::string funcName = "PostMessageToHost";
611     napi_value cb = nullptr;
612     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessageToHost, worker, &cb);
613     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
614     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
615     uv_async_t* req = new uv_async_t;
616     req->data = worker;
617     Worker::HostOnMessage(req);
618 
619     worker->EraseWorker();
620     result = Worker_Terminate(env, global);
621     ASSERT_TRUE(result != nullptr);
622 }
623 
624 //worker PostMessageToHost
625 HWTEST_F(WorkersTest, PostMessageToHostTest002, testing::ext::TestSize.Level0)
626 {
627     napi_env env = (napi_env)engine_;
628     napi_value global;
629     napi_get_global(env, &global);
630 
631     napi_value result = nullptr;
632     result = Worker_Constructor(env, global);
633     Worker* worker = nullptr;
634     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
635 
636     napi_value argv[1] = { nullptr };
637     std::string message = "host";
638     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
639 
640     std::string funcName = "PostMessageToHost";
641     napi_value cb = nullptr;
642     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessageToHost, nullptr, &cb);
643     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
644 
645     worker->EraseWorker();
646     result = Worker_Terminate(env, global);
647     ASSERT_TRUE(result != nullptr);
648 }
649 
650 //worker PostMessageToHost
651 HWTEST_F(WorkersTest, PostMessageToHostTest003, testing::ext::TestSize.Level0)
652 {
653     napi_env env = (napi_env)engine_;
654     napi_value global;
655     napi_get_global(env, &global);
656 
657     napi_value arrayresult = nullptr;
658     ASSERT_CHECK_CALL(napi_create_object(env, &arrayresult));
659     ASSERT_CHECK_VALUE_TYPE(env, arrayresult, napi_object);
660     const char testStr[] = "1234567";
661     napi_value strAttribute = nullptr;
662     ASSERT_CHECK_CALL(napi_create_string_utf8(env, testStr, strlen(testStr), &strAttribute));
663     ASSERT_CHECK_VALUE_TYPE(env, strAttribute, napi_string);
664     ASSERT_CHECK_CALL(napi_set_named_property(env, arrayresult, "strAttribute", strAttribute));
665 
666     napi_value retStrAttribute = nullptr;
667     ASSERT_CHECK_CALL(napi_get_named_property(env, arrayresult, "strAttribute", &retStrAttribute));
668     ASSERT_CHECK_VALUE_TYPE(env, retStrAttribute, napi_string);
669 
670     int32_t testNumber = 12345; // 12345 : indicates any number
671     napi_value numberAttribute = nullptr;
672     ASSERT_CHECK_CALL(napi_create_int32(env, testNumber, &numberAttribute));
673     ASSERT_CHECK_VALUE_TYPE(env, numberAttribute, napi_number);
674     ASSERT_CHECK_CALL(napi_set_named_property(env, arrayresult, "numberAttribute", numberAttribute));
675 
676     napi_value propNames = nullptr;
677     ASSERT_CHECK_CALL(napi_get_property_names(env, arrayresult, &propNames));
678     ASSERT_CHECK_VALUE_TYPE(env, propNames, napi_object);
679 
680     napi_value result = nullptr;
681     result = Worker_Constructor(env, global);
682 
683     Worker* worker = nullptr;
684     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
685     napi_value argv[2] = { nullptr };
686     std::string message = "";
687     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
688     std::string funcName = "PostMessageToHost";
689     argv[1] = propNames;
690     napi_value cb = nullptr;
691     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessageToHost, worker, &cb);
692     UpdateWorkerState(worker, Worker::RunnerState::STARTING);
693     worker->UpdateWorkerState(Worker::RunnerState::RUNNING);
694     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
695     worker->EraseWorker();
696     result = Worker_Terminate(env, global);
697     ASSERT_TRUE(result != nullptr);
698 }
699 
700 //worker EventListener
701 HWTEST_F(WorkersTest, EventListenerTest001, testing::ext::TestSize.Level0)
702 {
703     napi_env env = (napi_env)engine_;
704     napi_value global;
705     napi_get_global(env, &global);
706     napi_value result = nullptr;
707     result = Worker_Constructor(env, global);
708     Worker* worker = nullptr;
709     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
710 
711     napi_value argv[2] = {nullptr};
712     std::string message = "host";
713     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
__anon1cfb03780802(napi_env env, napi_callback_info info) 714     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
715         return nullptr;
716     };
717     napi_value funcValue = nullptr;
718     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
719     argv[1] = funcValue;
720 
721     std::string funcName = "On";
722     napi_value cb = nullptr;
723     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::On, worker, &cb);
724     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
725 
726     funcName = "Once";
727     cb = nullptr;
728     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::Once, worker, &cb);
729     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
730 
731     funcName = "AddEventListener";
732     cb = nullptr;
733     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::AddEventListener, worker, &cb);
734     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
735 
736     funcName = "RemoveEventListener";
737     cb = nullptr;
738     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::RemoveEventListener, worker, &cb);
739     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
740 
741     funcName = "Off";
742     cb = nullptr;
743     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::Off, worker, &cb);
744     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
745 
746     worker->EraseWorker();
747     result = Worker_Terminate(env, global);
748     ASSERT_TRUE(result != nullptr);
749 }
750 
751 //worker EventListener
752 HWTEST_F(WorkersTest, EventListenerTest002, testing::ext::TestSize.Level0)
753 {
754     napi_env env = (napi_env)engine_;
755     napi_value global;
756     napi_get_global(env, &global);
757     napi_value result = nullptr;
758     result = Worker_Constructor(env, global);
759     Worker* worker = nullptr;
760     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
761     napi_value argv[3] = {nullptr};
762     std::string message = "host";
763     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
__anon1cfb03780902(napi_env env, napi_callback_info info) 764     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
765         return nullptr;
766     };
767     napi_value funcValue = nullptr;
768     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
769     argv[1] = funcValue;
770     std::string funcName = "On";
771     napi_value cb = nullptr;
772     funcName = "Once";
773     cb = nullptr;
774     napi_value myobject = nullptr;
775     napi_create_object(env, &myobject);
776 
777     argv[2] = myobject;
778     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::Once, worker, &cb);
779     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
780     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
781     worker->EraseWorker();
782     result = Worker_Terminate(env, global);
783     ASSERT_TRUE(result != nullptr);
784 }
785 
786 //worker DispatchEvent
787 HWTEST_F(WorkersTest, DispatchEventTest001, testing::ext::TestSize.Level0)
788 {
789     napi_env env = (napi_env)engine_;
790     napi_value global;
791     napi_get_global(env, &global);
792     napi_value result = nullptr;
793     result = Worker_Constructor(env, global);
794     Worker* worker = nullptr;
795     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
796     napi_value argv1[2] = {nullptr};
797     std::string message = "host";
798     napi_create_string_utf8(env, message.c_str(), message.length(), &argv1[0]);
__anon1cfb03780a02(napi_env env, napi_callback_info info) 799     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
800         return nullptr;
801     };
802     napi_value funcValue = nullptr;
803     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
804     argv1[1] = funcValue;
805 
806     std::string funcName = "Once";
807     napi_value cb = nullptr;
808     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::Once, worker, &cb);
809     napi_call_function(env, global, cb, sizeof(argv1) / sizeof(argv1[0]), argv1, &result);
810     napi_value argv[1] = {nullptr};
811 
812     napi_value typeValue = nullptr;
813     std::string type = "message";
814     napi_create_string_utf8(env, type.c_str(), type.length(), &typeValue);
815 
816     napi_value object = nullptr;
817     napi_create_object(env, &object);
818     napi_set_named_property(env, object, "type", typeValue);
819     argv[0] = object;
820 
821     funcName = "DispatchEvent";
822     cb = nullptr;
823     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::DispatchEvent, worker, &cb);
824     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
825     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
826     worker->EraseWorker();
827     result = Worker_Terminate(env, global);
828     ASSERT_TRUE(result != nullptr);
829 }
830 
831 //worker ParentPortAddEventListener
832 HWTEST_F(WorkersTest, ParentPortAddEventListenerTest001, testing::ext::TestSize.Level0)
833 {
834     napi_env env = (napi_env)engine_;
835     napi_value global;
836     napi_get_global(env, &global);
837     napi_value result = nullptr;
838     result = Worker_Constructor(env, global);
839     Worker* worker = nullptr;
840     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
841     napi_value argv[3] = {nullptr};
842     std::string message = "host";
843     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
__anon1cfb03780b02(napi_env env, napi_callback_info info) 844     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
845         return nullptr;
846     };
847 
848     std::string funcName = "ParentPortAddEventListener";
849     napi_value cb = nullptr;
850     napi_value funcValue = nullptr;
851     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
852     argv[1] = funcValue;
853     ASSERT_TRUE(funcValue != nullptr);
854     napi_value myobject = nullptr;
855     napi_create_object(env, &myobject);
856     argv[2] = myobject;
857     napi_value callResult = nullptr;
858     // ------- workerEnv---------
859     napi_create_function(env, funcName.c_str(), funcName.size(),
860                          Worker::ParentPortAddEventListener, worker, &cb);
861     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
862     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
863     worker->EraseWorker();
864     result = Worker_Terminate(env, global);
865     ASSERT_TRUE(result != nullptr);
866 }
867 
868 //worker ParentPortRemoveAllListener
869 HWTEST_F(WorkersTest, ParentPortRemoveAllListenerTest001, 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     // ------- workerEnv---------
879     napi_env workerEnv = nullptr;
880     napi_create_runtime(env, &workerEnv);
881     napi_value workerGlobal = nullptr;
882     napi_get_global(workerEnv, &workerGlobal);
883     napi_value argv[1] = {nullptr};
884     std::string message = "host";
885     napi_create_string_utf8(workerEnv, message.c_str(), message.length(), &argv[0]);
886     std::string funcName = "ParentPortRemoveAllListener";
887     napi_value cb = nullptr;
888 
889     napi_value callResult = nullptr;
890     // ------- workerEnv---------
891     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
892                          Worker::ParentPortRemoveAllListener, worker, &cb);
893     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
894     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
895     worker->EraseWorker();
896     result = Worker_Terminate(env, global);
897     ASSERT_TRUE(result != nullptr);
898 }
899 
900 //worker ParentPortDispatchEvent
901 HWTEST_F(WorkersTest, ParentPortDispatchEventTest001, testing::ext::TestSize.Level0)
902 {
903     napi_env env = (napi_env)engine_;
904     napi_value global;
905     napi_get_global(env, &global);
906     napi_value result = nullptr;
907     result = Worker_Constructor(env, global);
908     Worker* worker = nullptr;
909     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
910     // ------- workerEnv---------
911     napi_env workerEnv = nullptr;
912     napi_create_runtime(env, &workerEnv);
913     napi_value workerGlobal = nullptr;
914     napi_get_global(workerEnv, &workerGlobal);
915 
916     napi_value argv[1] = {nullptr};
917     napi_value objresult = nullptr;
918     napi_create_object(workerEnv, &objresult);
919     napi_value cb = nullptr;
920     std::string funcName = "ParentPortDispatchEvent";
921     napi_value messageKey = nullptr;
922     const char* messageKeyStr = "type";
923     napi_create_string_latin1(workerEnv, messageKeyStr, strlen(messageKeyStr), &messageKey);
924     napi_value messageValue = nullptr;
925     const char* messageValueStr = "message";
926     napi_create_string_latin1(workerEnv, messageValueStr, strlen(messageValueStr), &messageValue);
927     napi_set_property(workerEnv, objresult, messageKey, messageValue);
928     argv[0] = objresult;
929     napi_value callResult = nullptr;
930     // ------- workerEnv---------
931     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
932                          Worker::ParentPortDispatchEvent, worker, &cb);
933     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
934     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
935     worker->EraseWorker();
936     result = Worker_Terminate(env, global);
937     ASSERT_TRUE(result != nullptr);
938 }
939 
940 //worker ParentPortRemoveEventListener
941 HWTEST_F(WorkersTest, ParentPortRemoveEventListenerTest001, testing::ext::TestSize.Level0)
942 {
943     napi_env env = (napi_env)engine_;
944     napi_value global;
945     napi_get_global(env, &global);
946     napi_value result = nullptr;
947     result = Worker_Constructor(env, global);
948     Worker* worker = nullptr;
949     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
950     // ------- workerEnv---------
951     napi_env workerEnv = nullptr;
952     napi_create_runtime(env, &workerEnv);
953     napi_value workerGlobal = nullptr;
954     napi_get_global(workerEnv, &workerGlobal);
955 
956     napi_value argv[2] = {nullptr};
957     std::string message = "host";
958     napi_create_string_utf8(workerEnv, message.c_str(), message.length(), &argv[0]);
__anon1cfb03780c02(napi_env env, napi_callback_info info) 959     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
960         return nullptr;
961     };
962     std::string funcName = "ParentPortRemoveEventListener";
963     napi_value cb = nullptr;
964     napi_value funcValue = nullptr;
965     napi_create_function(workerEnv, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
966     argv[1] = funcValue;
967 
968     napi_value callResult = nullptr;
969     // ------- workerEnv---------
970     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
971                          Worker::ParentPortRemoveEventListener, worker, &cb);
972     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
973     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
974     worker->EraseWorker();
975     result = Worker_Terminate(env, global);
976     ASSERT_TRUE(result != nullptr);
977 }
978 
979 //worker GlobalCall
980 HWTEST_F(WorkersTest, GlobalCallTest001, testing::ext::TestSize.Level0)
981 {
982     napi_env env = (napi_env)engine_;
983     napi_value global;
984     napi_get_global(env, &global);
985     napi_value result = nullptr;
986     result = Worker_Constructor(env, global);
987     Worker* worker = nullptr;
988     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
989     // ------- workerEnv---------
990     napi_env workerEnv = nullptr;
991     napi_create_runtime(env, &workerEnv);
992     napi_value workerGlobal = nullptr;
993     napi_get_global(workerEnv, &workerGlobal);
994 
995     napi_value argv[3] = {nullptr};
996     std::string instanceName = "host";
997     std::string methodName = "postMessage";
998     int32_t timeout = 300;
999     napi_create_string_utf8(workerEnv, instanceName.c_str(), instanceName.length(), &argv[0]);
1000     napi_create_string_utf8(workerEnv, methodName.c_str(), methodName.length(), &argv[1]);
1001     napi_create_int32(workerEnv, timeout, &argv[2]);
1002 
1003     std::string funcName = "GlobalCall";
1004     napi_value cb = nullptr;
1005     napi_value callResult = nullptr;
1006     // ------- workerEnv---------
1007     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
1008                          Worker::GlobalCall, worker, &cb);
1009     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1010     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
1011     uv_async_t* req = new uv_async_t;
1012     req->data = worker;
1013     Worker::HostOnGlobalCall(req);
1014     worker->EraseWorker();
1015     result = Worker_Terminate(env, global);
1016     ASSERT_TRUE(result != nullptr);
1017 }
1018 
1019 //messageQueue DeQueue_QUEUE_IS_NULL
1020 HWTEST_F(WorkersTest, MessageQueueTest001, testing::ext::TestSize.Level0)
1021 {
1022     MessageQueue queue;
1023     ASSERT_TRUE(queue.IsEmpty());
1024     MessageDataType data = nullptr;
1025     ASSERT_FALSE(queue.DeQueue(&data));
1026 }
1027 
1028 //messageQueue DeQueue_DATA_IS_NULL
1029 HWTEST_F(WorkersTest, MessageQueueTest002, testing::ext::TestSize.Level0)
1030 {
1031     napi_env env = (napi_env)engine_;
1032     MessageQueue queue;
1033     MessageDataType data = nullptr;
1034     napi_value undefined = NapiHelper::GetUndefinedValue(env);
1035     napi_serialize_inner(env, undefined, undefined, undefined, false, true, &data);
1036     queue.EnQueue(data);
1037     ASSERT_TRUE(queue.DeQueue(nullptr));
1038     queue.Clear(env);
1039 }
1040 
1041 //messageQueue MARKEDMESSAGEQUEUE
1042 HWTEST_F(WorkersTest, MarkedMessageQueue001, testing::ext::TestSize.Level0)
1043 {
1044     napi_env env = (napi_env)engine_;
1045     MarkedMessageQueue queue;
1046     MessageDataType data = nullptr;
1047     napi_value undefined = NapiHelper::GetUndefinedValue(env);
1048     napi_serialize_inner(env, undefined, undefined, undefined, false, true, &data);
1049     queue.Push(1, data);
1050     queue.Pop();
1051     ASSERT_TRUE(queue.IsEmpty());
1052 
1053     MessageDataType dataType = nullptr;
1054     napi_serialize_inner(env, undefined, undefined, undefined, false, true, &dataType);
1055     queue.Push(2, dataType);
1056     std::pair<uint32_t, MessageDataType> pair = queue.Front();
1057     ASSERT_EQ(pair.first, 2);
1058     queue.Clear(env);
1059     ASSERT_TRUE(queue.IsEmpty());
1060 }
1061 
1062 HWTEST_F(WorkersTest, WorkerTest001, testing::ext::TestSize.Level0)
1063 {
1064     napi_env env = (napi_env)engine_;
1065     napi_value global;
1066     napi_get_global(env, &global);
1067     napi_value result = nullptr;
1068     result = Worker_Constructor(env, global);
1069     Worker* worker = nullptr;
1070     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1071     napi_env workerEnv = nullptr;
1072     napi_create_runtime(env, &workerEnv);
1073     napi_value exports = nullptr;
1074     napi_create_object(workerEnv, &exports);
1075     Worker::InitWorker(workerEnv, exports);
1076     worker->EraseWorker();
1077     result = Worker_Terminate(env, global);
1078     ASSERT_TRUE(result != nullptr);
1079 }
1080 
1081 HWTEST_F(WorkersTest, WorkerTest002, testing::ext::TestSize.Level0)
1082 {
1083     napi_env env = (napi_env)engine_;
1084     napi_value global;
1085     napi_get_global(env, &global);
1086     napi_value result = nullptr;
1087     result = Worker_Constructor(env, global);
1088     Worker* worker = nullptr;
1089     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1090 
1091     napi_value argv[2] = {nullptr};
1092     std::string instanceName = "MainThread";
1093     napi_create_string_utf8(env, instanceName.c_str(), instanceName.length(), &argv[0]);
1094     napi_value obj = nullptr;
1095     napi_create_object(env, &obj);
1096     argv[1] = obj;
1097 
1098     std::string funcName = "RegisterGlobalCallObject";
1099     napi_value cb = nullptr;
1100     napi_value callResult = nullptr;
1101     // ------- workerEnv---------
1102     napi_create_function(env, funcName.c_str(), funcName.size(),
1103                          Worker::RegisterGlobalCallObject, worker, &cb);
1104     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1105     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
1106     worker->EraseWorker();
1107     result = Worker_Terminate(env, global);
1108     ASSERT_TRUE(result != nullptr);
1109 }
1110 
1111 HWTEST_F(WorkersTest, WorkerTest003, testing::ext::TestSize.Level0)
1112 {
1113     napi_env env = (napi_env)engine_;
1114     napi_value global;
1115     napi_get_global(env, &global);
1116     napi_value result = nullptr;
1117     result = Worker_Constructor(env, global);
1118     Worker* worker = nullptr;
1119     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1120 
1121     napi_value argv[1] = {nullptr};
1122     std::string instanceName = "MainThread";
1123     napi_create_string_utf8(env, instanceName.c_str(), instanceName.length(), &argv[0]);
1124 
1125     std::string funcName = "UnregisterGlobalCallObject";
1126     napi_value cb = nullptr;
1127     napi_value callResult = nullptr;
1128     // ------- workerEnv---------
1129     napi_create_function(env, funcName.c_str(), funcName.size(),
1130                         Worker::UnregisterGlobalCallObject, worker, &cb);
1131     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1132     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
1133     worker->EraseWorker();
1134     result = Worker_Terminate(env, global);
1135     ASSERT_TRUE(result != nullptr);
1136 }
1137 
1138 HWTEST_F(WorkersTest, WorkerTest004, testing::ext::TestSize.Level0)
1139 {
1140     napi_env env = (napi_env)engine_;
1141     napi_env workerEnv = nullptr;
1142     napi_create_runtime(env, &workerEnv);
1143     napi_value workerGlobal = nullptr;
1144     napi_get_global(workerEnv, &workerGlobal);
1145     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
1146     std::string funcName = "LimitedWorkerConstructor";
1147     napi_value cb = nullptr;
1148     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::LimitedWorkerConstructor, nullptr, &cb);
1149 
1150     napi_value result = nullptr;
1151     napi_value argv[2] = { nullptr };
1152     std::string script = "entry/ets/workers/@worker.ts";
1153     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
1154     std::string type = "classic";
1155     std::string name = "WorkerThread";
1156     napi_value typeValue = nullptr;
1157     napi_value nameValue = nullptr;
1158     napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
1159     napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
1160 
1161     napi_value object = nullptr;
1162     napi_create_object(workerEnv, &object);
1163 
1164     napi_set_named_property(workerEnv, object, "name", nameValue);
1165     napi_set_named_property(workerEnv, object, "type", typeValue);
1166     argv[1] = object;
1167 
1168     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1169     uv_sleep(200);
1170     Worker* worker = nullptr;
1171     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1172     worker->EraseWorker();
1173     result = Worker_Terminate(workerEnv, workerGlobal);
1174     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
1175     ASSERT_TRUE(result != nullptr);
1176 }
1177 
1178 HWTEST_F(WorkersTest, WorkerTest005, testing::ext::TestSize.Level0)
1179 {
1180     napi_env env = (napi_env)engine_;
1181     napi_env workerEnv = nullptr;
1182     napi_create_runtime(env, &workerEnv);
1183     napi_value workerGlobal = nullptr;
1184     napi_get_global(workerEnv, &workerGlobal);
1185     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
1186     std::string funcName = "ThreadWorkerConstructor";
1187     napi_value cb = nullptr;
1188     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
1189 
1190     napi_value result = nullptr;
1191     napi_value argv[2] = { nullptr };
1192     std::string script = "entry/ets/workers/@worker.ts";
1193     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
1194     std::string type = "classic";
1195     std::string name = "WorkerThread";
1196     napi_value typeValue = nullptr;
1197     napi_value nameValue = nullptr;
1198     napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
1199     napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
1200 
1201     napi_value object = nullptr;
1202     napi_create_object(workerEnv, &object);
1203 
1204     napi_set_named_property(workerEnv, object, "name", nameValue);
1205     napi_set_named_property(workerEnv, object, "type", typeValue);
1206     argv[1] = object;
1207 
1208     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1209     uv_sleep(200);
1210     Worker* worker = nullptr;
1211     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1212     worker->EraseWorker();
1213     result = Worker_Terminate(workerEnv, workerGlobal);
1214     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
1215     ASSERT_TRUE(result != nullptr);
1216 }
1217 
1218 HWTEST_F(WorkersTest, WorkerTest006, testing::ext::TestSize.Level0)
1219 {
1220     napi_env env = (napi_env)engine_;
1221     napi_value global;
1222     napi_get_global(env, &global);
1223 
1224     napi_value result = nullptr;
1225     result = Worker_Constructor(env, global);
1226 
1227     Worker* worker = nullptr;
1228     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1229 
1230     napi_value argv[1] = { nullptr };
1231     std::string message = "host";
1232     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
1233     std::string funcName = "PostMessageWithSharedSendable";
1234     napi_value cb = nullptr;
1235     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessageWithSharedSendable, worker, &cb);
1236     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1237     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1238 
1239     worker->EraseWorker();
1240     result = Worker_Terminate(env, global);
1241     ASSERT_TRUE(result != nullptr);
1242 }
1243 
1244 HWTEST_F(WorkersTest, WorkerTest007, testing::ext::TestSize.Level0)
1245 {
1246     napi_env env = (napi_env)engine_;
1247     napi_value global;
1248     napi_get_global(env, &global);
1249 
1250     napi_value result = nullptr;
1251     result = Worker_Constructor(env, global);
1252 
1253     Worker* worker = nullptr;
1254     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1255 
1256     napi_value argv[1] = { nullptr };
1257 
1258     std::string funcName = "RemoveAllListener";
1259     napi_value cb = nullptr;
1260     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::RemoveAllListener, worker, &cb);
1261     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1262     napi_call_function(env, global, cb, 1, argv, &result);
1263     worker->EraseWorker();
1264     result = Worker_Terminate(env, global);
1265     ASSERT_TRUE(result != nullptr);
1266 }
1267 
1268 HWTEST_F(WorkersTest, WorkerTest008, testing::ext::TestSize.Level0)
1269 {
1270     napi_env env = (napi_env)engine_;
1271     napi_value global;
1272     napi_get_global(env, &global);
1273 
1274     napi_value result = nullptr;
1275     result = Worker_Constructor(env, global);
1276 
1277     Worker* worker = nullptr;
1278     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1279 
1280     napi_value argv[1] = { nullptr };
1281     std::string message = "host";
1282     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
1283 
1284     std::string funcName = "CancelTask";
1285     napi_value cb = nullptr;
1286     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::CancelTask, worker, &cb);
1287     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1288     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1289     worker->EraseWorker();
1290     result = Worker_Terminate(env, global);
1291     ASSERT_TRUE(result != nullptr);
1292 }
1293 
1294 HWTEST_F(WorkersTest, WorkerTest009, testing::ext::TestSize.Level0)
1295 {
1296     napi_env env = (napi_env)engine_;
1297     napi_value global;
1298     napi_get_global(env, &global);
1299 
1300     napi_value result = nullptr;
1301     result = Worker_Constructor(env, global);
1302 
1303     Worker* worker = nullptr;
1304     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1305     napi_value argv[1] = { nullptr };
1306     std::string message = "host";
1307     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
1308 
1309     std::string funcName = "PostMessageWithSharedSendableToHost";
1310     napi_value cb = nullptr;
1311     napi_create_function(env, funcName.c_str(), funcName.size(),
1312                          Worker::PostMessageWithSharedSendableToHost, worker, &cb);
1313     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1314     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1315     uv_async_t* req = new uv_async_t;
1316     req->data = worker;
1317     Worker::HostOnMessage(req);
1318 
1319     worker->EraseWorker();
1320     result = Worker_Terminate(env, global);
1321     ASSERT_TRUE(result != nullptr);
1322 }
1323 
1324 HWTEST_F(WorkersTest, WorkerTest010, testing::ext::TestSize.Level0)
1325 {
1326     napi_env env = (napi_env)engine_;
1327     napi_value global;
1328     napi_get_global(env, &global);
1329 
1330     napi_value result = nullptr;
1331     result = Worker_Constructor(env, global);
1332 
1333     Worker* worker = nullptr;
1334     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1335     napi_value argv[1] = { nullptr };
1336     std::string message = "host";
1337     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
1338 
1339     std::string funcName = "ParentPortCancelTask";
1340     napi_value cb = nullptr;
1341     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::ParentPortCancelTask, worker, &cb);
1342     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1343     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1344     worker->EraseWorker();
1345     result = Worker_Terminate(env, global);
1346     ASSERT_TRUE(result != nullptr);
1347 }
1348 
1349 HWTEST_F(WorkersTest, WorkerTest011, testing::ext::TestSize.Level0)
1350 {
1351     napi_env env = (napi_env)engine_;
1352     napi_value global;
1353     napi_get_global(env, &global);
1354 
1355     napi_value result = nullptr;
1356     result = Worker_Constructor(env, global);
1357 
1358     Worker* worker = nullptr;
1359     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1360     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1361     uv_async_t* req = new uv_async_t;
1362     req->data = nullptr;
1363     Worker::HostOnError(req);
1364     req->data = worker;
1365     Worker::HostOnError(req);
1366     worker->EraseWorker();
1367     ASSERT_TRUE(result != nullptr);
1368 }
1369 
1370 //worker PostMessage
1371 HWTEST_F(WorkersTest, WorkerTest012, testing::ext::TestSize.Level0)
1372 {
1373     napi_env env = (napi_env)engine_;
1374     napi_value global;
1375     napi_get_global(env, &global);
1376 
1377     napi_value result = nullptr;
1378     result = Worker_Constructor(env, global);
1379 
1380     Worker* worker = nullptr;
1381     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1382 
1383     napi_value argv[1] = { nullptr };
1384     std::string message = "host";
1385     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
1386     std::string funcName = "PostMessage";
1387     napi_value cb = nullptr;
1388     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessage, worker, &cb);
1389     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1390     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1391 
1392     worker->EraseWorker();
1393     result = Worker_Terminate(env, global);
1394     ASSERT_TRUE(result != nullptr);
1395 }
1396 
1397 
1398 HWTEST_F(WorkersTest, CloseWorkerTest001, testing::ext::TestSize.Level0)
1399 {
1400     napi_env env = (napi_env)engine_;
1401     napi_value global;
1402     napi_get_global(env, &global);
1403     napi_value result = nullptr;
1404     std::string funcName = "CloseWorker";
1405     napi_value cb = nullptr;
1406     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::CloseWorker, nullptr, &cb);
1407     napi_call_function(env, global, cb, 0, nullptr, &result);
1408     ASSERT_TRUE(result != nullptr);
1409 }
1410 
1411 HWTEST_F(WorkersTest, CloseWorkerTest002, testing::ext::TestSize.Level0)
1412 {
1413     napi_env env = (napi_env)engine_;
1414     napi_value global;
1415     napi_get_global(env, &global);
1416 
1417     napi_value result = nullptr;
1418     result = Worker_Constructor(env, global);
1419 
1420     Worker* worker = nullptr;
1421     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1422     ASSERT_TRUE(worker != nullptr);
1423 
1424     std::string funcName = "CloseWorker";
1425     napi_value cb = nullptr;
1426     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::CloseWorker, worker, &cb);
1427     SetCloseWorkerProp(worker, env);
1428     napi_call_function(env, global, cb, 0, nullptr, &result);
1429     worker->EraseWorker();
1430     ASSERT_TRUE(result != nullptr);
1431 }
1432 
1433 HWTEST_F(WorkersTest, InitWorkerTest001, testing::ext::TestSize.Level0)
1434 {
1435     napi_env env = (napi_env)engine_;
1436     napi_value exports = nullptr;
1437     napi_create_object(env, &exports);
1438     Worker::InitWorker(env, exports);
1439     ASSERT_TRUE(exports != nullptr);
1440 }
1441 
1442 HWTEST_F(WorkersTest, InitWorkerTest002, testing::ext::TestSize.Level0)
1443 {
1444     napi_env env = (napi_env)engine_;
1445     napi_env workerEnv = nullptr;
1446     napi_create_runtime(env, &workerEnv);
1447     napi_value workerGlobal = nullptr;
1448     napi_get_global(workerEnv, &workerGlobal);
1449     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
1450     std::string funcName = "ThreadWorkerConstructor";
1451     napi_value cb = nullptr;
1452     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
1453 
1454     napi_value result = nullptr;
1455     napi_value argv[2] = { nullptr };
1456     std::string script = "entry/ets/workers/@worker.ts";
1457     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
1458     std::string type = "classic";
1459     std::string name = "WorkerThread";
1460     napi_value typeValue = nullptr;
1461     napi_value nameValue = nullptr;
1462     napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
1463     napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
1464 
1465     napi_value object = nullptr;
1466     napi_create_object(workerEnv, &object);
1467 
1468     napi_set_named_property(workerEnv, object, "name", nameValue);
1469     napi_set_named_property(workerEnv, object, "type", typeValue);
1470     argv[1] = object;
1471 
1472     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1473     uv_sleep(200);
1474     Worker* worker = nullptr;
1475     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1476     ASSERT_TRUE(worker != nullptr);
1477     worker->SetWorkerEnv(workerEnv);
1478     NativeEngine* workerEngine = reinterpret_cast<NativeEngine*>(workerEnv);
1479     workerEngine->MarkRestrictedWorkerThread();
1480     napi_value exports = nullptr;
1481     napi_create_object(env, &exports);
1482     Worker::InitWorker(workerEnv, exports);
1483     worker->EraseWorker();
1484     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
1485     ASSERT_TRUE(result != nullptr);
1486 }
1487 
1488 HWTEST_F(WorkersTest, InitWorkerTest003, testing::ext::TestSize.Level0)
1489 {
1490     napi_env env = (napi_env)engine_;
1491     napi_env workerEnv = nullptr;
1492     napi_create_runtime(env, &workerEnv);
1493     napi_value workerGlobal = nullptr;
1494     napi_get_global(workerEnv, &workerGlobal);
1495     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
1496     std::string funcName = "ThreadWorkerConstructor";
1497     napi_value cb = nullptr;
1498     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
1499 
1500     napi_value result = nullptr;
1501     napi_value argv[2] = { nullptr };
1502     std::string script = "entry/ets/workers/@worker.ts";
1503     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
1504     std::string type = "classic";
1505     std::string name = "WorkerThread";
1506     napi_value typeValue = nullptr;
1507     napi_value nameValue = nullptr;
1508     napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
1509     napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
1510 
1511     napi_value object = nullptr;
1512     napi_create_object(workerEnv, &object);
1513 
1514     napi_set_named_property(workerEnv, object, "name", nameValue);
1515     napi_set_named_property(workerEnv, object, "type", typeValue);
1516     argv[1] = object;
1517 
1518     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1519 
1520     uv_sleep(200);
1521     Worker* worker = new Worker(env, nullptr);
1522     napi_wrap(env, result, worker, nullptr, nullptr, nullptr);
1523     worker->SetWorkerEnv(workerEnv);
1524     NativeEngine* workerEngine = reinterpret_cast<NativeEngine*>(workerEnv);
1525     workerEngine->MarkTaskPoolThread();
1526     napi_value exports = nullptr;
1527     napi_create_object(env, &exports);
1528     Worker::InitWorker(workerEnv, exports);
1529     worker->EraseWorker();
1530     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
1531     ASSERT_TRUE(result != nullptr);
1532 }
1533 
1534 HWTEST_F(WorkersTest, InitWorkerTest004, testing::ext::TestSize.Level0)
1535 {
1536     napi_env env = (napi_env)engine_;
1537     napi_env workerEnv = nullptr;
1538     napi_create_runtime(env, &workerEnv);
1539     napi_value workerGlobal = nullptr;
1540     napi_get_global(workerEnv, &workerGlobal);
1541     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
1542     std::string funcName = "ThreadWorkerConstructor";
1543     napi_value cb = nullptr;
1544     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
1545 
1546     napi_value result = nullptr;
1547     napi_value argv[2] = { nullptr };
1548     std::string script = "entry/ets/workers/@worker.ts";
1549     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
1550     std::string type = "classic";
1551     std::string name = "WorkerThread";
1552     napi_value typeValue = nullptr;
1553     napi_value nameValue = nullptr;
1554     napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
1555     napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
1556 
1557     napi_value object = nullptr;
1558     napi_create_object(workerEnv, &object);
1559 
1560     napi_set_named_property(workerEnv, object, "name", nameValue);
1561     napi_set_named_property(workerEnv, object, "type", typeValue);
1562     argv[1] = object;
1563 
1564     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1565 
1566     uv_sleep(200);
1567     Worker* worker = nullptr;
1568     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1569     worker->SetWorkerEnv(workerEnv);
1570     NativeEngine* workerEngine = reinterpret_cast<NativeEngine*>(workerEnv);
1571     workerEngine->MarkWorkerThread();
1572     napi_value exports = nullptr;
1573     napi_create_object(workerEnv, &exports);
1574     Worker::InitWorker(workerEnv, exports);
1575     worker->EraseWorker();
1576     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
1577     ASSERT_TRUE(result != nullptr);
1578 }
1579 
1580 HWTEST_F(WorkersTest, InitWorkerTest005, testing::ext::TestSize.Level0)
1581 {
1582     napi_env env = (napi_env)engine_;
1583     napi_env workerEnv = nullptr;
1584     napi_create_runtime(env, &workerEnv);
1585     napi_value workerGlobal = nullptr;
1586     napi_get_global(workerEnv, &workerGlobal);
1587     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
1588 
1589     std::string funcName = "LimitedWorkerConstructor";
1590     napi_value cb = nullptr;
1591     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::LimitedWorkerConstructor, nullptr, &cb);
1592 
1593     napi_value result = nullptr;
1594     napi_value argv[2] = { nullptr };
1595     std::string script = "entry/ets/workers/@worker.ts";
1596     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
1597     std::string type = "classic";
1598     std::string name = "WorkerThread";
1599     napi_value typeValue = nullptr;
1600     napi_value nameValue = nullptr;
1601     napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
1602     napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
1603 
1604     napi_value object = nullptr;
1605     napi_create_object(workerEnv, &object);
1606 
1607     napi_set_named_property(workerEnv, object, "name", nameValue);
1608     napi_set_named_property(workerEnv, object, "type", typeValue);
1609     argv[1] = object;
1610 
1611     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1612 
1613     uv_sleep(200);
1614     Worker* worker = nullptr;
1615     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1616     worker->SetWorkerEnv(workerEnv);
1617     NativeEngine* workerEngine = reinterpret_cast<NativeEngine*>(workerEnv);
1618     workerEngine->MarkRestrictedWorkerThread();
1619     napi_value exports = nullptr;
1620     napi_create_object(workerEnv, &exports);
1621     Worker::InitWorker(workerEnv, exports);
1622     worker->EraseWorker();
1623     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
1624     ASSERT_TRUE(result != nullptr);
1625 }
1626 
1627 HWTEST_F(WorkersTest, ConstructorTest001, testing::ext::TestSize.Level0)
1628 {
1629     napi_env env = WorkersTest::GetEnv();
1630     Worker *worker = new Worker(env, nullptr);
1631     ASSERT_TRUE(worker != nullptr);
1632     napi_env hostEnv = worker->GetHostEnv();
1633     ASSERT_TRUE(env == hostEnv);
1634     napi_env workerEnv = worker->GetWorkerEnv();
1635     ASSERT_TRUE(workerEnv == nullptr);
1636     delete worker;
1637     worker = nullptr;
1638 }
1639 
1640 HWTEST_F(WorkersTest, ConstructorTest002, testing::ext::TestSize.Level0)
1641 {
1642     napi_env env = (napi_env)engine_;
1643     napi_value global = nullptr;
1644     napi_get_global(env, &global);
1645 
1646     std::string funcName = "LimitedWorkerConstructor";
1647     napi_value cb = nullptr;
1648     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::LimitedWorkerConstructor, nullptr, &cb);
1649 
1650     napi_value result = nullptr;
1651     napi_value argv[2] = { nullptr };
1652     std::string script = "entry/ets/workers/@worker.ts";
1653     napi_create_string_utf8(env, script.c_str(), script.length(), &argv[0]);
1654     std::string type = "classic";
1655     std::string name = "WorkerThread";
1656     napi_value typeValue = nullptr;
1657     napi_value nameValue = nullptr;
1658     napi_create_string_utf8(env, name.c_str(), name.length(), &nameValue);
1659     napi_create_string_utf8(env, type.c_str(), type.length(), &typeValue);
1660 
1661     napi_value object = nullptr;
1662     napi_create_object(env, &object);
1663 
1664     napi_set_named_property(env, object, "name", nameValue);
1665     napi_set_named_property(env, object, "type", typeValue);
1666     argv[1] = object;
1667 
1668     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1669     uv_sleep(200);
1670     ASSERT_TRUE(result == nullptr);
1671 }
1672 
1673 HWTEST_F(WorkersTest, ConstructorTest003, testing::ext::TestSize.Level0)
1674 {
1675     napi_env env = (napi_env)engine_;
1676     napi_value global = nullptr;
1677     napi_get_global(env, &global);
1678 
1679     std::string funcName = "ThreadWorkerConstructor";
1680     napi_value cb = nullptr;
1681     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
1682 
1683     napi_value result = nullptr;
1684     napi_value argv[2] = { nullptr };
1685     std::string script = "entry/ets/workers/@worker.ts";
1686     napi_create_string_utf8(env, script.c_str(), script.length(), &argv[0]);
1687     std::string type = "classic";
1688     std::string name = "WorkerThread";
1689     napi_value typeValue = nullptr;
1690     napi_value nameValue = nullptr;
1691     napi_create_string_utf8(env, name.c_str(), name.length(), &nameValue);
1692     napi_create_string_utf8(env, type.c_str(), type.length(), &typeValue);
1693 
1694     napi_value object = nullptr;
1695     napi_create_object(env, &object);
1696 
1697     napi_set_named_property(env, object, "name", nameValue);
1698     napi_set_named_property(env, object, "type", typeValue);
1699     argv[1] = object;
1700 
1701     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1702     uv_sleep(200);
1703     ASSERT_TRUE(result == nullptr);
1704 }
1705 
1706 HWTEST_F(WorkersTest, ConstructorTest004, testing::ext::TestSize.Level0)
1707 {
1708     napi_env env = (napi_env)engine_;
1709     napi_env workerEnv = nullptr;
1710     napi_create_runtime(env, &workerEnv);
1711     napi_value workerGlobal = nullptr;
1712     napi_get_global(workerEnv, &workerGlobal);
1713     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
1714     std::string funcName = "ThreadWorkerConstructor";
1715     napi_value cb = nullptr;
1716     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
1717 
1718     napi_value result = nullptr;
1719     napi_call_function(workerEnv, workerGlobal, cb, 0, nullptr, &result);
1720     uv_sleep(200);
1721     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
1722     ASSERT_TRUE(result == nullptr);
1723 }
1724 
1725 HWTEST_F(WorkersTest, ConstructorTest005, testing::ext::TestSize.Level0)
1726 {
1727     napi_env env = (napi_env)engine_;
1728     napi_env workerEnv = nullptr;
1729     napi_create_runtime(env, &workerEnv);
1730     napi_value workerGlobal = nullptr;
1731     napi_get_global(workerEnv, &workerGlobal);
1732     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
1733     std::string funcName = "ThreadWorkerConstructor";
1734     napi_value cb = nullptr;
1735     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
1736 
1737     napi_value result = nullptr;
1738     napi_value argv[2] = { nullptr };
1739     int32_t script = 200;
1740     napi_create_int32(workerEnv, script, &argv[0]);
1741     std::string type = "classic";
1742     std::string name = "WorkerThread";
1743     napi_value typeValue = nullptr;
1744     napi_value nameValue = nullptr;
1745     napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
1746     napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
1747 
1748     napi_value object = nullptr;
1749     napi_create_object(workerEnv, &object);
1750 
1751     napi_set_named_property(workerEnv, object, "name", nameValue);
1752     napi_set_named_property(workerEnv, object, "type", typeValue);
1753     argv[1] = object;
1754 
1755     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1756     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
1757     uv_sleep(200);
1758     ASSERT_TRUE(result == nullptr);
1759 }
1760 
1761 HWTEST_F(WorkersTest, PostMessageTest004, testing::ext::TestSize.Level0)
1762 {
1763     napi_env env = WorkersTest::GetEnv();
1764     Worker *worker = new Worker(env, nullptr);
1765     UpdateMainThreadWorkerFlag(worker, false);
1766     ASSERT_TRUE(worker != nullptr);
1767     uv_loop_t *loop = nullptr;
1768     napi_status status = napi_get_uv_event_loop(env, &loop);
1769     ASSERT_TRUE(status == napi_ok);
1770     InitHostHandle(worker, loop);
1771 
1772     std::thread t(WorkerThreadFunction, worker);
1773     t.detach();
1774     uint32_t number = 200; // 200 : test number
1775     napi_value numVal = nullptr;
1776     status = napi_create_uint32(env, number, &numVal);
1777     ASSERT_TRUE(status == napi_ok);
1778     void *data = nullptr;
1779     napi_value undefined = nullptr;
1780     napi_get_undefined(env, &undefined);
1781     status = napi_serialize(env, numVal, undefined, undefined, &data);
1782     ASSERT_TRUE(status == napi_ok);
1783     uv_sleep(1000); // 1000 : for post and receive message
1784     PostMessage(worker, data);
1785     uv_sleep(1000); // 1000 : for post and receive message
1786 }
1787 
1788 HWTEST_F(WorkersTest, MaxLimitTest0010, testing::ext::TestSize.Level0)
1789 {
1790     auto checker = std::make_shared<WorkerChecker>();
1791     checker->CreateWorkerList(false, MAX_WORKERS_COUNT + NUM_10);
1792     int32_t failed = checker->GetFailedCount();
1793     checker->DeleteWorkerList();
1794     ASSERT_EQ(failed, NUM_10);
1795 }
1796 
1797 HWTEST_F(WorkersTest, MaxLimitTest0011, testing::ext::TestSize.Level0)
1798 {
1799     auto checker = std::make_shared<WorkerChecker>();
1800     checker->CreateWorkerList(false, MAX_WORKERS_COUNT - NUM_1);
1801     int32_t failed = checker->GetFailedCount();
1802     ASSERT_EQ(failed, 0);
1803 
1804     auto checker2 = std::make_shared<WorkerChecker>();
1805     checker2->CreateWorkerList(false, NUM_1);
1806     failed = checker2->GetFailedCount();
1807     ASSERT_EQ(failed, 0);
1808 
1809     auto checker3 = std::make_shared<WorkerChecker>();
1810     checker3->CreateWorkerList(false, NUM_1);
1811     failed = checker3->GetFailedCount();
1812     ASSERT_EQ(failed, NUM_1);
1813     checker3->DeleteWorkerList();
1814 
1815     checker2->DeleteWorkerList();
1816     auto checker4 = std::make_shared<WorkerChecker>();
1817     checker4->CreateWorkerList(false, NUM_1);
1818     failed = checker4->GetFailedCount();
1819     ASSERT_EQ(failed, 0);
1820     checker4->DeleteWorkerList();
1821 
1822     checker->DeleteWorkerList();
1823 }
1824 
1825 HWTEST_F(WorkersTest, MaxLimitTest0020, testing::ext::TestSize.Level0)
1826 {
1827     auto checker = std::make_shared<ArkRuntimeChecker>();
1828     checker->CreateArkRuntimeList(MAX_ARKRUNTIME_COUNT + NUM_10);
1829     int32_t failed = checker->GetFailedCount();
1830     checker->DeleteArkRuntimeList();
1831     ASSERT_EQ(failed, NUM_10);
1832 }
1833 
1834 HWTEST_F(WorkersTest, MaxLimitTest0021, testing::ext::TestSize.Level0)
1835 {
1836     auto checker = std::make_shared<ArkRuntimeChecker>();
1837     checker->CreateArkRuntimeList(MAX_ARKRUNTIME_COUNT - NUM_1);
1838     int32_t failed = checker->GetFailedCount();
1839     ASSERT_EQ(failed, 0);
1840 
1841     auto checker2 = std::make_shared<ArkRuntimeChecker>();
1842     checker2->CreateArkRuntimeList(NUM_10);
1843     failed = checker2->GetFailedCount();
1844     ASSERT_EQ(failed, NUM_10 - NUM_1);
1845 
1846     auto checker3 = std::make_shared<ArkRuntimeChecker>();
1847     checker3->CreateArkRuntimeList(NUM_1);
1848     failed = checker3->GetFailedCount();
1849     ASSERT_EQ(failed, NUM_1);
1850 
1851     checker3->DeleteArkRuntimeList();
1852     checker2->DeleteArkRuntimeList();
1853 
1854     auto checker4 = std::make_shared<ArkRuntimeChecker>();
1855     checker4->CreateArkRuntimeList(NUM_1);
1856     failed = checker4->GetFailedCount();
1857     ASSERT_EQ(failed, 0);
1858     checker4->DeleteArkRuntimeList();
1859 
1860     checker->DeleteArkRuntimeList();
1861 }
1862 
1863 HWTEST_F(WorkersTest, MaxLimitTest0030, testing::ext::TestSize.Level0)
1864 {
1865     auto arkRuntimeChecker = std::make_shared<ArkRuntimeChecker>();
1866     arkRuntimeChecker->CreateArkRuntimeList(MAX_ARKRUNTIME_COUNT + NUM_10);
1867     int32_t failed1 = arkRuntimeChecker->GetFailedCount();
1868     auto workerChecker = std::make_shared<WorkerChecker>();
1869     workerChecker->CreateWorkerList(false, MAX_WORKERS_COUNT);
1870     int32_t failed2 = workerChecker->GetFailedCount();
1871     workerChecker->DeleteWorkerList();
1872     ASSERT_EQ(failed2, MAX_WORKERS_COUNT + MAX_ARKRUNTIME_COUNT - MAX_JSTHREAD_COUNT);
1873     arkRuntimeChecker->DeleteArkRuntimeList();
1874     ASSERT_EQ(failed1, NUM_10);
1875 }
1876 
1877 HWTEST_F(WorkersTest, MaxLimitTest0031, testing::ext::TestSize.Level0)
1878 {
1879     auto arkRuntimeChecker = std::make_shared<ArkRuntimeChecker>();
1880     arkRuntimeChecker->CreateArkRuntimeList(MAX_ARKRUNTIME_COUNT + NUM_10);
1881     int32_t failed1 = arkRuntimeChecker->GetFailedCount();
1882     auto workerChecker2 = std::make_shared<WorkerChecker>();
1883     workerChecker2->CreateWorkerList(false, MAX_JSTHREAD_COUNT - MAX_ARKRUNTIME_COUNT - NUM_10);
1884     int32_t failed2 = workerChecker2->GetFailedCount();
1885 
1886     auto workerChecker3 = std::make_shared<WorkerChecker>();
1887     workerChecker3->CreateWorkerList(true, NUM_10 + NUM_1);
1888     int32_t failed3 = workerChecker3->GetFailedCount();
1889     ASSERT_EQ(failed3, NUM_1);
1890     workerChecker3->DeleteWorkerList();
1891 
1892     workerChecker2->DeleteWorkerList();
1893     ASSERT_EQ(failed2, 0);
1894     arkRuntimeChecker->DeleteArkRuntimeList();
1895     ASSERT_EQ(failed1, NUM_10);
1896 }
1897 
1898 HWTEST_F(WorkersTest, MaxLimitTest004, testing::ext::TestSize.Level0)
1899 {
1900     auto workerChecker = std::make_shared<WorkerChecker>();
1901     workerChecker->CreateWorkerList(false, MAX_WORKERS_COUNT + NUM_10);
1902     int32_t failed1 = workerChecker->GetFailedCount();
1903     auto arkRuntimeChecker = std::make_shared<ArkRuntimeChecker>();
1904     arkRuntimeChecker->CreateArkRuntimeList(MAX_ARKRUNTIME_COUNT);
1905     int32_t failed2 = arkRuntimeChecker->GetFailedCount();
1906     workerChecker->DeleteWorkerList();
1907     ASSERT_EQ(failed1, NUM_10);
1908     arkRuntimeChecker->DeleteArkRuntimeList();
1909     ASSERT_EQ(failed2, MAX_WORKERS_COUNT + MAX_ARKRUNTIME_COUNT - MAX_JSTHREAD_COUNT);
1910 }
1911 
1912 HWTEST_F(WorkersTest, MaxLimitTest005, testing::ext::TestSize.Level0)
1913 {
1914     auto workerChecker = std::make_shared<WorkerChecker>();
1915     workerChecker->CreateWorkerList(false, MAX_WORKERS_COUNT - NUM_10);
1916     int32_t failed1 = workerChecker->GetFailedCount();
1917     ASSERT_EQ(failed1, 0);
1918 
1919     auto arkRuntimeChecker = std::make_shared<ArkRuntimeChecker>();
1920     arkRuntimeChecker->CreateArkRuntimeList(MAX_JSTHREAD_COUNT - MAX_WORKERS_COUNT + NUM_10 - NUM_1);
1921     int32_t failed2 = arkRuntimeChecker->GetFailedCount();
1922     ASSERT_EQ(failed2, 0);
1923 
1924     auto arkRuntimeChecker2 = std::make_shared<ArkRuntimeChecker>();
1925     arkRuntimeChecker2->CreateArkRuntimeList(NUM_10);
1926     failed2 = arkRuntimeChecker2->GetFailedCount();
1927     ASSERT_EQ(failed2, NUM_10 - NUM_1);
1928     arkRuntimeChecker2->DeleteArkRuntimeList();
1929 
1930     auto arkRuntimeChecker3 = std::make_shared<ArkRuntimeChecker>();
1931     arkRuntimeChecker3->CreateArkRuntimeList(NUM_1);
1932     failed2 = arkRuntimeChecker3->GetFailedCount();
1933     ASSERT_EQ(failed2, 0);
1934 
1935     auto arkRuntimeChecker4 = std::make_shared<ArkRuntimeChecker>();
1936     arkRuntimeChecker4->CreateArkRuntimeList(NUM_1);
1937     failed2 = arkRuntimeChecker4->GetFailedCount();
1938     ASSERT_EQ(failed2, NUM_1);
1939 
1940     arkRuntimeChecker3->DeleteArkRuntimeList();
1941     arkRuntimeChecker4->DeleteArkRuntimeList();
1942 
1943     workerChecker->DeleteWorkerList();
1944     arkRuntimeChecker->DeleteArkRuntimeList();
1945 }