• 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 "helper/error_helper.h"
24 #include "message_queue.h"
25 #include "test.h"
26 #include "napi/native_api.h"
27 #include "napi/native_node_api.h"
28 #include "js_concurrent_module/common/helper/napi_helper.h"
29 #include "native_engine/native_create_env.h"
30 #include "tools/log.h"
31 #include "worker.h"
32 
33 #define SELLP_MS 200
34 
35 #define ASSERT_CHECK_CALL(call)   \
36     {                             \
37         ASSERT_EQ(call, napi_ok); \
38     }
39 
40 #define ASSERT_CHECK_VALUE_TYPE(env, value, type)               \
41     {                                                           \
42         napi_valuetype valueType = napi_undefined;              \
43         ASSERT_TRUE(value != nullptr);                          \
44         ASSERT_CHECK_CALL(napi_typeof(env, value, &valueType)); \
45         ASSERT_EQ(valueType, type);                             \
46     }
47 
48 using namespace Commonlibrary::Concurrent::WorkerModule;
49 
50 namespace Commonlibrary::Concurrent::WorkerModule {
51 
52 static constexpr uint32_t GLOBAL_CALL_ID_MAX = 4294967295;
53 static constexpr size_t GLOBAL_CALL_MAX_COUNT = 65535;
54 
55 static constexpr int MAX_WORKERS_COUNT = 64;
56 static constexpr int MAX_ARKRUNTIME_COUNT = 64;
57 static constexpr int MAX_JSTHREAD_COUNT = 80;
58 static constexpr int NUM_10 = 10;
59 static constexpr int NUM_1 = 1;
60 static constexpr int TIME_1000MS = 1000;
61 static constexpr int TIME_500MS = 500;
62 static constexpr int TIME_100MS = 100;
63 
64 class ArkRuntimeChecker {
65 public:
66     ArkRuntimeChecker() = default;
67     static void CreateArkRuntimeEngine(napi_env& workerEnv);
68     void CreateArkRuntimeList(uint32_t runtimeCount);
69     void DeleteArkRuntimeList();
70     int32_t GetFailedCount();
71 
72     std::mutex mutexlock_;
73     std::condition_variable condition_;
74     std::thread* threadArray_[MAX_ARKRUNTIME_COUNT + NUM_10] = { nullptr };
75     std::atomic<uint32_t> failCount_{0};
76     bool notified_ = false;
77 };
78 
CreateArkRuntimeEngine(napi_env & workerEnv)79 void ArkRuntimeChecker::CreateArkRuntimeEngine(napi_env& workerEnv)
80 {
81     panda::RuntimeOption option;
82     option.SetGcType(panda::RuntimeOption::GC_TYPE::GEN_GC);
83     const int64_t poolSize = 0x1000000;
84     option.SetGcPoolSize(poolSize);
85     option.SetLogLevel(panda::RuntimeOption::LOG_LEVEL::ERROR);
86     option.SetDebuggerLibraryPath("");
87     panda::ecmascript::EcmaVM* vm = panda::JSNApi::CreateJSVM(option);
88     ASSERT_NE(vm, nullptr);
89     workerEnv = reinterpret_cast<napi_env>(new (std::nothrow) ArkNativeEngine(vm, nullptr));
90     auto cleanEnv = [vm]() {
91         if (vm != nullptr) {
92             panda::JSNApi::DestroyJSVM(vm);
93         }
94     };
95     ArkNativeEngine* arkEngine = (ArkNativeEngine*)workerEnv;
96     arkEngine->SetCleanEnv(cleanEnv);
97 }
98 
CreateArkRuntimeList(uint32_t runtimeCount)99 void ArkRuntimeChecker::CreateArkRuntimeList(uint32_t runtimeCount)
100 {
101     NativeCreateEnv::RegCreateNapiEnvCallback([] (napi_env *env) {
102         ArkRuntimeChecker::CreateArkRuntimeEngine(*env);
103         return napi_status::napi_ok;
104     });
105     NativeCreateEnv::RegDestroyNapiEnvCallback([] (napi_env *env) {
106         ArkNativeEngine* engine = reinterpret_cast<ArkNativeEngine*>(*env);
107         delete engine;
108         return napi_status::napi_ok;
109     });
110     for (int k = 0; k < runtimeCount; k++) {
111         threadArray_[k] = new std::thread([this] {
112             napi_env newenv = nullptr;
113             napi_create_ark_runtime(&newenv);
114             if (newenv == nullptr) {
115                 this->failCount_++;
116                 return;
117             }
118             std::unique_lock<std::mutex> lock(this->mutexlock_);
119             if (!this->notified_) {
120                 this->condition_.wait(lock);
121             }
122             if (newenv != nullptr) {
123                 napi_destroy_ark_runtime(&newenv);
124             }
125         });
126     }
127     uv_sleep(TIME_1000MS);
128 }
129 
DeleteArkRuntimeList()130 void ArkRuntimeChecker::DeleteArkRuntimeList()
131 {
132     mutexlock_.lock();
133     notified_ = true;
134     condition_.notify_all();
135     mutexlock_.unlock();
136     for (int k = 0; k < MAX_ARKRUNTIME_COUNT + NUM_10; k++) {
137         if (threadArray_[k] != nullptr) {
138             threadArray_[k]->join();
139         }
140     }
141 }
142 
GetFailedCount()143 int32_t ArkRuntimeChecker::GetFailedCount()
144 {
145     return failCount_.load();
146 }
147 
148 class WorkersTest : public testing::Test {
149 public:
SetUpTestSuite()150     static void SetUpTestSuite()
151     {
152         InitializeEngine();
153     }
154 
TearDownTestSuite()155     static void TearDownTestSuite()
156     {
157         DestroyEngine();
158     }
159 
InitializeEngine()160     static void InitializeEngine()
161     {
162         panda::RuntimeOption option;
163         option.SetGcType(panda::RuntimeOption::GC_TYPE::GEN_GC);
164         const int64_t poolSize = 0x1000000;  // 16M
165         option.SetGcPoolSize(poolSize);
166         option.SetLogLevel(panda::RuntimeOption::LOG_LEVEL::ERROR);
167         option.SetDebuggerLibraryPath("");
168         vm_ = panda::JSNApi::CreateJSVM(option);
169         ASSERT_TRUE(vm_ != nullptr);
170         engine_ = new ArkNativeEngine(vm_, nullptr);
171         engine_->SetInitWorkerFunc([](NativeEngine*) {});
172     }
173 
DestroyEngine()174     static void DestroyEngine()
175     {
176         if (engine_) {
177             delete engine_;
178             engine_ = nullptr;
179         }
180         panda::JSNApi::DestroyJSVM(vm_);
181     }
182 
GetEnv()183     static napi_env GetEnv()
184     {
185         return reinterpret_cast<napi_env>(engine_);
186     }
187 
WorkerOnMessage(const uv_async_t * req)188     static void WorkerOnMessage(const uv_async_t *req)
189     {
190         Worker *worker = static_cast<Worker*>(req->data);
191         ASSERT_NE(worker, nullptr);
192         napi_env workerEnv = worker->GetWorkerEnv();
193         void *data = nullptr;
194         while (worker->workerMessageQueue_.DeQueue(&data)) {
195             if (data == nullptr) {
196                 return;
197             }
198             napi_value result = nullptr;
199             napi_status status = napi_deserialize(workerEnv, data, &result);
200             ASSERT_TRUE(status == napi_ok);
201             uint32_t number = 0;
202             status = napi_get_value_uint32(workerEnv, result, &number);
203             ASSERT_TRUE(status == napi_ok);
204             ASSERT_TRUE(number != 0);
205             napi_delete_serialization_data(workerEnv, data);
206             number = 1000; // 1000 : test number
207             napi_value numVal = nullptr;
208             status = napi_create_uint32(workerEnv, number, &numVal);
209             ASSERT_TRUE(status == napi_ok);
210             napi_value undefined = nullptr;
211             napi_get_undefined(workerEnv, &undefined);
212             void *workerData = nullptr;
213             status = napi_serialize_inner(workerEnv, numVal, undefined, undefined, false, true, &workerData);
214             ASSERT_TRUE(status == napi_ok);
215             ASSERT_NE(workerData, nullptr);
216             worker->PostMessageToHostInner(workerData);
217         }
218     }
219 
HostOnMessage(const uv_async_t * req)220     static void HostOnMessage(const uv_async_t *req)
221     {
222         Worker *worker = static_cast<Worker*>(req->data);
223         ASSERT_NE(worker, nullptr);
224         void *data = nullptr;
225         while (worker->hostMessageQueue_.DeQueue(&data)) {
226             if (data == nullptr) {
227                 return;
228             }
229             napi_env hostEnv = worker->GetHostEnv();
230             napi_value result = nullptr;
231             napi_status status = napi_deserialize(hostEnv, data, &result);
232             ASSERT_TRUE(status == napi_ok);
233             uint32_t number = 0;
234             status = napi_get_value_uint32(hostEnv, result, &number);
235             ASSERT_TRUE(status == napi_ok);
236             ASSERT_EQ(number, 1000); // 1000 : test number
237             napi_delete_serialization_data(hostEnv, data);
238         }
239     }
240 
WorkerThreadFunction(void * data)241     static void WorkerThreadFunction(void *data)
242     {
243         auto worker = reinterpret_cast<Worker*>(data);
244         napi_env hostEnv = worker->GetHostEnv();
245         ASSERT_NE(hostEnv, nullptr);
246         napi_env workerEnv  = nullptr;
247         napi_status status = napi_create_runtime(hostEnv, &workerEnv);
248         ASSERT_TRUE(status == napi_ok);
249         worker->SetWorkerEnv(workerEnv);
250         uv_loop_t *workerLoop = nullptr;
251         status = napi_get_uv_event_loop(workerEnv, &workerLoop);
252         ASSERT_TRUE(status == napi_ok);
253         worker->workerOnMessageSignal_ = new uv_async_t;
254         uv_async_init(workerLoop, worker->workerOnMessageSignal_, reinterpret_cast<uv_async_cb>(WorkerOnMessage));
255         worker->workerOnMessageSignal_->data = worker;
256         worker->Loop();
257     }
258 
UpdateMainThreadWorkerFlag(Worker * worker,bool isMainThreadWorker)259     static void UpdateMainThreadWorkerFlag(Worker *worker, bool isMainThreadWorker)
260     {
261         worker->isMainThreadWorker_ = isMainThreadWorker;
262     }
263 
InitHostHandle(Worker * worker,uv_loop_t * loop)264     static void InitHostHandle(Worker *worker, uv_loop_t *loop)
265     {
266         worker->hostOnMessageSignal_ = new uv_async_t;
267         uv_async_init(loop, worker->hostOnMessageSignal_, reinterpret_cast<uv_async_cb>(HostOnMessage));
268         worker->hostOnMessageSignal_->data = worker;
269     }
270 
PostMessage(Worker * worker,void * message)271     static void PostMessage(Worker *worker, void *message)
272     {
273         worker->PostMessageInner(message);
274     }
275 
UpdateWorkerState(Worker * worker,Worker::RunnerState state)276     static void UpdateWorkerState(Worker *worker, Worker::RunnerState state)
277     {
278         bool done = false;
279         do {
280             Worker::RunnerState oldState = worker->runnerState_.load(std::memory_order_acquire);
281             done = worker->runnerState_.compare_exchange_strong(oldState, state);
282         } while (!done);
283     }
284 
SetCloseWorkerProp(Worker * worker,napi_env env)285     static void SetCloseWorkerProp(Worker *worker, napi_env env)
286     {
287         worker->SetWorkerEnv(env);
288         uv_loop_t* loop = worker->GetWorkerLoop();
289         ASSERT_TRUE(loop != nullptr);
290         worker->workerOnMessageSignal_ = new uv_async_t;
291         uv_async_init(loop, worker->workerOnMessageSignal_, reinterpret_cast<uv_async_cb>(
292             UpdateMainThreadWorkerFlag));
293         worker->workerOnMessageSignal_->data = worker;
294         worker->debuggerOnPostTaskSignal_ = new uv_async_t;
295         uv_async_init(loop, worker->debuggerOnPostTaskSignal_, reinterpret_cast<uv_async_cb>(
296             UpdateWorkerState));
297         worker->debuggerOnPostTaskSignal_->data = worker;
298     }
299 
SetWorkerRef(Worker * worker,napi_env env)300     static void SetWorkerRef(Worker *worker, napi_env env)
301     {
302         std::string funcName = "onmessage";
303         auto func = [](napi_env env, napi_callback_info info) -> napi_value {
304             return nullptr;
305         };
306         napi_value funcValue = nullptr;
307         napi_create_function(env, funcName.c_str(), NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
308         napi_value obj = NapiHelper::CreateObject(env);
309         napi_set_named_property(env, obj, funcName.c_str(), funcValue);
310         napi_ref ref = NapiHelper::CreateReference(env, obj, 1);
311         worker->workerRef_ = ref;
312     }
313 
SetWorkerHostEnv(Worker * worker,napi_env env,bool setNull)314     static void SetWorkerHostEnv(Worker *worker, napi_env env, bool setNull)
315     {
316         if (setNull) {
317             worker->hostEnv_ = nullptr;
318             return;
319         }
320         worker->hostEnv_ = env;
321     }
322 
UpdateHostState(Worker * worker,Worker::HostState state)323     static void UpdateHostState(Worker *worker, Worker::HostState state)
324     {
325         bool done = false;
326         do {
327             Worker::HostState oldState = worker->hostState_.load(std::memory_order_acquire);
328             done = worker->hostState_.compare_exchange_strong(oldState, state);
329         } while (!done);
330     }
331 
SetMainThread(Worker * worker,bool isMainThreadWorker)332     static void SetMainThread(Worker *worker, bool isMainThreadWorker)
333     {
334         worker->isMainThreadWorker_ = isMainThreadWorker;
335     }
336 
SetLimitedWorker(Worker * worker,bool isLimitedWorker)337     static void SetLimitedWorker(Worker *worker, bool isLimitedWorker)
338     {
339         worker->isLimitedWorker_ = isLimitedWorker;
340     }
341 
RemoveGlobalCallObject(Worker * worker,napi_env env)342     static void RemoveGlobalCallObject(Worker *worker, napi_env env)
343     {
344         worker->globalCallId_ = GLOBAL_CALL_ID_MAX;
345         worker->IncreaseGlobalCallId();
346         ASSERT_TRUE(worker->globalCallId_ == 1);
347         napi_value obj = NapiHelper::CreateObject(env);
348         napi_ref ref = NapiHelper::CreateReference(env, obj, 1);
349         std::string instanceName = "host";
350         std::string messageStr = "message";
351         worker->AddGlobalCallObject(instanceName, ref);
352         ASSERT_FALSE(worker->RemoveGlobalCallObject(messageStr));
353         ASSERT_TRUE(worker->RemoveGlobalCallObject(instanceName));
354         napi_env workerEnv = nullptr;
355         napi_create_runtime(env, &workerEnv);
356         worker->workerEnv_ = workerEnv;
357         worker->isRelativePath_ = true;
358         worker->PrepareForWorkerInstance();
359         UpdateHostState(worker, Worker::HostState::INACTIVE);
360         worker->PrepareForWorkerInstance();
361         worker->EraseWorker();
362         ClearWorkerHandle(worker);
363         Worker::ExecuteInThread(reinterpret_cast<void*>(worker));
364     }
365 
TestHostOnMessageInner(Worker * worker,napi_env env)366     static void TestHostOnMessageInner(Worker *worker, napi_env env)
367     {
368         uv_async_t* req = new uv_async_t;
369         req->data = nullptr;
370         Worker::HostOnMessage(req);
371         delete req;
372         worker->hostEnv_ = nullptr;
373         worker->HostOnMessageInner();
374         worker->hostEnv_ = env;
375         UpdateHostState(worker, Worker::HostState::INACTIVE);
376         worker->HostOnMessageInner();
377         worker->UpdateHostState(Worker::HostState::ACTIVE);
378         UpdateHostState(worker, Worker::HostState::ACTIVE);
379         worker->hostMessageQueue_.Clear(env);
380         worker->HostOnMessageInner();
381         MessageDataType data1 = nullptr;
382         napi_value undefined = NapiHelper::GetUndefinedValue(env);
383         napi_serialize_inner(env, undefined, undefined,
384                              undefined, false, true, &data1);
385         worker->hostMessageQueue_.EnQueue(data1);
386         SetWorkerRef(worker, env);
387         worker->HostOnMessageInner();
388         MessageDataType data2 = nullptr;
389         napi_serialize_inner(env, undefined, undefined,
390                              undefined, false, true, &data2);
391         worker->hostMessageQueue_.EnQueue(data2);
392         std::string funcName = "onmessage";
393         napi_value funcValue = nullptr;
394         napi_create_string_utf8(env, funcName.c_str(), funcName.length(), &funcValue);
395         napi_value obj = NapiHelper::CreateObject(env);
396         napi_set_named_property(env, obj, funcName.c_str(), funcValue);
397         napi_ref ref = NapiHelper::CreateReference(env, obj, 1);
398         worker->workerRef_ = ref;
399         worker->HostOnMessageInner();
400     }
401 
HostOnGlobalCall(Worker * worker,napi_env env)402     static void HostOnGlobalCall(Worker *worker, napi_env env)
403     {
404         uv_async_t* req = new uv_async_t;
405         req->data = nullptr;
406         Worker::HostOnGlobalCall(req);
407         delete req;
408         req->data = worker;
409         worker->hostEnv_ = nullptr;
410         worker->HostOnGlobalCallInner();
411         worker->hostEnv_ = env;
412         UpdateHostState(worker, Worker::HostState::INACTIVE);
413         worker->HostOnGlobalCallInner();
414         UpdateHostState(worker, Worker::HostState::ACTIVE);
415         worker->HostOnGlobalCallInner();
416         napi_value undefined = NapiHelper::GetUndefinedValue(env);
417         for (size_t index = 0; index <= GLOBAL_CALL_MAX_COUNT; ++index) {
418             MessageDataType data = nullptr;
419             napi_serialize_inner(env, undefined, undefined,
420                                  undefined, false, true, &data);
421             worker->hostGlobalCallQueue_.Push(index, data);
422         }
423         worker->HostOnGlobalCallInner();
424         worker->hostGlobalCallQueue_.Clear(env);
425         size_t argc = 2;
426         napi_value args[2] = { nullptr };
427         std::string instanceName = "workerInstance";
428         std::string methodName = "onmessage";
429         napi_create_string_utf8(env, instanceName.c_str(), instanceName.length(), &args[0]);
430         napi_create_string_utf8(env, methodName.c_str(), methodName.length(), &args[1]);
431         MessageDataType data = nullptr;
432         napi_value argsArray;
433         napi_create_array_with_length(env, argc, &argsArray);
434         size_t index = 0;
435         for (size_t i = 0; i < argc; i++) {
436             napi_set_element(env, argsArray, index, args[i]);
437             index++;
438         }
439         napi_serialize_inner(env, argsArray, undefined, undefined, false, true, &data);
440         worker->hostGlobalCallQueue_.Push(1, data);
441         worker->globalCallId_ = 1;
442         worker->HostOnGlobalCallInner();
443     }
444 
HostOnGlobalCallInner001(Worker * worker,napi_env env)445     static void HostOnGlobalCallInner001(Worker *worker, napi_env env)
446     {
447         napi_value undefined = NapiHelper::GetUndefinedValue(env);
448         size_t argc = 2;
449         napi_value args[2] = { nullptr };
450         std::string instanceName = "workerInstance";
451         std::string methodName = "onmessage";
452         napi_create_string_utf8(env, instanceName.c_str(), instanceName.length(), &args[0]);
453         napi_create_string_utf8(env, methodName.c_str(), methodName.length(), &args[1]);
454         MessageDataType data = nullptr;
455         napi_value argsArray;
456         napi_create_array_with_length(env, argc, &argsArray);
457         size_t index = 0;
458         for (size_t i = 0; i < argc; i++) {
459             napi_set_element(env, argsArray, index, args[i]);
460             index++;
461         }
462         napi_serialize_inner(env, argsArray, undefined, undefined, false, true, &data);
463         worker->hostGlobalCallQueue_.Push(1, data);
464         worker->globalCallId_ = 1;
465         napi_value obj = NapiHelper::CreateObject(env);
466         napi_ref ref = NapiHelper::CreateReference(env, obj, 1);
467         worker->AddGlobalCallObject(instanceName, ref);
468         worker->HostOnGlobalCallInner();
469     }
470 
HostOnGlobalCallInner002(Worker * worker,napi_env env)471     static void HostOnGlobalCallInner002(Worker *worker, napi_env env)
472     {
473         napi_value undefined = NapiHelper::GetUndefinedValue(env);
474         size_t argc = 2;
475         napi_value args[2] = { nullptr };
476         std::string instanceName = "workerInstance";
477         std::string methodName = "onmessage";
478         napi_create_string_utf8(env, instanceName.c_str(), instanceName.length(), &args[0]);
479         napi_create_string_utf8(env, methodName.c_str(), methodName.length(), &args[1]);
480         MessageDataType data = nullptr;
481         napi_value argsArray;
482         napi_create_array_with_length(env, argc, &argsArray);
483         size_t index = 0;
484         for (size_t i = 0; i < argc; i++) {
485             napi_set_element(env, argsArray, index, args[i]);
486             index++;
487         }
488         napi_serialize_inner(env, argsArray, undefined, undefined, false, true, &data);
489         worker->hostGlobalCallQueue_.Push(1, data);
490         worker->globalCallId_ = 1;
491         napi_value obj = NapiHelper::CreateObject(env);
492         napi_value methodValue;
493         napi_create_string_utf8(env, methodName.c_str(), methodName.length(), &methodValue);
494         napi_set_named_property(env, obj, methodName.c_str(), methodValue);
495         napi_ref ref = NapiHelper::CreateReference(env, obj, 1);
496         worker->AddGlobalCallObject(instanceName, ref);
497         worker->HostOnGlobalCallInner();
498     }
499 
HostOnGlobalCallInner003(Worker * worker,napi_env env)500     static void HostOnGlobalCallInner003(Worker *worker, napi_env env)
501     {
502         napi_value undefined = NapiHelper::GetUndefinedValue(env);
503         size_t argc = 2;
504         napi_value args[2] = { nullptr };
505         std::string instanceName = "workerInstance";
506         std::string methodName = "onmessage";
507         napi_create_string_utf8(env, instanceName.c_str(), instanceName.length(), &args[0]);
508         napi_create_string_utf8(env, methodName.c_str(), methodName.length(), &args[1]);
509         MessageDataType data = nullptr;
510         napi_value argsArray;
511         napi_create_array_with_length(env, argc, &argsArray);
512         size_t index = 0;
513         for (size_t i = 0; i < argc; i++) {
514             napi_set_element(env, argsArray, index, args[i]);
515             index++;
516         }
517         napi_serialize_inner(env, argsArray, undefined, undefined, false, true, &data);
518         worker->hostGlobalCallQueue_.Push(1, data);
519         worker->globalCallId_ = 1;
520         napi_value obj = NapiHelper::CreateObject(env);
521         auto func = [](napi_env env, napi_callback_info info) -> napi_value {
522             return nullptr;
523         };
524         napi_value funcValue = nullptr;
525         napi_create_function(env, methodName.c_str(), NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
526         napi_set_named_property(env, obj, methodName.c_str(), funcValue);
527         napi_ref ref = NapiHelper::CreateReference(env, obj, 1);
528         worker->AddGlobalCallObject(instanceName, ref);
529         worker->HostOnGlobalCallInner();
530     }
531 
HostOnGlobalCallInner004(Worker * worker,napi_env env)532     static void HostOnGlobalCallInner004(Worker *worker, napi_env env)
533     {
534         napi_value undefined = NapiHelper::GetUndefinedValue(env);
535         size_t argc = 3;
536         napi_value args[3] = { nullptr };
537         std::string instanceName = "workerInstance";
538         std::string methodName = "onmessage";
539         std::string argValue = "test";
540         napi_create_string_utf8(env, instanceName.c_str(), instanceName.length(), &args[0]);
541         napi_create_string_utf8(env, methodName.c_str(), methodName.length(), &args[1]);
542         napi_create_string_utf8(env, argValue.c_str(), argValue.length(), &args[2]); // 2: the index of test argument
543         MessageDataType data = nullptr;
544         napi_value argsArray;
545         napi_create_array_with_length(env, argc, &argsArray);
546         size_t index = 0;
547         for (size_t i = 0; i < argc; i++) {
548             napi_set_element(env, argsArray, index, args[i]);
549             index++;
550         }
551         napi_serialize_inner(env, argsArray, undefined, undefined, false, true, &data);
552         worker->hostGlobalCallQueue_.Push(1, data);
553         worker->globalCallId_ = 1;
554         napi_value obj = NapiHelper::CreateObject(env);
555         auto func = [](napi_env env, napi_callback_info info) -> napi_value {
556             return nullptr;
557         };
558         napi_value funcValue = nullptr;
559         napi_create_function(env, methodName.c_str(), NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
560         napi_set_named_property(env, obj, methodName.c_str(), funcValue);
561         napi_ref ref = NapiHelper::CreateReference(env, obj, 1);
562         worker->AddGlobalCallObject(instanceName, ref);
563         Worker::LimitedWorkerConstructor(env, nullptr);
564         worker->HostOnGlobalCallInner();
565     }
566 
HostOnGlobalCallInner005(Worker * worker,napi_env env)567     static void HostOnGlobalCallInner005(Worker *worker, napi_env env)
568     {
569         napi_value undefined = NapiHelper::GetUndefinedValue(env);
570         size_t argc = 2;
571         napi_value args[3] = { nullptr };
572         std::string instanceName = "workerInstance";
573         std::string methodName = "onmessage";
574         napi_create_string_utf8(env, instanceName.c_str(), instanceName.length(), &args[0]);
575         napi_create_string_utf8(env, methodName.c_str(), methodName.length(), &args[1]);
576         MessageDataType data = nullptr;
577         napi_value argsArray;
578         napi_create_array_with_length(env, argc, &argsArray);
579         size_t index = 0;
580         for (size_t i = 0; i < argc; i++) {
581             napi_set_element(env, argsArray, index, args[i]);
582             index++;
583         }
584         napi_serialize_inner(env, argsArray, undefined, undefined, false, true, &data);
585         worker->hostGlobalCallQueue_.Push(0, data);
586         worker->globalCallId_ = 0;
587         napi_value obj = NapiHelper::CreateObject(env);
588         auto func = [](napi_env env, napi_callback_info info) -> napi_value {
589             return NapiHelper::GetUndefinedValue(env);
590         };
591         napi_value funcValue = nullptr;
592         napi_create_function(env, methodName.c_str(), NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
593         napi_set_named_property(env, obj, methodName.c_str(), funcValue);
594         napi_ref ref = NapiHelper::CreateReference(env, obj, 1);
595         worker->AddGlobalCallObject(instanceName, ref);
596         worker->HostOnGlobalCallInner();
597     }
598 
HostOnGlobalCallInner006(Worker * worker,napi_env env)599     static void HostOnGlobalCallInner006(Worker *worker, napi_env env)
600     {
601         napi_value undefined = NapiHelper::GetUndefinedValue(env);
602         size_t argc = 2;
603         napi_value args[3] = { nullptr };
604         std::string instanceName = "workerInstance";
605         std::string methodName = "onmessage";
606         napi_create_string_utf8(env, instanceName.c_str(), instanceName.length(), &args[0]);
607         napi_create_string_utf8(env, methodName.c_str(), methodName.length(), &args[1]);
608         MessageDataType data = nullptr;
609         napi_value argsArray;
610         napi_create_array_with_length(env, argc, &argsArray);
611         size_t index = 0;
612         for (size_t i = 0; i < argc; i++) {
613             napi_set_element(env, argsArray, index, args[i]);
614             index++;
615         }
616         napi_serialize_inner(env, argsArray, undefined, undefined, false, true, &data);
617         worker->hostGlobalCallQueue_.Push(1, data);
618         worker->globalCallId_ = 1;
619         napi_value obj = NapiHelper::CreateObject(env);
620         auto func = [](napi_env env, napi_callback_info info) -> napi_value {
621             return NapiHelper::GetUndefinedValue(env);
622         };
623         napi_value funcValue = nullptr;
624         napi_create_function(env, methodName.c_str(), NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
625         napi_set_named_property(env, obj, methodName.c_str(), funcValue);
626         napi_ref ref = NapiHelper::CreateReference(env, obj, 1);
627         worker->AddGlobalCallObject(instanceName, ref);
628         worker->HostOnGlobalCallInner();
629     }
630 
HandleGlobalCall(Worker * worker,napi_env env)631     static void HandleGlobalCall(Worker *worker, napi_env env)
632     {
633         worker->AddGlobalCallError(ErrorHelper::ERR_WORKER_SERIALIZATION);
634         worker->HandleGlobalCallError(env);
635         napi_value exception = nullptr;
636         napi_get_and_clear_last_exception(env, &exception);
637         ASSERT_TRUE(exception != nullptr);
638         napi_value errorData = nullptr;
639         napi_value undefined = NapiHelper::GetUndefinedValue(env);
640         napi_serialize_inner(env, undefined, undefined, undefined,
641                              false, true, reinterpret_cast<void**>(&errorData));
642         worker->AddGlobalCallError(ErrorHelper::ERR_WORKER_SERIALIZATION, errorData);
643         worker->AddGlobalCallError(ErrorHelper::ERR_CALL_METHOD_ON_BINDING_OBJ);
644         worker->ClearGlobalCallError(env);
645         worker->hostEnv_ = nullptr;
646         worker->CallHostFunction(0, nullptr, "onmessageerror");
647         worker->hostEnv_ = env;
648         UpdateHostState(worker, Worker::HostState::INACTIVE);
649         worker->CallHostFunction(0, nullptr, "onmessageerror");
650         UpdateHostState(worker, Worker::HostState::ACTIVE);
651         std::string funcName = "onmessage";
652         SetWorkerRef(worker, env);
653         napi_value argv[1] = { nullptr };
654         napi_create_string_utf8(env, funcName.c_str(), funcName.length(), &argv[0]);
655         worker->CallHostFunction(1, argv, "onmessage");
656     }
657 
HostOnError(Worker * worker,napi_env env)658     static void HostOnError(Worker *worker, napi_env env)
659     {
660         worker->hostEnv_ = nullptr;
661         worker->HostOnErrorInner();
662         worker->HostOnMessageErrorInner();
663         worker->hostEnv_ = env;
664         UpdateHostState(worker, Worker::HostState::INACTIVE);
665         worker->HostOnErrorInner();
666         worker->HostOnMessageErrorInner();
667         UpdateHostState(worker, Worker::HostState::ACTIVE);
668         std::string funcName = "onerror";
669         napi_value funcValue = nullptr;
670         napi_create_string_utf8(env, funcName.c_str(), funcName.length(), &funcValue);
671         napi_value obj = NapiHelper::CreateObject(env);
672         napi_set_named_property(env, obj, funcName.c_str(), funcValue);
673         napi_ref ref = NapiHelper::CreateReference(env, obj, 1);
674         worker->workerRef_ = ref;
675         MessageDataType data = nullptr;
676         napi_value undefined = NapiHelper::GetUndefinedValue(env);
677         napi_serialize_inner(env, undefined, undefined, undefined, false, true, &data);
678         worker->errorQueue_.EnQueue(data);
679         worker->HostOnErrorInner();
680     }
681 
HostOnErrorInner(Worker * worker,napi_env env)682     static void HostOnErrorInner(Worker *worker, napi_env env)
683     {
684         std::string funcName = "onerror";
685         auto func = [](napi_env env, napi_callback_info info) -> napi_value {
686             return nullptr;
687         };
688         napi_value funcValue = nullptr;
689         napi_create_function(env, funcName.c_str(), NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
690         napi_value obj = NapiHelper::CreateObject(env);
691         napi_set_named_property(env, obj, funcName.c_str(), funcValue);
692         napi_ref ref = NapiHelper::CreateReference(env, obj, 1);
693         worker->workerRef_ = ref;
694         MessageDataType data = nullptr;
695         napi_value undefined = NapiHelper::GetUndefinedValue(env);
696         napi_serialize_inner(env, undefined, undefined, undefined, false, true, &data);
697         worker->errorQueue_.EnQueue(data);
698         worker->HostOnErrorInner();
699         UpdateWorkerState(worker, Worker::RunnerState::TERMINATED);
700         worker->PostMessageInner(nullptr);
701         UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
702         worker->workerOnMessageSignal_ = nullptr;
703         worker->PostMessageInner(nullptr);
704     }
705 
HostOnMessageErrorInner(Worker * worker,napi_env env)706     static void HostOnMessageErrorInner(Worker *worker, napi_env env)
707     {
708         SetWorkerRef(worker, env);
709         worker->HostOnMessageErrorInner();
710         UpdateWorkerState(worker, Worker::RunnerState::TERMINATED);
711         worker->TerminateInner();
712         UpdateWorkerState(worker, Worker::RunnerState::TERMINATEING);
713         worker->TerminateInner();
714         worker->isTerminated_ = true;
715         worker->CloseInner();
716     }
717 
PublishWorkerOverSignal(Worker * worker,napi_env env)718     static void PublishWorkerOverSignal(Worker *worker, napi_env env)
719     {
720         UpdateHostState(worker, Worker::HostState::INACTIVE);
721         worker->PublishWorkerOverSignal();
722         UpdateHostState(worker, Worker::HostState::ACTIVE);
723         uv_loop_t *loop = nullptr;
724         napi_status status = napi_get_uv_event_loop(env, &loop);
725         ASSERT_TRUE(status == napi_ok);
726         InitHostHandle(worker, loop);
727         worker->isMainThreadWorker_ = false;
728         worker->PublishWorkerOverSignal();
729         worker->isMainThreadWorker_ = true;
730         worker->isLimitedWorker_ = true;
731         worker->PublishWorkerOverSignal();
732         worker->isMainThreadWorker_ = true;
733         worker->isLimitedWorker_ = false;
734         worker->PublishWorkerOverSignal();
735         worker->PostWorkerErrorTask();
736         worker->PostWorkerMessageTask();
737         worker->PostWorkerGlobalCallTask();
738         worker->EraseWorker();
739         worker->PostWorkerOverTask();
740         worker->PostWorkerErrorTask();
741         worker->PostWorkerMessageTask();
742         worker->PostWorkerGlobalCallTask();
743     }
744 
TestWorkerOnMessageInner(Worker * worker,napi_env env)745     static void TestWorkerOnMessageInner(Worker *worker, napi_env env)
746     {
747         uv_async_t* req = new uv_async_t;
748         req->data = nullptr;
749         Worker::WorkerOnMessage(req);
750         delete req;
751         UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
752         napi_env workerEnv = nullptr;
753         napi_create_runtime(env, &workerEnv);
754         worker->workerEnv_ = workerEnv;
755         worker->WorkerOnMessageInner();
756         MessageDataType data = nullptr;
757         napi_value undefined = NapiHelper::GetUndefinedValue(env);
758         napi_serialize_inner(env, undefined, undefined, undefined, false, true, &data);
759         worker->workerMessageQueue_.EnQueue(data);
760         std::string funcName = "onmessage";
761         auto func = [](napi_env env, napi_callback_info info) -> napi_value {
762             return nullptr;
763         };
764         napi_value funcValue = nullptr;
765         napi_create_function(workerEnv, funcName.c_str(), NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
766         napi_value obj = NapiHelper::CreateObject(workerEnv);
767         napi_set_named_property(workerEnv, obj, funcName.c_str(), funcValue);
768         napi_ref ref = NapiHelper::CreateReference(workerEnv, obj, 1);
769         worker->workerPort_ = ref;
770         worker->WorkerOnMessageInner();
771         SetCloseWorkerProp(worker, workerEnv);
772         worker->workerMessageQueue_.EnQueue(nullptr);
773         worker->WorkerOnMessageInner();
774     }
775 
HandleEventListeners(Worker * worker,napi_env env)776     static void HandleEventListeners(Worker *worker, napi_env env)
777     {
778         napi_value obj = NapiHelper::CreateObject(env);
779         napi_ref callback = NapiHelper::CreateReference(env, obj, 1);
780         auto listener = new Worker::WorkerListener(env, callback, Worker::ListenerMode::PERMANENT);
781         std::string funcName = "onmessage";
782         worker->AddListenerInner(env, "onmessage", listener);
783         worker->HandleEventListeners(env, nullptr, 0, nullptr, "onmessage");
784         worker->eventListeners_.clear();
785         auto func = [](napi_env env, napi_callback_info info) -> napi_value {
786             return nullptr;
787         };
788         napi_value obj2 = NapiHelper::CreateObject(env);
789         napi_value funcValue = nullptr;
790         napi_create_function(env, funcName.c_str(), NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
791         napi_ref callback2 = NapiHelper::CreateReference(env, funcValue, 1);
792         auto listener2 = new Worker::WorkerListener(env, callback2, Worker::ListenerMode::ONCE);
793         worker->AddListenerInner(env, "onmessage", listener2);
794         worker->HandleEventListeners(env, obj2, 0, nullptr, "onmessage");
795         worker->eventListeners_.clear();
796     }
797 
HandleHostException(Worker * worker,napi_env env)798     static void HandleHostException(Worker *worker, napi_env env)
799     {
800         worker->HandleHostException();
801         ErrorHelper::ThrowError(env, ErrorHelper::ERR_WORKER_NOT_RUNNING, "Worker create runtime error");
802         worker->HandleHostException();
803         napi_value exception = nullptr;
804         napi_get_and_clear_last_exception(env, &exception);
805         ASSERT_TRUE(exception != nullptr);
806         napi_env workerEnv = nullptr;
807         napi_create_runtime(env, &workerEnv);
808         worker->workerEnv_ = workerEnv;
809         worker->HandleException();
810         ErrorHelper::ThrowError(workerEnv, ErrorHelper::ERR_WORKER_NOT_RUNNING, "Worker create runtime error");
811         std::string funcName = "onerror";
812         auto func = [](napi_env env, napi_callback_info info) -> napi_value {
813             return nullptr;
814         };
815         napi_value funcValue = nullptr;
816         napi_create_function(workerEnv, funcName.c_str(), NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
817         napi_value obj = NapiHelper::CreateObject(workerEnv);
818         napi_set_named_property(workerEnv, obj, funcName.c_str(), funcValue);
819         napi_ref ref = NapiHelper::CreateReference(workerEnv, obj, 1);
820         worker->workerPort_ = ref;
821         uv_loop_t* loop = worker->GetWorkerLoop();
822         ASSERT_TRUE(loop != nullptr);
823         worker->hostOnErrorSignal_ = new uv_async_t;
824         uv_async_init(loop, worker->hostOnErrorSignal_,
825                       reinterpret_cast<uv_async_cb>(UpdateMainThreadWorkerFlag));
826         worker->hostOnErrorSignal_->data = worker;
827         worker->isMainThreadWorker_ = false;
828         worker->HandleException();
829         worker->isMainThreadWorker_ = true;
830         worker->isLimitedWorker_ = true;
831         ErrorHelper::ThrowError(workerEnv, ErrorHelper::ERR_WORKER_NOT_RUNNING, "Worker create runtime error");
832         worker->HandleException();
833         worker->isLimitedWorker_ = false;
834         ErrorHelper::ThrowError(workerEnv, ErrorHelper::ERR_WORKER_NOT_RUNNING, "Worker create runtime error");
835         worker->HandleException();
836         ErrorHelper::ThrowError(workerEnv, ErrorHelper::ERR_WORKER_NOT_RUNNING, "Worker create runtime error");
837         napi_get_and_clear_last_exception(workerEnv, &exception);
838         worker->hostEnv_ = nullptr;
839         worker->HandleUncaughtException(exception);
840         worker->hostEnv_ = env;
841         UpdateHostState(worker, Worker::HostState::INACTIVE);
842         worker->HandleUncaughtException(exception);
843     }
844 
PostMessageToHostInner(Worker * worker,napi_env env)845     static void PostMessageToHostInner(Worker *worker, napi_env env)
846     {
847         worker->hostEnv_ = nullptr;
848         worker->PostMessageToHostInner(nullptr);
849         worker->hostEnv_ = env;
850         UpdateHostState(worker, Worker::HostState::INACTIVE);
851         worker->PostMessageToHostInner(nullptr);
852         UpdateHostState(worker, Worker::HostState::ACTIVE);
853         uv_loop_t *loop = nullptr;
854         napi_status status = napi_get_uv_event_loop(env, &loop);
855         ASSERT_TRUE(status == napi_ok);
856         InitHostHandle(worker, loop);
857         worker->isMainThreadWorker_ = false;
858         worker->PostMessageToHostInner(nullptr);
859         worker->isMainThreadWorker_ = true;
860         worker->isLimitedWorker_ = true;
861         worker->PostMessageToHostInner(nullptr);
862         worker->isMainThreadWorker_ = true;
863         worker->isLimitedWorker_ = false;
864         worker->PostMessageToHostInner(nullptr);
865     }
866 
RemoveListenerInner(Worker * worker,napi_env env)867     static void RemoveListenerInner(Worker *worker, napi_env env)
868     {
869         worker->RemoveListenerInner(env, "onmessage", nullptr);
870         std::string funcName = "onmessage";
871         auto func = [](napi_env env, napi_callback_info info) -> napi_value {
872             return nullptr;
873         };
874         napi_value funcValue = nullptr;
875         napi_create_function(env, funcName.c_str(), NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
876         napi_ref callback = NapiHelper::CreateReference(env, funcValue, 1);
877         auto listener = new Worker::WorkerListener(env, callback, Worker::ListenerMode::PERMANENT);
878         worker->AddListenerInner(env, "onmessage", listener);
879         worker->RemoveListenerInner(env, "onmessage", nullptr);
880 
881         napi_env workerEnv = nullptr;
882         napi_create_runtime(env, &workerEnv);
883         worker->workerEnv_ = workerEnv;
884         std::string errorFuncName = "onerror";
885         auto errorFunc = [](napi_env env, napi_callback_info info) -> napi_value {
886             return nullptr;
887         };
888         napi_value errorFuncValue = nullptr;
889         napi_create_function(workerEnv, errorFuncName.c_str(), NAPI_AUTO_LENGTH,
890                              errorFunc, nullptr, &errorFuncValue);
891         napi_value obj = NapiHelper::CreateObject(workerEnv);
892         napi_set_named_property(workerEnv, obj, "onerror", errorFuncValue);
893         napi_ref ref = NapiHelper::CreateReference(workerEnv, obj, 1);
894         worker->workerPort_ = ref;
895         worker->CallWorkerFunction(0, nullptr, "onerror", true);
896         worker->CallWorkerFunction(0, nullptr, "onerror", false);
897 
898         std::string undefinedFuncName = "OnMessageError";
899         auto undefinedFunc = [](napi_env env, napi_callback_info info) -> napi_value {
900             return NapiHelper::GetUndefinedValue(env);
901         };
902         napi_value undefinedFuncValue = nullptr;
903         napi_create_function(workerEnv, undefinedFuncName.c_str(), NAPI_AUTO_LENGTH,
904                              undefinedFunc, nullptr, &undefinedFuncValue);
905         napi_value obj2 = NapiHelper::CreateObject(workerEnv);
906         napi_set_named_property(workerEnv, obj2, "OnMessageError", undefinedFuncValue);
907         napi_ref ref2 = NapiHelper::CreateReference(workerEnv, obj2, 1);
908         worker->workerPort_ = ref2;
909         worker->CallWorkerFunction(0, nullptr, "OnMessageError", true);
910     }
911 
ParentPortAddListenerInnerTest(Worker * worker,napi_env env)912     static void ParentPortAddListenerInnerTest(Worker *worker, napi_env env)
913     {
914         UpdateHostState(worker, Worker::HostState::INACTIVE);
915         worker->CloseWorkerCallback();
916         UpdateHostState(worker, Worker::HostState::ACTIVE);
917         std::string funcName = "onmessage";
918         auto func = [](napi_env env, napi_callback_info info) -> napi_value {
919             return nullptr;
920         };
921         napi_value funcValue = nullptr;
922         napi_create_function(env, funcName.c_str(), NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
923         napi_ref callback = NapiHelper::CreateReference(env, funcValue, 1);
924         auto listener = new Worker::WorkerListener(env, callback, Worker::ListenerMode::PERMANENT);
925         worker->ParentPortAddListenerInner(env, "onmessage", listener);
926         worker->ParentPortAddListenerInner(env, "onmessage", listener);
927         napi_value obj = NapiHelper::CreateObject(env);
928         napi_ref ref = NapiHelper::CreateReference(env, obj, 1);
929         auto listener2 = new Worker::WorkerListener(env, ref, Worker::ListenerMode::ONCE);
930         worker->ParentPortAddListenerInner(env, "onmessage", listener2);
931         worker->ParentPortRemoveAllListenerInner();
932     }
933 
ParentPortRemoveListenerInnerTest(Worker * worker,napi_env env)934     static void ParentPortRemoveListenerInnerTest(Worker *worker, napi_env env)
935     {
936         std::string funcName = "onmessage";
937         auto func = [](napi_env env, napi_callback_info info) -> napi_value {
938             return nullptr;
939         };
940         napi_value funcValue = nullptr;
941         napi_create_function(env, funcName.c_str(), NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
942         napi_ref callback = NapiHelper::CreateReference(env, funcValue, 1);
943         auto listener = new Worker::WorkerListener(env, callback, Worker::ListenerMode::PERMANENT);
944         worker->ParentPortAddListenerInner(env, "onmessage", listener);
945 
946         std::string errorFuncName = "onerror";
947         auto errorFunc = [](napi_env env, napi_callback_info info) -> napi_value {
948             return nullptr;
949         };
950         napi_value errorFuncValue = nullptr;
951         napi_create_function(env, errorFuncName.c_str(), NAPI_AUTO_LENGTH,
952                              errorFunc, nullptr, &errorFuncValue);
953         napi_ref callback2 = NapiHelper::CreateReference(env, errorFuncValue, 1);
954         auto listener2 = new Worker::WorkerListener(env, callback2, Worker::ListenerMode::PERMANENT);
955         worker->ParentPortAddListenerInner(env, "onerror", listener2);
956         worker->ParentPortRemoveListenerInner(env, "OnMessageError", nullptr);
957 
958         std::string hostFuncName = "host";
959         auto hostFunc = [](napi_env env, napi_callback_info info) -> napi_value {
960             return nullptr;
961         };
962         napi_value hostFuncValue = nullptr;
963         napi_create_function(env, hostFuncName.c_str(), NAPI_AUTO_LENGTH,
964                              hostFunc, nullptr, &hostFuncValue);
965         napi_ref callback3 = NapiHelper::CreateReference(env, hostFuncValue, 1);
966         worker->ParentPortRemoveListenerInner(env, "onmessage", callback);
967         worker->ParentPortRemoveListenerInner(env, "onmessage", callback3);
968         worker->ParentPortRemoveListenerInner(env, "onerror", nullptr);
969     }
970 
ParentPortHandleEventListeners(Worker * worker,napi_env env)971     static void ParentPortHandleEventListeners(Worker *worker, napi_env env) //todo:
972     {
973         napi_value recv = NapiHelper::CreateObject(env);
974         std::string funcName = "onmessage";
975         auto func = [](napi_env env, napi_callback_info info) -> napi_value {
976             return nullptr;
977         };
978         napi_value funcValue = nullptr;
979         napi_create_function(env, funcName.c_str(), NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
980         napi_ref callback = NapiHelper::CreateReference(env, funcValue, 1);
981         auto listener = new Worker::WorkerListener(env, callback, Worker::ListenerMode::ONCE);
982         worker->ParentPortAddListenerInner(env, "onmessage", listener);
983         worker->ParentPortHandleEventListeners(env, recv, 0, nullptr, "onmessage", true);
984 
985         std::string errorFuncName = "onerror";
986         auto errorFunc = [](napi_env env, napi_callback_info info) -> napi_value {
987             return nullptr;
988         };
989         napi_value errorFuncValue = nullptr;
990         napi_create_function(env, errorFuncName.c_str(), NAPI_AUTO_LENGTH,
991                              errorFunc, nullptr, &errorFuncValue);
992         napi_ref callback2 = NapiHelper::CreateReference(env, errorFuncValue, 1);
993         auto listener2 = new Worker::WorkerListener(env, callback2, Worker::ListenerMode::PERMANENT);
994         worker->ParentPortAddListenerInner(env, "onerror", listener2);
995 
996         std::string hostFuncName = "host";
997         napi_value hostFuncValue = nullptr;
998         napi_create_string_utf8(env, hostFuncName.c_str(), hostFuncName.length(), &hostFuncValue);
999         napi_ref callback3 = NapiHelper::CreateReference(env, hostFuncValue, 1);
1000         auto listener3 = new Worker::WorkerListener(env, callback3, Worker::ListenerMode::PERMANENT);
1001         worker->ParentPortAddListenerInner(env, "onerror", listener3);
1002         worker->ParentPortHandleEventListeners(env, recv, 0, nullptr, "onerror", false);
1003     }
1004 
DebuggerOnPostTask(Worker * worker,napi_env env)1005     static void DebuggerOnPostTask(Worker* worker, napi_env env)
1006     {
1007         napi_env workerEnv = nullptr;
1008         napi_create_runtime(env, &workerEnv);
1009         auto workerEngine = reinterpret_cast<NativeEngine*>(workerEnv);
1010         workerEngine->CheckAndSetWorkerVersion(WorkerVersion::NONE, WorkerVersion::NEW);
1011         workerEngine->MarkWorkerThread();
1012         Worker::CanCreateWorker(workerEnv, WorkerVersion::NEW);
1013         Worker::WorkerThrowError(workerEnv, ErrorHelper::ERR_WORKER_NOT_RUNNING,
1014             "host thread maybe is over when CallHostFunction");
1015         napi_value exception = nullptr;
1016         napi_get_and_clear_last_exception(workerEnv, &exception);
1017         worker->SetWorkerEnv(workerEnv);
1018         uv_loop_t* loop = worker->GetWorkerLoop();
1019         ASSERT_TRUE(loop != nullptr);
1020         worker->debuggerOnPostTaskSignal_ = new uv_async_t;
1021         uv_async_init(loop, worker->debuggerOnPostTaskSignal_, reinterpret_cast<uv_async_cb>(
1022             UpdateMainThreadWorkerFlag));
1023         worker->debuggerOnPostTaskSignal_->data = worker;
1024         std::function<void()> myTask = []() {
1025             return;
1026         };
1027         UpdateWorkerState(worker, Worker::RunnerState::TERMINATED);
1028         worker->DebuggerOnPostTask(std::move(myTask));
1029         UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1030         worker->DebuggerOnPostTask(std::move(myTask));
1031     }
1032 
CloseHostHandle(Worker * worker,napi_env env)1033     static void CloseHostHandle(Worker* worker, napi_env env)
1034     {
1035         uv_loop_t *loop = nullptr;
1036         napi_status status = napi_get_uv_event_loop(env, &loop);
1037         ASSERT_TRUE(status == napi_ok);
1038         InitHostHandle(worker, loop);
1039         worker->hostOnErrorSignal_ = new uv_async_t;
1040         uv_async_init(loop, worker->hostOnErrorSignal_,
1041                       reinterpret_cast<uv_async_cb>(UpdateMainThreadWorkerFlag));
1042         worker->hostOnErrorSignal_->data = worker;
1043         worker->hostOnGlobalCallSignal_ = new uv_async_t;
1044         uv_async_init(loop, worker->hostOnGlobalCallSignal_,
1045                       reinterpret_cast<uv_async_cb>(UpdateMainThreadWorkerFlag));
1046         worker->hostOnGlobalCallSignal_->data = worker;
1047         worker->CloseHostHandle();
1048     }
1049 
ClearWorkerHandle(Worker * worker)1050     static void ClearWorkerHandle(Worker* worker)
1051     {
1052         worker->CloseHostHandle();
1053         if (worker->isLimitedWorker_) {
1054             napi_remove_env_cleanup_hook(worker->hostEnv_, Worker::LimitedWorkerHostEnvCleanCallback, worker);
1055         } else {
1056             napi_remove_env_cleanup_hook(worker->hostEnv_, Worker::WorkerHostEnvCleanCallback, worker);
1057         }
1058     }
1059 protected:
1060     static thread_local NativeEngine *engine_;
1061     static thread_local EcmaVM *vm_;
1062 };
1063 
1064 thread_local NativeEngine *WorkersTest::engine_ = nullptr;
1065 thread_local EcmaVM *WorkersTest::vm_ = nullptr;
1066 }
1067 
1068 // worker constructor
Worker_Constructor(napi_env env,napi_value global)1069 napi_value Worker_Constructor(napi_env env, napi_value global)
1070 {
1071     std::string funcName = "WorkerConstructor";
1072     napi_value cb = nullptr;
1073     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::WorkerConstructor, nullptr, &cb);
1074 
1075     napi_value result = nullptr;
1076     napi_value argv[2] = { nullptr };
1077     std::string script = "entry/ets/workers/@worker.ts";
1078     napi_create_string_utf8(env, script.c_str(), script.length(), &argv[0]);
1079     std::string type = "classic";
1080     std::string name = "WorkerThread";
1081     napi_value typeValue = nullptr;
1082     napi_value nameValue = nullptr;
1083     napi_create_string_utf8(env, name.c_str(), name.length(), &nameValue);
1084     napi_create_string_utf8(env, type.c_str(), type.length(), &typeValue);
1085 
1086     napi_value object = nullptr;
1087     napi_create_object(env, &object);
1088 
1089     napi_set_named_property(env, object, "name", nameValue);
1090     napi_set_named_property(env, object, "type", typeValue);
1091     argv[1]  = object;
1092 
1093     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1094     uv_sleep(SELLP_MS);
1095     napi_env newEnv = nullptr;
1096     napi_create_runtime(env, &newEnv);
1097     return result;
1098 }
1099 
1100 // worker terminate
Worker_Terminate(napi_env env,napi_value global)1101 napi_value Worker_Terminate(napi_env env, napi_value global)
1102 {
1103     std::string funcName = "Terminate";
1104     napi_value cb = nullptr;
1105     napi_value result = nullptr;
1106     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::Terminate, nullptr, &cb);
1107     napi_call_function(env, global, cb, 0, nullptr, &result);
1108     return result;
1109 }
1110 
GetGlobalProperty(napi_env env,const char * name)1111 napi_value GetGlobalProperty(napi_env env, const char *name)
1112 {
1113     napi_value value = nullptr;
1114     napi_value global;
1115     napi_get_global(env, &global);
1116     napi_get_named_property(env, global, name, &value);
1117     return value;
1118 }
1119 
1120 class WorkerChecker {
1121 public:
1122     WorkerChecker() = default;
1123     void CreateWorkerHostEngine(napi_env& workerEnv);
1124     static napi_value CreateWorker(bool limited, napi_env workerEnv, napi_value workerGlobal);
1125     void CreateWorkerList(bool limited, uint32_t workerNum);
1126     void DeleteWorkerList();
1127     int32_t GetFailedCount();
1128 
1129     napi_env workerHostEnv_{nullptr};
1130     std::atomic<uint32_t> failCount_{0};
1131     std::vector<Worker*> workerlist_;
1132 
1133     bool notified_ = false;
1134     std::mutex mutexlock_;
1135     std::condition_variable condition_;
1136 };
1137 
CreateWorkerHostEngine(napi_env & workerEnv)1138 void WorkerChecker::CreateWorkerHostEngine(napi_env& workerEnv)
1139 {
1140     panda::RuntimeOption option;
1141     option.SetGcType(panda::RuntimeOption::GC_TYPE::GEN_GC);
1142     const int64_t poolSize = 0x1000000;
1143     option.SetGcPoolSize(poolSize);
1144     option.SetLogLevel(panda::RuntimeOption::LOG_LEVEL::ERROR);
1145     option.SetDebuggerLibraryPath("");
1146     panda::ecmascript::EcmaVM* vm = panda::JSNApi::CreateJSVM(option);
1147     ASSERT_NE(vm, nullptr);
1148 
1149     workerEnv = reinterpret_cast<napi_env>(new (std::nothrow) ArkNativeEngine(vm, nullptr));
1150     ArkNativeEngine* arkEngine = (ArkNativeEngine*)workerEnv;
1151     arkEngine->SetInitWorkerFunc([this](NativeEngine*) {
1152         std::unique_lock<std::mutex> lock(this->mutexlock_);
1153         if (!this->notified_) {
1154             this->condition_.wait(lock);
1155         }
1156     });
1157     auto cleanEnv = [vm]() {
1158         if (vm != nullptr) {
1159             panda::JSNApi::DestroyJSVM(vm);
1160         }
1161     };
1162     arkEngine->SetCleanEnv(cleanEnv);
1163 }
1164 
CreateWorker(bool limited,napi_env workerEnv,napi_value workerGlobal)1165 napi_value WorkerChecker::CreateWorker(bool limited, napi_env workerEnv, napi_value workerGlobal)
1166 {
1167     std::string funcName = "ThreadWorkerConstructor";
1168     if (limited) {
1169         funcName = "LimitedWorkerConstructor";
1170     }
1171     napi_value cb = nullptr;
1172     if (!limited) {
1173         napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
1174             Worker::ThreadWorkerConstructor, nullptr, &cb);
1175     } else {
1176         napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
1177             Worker::LimitedWorkerConstructor, nullptr, &cb);
1178     }
1179     napi_value result = nullptr;
1180     napi_value argv[2] = { nullptr };
1181     std::string script = "entry/ets/workers/@worker.ts";
1182     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
1183     std::string type = "classic";
1184     std::string name = "WorkerThread";
1185     napi_value typeValue = nullptr;
1186     napi_value nameValue = nullptr;
1187     napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
1188     napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
1189 
1190     napi_value object = nullptr;
1191     napi_create_object(workerEnv, &object);
1192     napi_set_named_property(workerEnv, object, "name", nameValue);
1193     napi_set_named_property(workerEnv, object, "type", typeValue);
1194     argv[1] = object;
1195 
1196     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1197     return result;
1198 }
1199 
CreateWorkerList(bool limited,uint32_t workerNum)1200 void WorkerChecker::CreateWorkerList(bool limited, uint32_t workerNum)
1201 {
1202     CreateWorkerHostEngine(workerHostEnv_);
1203     ASSERT_NE(workerHostEnv_, nullptr);
1204     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
1205     napi_value workerGlobal = nullptr;
1206     napi_get_global(workerHostEnv_, &workerGlobal);
1207 
1208     for (int k = 0; k < workerNum; k++) {
1209         TryCatch tryCatch(workerHostEnv_);
1210         napi_value result = WorkerChecker::CreateWorker(limited, workerHostEnv_, workerGlobal);
1211         if (tryCatch.HasCaught()) {
1212             tryCatch.ClearException();
1213         }
1214         if (result == nullptr) {
1215             failCount_++;
1216         } else {
1217             Worker* worker = nullptr;
1218             napi_unwrap(workerHostEnv_, result, reinterpret_cast<void**>(&worker));
1219             if (worker != nullptr) {
1220                 workerlist_.push_back(worker);
1221             }
1222         }
1223     }
1224     uv_sleep(TIME_100MS);
1225 }
1226 
DeleteWorkerList()1227 void WorkerChecker::DeleteWorkerList()
1228 {
1229     ArkNativeEngine* workerHostEngine = reinterpret_cast<ArkNativeEngine*>(workerHostEnv_);
1230     mutexlock_.lock();
1231     notified_ = true;
1232     condition_.notify_all();
1233     mutexlock_.unlock();
1234     uv_sleep(TIME_500MS);
1235 
1236     for (auto worker : workerlist_) {
1237         worker->EraseWorker();
1238         WorkersTest::ClearWorkerHandle(worker);
1239     }
1240     workerlist_.clear();
1241     napi_value workerGlobal = nullptr;
1242     napi_get_global(workerHostEnv_, &workerGlobal);
1243     Worker_Terminate(workerHostEnv_, workerGlobal);
1244     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
1245     delete workerHostEngine;
1246 }
1247 
GetFailedCount()1248 int32_t WorkerChecker::GetFailedCount()
1249 {
1250     return failCount_.load();
1251 }
1252 
1253 // worker WorkerConstructor
1254 HWTEST_F(WorkersTest, WorkerConstructorTest001, testing::ext::TestSize.Level0)
1255 {
1256     napi_env env = (napi_env)engine_;
1257     napi_value global;
1258     napi_get_global(env, &global);
1259 
1260     napi_value result = nullptr;
1261     result = Worker_Constructor(env, global);
1262 
1263     Worker* worker = nullptr;
1264     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1265     std::string nameResult = worker->GetName();
1266     ASSERT_EQ(nameResult, "WorkerThread");
1267     std::string scriptResult = worker->GetScript();
1268     ASSERT_EQ(scriptResult, "entry/ets/workers/@worker.ts");
1269     worker->EraseWorker();
1270     ClearWorkerHandle(worker);
1271     result = Worker_Terminate(env, global);
1272 
1273     ASSERT_TRUE(result != nullptr);
1274 }
1275 
1276 //worker PostMessage
1277 HWTEST_F(WorkersTest, PostMessageTest001, testing::ext::TestSize.Level0)
1278 {
1279     napi_env env = (napi_env)engine_;
1280     napi_value global;
1281     napi_get_global(env, &global);
1282 
1283     napi_value result = nullptr;
1284     result = Worker_Constructor(env, global);
1285 
1286     Worker* worker = nullptr;
1287     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1288 
1289     napi_value argv[1] = { nullptr };
1290     std::string message = "host";
1291     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
1292     std::string funcName = "PostMessage";
1293     napi_value cb = nullptr;
1294     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessage, worker, &cb);
1295     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1296     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1297     worker->EraseWorker();
1298     ClearWorkerHandle(worker);
1299     result = Worker_Terminate(env, global);
1300     ASSERT_TRUE(result != nullptr);
1301 }
1302 
1303 //worker PostMessage
1304 HWTEST_F(WorkersTest, PostMessageTest002, testing::ext::TestSize.Level0)
1305 {
1306     napi_env env = (napi_env)engine_;
1307     napi_value global;
1308     napi_get_global(env, &global);
1309 
1310     napi_value result = nullptr;
1311     result = Worker_Constructor(env, global);
1312     Worker* worker = nullptr;
1313     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1314 
1315     napi_value argv[1] = { nullptr };
1316     std::string message = "host";
1317     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
1318 
1319     std::string funcName = "PostMessage";
1320     napi_value cb = nullptr;
1321 
1322     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessage, nullptr, &cb);
1323     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1324 
1325     worker->EraseWorker();
1326     ClearWorkerHandle(worker);
1327     result = Worker_Terminate(env, global);
1328     ASSERT_TRUE(result != nullptr);
1329 }
1330 
1331 //worker PostMessage
1332 HWTEST_F(WorkersTest, PostMessageTest003, testing::ext::TestSize.Level0)
1333 {
1334     napi_env env = (napi_env)engine_;
1335     napi_value global;
1336     napi_get_global(env, &global);
1337 
1338     napi_value result = nullptr;
1339     result = Worker_Constructor(env, global);
1340 
1341     Worker* worker = nullptr;
1342     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1343     worker->UpdateWorkerState(Worker::RunnerState::TERMINATED);
1344 
1345     napi_value argv[1] = { nullptr };
1346     std::string message = "host";
1347     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
1348     std::string funcName = "PostMessage";
1349     napi_value cb = nullptr;
1350     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessage, worker, &cb);
1351     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1352 
1353     uv_async_t* req = new uv_async_t;
1354     req->data = worker;
1355     Worker::WorkerOnMessage(req);
1356 
1357     worker->EraseWorker();
1358     ClearWorkerHandle(worker);
1359     result = Worker_Terminate(env, global);
1360     ASSERT_TRUE(result != nullptr);
1361 }
1362 
1363 //worker PostMessage
1364 HWTEST_F(WorkersTest, PostMessageToHostTest001, testing::ext::TestSize.Level0)
1365 {
1366     napi_env env = (napi_env)engine_;
1367     napi_value global;
1368     napi_get_global(env, &global);
1369 
1370     napi_value result = nullptr;
1371     result = Worker_Constructor(env, global);
1372 
1373     Worker* worker = nullptr;
1374     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1375     napi_value argv[1] = { nullptr };
1376     std::string message = "host";
1377     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
1378 
1379     std::string funcName = "PostMessageToHost";
1380     napi_value cb = nullptr;
1381     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessageToHost, worker, &cb);
1382     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1383     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1384     uv_async_t* req = new uv_async_t;
1385     req->data = worker;
1386     Worker::HostOnMessage(req);
1387 
1388     result = Worker_Terminate(env, global);
1389     ASSERT_TRUE(result != nullptr);
1390 }
1391 
1392 //worker PostMessageToHost
1393 HWTEST_F(WorkersTest, PostMessageToHostTest002, testing::ext::TestSize.Level0)
1394 {
1395     napi_env env = (napi_env)engine_;
1396     napi_value global;
1397     napi_get_global(env, &global);
1398 
1399     napi_value result = nullptr;
1400     result = Worker_Constructor(env, global);
1401     Worker* worker = nullptr;
1402     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1403 
1404     napi_value argv[1] = { nullptr };
1405     std::string message = "host";
1406     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
1407 
1408     std::string funcName = "PostMessageToHost";
1409     napi_value cb = nullptr;
1410     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessageToHost, nullptr, &cb);
1411     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1412 
1413     worker->EraseWorker();
1414     ClearWorkerHandle(worker);
1415     result = Worker_Terminate(env, global);
1416     ASSERT_TRUE(result != nullptr);
1417 }
1418 
1419 //worker PostMessageToHost
1420 HWTEST_F(WorkersTest, PostMessageToHostTest003, testing::ext::TestSize.Level0)
1421 {
1422     napi_env env = (napi_env)engine_;
1423     napi_value global;
1424     napi_get_global(env, &global);
1425 
1426     napi_value arrayresult = nullptr;
1427     ASSERT_CHECK_CALL(napi_create_object(env, &arrayresult));
1428     ASSERT_CHECK_VALUE_TYPE(env, arrayresult, napi_object);
1429     const char testStr[] = "1234567";
1430     napi_value strAttribute = nullptr;
1431     ASSERT_CHECK_CALL(napi_create_string_utf8(env, testStr, strlen(testStr), &strAttribute));
1432     ASSERT_CHECK_VALUE_TYPE(env, strAttribute, napi_string);
1433     ASSERT_CHECK_CALL(napi_set_named_property(env, arrayresult, "strAttribute", strAttribute));
1434 
1435     napi_value retStrAttribute = nullptr;
1436     ASSERT_CHECK_CALL(napi_get_named_property(env, arrayresult, "strAttribute", &retStrAttribute));
1437     ASSERT_CHECK_VALUE_TYPE(env, retStrAttribute, napi_string);
1438 
1439     int32_t testNumber = 12345; // 12345 : indicates any number
1440     napi_value numberAttribute = nullptr;
1441     ASSERT_CHECK_CALL(napi_create_int32(env, testNumber, &numberAttribute));
1442     ASSERT_CHECK_VALUE_TYPE(env, numberAttribute, napi_number);
1443     ASSERT_CHECK_CALL(napi_set_named_property(env, arrayresult, "numberAttribute", numberAttribute));
1444 
1445     napi_value propNames = nullptr;
1446     ASSERT_CHECK_CALL(napi_get_property_names(env, arrayresult, &propNames));
1447     ASSERT_CHECK_VALUE_TYPE(env, propNames, napi_object);
1448 
1449     napi_value result = nullptr;
1450     result = Worker_Constructor(env, global);
1451 
1452     Worker* worker = nullptr;
1453     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1454     napi_value argv[2] = { nullptr };
1455     std::string message = "";
1456     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
1457     std::string funcName = "PostMessageToHost";
1458     argv[1] = propNames;
1459     napi_value cb = nullptr;
1460     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessageToHost, worker, &cb);
1461     UpdateWorkerState(worker, Worker::RunnerState::STARTING);
1462     worker->UpdateWorkerState(Worker::RunnerState::RUNNING);
1463     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1464     worker->EraseWorker();
1465     ClearWorkerHandle(worker);
1466     result = Worker_Terminate(env, global);
1467     ASSERT_TRUE(result != nullptr);
1468 }
1469 
1470 //worker EventListener
1471 HWTEST_F(WorkersTest, EventListenerTest001, testing::ext::TestSize.Level0)
1472 {
1473     napi_env env = (napi_env)engine_;
1474     napi_value global;
1475     napi_get_global(env, &global);
1476     napi_value result = nullptr;
1477     result = Worker_Constructor(env, global);
1478     Worker* worker = nullptr;
1479     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1480 
1481     napi_value argv[2] = {nullptr};
1482     std::string message = "host";
1483     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
__anon0020bb761b02(napi_env env, napi_callback_info info) 1484     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
1485         return nullptr;
1486     };
1487     napi_value funcValue = nullptr;
1488     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
1489     argv[1] = funcValue;
1490 
1491     std::string funcName = "On";
1492     napi_value cb = nullptr;
1493     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::On, worker, &cb);
1494     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1495 
1496     funcName = "Once";
1497     cb = nullptr;
1498     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::Once, worker, &cb);
1499     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1500 
1501     funcName = "AddEventListener";
1502     cb = nullptr;
1503     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::AddEventListener, worker, &cb);
1504     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1505 
1506     funcName = "RemoveEventListener";
1507     cb = nullptr;
1508     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::RemoveEventListener, worker, &cb);
1509     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1510 
1511     funcName = "Off";
1512     cb = nullptr;
1513     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::Off, worker, &cb);
1514     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1515 
1516     worker->EraseWorker();
1517     ClearWorkerHandle(worker);
1518     result = Worker_Terminate(env, global);
1519     ASSERT_TRUE(result != nullptr);
1520 }
1521 
1522 //worker EventListener
1523 HWTEST_F(WorkersTest, EventListenerTest002, testing::ext::TestSize.Level0)
1524 {
1525     napi_env env = (napi_env)engine_;
1526     napi_value global;
1527     napi_get_global(env, &global);
1528     napi_value result = nullptr;
1529     result = Worker_Constructor(env, global);
1530     Worker* worker = nullptr;
1531     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1532     napi_value argv[3] = {nullptr};
1533     std::string message = "host";
1534     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
__anon0020bb761c02(napi_env env, napi_callback_info info) 1535     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
1536         return nullptr;
1537     };
1538     napi_value funcValue = nullptr;
1539     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
1540     argv[1] = funcValue;
1541     std::string funcName = "On";
1542     napi_value cb = nullptr;
1543     funcName = "Once";
1544     cb = nullptr;
1545     napi_value myobject = nullptr;
1546     napi_create_object(env, &myobject);
1547 
1548     argv[2] = myobject;
1549     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::Once, worker, &cb);
1550     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1551     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1552     worker->EraseWorker();
1553     ClearWorkerHandle(worker);
1554     result = Worker_Terminate(env, global);
1555     ASSERT_TRUE(result != nullptr);
1556 }
1557 
1558 //worker DispatchEvent
1559 HWTEST_F(WorkersTest, DispatchEventTest001, testing::ext::TestSize.Level0)
1560 {
1561     napi_env env = (napi_env)engine_;
1562     napi_value global;
1563     napi_get_global(env, &global);
1564     napi_value result = nullptr;
1565     result = Worker_Constructor(env, global);
1566     Worker* worker = nullptr;
1567     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1568     napi_value argv1[2] = {nullptr};
1569     std::string message = "host";
1570     napi_create_string_utf8(env, message.c_str(), message.length(), &argv1[0]);
__anon0020bb761d02(napi_env env, napi_callback_info info) 1571     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
1572         return nullptr;
1573     };
1574     napi_value funcValue = nullptr;
1575     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
1576     argv1[1] = funcValue;
1577 
1578     std::string funcName = "Once";
1579     napi_value cb = nullptr;
1580     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::Once, worker, &cb);
1581     napi_call_function(env, global, cb, sizeof(argv1) / sizeof(argv1[0]), argv1, &result);
1582     napi_value argv[1] = {nullptr};
1583 
1584     napi_value typeValue = nullptr;
1585     std::string type = "message";
1586     napi_create_string_utf8(env, type.c_str(), type.length(), &typeValue);
1587 
1588     napi_value object = nullptr;
1589     napi_create_object(env, &object);
1590     napi_set_named_property(env, object, "type", typeValue);
1591     argv[0] = object;
1592 
1593     funcName = "DispatchEvent";
1594     cb = nullptr;
1595     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::DispatchEvent, worker, &cb);
1596     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1597     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1598     worker->EraseWorker();
1599     ClearWorkerHandle(worker);
1600     result = Worker_Terminate(env, global);
1601     ASSERT_TRUE(result != nullptr);
1602 }
1603 
1604 //worker ParentPortAddEventListener
1605 HWTEST_F(WorkersTest, ParentPortAddEventListenerTest001, testing::ext::TestSize.Level0)
1606 {
1607     napi_env env = (napi_env)engine_;
1608     napi_value global;
1609     napi_get_global(env, &global);
1610     napi_value result = nullptr;
1611     result = Worker_Constructor(env, global);
1612     Worker* worker = nullptr;
1613     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1614     napi_value argv[3] = {nullptr};
1615     std::string message = "host";
1616     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
__anon0020bb761e02(napi_env env, napi_callback_info info) 1617     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
1618         return nullptr;
1619     };
1620 
1621     std::string funcName = "ParentPortAddEventListener";
1622     napi_value cb = nullptr;
1623     napi_value funcValue = nullptr;
1624     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
1625     argv[1] = funcValue;
1626     ASSERT_TRUE(funcValue != nullptr);
1627     napi_value myobject = nullptr;
1628     napi_create_object(env, &myobject);
1629     argv[2] = myobject;
1630     napi_value callResult = nullptr;
1631     // ------- workerEnv---------
1632     napi_create_function(env, funcName.c_str(), funcName.size(),
1633                          Worker::ParentPortAddEventListener, worker, &cb);
1634     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1635     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
1636     worker->EraseWorker();
1637     ClearWorkerHandle(worker);
1638     result = Worker_Terminate(env, global);
1639     ASSERT_TRUE(result != nullptr);
1640 }
1641 
1642 //worker ParentPortRemoveAllListener
1643 HWTEST_F(WorkersTest, ParentPortRemoveAllListenerTest001, testing::ext::TestSize.Level0)
1644 {
1645     napi_env env = (napi_env)engine_;
1646     napi_value global;
1647     napi_get_global(env, &global);
1648     napi_value result = nullptr;
1649     result = Worker_Constructor(env, global);
1650     Worker* worker = nullptr;
1651     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1652     // ------- workerEnv---------
1653     napi_env workerEnv = nullptr;
1654     napi_create_runtime(env, &workerEnv);
1655     napi_value workerGlobal = nullptr;
1656     napi_get_global(workerEnv, &workerGlobal);
1657     napi_value argv[1] = {nullptr};
1658     std::string message = "host";
1659     napi_create_string_utf8(workerEnv, message.c_str(), message.length(), &argv[0]);
1660     std::string funcName = "ParentPortRemoveAllListener";
1661     napi_value cb = nullptr;
1662 
1663     napi_value callResult = nullptr;
1664     // ------- workerEnv---------
1665     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
1666                          Worker::ParentPortRemoveAllListener, worker, &cb);
1667     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1668     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
1669     worker->EraseWorker();
1670     ClearWorkerHandle(worker);
1671     result = Worker_Terminate(env, global);
1672     ASSERT_TRUE(result != nullptr);
1673 }
1674 
1675 //worker ParentPortDispatchEvent
1676 HWTEST_F(WorkersTest, ParentPortDispatchEventTest001, testing::ext::TestSize.Level0)
1677 {
1678     napi_env env = (napi_env)engine_;
1679     napi_value global;
1680     napi_get_global(env, &global);
1681     napi_value result = nullptr;
1682     result = Worker_Constructor(env, global);
1683     Worker* worker = nullptr;
1684     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1685     // ------- workerEnv---------
1686     napi_env workerEnv = nullptr;
1687     napi_create_runtime(env, &workerEnv);
1688     napi_value workerGlobal = nullptr;
1689     napi_get_global(workerEnv, &workerGlobal);
1690 
1691     napi_value argv[1] = {nullptr};
1692     napi_value objresult = nullptr;
1693     napi_create_object(workerEnv, &objresult);
1694     napi_value cb = nullptr;
1695     std::string funcName = "ParentPortDispatchEvent";
1696     napi_value messageKey = nullptr;
1697     const char* messageKeyStr = "type";
1698     napi_create_string_latin1(workerEnv, messageKeyStr, strlen(messageKeyStr), &messageKey);
1699     napi_value messageValue = nullptr;
1700     const char* messageValueStr = "message";
1701     napi_create_string_latin1(workerEnv, messageValueStr, strlen(messageValueStr), &messageValue);
1702     napi_set_property(workerEnv, objresult, messageKey, messageValue);
1703     argv[0] = objresult;
1704     napi_value callResult = nullptr;
1705     // ------- workerEnv---------
1706     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
1707                          Worker::ParentPortDispatchEvent, worker, &cb);
1708     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1709     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
1710     worker->EraseWorker();
1711     ClearWorkerHandle(worker);
1712     result = Worker_Terminate(env, global);
1713     ASSERT_TRUE(result != nullptr);
1714 }
1715 
1716 //worker ParentPortRemoveEventListener
1717 HWTEST_F(WorkersTest, ParentPortRemoveEventListenerTest001, testing::ext::TestSize.Level0)
1718 {
1719     napi_env env = (napi_env)engine_;
1720     napi_value global;
1721     napi_get_global(env, &global);
1722     napi_value result = nullptr;
1723     result = Worker_Constructor(env, global);
1724     Worker* worker = nullptr;
1725     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1726     // ------- workerEnv---------
1727     napi_env workerEnv = nullptr;
1728     napi_create_runtime(env, &workerEnv);
1729     napi_value workerGlobal = nullptr;
1730     napi_get_global(workerEnv, &workerGlobal);
1731 
1732     napi_value argv[2] = {nullptr};
1733     std::string message = "host";
1734     napi_create_string_utf8(workerEnv, message.c_str(), message.length(), &argv[0]);
__anon0020bb761f02(napi_env env, napi_callback_info info) 1735     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
1736         return nullptr;
1737     };
1738     std::string funcName = "ParentPortRemoveEventListener";
1739     napi_value cb = nullptr;
1740     napi_value funcValue = nullptr;
1741     napi_create_function(workerEnv, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
1742     argv[1] = funcValue;
1743 
1744     napi_value callResult = nullptr;
1745     // ------- workerEnv---------
1746     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
1747                          Worker::ParentPortRemoveEventListener, worker, &cb);
1748     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1749     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
1750     worker->EraseWorker();
1751     ClearWorkerHandle(worker);
1752     result = Worker_Terminate(env, global);
1753     ASSERT_TRUE(result != nullptr);
1754 }
1755 
1756 //worker GlobalCall
1757 HWTEST_F(WorkersTest, GlobalCallTest001, testing::ext::TestSize.Level0)
1758 {
1759     napi_env env = (napi_env)engine_;
1760     napi_value global;
1761     napi_get_global(env, &global);
1762     napi_value result = nullptr;
1763     result = Worker_Constructor(env, global);
1764     Worker* worker = nullptr;
1765     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1766     // ------- workerEnv---------
1767     napi_env workerEnv = nullptr;
1768     napi_create_runtime(env, &workerEnv);
1769     napi_value workerGlobal = nullptr;
1770     napi_get_global(workerEnv, &workerGlobal);
1771 
1772     napi_value argv[3] = {nullptr};
1773     std::string instanceName = "host";
1774     std::string methodName = "postMessage";
1775     int32_t timeout = 300;
1776     napi_create_string_utf8(workerEnv, instanceName.c_str(), instanceName.length(), &argv[0]);
1777     napi_create_string_utf8(workerEnv, methodName.c_str(), methodName.length(), &argv[1]);
1778     napi_create_int32(workerEnv, timeout, &argv[2]);
1779 
1780     std::string funcName = "GlobalCall";
1781     napi_value cb = nullptr;
1782     napi_value callResult = nullptr;
1783     // ------- workerEnv---------
1784     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
1785                          Worker::GlobalCall, worker, &cb);
1786     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1787     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
1788     uv_async_t* req = new uv_async_t;
1789     req->data = worker;
1790     Worker::HostOnGlobalCall(req);
1791     worker->EraseWorker();
1792     ClearWorkerHandle(worker);
1793     result = Worker_Terminate(env, global);
1794     ASSERT_TRUE(result != nullptr);
1795 }
1796 
1797 //messageQueue DeQueue_QUEUE_IS_NULL
1798 HWTEST_F(WorkersTest, MessageQueueTest001, testing::ext::TestSize.Level0)
1799 {
1800     MessageQueue queue;
1801     ASSERT_TRUE(queue.IsEmpty());
1802     MessageDataType data = nullptr;
1803     ASSERT_FALSE(queue.DeQueue(&data));
1804 }
1805 
1806 //messageQueue DeQueue_DATA_IS_NULL
1807 HWTEST_F(WorkersTest, MessageQueueTest002, testing::ext::TestSize.Level0)
1808 {
1809     napi_env env = (napi_env)engine_;
1810     MessageQueue queue;
1811     MessageDataType data = nullptr;
1812     napi_value undefined = NapiHelper::GetUndefinedValue(env);
1813     napi_serialize_inner(env, undefined, undefined, undefined, false, true, &data);
1814     queue.EnQueue(data);
1815     ASSERT_TRUE(queue.DeQueue(nullptr));
1816     queue.Clear(env);
1817 }
1818 
1819 //messageQueue MARKEDMESSAGEQUEUE
1820 HWTEST_F(WorkersTest, MarkedMessageQueue001, testing::ext::TestSize.Level0)
1821 {
1822     napi_env env = (napi_env)engine_;
1823     MarkedMessageQueue queue;
1824     MessageDataType data = nullptr;
1825     napi_value undefined = NapiHelper::GetUndefinedValue(env);
1826     napi_serialize_inner(env, undefined, undefined, undefined, false, true, &data);
1827     queue.Push(1, data);
1828     queue.Pop();
1829     ASSERT_TRUE(queue.IsEmpty());
1830 
1831     MessageDataType dataType = nullptr;
1832     napi_serialize_inner(env, undefined, undefined, undefined, false, true, &dataType);
1833     queue.Push(2, dataType);
1834     std::pair<uint32_t, MessageDataType> pair = queue.Front();
1835     ASSERT_EQ(pair.first, 2);
1836     queue.Clear(env);
1837     ASSERT_TRUE(queue.IsEmpty());
1838 }
1839 
1840 HWTEST_F(WorkersTest, WorkerTest001, testing::ext::TestSize.Level0)
1841 {
1842     napi_env env = (napi_env)engine_;
1843     napi_value global;
1844     napi_get_global(env, &global);
1845     napi_value result = nullptr;
1846     result = Worker_Constructor(env, global);
1847     Worker* worker = nullptr;
1848     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1849     napi_env workerEnv = nullptr;
1850     napi_create_runtime(env, &workerEnv);
1851     napi_value exports = nullptr;
1852     napi_create_object(workerEnv, &exports);
1853     Worker::InitWorker(workerEnv, exports);
1854     worker->EraseWorker();
1855     ClearWorkerHandle(worker);
1856     result = Worker_Terminate(env, global);
1857     ASSERT_TRUE(result != nullptr);
1858 }
1859 
1860 HWTEST_F(WorkersTest, WorkerTest002, testing::ext::TestSize.Level0)
1861 {
1862     napi_env env = (napi_env)engine_;
1863     napi_value global;
1864     napi_get_global(env, &global);
1865     napi_value result = nullptr;
1866     result = Worker_Constructor(env, global);
1867     Worker* worker = nullptr;
1868     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1869 
1870     napi_value argv[2] = {nullptr};
1871     std::string instanceName = "MainThread";
1872     napi_create_string_utf8(env, instanceName.c_str(), instanceName.length(), &argv[0]);
1873     napi_value obj = nullptr;
1874     napi_create_object(env, &obj);
1875     argv[1] = obj;
1876 
1877     std::string funcName = "RegisterGlobalCallObject";
1878     napi_value cb = nullptr;
1879     napi_value callResult = nullptr;
1880     // ------- workerEnv---------
1881     napi_create_function(env, funcName.c_str(), funcName.size(),
1882                          Worker::RegisterGlobalCallObject, worker, &cb);
1883     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1884     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
1885     worker->EraseWorker();
1886     ClearWorkerHandle(worker);
1887     result = Worker_Terminate(env, global);
1888     ASSERT_TRUE(result != nullptr);
1889 }
1890 
1891 HWTEST_F(WorkersTest, WorkerTest003, testing::ext::TestSize.Level0)
1892 {
1893     napi_env env = (napi_env)engine_;
1894     napi_value global;
1895     napi_get_global(env, &global);
1896     napi_value result = nullptr;
1897     result = Worker_Constructor(env, global);
1898     Worker* worker = nullptr;
1899     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1900 
1901     napi_value argv[1] = {nullptr};
1902     std::string instanceName = "MainThread";
1903     napi_create_string_utf8(env, instanceName.c_str(), instanceName.length(), &argv[0]);
1904 
1905     std::string funcName = "UnregisterGlobalCallObject";
1906     napi_value cb = nullptr;
1907     napi_value callResult = nullptr;
1908     // ------- workerEnv---------
1909     napi_create_function(env, funcName.c_str(), funcName.size(),
1910                         Worker::UnregisterGlobalCallObject, worker, &cb);
1911     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1912     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
1913     worker->EraseWorker();
1914     ClearWorkerHandle(worker);
1915     result = Worker_Terminate(env, global);
1916     ASSERT_TRUE(result != nullptr);
1917 }
1918 
1919 HWTEST_F(WorkersTest, WorkerTest004, testing::ext::TestSize.Level0)
1920 {
1921     napi_env env = (napi_env)engine_;
1922     napi_env workerEnv = nullptr;
1923     napi_create_runtime(env, &workerEnv);
1924     napi_value workerGlobal = nullptr;
1925     napi_get_global(workerEnv, &workerGlobal);
1926     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
1927 
1928     std::string funcName = "LimitedWorkerConstructor";
1929     napi_value cb = nullptr;
1930     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::LimitedWorkerConstructor, nullptr, &cb);
1931 
1932     napi_value result = nullptr;
1933     napi_value argv[2] = { nullptr };
1934     std::string script = "entry/ets/workers/@worker.ts";
1935     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
1936     std::string type = "classic";
1937     std::string name = "WorkerThread";
1938     napi_value typeValue = nullptr;
1939     napi_value nameValue = nullptr;
1940     napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
1941     napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
1942 
1943     napi_value object = nullptr;
1944     napi_create_object(workerEnv, &object);
1945 
1946     napi_set_named_property(workerEnv, object, "name", nameValue);
1947     napi_set_named_property(workerEnv, object, "type", typeValue);
1948     argv[1] = object;
1949 
1950     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1951     uv_sleep(200);
1952     Worker* worker = nullptr;
1953     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1954     worker->EraseWorker();
1955     ClearWorkerHandle(worker);
1956     result = Worker_Terminate(workerEnv, workerGlobal);
1957     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
1958     ASSERT_TRUE(result != nullptr);
1959 }
1960 
1961 HWTEST_F(WorkersTest, WorkerTest005, testing::ext::TestSize.Level0)
1962 {
1963     napi_env env = (napi_env)engine_;
1964     napi_env workerEnv = nullptr;
1965     napi_create_runtime(env, &workerEnv);
1966     napi_value workerGlobal = nullptr;
1967     napi_get_global(workerEnv, &workerGlobal);
1968     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
1969     std::string funcName = "ThreadWorkerConstructor";
1970     napi_value cb = nullptr;
1971     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
1972 
1973     napi_value result = nullptr;
1974     napi_value argv[2] = { nullptr };
1975     std::string script = "entry/ets/workers/@worker.ts";
1976     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
1977     std::string type = "classic";
1978     std::string name = "WorkerThread";
1979     napi_value typeValue = nullptr;
1980     napi_value nameValue = nullptr;
1981     napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
1982     napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
1983 
1984     napi_value object = nullptr;
1985     napi_create_object(workerEnv, &object);
1986 
1987     napi_set_named_property(workerEnv, object, "name", nameValue);
1988     napi_set_named_property(workerEnv, object, "type", typeValue);
1989     napi_value priorityValue = nullptr;
1990     napi_create_uint32(workerEnv, static_cast<int32_t>(WorkerPriority::HIGH), &priorityValue);
1991     napi_set_named_property(workerEnv, object, "priority", priorityValue);
1992     argv[1] = object;
1993 
1994     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1995     Worker* worker = nullptr;
1996     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1997     bool qosUpdated = false;
__anon0020bb762002null1998     worker->SetQOSLevelUpdatedCallback([&qosUpdated] { qosUpdated = true; });
1999     uv_sleep(200);
2000     ASSERT_TRUE(qosUpdated);
2001     worker->EraseWorker();
2002     ClearWorkerHandle(worker);
2003     result = Worker_Terminate(workerEnv, workerGlobal);
2004     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
2005     ASSERT_TRUE(result != nullptr);
2006 }
2007 
2008 HWTEST_F(WorkersTest, WorkerTest006, testing::ext::TestSize.Level0)
2009 {
2010     napi_env env = (napi_env)engine_;
2011     napi_value global;
2012     napi_get_global(env, &global);
2013 
2014     napi_value result = nullptr;
2015     result = Worker_Constructor(env, global);
2016 
2017     Worker* worker = nullptr;
2018     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
2019 
2020     napi_value argv[1] = { nullptr };
2021     std::string message = "host";
2022     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
2023     std::string funcName = "PostMessageWithSharedSendable";
2024     napi_value cb = nullptr;
2025     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessageWithSharedSendable, worker, &cb);
2026     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
2027     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
2028 
2029     worker->EraseWorker();
2030     ClearWorkerHandle(worker);
2031     result = Worker_Terminate(env, global);
2032     ASSERT_TRUE(result != nullptr);
2033 }
2034 
2035 HWTEST_F(WorkersTest, WorkerTest007, testing::ext::TestSize.Level0)
2036 {
2037     napi_env env = (napi_env)engine_;
2038     napi_value global;
2039     napi_get_global(env, &global);
2040 
2041     napi_value result = nullptr;
2042     result = Worker_Constructor(env, global);
2043 
2044     Worker* worker = nullptr;
2045     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
2046 
2047     napi_value argv[1] = { nullptr };
2048 
2049     std::string funcName = "RemoveAllListener";
2050     napi_value cb = nullptr;
2051     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::RemoveAllListener, worker, &cb);
2052     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
2053     napi_call_function(env, global, cb, 1, argv, &result);
2054     worker->EraseWorker();
2055     ClearWorkerHandle(worker);
2056     result = Worker_Terminate(env, global);
2057     ASSERT_TRUE(result != nullptr);
2058 }
2059 
2060 HWTEST_F(WorkersTest, WorkerTest008, testing::ext::TestSize.Level0)
2061 {
2062     napi_env env = (napi_env)engine_;
2063     napi_value global;
2064     napi_get_global(env, &global);
2065 
2066     napi_value result = nullptr;
2067     result = Worker_Constructor(env, global);
2068 
2069     Worker* worker = nullptr;
2070     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
2071 
2072     napi_value argv[1] = { nullptr };
2073     std::string message = "host";
2074     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
2075 
2076     std::string funcName = "CancelTask";
2077     napi_value cb = nullptr;
2078     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::CancelTask, worker, &cb);
2079     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
2080     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
2081     worker->EraseWorker();
2082     ClearWorkerHandle(worker);
2083     result = Worker_Terminate(env, global);
2084     ASSERT_TRUE(result != nullptr);
2085 }
2086 
2087 HWTEST_F(WorkersTest, WorkerTest009, testing::ext::TestSize.Level0)
2088 {
2089     napi_env env = (napi_env)engine_;
2090     napi_value global;
2091     napi_get_global(env, &global);
2092 
2093     napi_value result = nullptr;
2094     result = Worker_Constructor(env, global);
2095 
2096     Worker* worker = nullptr;
2097     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
2098     napi_value argv[1] = { nullptr };
2099     std::string message = "host";
2100     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
2101 
2102     std::string funcName = "PostMessageWithSharedSendableToHost";
2103     napi_value cb = nullptr;
2104     napi_create_function(env, funcName.c_str(), funcName.size(),
2105                          Worker::PostMessageWithSharedSendableToHost, worker, &cb);
2106     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
2107     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
2108     uv_async_t* req = new uv_async_t;
2109     req->data = worker;
2110     Worker::HostOnMessage(req);
2111 
2112     worker->EraseWorker();
2113     ClearWorkerHandle(worker);
2114     result = Worker_Terminate(env, global);
2115     ASSERT_TRUE(result != nullptr);
2116 }
2117 
2118 HWTEST_F(WorkersTest, WorkerTest010, testing::ext::TestSize.Level0)
2119 {
2120     napi_env env = (napi_env)engine_;
2121     napi_value global;
2122     napi_get_global(env, &global);
2123 
2124     napi_value result = nullptr;
2125     result = Worker_Constructor(env, global);
2126 
2127     Worker* worker = nullptr;
2128     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
2129     napi_value argv[1] = { nullptr };
2130     std::string message = "host";
2131     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
2132 
2133     std::string funcName = "ParentPortCancelTask";
2134     napi_value cb = nullptr;
2135     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::ParentPortCancelTask, worker, &cb);
2136     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
2137     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
2138     worker->EraseWorker();
2139     ClearWorkerHandle(worker);
2140     result = Worker_Terminate(env, global);
2141     ASSERT_TRUE(result != nullptr);
2142 }
2143 
2144 HWTEST_F(WorkersTest, WorkerTest011, testing::ext::TestSize.Level0)
2145 {
2146     napi_env env = (napi_env)engine_;
2147     napi_value global;
2148     napi_get_global(env, &global);
2149 
2150     napi_value result = nullptr;
2151     result = Worker_Constructor(env, global);
2152 
2153     Worker* worker = nullptr;
2154     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
2155     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
2156     uv_async_t* req = new uv_async_t;
2157     req->data = nullptr;
2158     Worker::HostOnError(req);
2159     req->data = worker;
2160     Worker::HostOnError(req);
2161     worker->EraseWorker();
2162     ClearWorkerHandle(worker);
2163     ASSERT_TRUE(result != nullptr);
2164 }
2165 
2166 //worker PostMessage
2167 HWTEST_F(WorkersTest, WorkerTest012, testing::ext::TestSize.Level0)
2168 {
2169     napi_env env = (napi_env)engine_;
2170     napi_value global;
2171     napi_get_global(env, &global);
2172 
2173     napi_value result = nullptr;
2174     result = Worker_Constructor(env, global);
2175 
2176     Worker* worker = nullptr;
2177     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
2178 
2179     napi_value argv[1] = { nullptr };
2180     std::string message = "host";
2181     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
2182     std::string funcName = "PostMessage";
2183     napi_value cb = nullptr;
2184     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessage, worker, &cb);
2185     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
2186     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
2187 
2188     worker->EraseWorker();
2189     ClearWorkerHandle(worker);
2190     result = Worker_Terminate(env, global);
2191     ASSERT_TRUE(result != nullptr);
2192 }
2193 
2194 
2195 HWTEST_F(WorkersTest, CloseWorkerTest001, testing::ext::TestSize.Level0)
2196 {
2197     napi_env env = (napi_env)engine_;
2198     napi_value global;
2199     napi_get_global(env, &global);
2200     napi_value result = nullptr;
2201     std::string funcName = "CloseWorker";
2202     napi_value cb = nullptr;
2203     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::CloseWorker, nullptr, &cb);
2204     napi_call_function(env, global, cb, 0, nullptr, &result);
2205     ASSERT_TRUE(result != nullptr);
2206 }
2207 
2208 HWTEST_F(WorkersTest, CloseWorkerTest002, testing::ext::TestSize.Level0)
2209 {
2210     napi_env env = (napi_env)engine_;
2211     napi_value global;
2212     napi_get_global(env, &global);
2213 
2214     napi_value result = nullptr;
2215     result = Worker_Constructor(env, global);
2216 
2217     Worker* worker = nullptr;
2218     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
2219     ASSERT_TRUE(worker != nullptr);
2220 
2221     std::string funcName = "CloseWorker";
2222     napi_value cb = nullptr;
2223     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::CloseWorker, worker, &cb);
2224     napi_env workerEnv = nullptr;
2225     napi_create_runtime(env, &workerEnv);
2226     SetCloseWorkerProp(worker, workerEnv);
2227     napi_call_function(env, global, cb, 0, nullptr, &result);
2228     worker->EraseWorker();
2229     ClearWorkerHandle(worker);
2230     ASSERT_TRUE(result != nullptr);
2231 }
2232 
2233 HWTEST_F(WorkersTest, InitWorkerTest001, testing::ext::TestSize.Level0)
2234 {
2235     napi_env env = (napi_env)engine_;
2236     napi_value exports = nullptr;
2237     napi_create_object(env, &exports);
2238     Worker::InitWorker(env, exports);
2239     ASSERT_TRUE(exports != nullptr);
2240 }
2241 
2242 HWTEST_F(WorkersTest, InitWorkerTest002, testing::ext::TestSize.Level0)
2243 {
2244     napi_env env = (napi_env)engine_;
2245     napi_env workerEnv = nullptr;
2246     napi_create_runtime(env, &workerEnv);
2247     napi_value workerGlobal = nullptr;
2248     napi_get_global(workerEnv, &workerGlobal);
2249     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
2250     std::string funcName = "ThreadWorkerConstructor";
2251     napi_value cb = nullptr;
2252     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
2253 
2254     napi_value result = nullptr;
2255     napi_value argv[2] = { nullptr };
2256     std::string script = "entry/ets/workers/@worker.ts";
2257     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
2258     std::string type = "classic";
2259     std::string name = "WorkerThread";
2260     napi_value typeValue = nullptr;
2261     napi_value nameValue = nullptr;
2262     napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
2263     napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
2264 
2265     napi_value object = nullptr;
2266     napi_create_object(workerEnv, &object);
2267 
2268     napi_set_named_property(workerEnv, object, "name", nameValue);
2269     napi_set_named_property(workerEnv, object, "type", typeValue);
2270     argv[1] = object;
2271 
2272     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
2273     uv_sleep(200);
2274     Worker* worker = nullptr;
2275     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
2276     ASSERT_TRUE(worker != nullptr);
2277     worker->SetWorkerEnv(workerEnv);
2278     NativeEngine* workerEngine = reinterpret_cast<NativeEngine*>(workerEnv);
2279     workerEngine->MarkRestrictedWorkerThread();
2280     napi_value exports = nullptr;
2281     napi_create_object(env, &exports);
2282     Worker::InitWorker(workerEnv, exports);
2283     worker->EraseWorker();
2284     ClearWorkerHandle(worker);
2285     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
2286     ASSERT_TRUE(result != nullptr);
2287 }
2288 
2289 HWTEST_F(WorkersTest, InitWorkerTest003, testing::ext::TestSize.Level0)
2290 {
2291     napi_env env = (napi_env)engine_;
2292     napi_env workerEnv = nullptr;
2293     napi_create_runtime(env, &workerEnv);
2294     napi_value workerGlobal = nullptr;
2295     napi_get_global(workerEnv, &workerGlobal);
2296     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
2297     std::string funcName = "ThreadWorkerConstructor";
2298     napi_value cb = nullptr;
2299     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
2300 
2301     napi_value result = nullptr;
2302     napi_value argv[2] = { nullptr };
2303     std::string script = "entry/ets/workers/@worker.ts";
2304     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
2305     std::string type = "classic";
2306     std::string name = "WorkerThread";
2307     napi_value typeValue = nullptr;
2308     napi_value nameValue = nullptr;
2309     napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
2310     napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
2311 
2312     napi_value object = nullptr;
2313     napi_create_object(workerEnv, &object);
2314 
2315     napi_set_named_property(workerEnv, object, "name", nameValue);
2316     napi_set_named_property(workerEnv, object, "type", typeValue);
2317     argv[1] = object;
2318 
2319     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
2320 
2321     uv_sleep(200);
2322     Worker* worker = new Worker(env, nullptr);
2323     napi_wrap(env, result, worker, nullptr, nullptr, nullptr);
2324     worker->SetWorkerEnv(workerEnv);
2325     NativeEngine* workerEngine = reinterpret_cast<NativeEngine*>(workerEnv);
2326     workerEngine->MarkTaskPoolThread();
2327     napi_value exports = nullptr;
2328     napi_create_object(env, &exports);
2329     Worker::InitWorker(workerEnv, exports);
2330     worker->EraseWorker();
2331     ClearWorkerHandle(worker);
2332     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
2333     ASSERT_TRUE(result != nullptr);
2334 }
2335 
2336 HWTEST_F(WorkersTest, InitWorkerTest004, testing::ext::TestSize.Level0)
2337 {
2338     napi_env env = (napi_env)engine_;
2339     napi_env workerEnv = nullptr;
2340     napi_create_runtime(env, &workerEnv);
2341     napi_value workerGlobal = nullptr;
2342     napi_get_global(workerEnv, &workerGlobal);
2343     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
2344     std::string funcName = "ThreadWorkerConstructor";
2345     napi_value cb = nullptr;
2346     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
2347 
2348     napi_value result = nullptr;
2349     napi_value argv[2] = { nullptr };
2350     std::string script = "entry/ets/workers/@worker.ts";
2351     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
2352     std::string type = "classic";
2353     std::string name = "WorkerThread";
2354     napi_value typeValue = nullptr;
2355     napi_value nameValue = nullptr;
2356     napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
2357     napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
2358 
2359     napi_value object = nullptr;
2360     napi_create_object(workerEnv, &object);
2361 
2362     napi_set_named_property(workerEnv, object, "name", nameValue);
2363     napi_set_named_property(workerEnv, object, "type", typeValue);
2364     argv[1] = object;
2365 
2366     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
2367 
2368     uv_sleep(200);
2369     Worker* worker = nullptr;
2370     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
2371     worker->SetWorkerEnv(workerEnv);
2372     NativeEngine* workerEngine = reinterpret_cast<NativeEngine*>(workerEnv);
2373     workerEngine->MarkWorkerThread();
2374     napi_value exports = nullptr;
2375     napi_create_object(workerEnv, &exports);
2376     Worker::InitWorker(workerEnv, exports);
2377     worker->EraseWorker();
2378     ClearWorkerHandle(worker);
2379     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
2380     ASSERT_TRUE(result != nullptr);
2381 }
2382 
2383 HWTEST_F(WorkersTest, InitWorkerTest005, testing::ext::TestSize.Level0)
2384 {
2385     napi_env env = (napi_env)engine_;
2386     napi_env workerEnv = nullptr;
2387     napi_create_runtime(env, &workerEnv);
2388     napi_value workerGlobal = nullptr;
2389     napi_get_global(workerEnv, &workerGlobal);
2390     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
2391     std::string funcName = "LimitedWorkerConstructor";
2392     napi_value cb = nullptr;
2393     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::LimitedWorkerConstructor, nullptr, &cb);
2394 
2395     napi_value result = nullptr;
2396     napi_value argv[2] = { nullptr };
2397     std::string script = "entry/ets/workers/@worker.ts";
2398     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
2399     std::string type = "classic";
2400     std::string name = "WorkerThread";
2401     napi_value typeValue = nullptr;
2402     napi_value nameValue = nullptr;
2403     napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
2404     napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
2405 
2406     napi_value object = nullptr;
2407     napi_create_object(workerEnv, &object);
2408 
2409     napi_set_named_property(workerEnv, object, "name", nameValue);
2410     napi_set_named_property(workerEnv, object, "type", typeValue);
2411     argv[1] = object;
2412 
2413     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
2414 
2415     uv_sleep(200);
2416     Worker* worker = nullptr;
2417     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
2418     worker->SetWorkerEnv(workerEnv);
2419     NativeEngine* workerEngine = reinterpret_cast<NativeEngine*>(workerEnv);
2420     workerEngine->MarkRestrictedWorkerThread();
2421     napi_value exports = nullptr;
2422     napi_create_object(workerEnv, &exports);
2423     Worker::InitWorker(workerEnv, exports);
2424     worker->EraseWorker();
2425     ClearWorkerHandle(worker);
2426     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
2427     ASSERT_TRUE(result != nullptr);
2428 }
2429 
2430 HWTEST_F(WorkersTest, ConstructorTest001, testing::ext::TestSize.Level0)
2431 {
2432     napi_env env = WorkersTest::GetEnv();
2433     Worker *worker = new Worker(env, nullptr);
2434     ASSERT_TRUE(worker != nullptr);
2435     napi_env hostEnv = worker->GetHostEnv();
2436     ASSERT_TRUE(env == hostEnv);
2437     napi_env workerEnv = worker->GetWorkerEnv();
2438     ASSERT_TRUE(workerEnv == nullptr);
2439     delete worker;
2440     worker = nullptr;
2441 }
2442 
2443 HWTEST_F(WorkersTest, ConstructorTest002, testing::ext::TestSize.Level0)
2444 {
2445     napi_env env = (napi_env)engine_;
2446     napi_value global = nullptr;
2447     napi_get_global(env, &global);
2448 
2449     std::string funcName = "LimitedWorkerConstructor";
2450     napi_value cb = nullptr;
2451     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::LimitedWorkerConstructor, nullptr, &cb);
2452 
2453     napi_value result = nullptr;
2454     napi_value argv[2] = { nullptr };
2455     std::string script = "entry/ets/workers/@worker.ts";
2456     napi_create_string_utf8(env, script.c_str(), script.length(), &argv[0]);
2457     std::string type = "classic";
2458     std::string name = "WorkerThread";
2459     napi_value typeValue = nullptr;
2460     napi_value nameValue = nullptr;
2461     napi_create_string_utf8(env, name.c_str(), name.length(), &nameValue);
2462     napi_create_string_utf8(env, type.c_str(), type.length(), &typeValue);
2463 
2464     napi_value object = nullptr;
2465     napi_create_object(env, &object);
2466 
2467     napi_set_named_property(env, object, "name", nameValue);
2468     napi_set_named_property(env, object, "type", typeValue);
2469     argv[1] = object;
2470 
2471     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
2472     uv_sleep(200);
2473     ASSERT_TRUE(result == nullptr);
2474 }
2475 
2476 HWTEST_F(WorkersTest, ConstructorTest003, testing::ext::TestSize.Level0)
2477 {
2478     napi_env env = (napi_env)engine_;
2479     napi_value global = nullptr;
2480     napi_get_global(env, &global);
2481 
2482     std::string funcName = "ThreadWorkerConstructor";
2483     napi_value cb = nullptr;
2484     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
2485 
2486     napi_value result = nullptr;
2487     napi_value argv[2] = { nullptr };
2488     std::string script = "entry/ets/workers/@worker.ts";
2489     napi_create_string_utf8(env, script.c_str(), script.length(), &argv[0]);
2490     std::string type = "classic";
2491     std::string name = "WorkerThread";
2492     napi_value typeValue = nullptr;
2493     napi_value nameValue = nullptr;
2494     napi_create_string_utf8(env, name.c_str(), name.length(), &nameValue);
2495     napi_create_string_utf8(env, type.c_str(), type.length(), &typeValue);
2496 
2497     napi_value object = nullptr;
2498     napi_create_object(env, &object);
2499 
2500     napi_set_named_property(env, object, "name", nameValue);
2501     napi_set_named_property(env, object, "type", typeValue);
2502     argv[1] = object;
2503 
2504     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
2505     uv_sleep(200);
2506     ASSERT_TRUE(result == nullptr);
2507 }
2508 
2509 HWTEST_F(WorkersTest, ConstructorTest004, testing::ext::TestSize.Level0)
2510 {
2511     napi_env env = (napi_env)engine_;
2512     napi_env workerEnv = nullptr;
2513     napi_create_runtime(env, &workerEnv);
2514     napi_value workerGlobal = nullptr;
2515     napi_get_global(workerEnv, &workerGlobal);
2516     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
2517     std::string funcName = "ThreadWorkerConstructor";
2518     napi_value cb = nullptr;
2519     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
2520 
2521     napi_value result = nullptr;
2522     napi_call_function(workerEnv, workerGlobal, cb, 0, nullptr, &result);
2523     uv_sleep(200);
2524     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
2525     ASSERT_TRUE(result == nullptr);
2526 }
2527 
2528 HWTEST_F(WorkersTest, ConstructorTest005, testing::ext::TestSize.Level0)
2529 {
2530     napi_env env = (napi_env)engine_;
2531     napi_env workerEnv = nullptr;
2532     napi_create_runtime(env, &workerEnv);
2533     napi_value workerGlobal = nullptr;
2534     napi_get_global(workerEnv, &workerGlobal);
2535     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
2536     std::string funcName = "ThreadWorkerConstructor";
2537     napi_value cb = nullptr;
2538     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
2539 
2540     napi_value result = nullptr;
2541     napi_value argv[2] = { nullptr };
2542     int32_t script = 200;
2543     napi_create_int32(workerEnv, script, &argv[0]);
2544     std::string type = "classic";
2545     std::string name = "WorkerThread";
2546     napi_value typeValue = nullptr;
2547     napi_value nameValue = nullptr;
2548     napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
2549     napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
2550 
2551     napi_value object = nullptr;
2552     napi_create_object(workerEnv, &object);
2553 
2554     napi_set_named_property(workerEnv, object, "name", nameValue);
2555     napi_set_named_property(workerEnv, object, "type", typeValue);
2556     argv[1] = object;
2557 
2558     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
2559     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
2560     uv_sleep(200);
2561     ASSERT_TRUE(result == nullptr);
2562 }
2563 
2564 HWTEST_F(WorkersTest, ConstructorTest006, testing::ext::TestSize.Level0)
2565 {
2566     napi_env env = (napi_env)engine_;
2567     napi_env workerEnv = nullptr;
2568     napi_create_runtime(env, &workerEnv);
2569     napi_value workerGlobal = nullptr;
2570     napi_get_global(workerEnv, &workerGlobal);
2571     auto engine = reinterpret_cast<NativeEngine*>(workerEnv);
2572     engine->CheckAndSetWorkerVersion(WorkerVersion::NONE, WorkerVersion::OLD);
2573     Worker::ThreadWorkerConstructor(workerEnv, nullptr);
2574     napi_value exception = nullptr;
2575     napi_get_and_clear_last_exception(workerEnv, &exception);
2576     ASSERT_TRUE(exception != nullptr);
2577     engine->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NEW);
2578     Worker::WorkerConstructor(workerEnv, nullptr);
2579     napi_get_and_clear_last_exception(workerEnv, &exception);
2580     ASSERT_TRUE(exception != nullptr);
2581 }
2582 
2583 HWTEST_F(WorkersTest, ConstructorTest007, testing::ext::TestSize.Level0)
2584 {
2585     napi_env env = (napi_env)engine_;
2586     napi_env workerEnv = nullptr;
2587     napi_create_runtime(env, &workerEnv);
2588     napi_value workerGlobal = nullptr;
2589     napi_get_global(workerEnv, &workerGlobal);
2590     std::string funcName = "WorkerConstructor";
2591     napi_value cb = nullptr;
2592     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::WorkerConstructor, nullptr, &cb);
2593 
2594     napi_value result = nullptr;
2595     napi_value argv[2] = { nullptr };
2596     std::string script = "entry/ets/workers/@worker.ts";
2597     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
2598     argv[1] = nullptr;
2599     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
2600     uv_sleep(200);
2601     ASSERT_TRUE(result != nullptr);
2602     napi_value exception = nullptr;
2603     napi_get_and_clear_last_exception(env, &exception);
2604     ASSERT_TRUE(exception != nullptr);
2605 }
2606 
2607 HWTEST_F(WorkersTest, ConstructorTest008, testing::ext::TestSize.Level0)
2608 {
2609     napi_env env = (napi_env)engine_;
2610     napi_env workerEnv = nullptr;
2611     napi_create_runtime(env, &workerEnv);
2612     napi_value workerGlobal = nullptr;
2613     napi_get_global(workerEnv, &workerGlobal);
2614     std::string funcName = "WorkerConstructor";
2615     napi_value cb = nullptr;
2616     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::WorkerConstructor, nullptr, &cb);
2617 
2618     napi_value result = nullptr;
2619     napi_value argv[3] = { nullptr };
2620     std::string script = "entry/ets/workers/@worker.ts";
2621     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
2622     argv[1] = nullptr;
2623     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
2624     uv_sleep(200);
2625     ASSERT_TRUE(result != nullptr);
2626     napi_value exception = nullptr;
2627     napi_get_and_clear_last_exception(env, &exception);
2628     ASSERT_TRUE(exception == nullptr);
2629 }
2630 
2631 HWTEST_F(WorkersTest, ConstructorTest009, testing::ext::TestSize.Level0)
2632 {
2633     napi_env env = (napi_env)engine_;
2634     napi_env workerEnv = nullptr;
2635     napi_create_runtime(env, &workerEnv);
2636     napi_value workerGlobal = nullptr;
2637     napi_get_global(workerEnv, &workerGlobal);
2638     std::string funcName = "WorkerConstructor";
2639     napi_value cb = nullptr;
2640     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::WorkerConstructor, nullptr, &cb);
2641 
2642     napi_value result = nullptr;
2643     napi_value argv[2] = { nullptr };
2644     argv[0] = NapiHelper::CreateEmptyString(workerEnv);
2645     std::string type = "classic";
2646     napi_value typeValue = nullptr;
2647     napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
2648     napi_value nameValue = NapiHelper::CreateEmptyString(workerEnv);;
2649 
2650     napi_value object = nullptr;
2651     napi_create_object(workerEnv, &object);
2652 
2653     napi_set_named_property(workerEnv, object, "name", nameValue);
2654     napi_set_named_property(workerEnv, object, "type", typeValue);
2655     argv[1] = object;
2656 
2657     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
2658     uv_sleep(200);
2659     ASSERT_TRUE(result != nullptr);
2660     napi_value exception = nullptr;
2661     napi_get_and_clear_last_exception(env, &exception);
2662     ASSERT_TRUE(exception == nullptr);
2663 }
2664 
2665 HWTEST_F(WorkersTest, CheckWorkerArgs001, testing::ext::TestSize.Level0)
2666 {
2667     napi_env env = (napi_env)engine_;
2668     napi_value undefined = NapiHelper::GetUndefinedValue(env);
2669     napi_value object1 = nullptr;
2670     napi_create_object(env, &object1);
2671     napi_set_named_property(env, object1, "name", undefined);
2672     napi_set_named_property(env, object1, "type", undefined);
2673     Worker::CheckWorkerArgs(env, object1);
2674 
2675     uint32_t name2 = 100; //test 100
2676     napi_value nameValue2 = nullptr;
2677     napi_create_uint32(env, name2, &nameValue2);
2678     napi_value object2 = nullptr;
2679     napi_create_object(env, &object2);
2680     napi_set_named_property(env, object2, "name", nameValue2);
2681     Worker::CheckWorkerArgs(env, object2);
2682     napi_value exception = nullptr;
2683     napi_get_and_clear_last_exception(env, &exception);
2684     ASSERT_TRUE(exception == nullptr);
2685 
2686     uint32_t type3 = 100; //test 100
2687     std::string name3 = "WorkerThread";
2688     napi_value typeValue3 = nullptr;
2689     napi_value nameValue3 = nullptr;
2690     napi_create_string_utf8(env, name3.c_str(), name3.length(), &nameValue3);
2691     napi_create_uint32(env, type3, &typeValue3);
2692     napi_value object3 = nullptr;
2693     napi_create_object(env, &object3);
2694     napi_set_named_property(env, object3, "name", nameValue3);
2695     napi_set_named_property(env, object3, "type", typeValue3);
2696     Worker::CheckWorkerArgs(env, object3);
2697     napi_get_and_clear_last_exception(env, &exception);
2698     ASSERT_TRUE(exception == nullptr);
2699 }
2700 
2701 HWTEST_F(WorkersTest, WorkerTest013, testing::ext::TestSize.Level0)
2702 {
2703     napi_env env = (napi_env)engine_;
2704     napi_value global;
2705     napi_get_global(env, &global);
2706     napi_value result = nullptr;
2707     result = Worker_Constructor(env, global);
2708     Worker* worker = nullptr;
2709     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
2710     napi_value argv[1] = { nullptr };
2711     std::string message = "host";
2712     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
2713     std::string funcName = "PostMessage";
2714     napi_value cb = nullptr;
2715     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessage, worker, &cb);
2716     napi_call_function(env, global, cb, 0, nullptr, &result);
2717     napi_value exception = nullptr;
2718     napi_get_and_clear_last_exception(env, &exception);
2719     ASSERT_TRUE(exception != nullptr);
2720     cb = nullptr;
2721     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessage, worker, &cb);
2722     UpdateWorkerState(worker, Worker::RunnerState::TERMINATEING);
2723     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
2724     cb = nullptr;
2725     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessage, worker, &cb);
2726     UpdateWorkerState(worker, Worker::RunnerState::TERMINATED);
2727     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
2728     worker->EraseWorker();
2729     ClearWorkerHandle(worker);
2730     result = Worker_Terminate(env, global);
2731     ASSERT_TRUE(result != nullptr);
2732 }
2733 
2734 HWTEST_F(WorkersTest, WorkerTest014, testing::ext::TestSize.Level0)
2735 {
2736     napi_env env = (napi_env)engine_;
2737     napi_value global;
2738     napi_get_global(env, &global);
2739     napi_value result = nullptr;
2740     napi_value argv[1] = { nullptr };
2741     std::string message = "host";
2742     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
2743     std::string funcName = "PostMessage";
2744     napi_value cb = nullptr;
2745     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessage, nullptr, &cb);
2746     napi_call_function(env, nullptr, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
2747     napi_value exception = nullptr;
2748     napi_get_and_clear_last_exception(env, &exception);
2749     ASSERT_TRUE(exception == nullptr);
2750     ASSERT_TRUE(result != nullptr);
2751 }
2752 
2753 HWTEST_F(WorkersTest, WorkerTest015, testing::ext::TestSize.Level0)
2754 {
2755     napi_env env = (napi_env)engine_;
2756     napi_value global;
2757     napi_get_global(env, &global);
2758     napi_value result = nullptr;
2759     result = Worker_Constructor(env, global);
2760 
2761     Worker* worker = nullptr;
2762     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
2763 
2764     napi_value argv[2] = { nullptr };
2765     std::string message = "host";
2766     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
2767     std::string arr = "arr";
2768     napi_create_string_utf8(env, arr.c_str(), arr.length(), &argv[1]);
2769     std::string funcName = "PostMessage";
2770     napi_value cb = nullptr;
2771     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessage, worker, &cb);
2772     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
2773     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
2774     napi_value exception = nullptr;
2775     napi_get_and_clear_last_exception(env, &exception);
2776     ASSERT_TRUE(exception != nullptr);
2777     worker->EraseWorker();
2778     ClearWorkerHandle(worker);
2779     result = Worker_Terminate(env, global);
2780     ASSERT_TRUE(result != nullptr);
2781 }
2782 
2783 HWTEST_F(WorkersTest, WorkerTest016, testing::ext::TestSize.Level0)
2784 {
2785     napi_env env = (napi_env)engine_;
2786     napi_value global;
2787     napi_get_global(env, &global);
2788     napi_value result = nullptr;
2789     result = Worker_Constructor(env, global);
2790     Worker* worker = nullptr;
2791     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
2792 
2793     napi_value argv[2] = { nullptr };
2794     std::string message = "host";
2795     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
2796     napi_create_array_with_length(env, 1, &argv[1]);
2797     std::string funcName = "PostMessage";
2798     napi_value cb = nullptr;
2799     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessage, worker, &cb);
2800     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
2801     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
2802     napi_value exception = nullptr;
2803     napi_get_and_clear_last_exception(env, &exception);
2804     ASSERT_TRUE(exception == nullptr);
2805     worker->EraseWorker();
2806     ClearWorkerHandle(worker);
2807     result = Worker_Terminate(env, global);
2808     ASSERT_TRUE(result != nullptr);
2809 }
2810 
2811 HWTEST_F(WorkersTest, WorkerTest017, testing::ext::TestSize.Level0)
2812 {
2813     napi_env env = (napi_env)engine_;
2814     napi_value global;
2815     napi_get_global(env, &global);
2816     napi_value result = nullptr;
2817     result = Worker_Constructor(env, global);
2818     Worker* worker = nullptr;
2819     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
2820 
2821     napi_value argv[2] = {nullptr};
2822     std::string instanceName = "MainThread";
2823     napi_create_string_utf8(env, instanceName.c_str(), instanceName.length(), &argv[0]);
2824     napi_value obj = nullptr;
2825     napi_create_object(env, &obj);
2826     argv[1] = obj;
2827 
2828     std::string funcName = "RegisterGlobalCallObject";
2829     napi_value cb = nullptr;
2830     napi_value callResult = nullptr;
2831     // ------- workerEnv---------
2832     napi_create_function(env, funcName.c_str(), funcName.size(),
2833                          Worker::RegisterGlobalCallObject, worker, &cb);
2834     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
2835     napi_call_function(env, global, cb, 0, nullptr, &callResult);
2836     napi_value exception = nullptr;
2837     napi_get_and_clear_last_exception(env, &exception);
2838     ASSERT_TRUE(exception != nullptr);
2839     worker->EraseWorker();
2840     ClearWorkerHandle(worker);
2841     result = Worker_Terminate(env, global);
2842     ASSERT_TRUE(result != nullptr);
2843 }
2844 
2845 HWTEST_F(WorkersTest, WorkerTest018, testing::ext::TestSize.Level0)
2846 {
2847     napi_env env = (napi_env)engine_;
2848     napi_value global;
2849     napi_get_global(env, &global);
2850     napi_value result = nullptr;
2851     result = Worker_Constructor(env, global);
2852     Worker* worker = nullptr;
2853     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
2854 
2855     napi_value argv[2] = {nullptr};
2856     std::string instanceName = "MainThread";
2857     napi_create_string_utf8(env, instanceName.c_str(), instanceName.length(), &argv[0]);
2858     napi_value obj = nullptr;
2859     napi_create_object(env, &obj);
2860     argv[1] = obj;
2861 
2862     std::string funcName = "RegisterGlobalCallObject";
2863     napi_value cb = nullptr;
2864     napi_value callResult = nullptr;
2865     // ------- workerEnv---------
2866     napi_create_function(env, funcName.c_str(), funcName.size(),
2867                          Worker::RegisterGlobalCallObject, nullptr, &cb);
2868     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
2869     napi_call_function(env, nullptr, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
2870     napi_value exception = nullptr;
2871     napi_get_and_clear_last_exception(env, &exception);
2872     ASSERT_TRUE(exception != nullptr);
2873     worker->EraseWorker();
2874     ClearWorkerHandle(worker);
2875     result = Worker_Terminate(env, global);
2876     ASSERT_TRUE(result != nullptr);
2877 }
2878 
2879 HWTEST_F(WorkersTest, WorkerTest019, testing::ext::TestSize.Level0)
2880 {
2881     napi_env env = (napi_env)engine_;
2882     napi_value global;
2883     napi_get_global(env, &global);
2884     napi_value result = nullptr;
2885     result = Worker_Constructor(env, global);
2886     Worker* worker = nullptr;
2887     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
2888 
2889     napi_value argv[2] = {nullptr};
2890     std::string instanceName = "MainThread";
2891     napi_create_string_utf8(env, instanceName.c_str(), instanceName.length(), &argv[0]);
2892 
2893     std::string funcName = "UnregisterGlobalCallObject";
2894     napi_create_string_utf8(env, funcName.c_str(), funcName.length(), &argv[1]);
2895     napi_value cb = nullptr;
2896     napi_value callResult = nullptr;
2897     // ------- workerEnv---------
2898     napi_create_function(env, funcName.c_str(), funcName.size(),
2899                         Worker::UnregisterGlobalCallObject, worker, &cb);
2900     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
2901     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
2902     napi_value exception = nullptr;
2903     napi_get_and_clear_last_exception(env, &exception);
2904     ASSERT_TRUE(exception != nullptr);
2905     worker->EraseWorker();
2906     ClearWorkerHandle(worker);
2907     result = Worker_Terminate(env, global);
2908     ASSERT_TRUE(result != nullptr);
2909 }
2910 
2911 HWTEST_F(WorkersTest, WorkerTest020, testing::ext::TestSize.Level0)
2912 {
2913     napi_env env = (napi_env)engine_;
2914     napi_value global;
2915     napi_get_global(env, &global);
2916     napi_value result = nullptr;
2917     result = Worker_Constructor(env, global);
2918     Worker* worker = nullptr;
2919     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
2920 
2921     napi_value argv[1] = {nullptr};
2922     std::string instanceName = "MainThread";
2923     napi_create_string_utf8(env, instanceName.c_str(), instanceName.length(), &argv[0]);
2924 
2925     std::string funcName = "UnregisterGlobalCallObject";
2926     napi_value cb = nullptr;
2927     napi_value callResult = nullptr;
2928     // ------- workerEnv---------
2929     napi_create_function(env, funcName.c_str(), funcName.size(),
2930                         Worker::UnregisterGlobalCallObject, worker, &cb);
2931     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
2932     napi_call_function(env, global, cb, 0, nullptr, &callResult);
2933     napi_value exception = nullptr;
2934     napi_get_and_clear_last_exception(env, &exception);
2935     ASSERT_TRUE(exception == nullptr);
2936     worker->EraseWorker();
2937     ClearWorkerHandle(worker);
2938     result = Worker_Terminate(env, global);
2939     ASSERT_TRUE(result != nullptr);
2940 }
2941 
2942 HWTEST_F(WorkersTest, WorkerTest021, testing::ext::TestSize.Level0)
2943 {
2944     napi_env env = (napi_env)engine_;
2945     napi_value global;
2946     napi_get_global(env, &global);
2947     napi_value result = nullptr;
2948     result = Worker_Constructor(env, global);
2949     Worker* worker = nullptr;
2950     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
2951 
2952     napi_value argv[1] = {nullptr};
2953     std::string instanceName = "MainThread";
2954     napi_create_string_utf8(env, instanceName.c_str(), instanceName.length(), &argv[0]);
2955 
2956     std::string funcName = "UnregisterGlobalCallObject";
2957     napi_value cb = nullptr;
2958     napi_value callResult = nullptr;
2959     // ------- workerEnv---------
2960     napi_create_function(env, funcName.c_str(), funcName.size(),
2961                         Worker::UnregisterGlobalCallObject, nullptr, &cb);
2962     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
2963     napi_call_function(env, nullptr, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
2964     napi_value exception = nullptr;
2965     napi_get_and_clear_last_exception(env, &exception);
2966     ASSERT_TRUE(exception != nullptr);
2967     worker->EraseWorker();
2968     ClearWorkerHandle(worker);
2969     result = Worker_Terminate(env, global);
2970     ASSERT_TRUE(result != nullptr);
2971 }
2972 
2973 HWTEST_F(WorkersTest, WorkerTest022, testing::ext::TestSize.Level0)
2974 {
2975     napi_env env = (napi_env)engine_;
2976     napi_value global;
2977     napi_get_global(env, &global);
2978     napi_value result = nullptr;
2979     result = Worker_Constructor(env, global);
2980     Worker* worker = nullptr;
2981     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
2982 
2983     napi_value argv[2] = {nullptr};
2984     std::string message = "host";
2985     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
2986 
2987     std::string funcName = "AddEventListener";
2988     napi_create_string_utf8(env, funcName.c_str(), funcName.length(), &argv[1]);
2989     napi_value cb = nullptr;
2990     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::AddEventListener, worker, &cb);
2991     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
2992     napi_value exception = nullptr;
2993     napi_get_and_clear_last_exception(env, &exception);
2994     ASSERT_TRUE(exception != nullptr);
2995     worker->EraseWorker();
2996     ClearWorkerHandle(worker);
2997     result = Worker_Terminate(env, global);
2998     ASSERT_TRUE(result != nullptr);
2999 }
3000 
3001 HWTEST_F(WorkersTest, WorkerTest023, testing::ext::TestSize.Level0)
3002 {
3003     napi_env env = (napi_env)engine_;
3004     napi_value global;
3005     napi_get_global(env, &global);
3006     napi_value result = nullptr;
3007     result = Worker_Constructor(env, global);
3008     Worker* worker = nullptr;
3009     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3010 
3011     napi_value argv[1] = {nullptr};
3012     std::string message = "host";
3013     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
3014 
3015     std::string funcName = "AddEventListener";
3016     napi_value cb = nullptr;
3017     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::AddEventListener, worker, &cb);
3018     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
3019     napi_value exception = nullptr;
3020     napi_get_and_clear_last_exception(env, &exception);
3021     ASSERT_TRUE(exception != nullptr);
3022     worker->EraseWorker();
3023     ClearWorkerHandle(worker);
3024     result = Worker_Terminate(env, global);
3025     ASSERT_TRUE(result != nullptr);
3026 }
3027 
3028 HWTEST_F(WorkersTest, WorkerTest024, testing::ext::TestSize.Level0)
3029 {
3030     napi_env env = (napi_env)engine_;
3031     napi_value global;
3032     napi_get_global(env, &global);
3033     napi_value result = nullptr;
3034     result = Worker_Constructor(env, global);
3035     Worker* worker = nullptr;
3036     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3037 
3038     napi_value argv[2] = {nullptr};
3039     std::string message = "host";
3040     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
3041 
3042     std::string funcName = "AddEventListener";
3043     napi_create_string_utf8(env, funcName.c_str(), funcName.length(), &argv[1]);
3044     napi_value cb = nullptr;
3045     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::AddEventListener, nullptr, &cb);
3046     napi_call_function(env, nullptr, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
3047     napi_value exception = nullptr;
3048     napi_get_and_clear_last_exception(env, &exception);
3049     ASSERT_TRUE(exception != nullptr);
3050     worker->EraseWorker();
3051     ClearWorkerHandle(worker);
3052     result = Worker_Terminate(env, global);
3053     ASSERT_TRUE(result != nullptr);
3054 }
3055 
3056 HWTEST_F(WorkersTest, WorkerTest025, testing::ext::TestSize.Level0)
3057 {
3058     napi_env env = (napi_env)engine_;
3059     napi_value global;
3060     napi_get_global(env, &global);
3061     napi_value result = nullptr;
3062     result = Worker_Constructor(env, global);
3063     Worker* worker = nullptr;
3064     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3065 
3066     napi_value argv[2] = {nullptr};
3067     std::string message = "host";
3068     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
__anon0020bb762102(napi_env env, napi_callback_info info) 3069     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
3070         return nullptr;
3071     };
3072     napi_value funcValue = nullptr;
3073     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
3074     argv[1] = funcValue;
3075 
3076     std::string funcName = "RemoveEventListener";
3077     napi_value cb = nullptr;
3078 
3079     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::RemoveEventListener, worker, &cb);
3080     napi_call_function(env, global, cb, 0, nullptr, &result);
3081     napi_value exception = nullptr;
3082     napi_get_and_clear_last_exception(env, &exception);
3083     ASSERT_TRUE(exception != nullptr);
3084     worker->EraseWorker();
3085     ClearWorkerHandle(worker);
3086     result = Worker_Terminate(env, global);
3087     ASSERT_TRUE(result != nullptr);
3088 }
3089 
3090 HWTEST_F(WorkersTest, WorkerTest026, testing::ext::TestSize.Level0)
3091 {
3092     napi_env env = (napi_env)engine_;
3093     napi_value global;
3094     napi_get_global(env, &global);
3095     napi_value result = nullptr;
3096     result = Worker_Constructor(env, global);
3097     Worker* worker = nullptr;
3098     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3099 
3100     napi_value argv[2] = {nullptr};
3101     std::string message = "host";
3102     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
__anon0020bb762202(napi_env env, napi_callback_info info) 3103     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
3104         return nullptr;
3105     };
3106     napi_value funcValue = nullptr;
3107     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
3108     argv[1] = funcValue;
3109 
3110     std::string funcName = "RemoveEventListener";
3111     napi_value cb = nullptr;
3112 
3113     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::RemoveEventListener, nullptr, &cb);
3114     napi_call_function(env, nullptr, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
3115     napi_value exception = nullptr;
3116     napi_get_and_clear_last_exception(env, &exception);
3117     ASSERT_TRUE(exception == nullptr);
3118     worker->EraseWorker();
3119     ClearWorkerHandle(worker);
3120     result = Worker_Terminate(env, global);
3121     ASSERT_TRUE(result != nullptr);
3122 }
3123 
3124 HWTEST_F(WorkersTest, WorkerTest027, testing::ext::TestSize.Level0)
3125 {
3126     napi_env env = (napi_env)engine_;
3127     napi_value global;
3128     napi_get_global(env, &global);
3129     napi_value result = nullptr;
3130     result = Worker_Constructor(env, global);
3131     Worker* worker = nullptr;
3132     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3133 
3134     napi_value argv[2] = {nullptr};
3135     std::string message = "host";
3136     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
3137 
3138     std::string funcName = "RemoveEventListener";
3139     napi_create_string_utf8(env, funcName.c_str(), funcName.length(), &argv[1]);
3140     napi_value cb = nullptr;
3141 
3142     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::RemoveEventListener, worker, &cb);
3143     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
3144     napi_value exception = nullptr;
3145     napi_get_and_clear_last_exception(env, &exception);
3146     ASSERT_TRUE(exception != nullptr);
3147     worker->EraseWorker();
3148     ClearWorkerHandle(worker);
3149     result = Worker_Terminate(env, global);
3150     ASSERT_TRUE(result != nullptr);
3151 }
3152 
3153 HWTEST_F(WorkersTest, WorkerTest028, testing::ext::TestSize.Level0)
3154 {
3155     napi_env env = (napi_env)engine_;
3156     napi_value global;
3157     napi_get_global(env, &global);
3158     napi_value result = nullptr;
3159     result = Worker_Constructor(env, global);
3160     Worker* worker = nullptr;
3161     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3162     SetWorkerRef(worker, env);
3163     napi_value argv[1] = {nullptr};
3164     napi_value typeValue = nullptr;
3165     std::string type = "message";
3166     napi_create_string_utf8(env, type.c_str(), type.length(), &typeValue);
3167     napi_value object = nullptr;
3168     napi_create_object(env, &object);
3169     napi_set_named_property(env, object, "type", typeValue);
3170     argv[0] = object;
3171 
3172     std::string funcName = "DispatchEvent";
3173     napi_value cb = nullptr;
3174     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::DispatchEvent, worker, &cb);
3175     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
3176     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
3177     napi_value exception = nullptr;
3178     napi_get_and_clear_last_exception(env, &exception);
3179     ASSERT_TRUE(exception == nullptr);
3180     worker->EraseWorker();
3181     ClearWorkerHandle(worker);
3182     result = Worker_Terminate(env, global);
3183     ASSERT_TRUE(result != nullptr);
3184 }
3185 
3186 HWTEST_F(WorkersTest, WorkerTest029, testing::ext::TestSize.Level0)
3187 {
3188     napi_env env = (napi_env)engine_;
3189     napi_value global;
3190     napi_get_global(env, &global);
3191     napi_value result = nullptr;
3192     result = Worker_Constructor(env, global);
3193     Worker* worker = nullptr;
3194     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3195 
3196     std::string funcName = "DispatchEvent";
3197     napi_value cb = nullptr;
3198     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::DispatchEvent, worker, &cb);
3199     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
3200     napi_call_function(env, global, cb, 0, nullptr, &result);
3201     napi_value exception = nullptr;
3202     napi_get_and_clear_last_exception(env, &exception);
3203     ASSERT_TRUE(exception != nullptr);
3204     worker->EraseWorker();
3205     ClearWorkerHandle(worker);
3206     result = Worker_Terminate(env, global);
3207     ASSERT_TRUE(result != nullptr);
3208 }
3209 
3210 HWTEST_F(WorkersTest, WorkerTest030, testing::ext::TestSize.Level0)
3211 {
3212     napi_env env = (napi_env)engine_;
3213     napi_value global;
3214     napi_get_global(env, &global);
3215     napi_value result = nullptr;
3216     result = Worker_Constructor(env, global);
3217     Worker* worker = nullptr;
3218     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3219     SetWorkerRef(worker, env);
3220     napi_value argv[1] = {nullptr};
3221     std::string type = "message";
3222     napi_create_string_utf8(env, type.c_str(), type.length(), &argv[0]);
3223 
3224     std::string funcName = "DispatchEvent";
3225     napi_value cb = nullptr;
3226     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::DispatchEvent, worker, &cb);
3227     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
3228     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
3229     napi_value exception = nullptr;
3230     napi_get_and_clear_last_exception(env, &exception);
3231     ASSERT_TRUE(exception != nullptr);
3232     worker->EraseWorker();
3233     ClearWorkerHandle(worker);
3234     result = Worker_Terminate(env, global);
3235     ASSERT_TRUE(result != nullptr);
3236 }
3237 
3238 HWTEST_F(WorkersTest, WorkerTest031, testing::ext::TestSize.Level0)
3239 {
3240     napi_env env = (napi_env)engine_;
3241     napi_value global;
3242     napi_get_global(env, &global);
3243     napi_value result = nullptr;
3244     result = Worker_Constructor(env, global);
3245     Worker* worker = nullptr;
3246     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3247     SetWorkerRef(worker, env);
3248     napi_value argv[1] = {nullptr};
3249     napi_value typeValue = nullptr;
3250     std::string type = "message";
3251     napi_create_string_utf8(env, type.c_str(), type.length(), &typeValue);
3252     napi_value object = nullptr;
3253     napi_create_object(env, &object);
3254     napi_set_named_property(env, object, "type", typeValue);
3255     argv[0] = object;
3256     std::string funcName = "DispatchEvent";
3257     napi_value cb = nullptr;
3258     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::DispatchEvent, nullptr, &cb);
3259     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
3260     napi_call_function(env, nullptr, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
3261     napi_value exception = nullptr;
3262     napi_get_and_clear_last_exception(env, &exception);
3263     ASSERT_TRUE(exception == nullptr);
3264     worker->EraseWorker();
3265     ClearWorkerHandle(worker);
3266     result = Worker_Terminate(env, global);
3267     ASSERT_TRUE(result != nullptr);
3268 }
3269 
3270 HWTEST_F(WorkersTest, WorkerTest032, testing::ext::TestSize.Level0)
3271 {
3272     napi_env env = (napi_env)engine_;
3273     napi_value global;
3274     napi_get_global(env, &global);
3275     napi_value result = nullptr;
3276     result = Worker_Constructor(env, global);
3277     Worker* worker = nullptr;
3278     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3279     SetWorkerRef(worker, env);
3280     napi_value argv[1] = {nullptr};
3281     napi_value typeValue = nullptr;
3282     uint32_t type = 100; //test 100
3283     napi_create_uint32(env, type, &typeValue);
3284     napi_value object = nullptr;
3285     napi_create_object(env, &object);
3286     napi_set_named_property(env, object, "type", typeValue);
3287     argv[0] = object;
3288     std::string funcName = "DispatchEvent";
3289     napi_value cb = nullptr;
3290     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::DispatchEvent, worker, &cb);
3291     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
3292     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
3293     napi_value exception = nullptr;
3294     napi_get_and_clear_last_exception(env, &exception);
3295     ASSERT_TRUE(exception != nullptr);
3296     worker->EraseWorker();
3297     ClearWorkerHandle(worker);
3298     result = Worker_Terminate(env, global);
3299     ASSERT_TRUE(result != nullptr);
3300 }
3301 
3302 HWTEST_F(WorkersTest, WorkerTest033, testing::ext::TestSize.Level0)
3303 {
3304     napi_env env = (napi_env)engine_;
3305     napi_value global;
3306     napi_get_global(env, &global);
3307     napi_value result = nullptr;
3308     result = Worker_Constructor(env, global);
3309     Worker* worker = nullptr;
3310     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3311     napi_value argv[1] = { nullptr };
3312     std::string funcName = "RemoveAllListener";
3313     napi_value cb = nullptr;
3314     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::RemoveAllListener, nullptr, &cb);
3315     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
3316     napi_call_function(env, nullptr, cb, 1, argv, &result);
3317     napi_value exception = nullptr;
3318     napi_get_and_clear_last_exception(env, &exception);
3319     ASSERT_TRUE(exception == nullptr);
3320     worker->EraseWorker();
3321     ClearWorkerHandle(worker);
3322     result = Worker_Terminate(env, global);
3323     ASSERT_TRUE(result != nullptr);
3324 }
3325 
3326 HWTEST_F(WorkersTest, WorkerTest034, testing::ext::TestSize.Level0)
3327 {
3328     napi_env env = (napi_env)engine_;
3329     napi_value global;
3330     napi_get_global(env, &global);
3331     napi_value result = nullptr;
3332     result = Worker_Constructor(env, global);
3333     Worker* worker = nullptr;
3334     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3335     napi_value argv[1] = { nullptr };
3336     std::string message = "host";
3337     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
3338     std::string funcName = "CancelTask";
3339     napi_value cb = nullptr;
3340     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::CancelTask, nullptr, &cb);
3341     napi_call_function(env, nullptr, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
3342     worker->EraseWorker();
3343     ClearWorkerHandle(worker);
3344     result = Worker_Terminate(env, global);
3345     ASSERT_TRUE(result != nullptr);
3346 }
3347 
3348 HWTEST_F(WorkersTest, WorkerTest035, testing::ext::TestSize.Level0)
3349 {
3350     napi_env env = (napi_env)engine_;
3351     napi_value global;
3352     napi_get_global(env, &global);
3353     napi_value result = nullptr;
3354     result = Worker_Constructor(env, global);
3355     Worker* worker = nullptr;
3356     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3357     napi_value argv[1] = { nullptr };
3358     std::string message = "host";
3359     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
3360     std::string funcName = "CancelTask";
3361     napi_value cb = nullptr;
3362     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::CancelTask, worker, &cb);
3363     UpdateWorkerState(worker, Worker::RunnerState::TERMINATED);
3364     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
3365     worker->EraseWorker();
3366     ClearWorkerHandle(worker);
3367     result = Worker_Terminate(env, global);
3368     ASSERT_TRUE(result != nullptr);
3369 }
3370 
3371 HWTEST_F(WorkersTest, WorkerTest036, testing::ext::TestSize.Level0)
3372 {
3373     napi_env env = (napi_env)engine_;
3374     napi_value global;
3375     napi_get_global(env, &global);
3376     napi_value result = nullptr;
3377     result = Worker_Constructor(env, global);
3378     Worker* worker = nullptr;
3379     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3380     napi_value argv[1] = { nullptr };
3381     std::string message = "host";
3382     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
3383     std::string funcName = "CancelTask";
3384     napi_value cb = nullptr;
3385     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::CancelTask, worker, &cb);
3386     UpdateWorkerState(worker, Worker::RunnerState::TERMINATEING);
3387     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
3388     worker->EraseWorker();
3389     ClearWorkerHandle(worker);
3390     result = Worker_Terminate(env, global);
3391     ASSERT_TRUE(result != nullptr);
3392 }
3393 
3394 HWTEST_F(WorkersTest, WorkerTest037, testing::ext::TestSize.Level0)
3395 {
3396     napi_env env = (napi_env)engine_;
3397     napi_value global;
3398     napi_get_global(env, &global);
3399     napi_value result = nullptr;
3400     result = Worker_Constructor(env, global);
3401     Worker* worker = nullptr;
3402     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3403     napi_value argv[1] = { nullptr };
3404     std::string message = "host";
3405     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
3406     std::string funcName = "CancelTask";
3407     napi_value cb = nullptr;
3408     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::CancelTask, worker, &cb);
3409     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
3410     SetWorkerHostEnv(worker, env, true);
3411     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
3412     SetWorkerHostEnv(worker, env, false);
3413     worker->EraseWorker();
3414     ClearWorkerHandle(worker);
3415     result = Worker_Terminate(env, global);
3416     ASSERT_TRUE(result != nullptr);
3417 }
3418 
3419 HWTEST_F(WorkersTest, WorkerTest038, testing::ext::TestSize.Level0)
3420 {
3421     napi_env env = (napi_env)engine_;
3422     napi_value global;
3423     napi_get_global(env, &global);
3424     napi_value result = nullptr;
3425     result = Worker_Constructor(env, global);
3426     Worker* worker = nullptr;
3427     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3428     napi_value argv[1] = { nullptr };
3429     std::string message = "host";
3430     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
3431     std::string funcName = "PostMessageToHost";
3432     napi_value cb = nullptr;
3433     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessageToHost, worker, &cb);
3434     napi_call_function(env, global, cb, 0, nullptr, &result);
3435     worker->EraseWorker();
3436     ClearWorkerHandle(worker);
3437     napi_value exception = nullptr;
3438     napi_get_and_clear_last_exception(env, &exception);
3439     ASSERT_TRUE(exception != nullptr);
3440     result = Worker_Terminate(env, global);
3441     ASSERT_TRUE(result != nullptr);
3442 }
3443 
3444 HWTEST_F(WorkersTest, WorkerTest039, testing::ext::TestSize.Level0)
3445 {
3446     napi_env env = (napi_env)engine_;
3447     napi_value global;
3448     napi_get_global(env, &global);
3449     napi_value result = nullptr;
3450     result = Worker_Constructor(env, global);
3451     Worker* worker = nullptr;
3452     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3453     napi_value argv[1] = { nullptr };
3454     std::string message = "host";
3455     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
3456     std::string funcName = "PostMessageToHost";
3457     napi_value cb = nullptr;
3458     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessageToHost, worker, &cb);
3459     UpdateWorkerState(worker, Worker::RunnerState::TERMINATED);
3460     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
3461     worker->EraseWorker();
3462     ClearWorkerHandle(worker);
3463     napi_value exception = nullptr;
3464     napi_get_and_clear_last_exception(env, &exception);
3465     ASSERT_TRUE(exception == nullptr);
3466     result = Worker_Terminate(env, global);
3467     ASSERT_TRUE(result != nullptr);
3468 }
3469 
3470 HWTEST_F(WorkersTest, WorkerTest040, testing::ext::TestSize.Level0)
3471 {
3472     napi_env env = (napi_env)engine_;
3473     napi_value global;
3474     napi_get_global(env, &global);
3475     napi_value result = nullptr;
3476     result = Worker_Constructor(env, global);
3477     Worker* worker = nullptr;
3478     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3479     // ------- workerEnv---------
3480     napi_env workerEnv = nullptr;
3481     napi_create_runtime(env, &workerEnv);
3482     napi_value workerGlobal = nullptr;
3483     napi_get_global(workerEnv, &workerGlobal);
3484     std::string funcName = "GlobalCall";
3485     napi_value cb = nullptr;
3486     napi_value callResult = nullptr;
3487     // ------- workerEnv---------
3488     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
3489                          Worker::GlobalCall, worker, &cb);
3490     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
3491     napi_call_function(workerEnv, workerGlobal, cb, 0, nullptr, &callResult);
3492     worker->EraseWorker();
3493     ClearWorkerHandle(worker);
3494     napi_value exception = nullptr;
3495     napi_get_and_clear_last_exception(env, &exception);
3496     ASSERT_TRUE(exception == nullptr);
3497     result = Worker_Terminate(env, global);
3498     ASSERT_TRUE(result != nullptr);
3499 }
3500 
3501 HWTEST_F(WorkersTest, WorkerTest041, testing::ext::TestSize.Level0)
3502 {
3503     napi_env env = (napi_env)engine_;
3504     napi_value global;
3505     napi_get_global(env, &global);
3506     napi_value result = nullptr;
3507     result = Worker_Constructor(env, global);
3508     Worker* worker = nullptr;
3509     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3510     // ------- workerEnv---------
3511     napi_env workerEnv = nullptr;
3512     napi_create_runtime(env, &workerEnv);
3513     napi_value workerGlobal = nullptr;
3514     napi_get_global(workerEnv, &workerGlobal);
3515     napi_value argv[3] = {nullptr};
3516     std::string instanceName = "host";
3517     std::string methodName = "postMessage";
3518     int32_t timeout = 300;
3519     napi_create_string_utf8(workerEnv, instanceName.c_str(), instanceName.length(), &argv[0]);
3520     napi_create_string_utf8(workerEnv, methodName.c_str(), methodName.length(), &argv[1]);
3521     napi_create_int32(workerEnv, timeout, &argv[2]);
3522     std::string funcName = "GlobalCall";
3523     napi_value cb = nullptr;
3524     napi_value callResult = nullptr;
3525     // ------- workerEnv---------
3526     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
3527                          Worker::GlobalCall, nullptr, &cb);
3528     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
3529     napi_call_function(workerEnv, nullptr, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
3530     napi_value exception = nullptr;
3531     napi_get_and_clear_last_exception(env, &exception);
3532     ASSERT_TRUE(exception == nullptr);
3533     worker->EraseWorker();
3534     ClearWorkerHandle(worker);
3535     result = Worker_Terminate(env, global);
3536     ASSERT_TRUE(result != nullptr);
3537 }
3538 
3539 HWTEST_F(WorkersTest, WorkerTest042, testing::ext::TestSize.Level0)
3540 {
3541     napi_env env = (napi_env)engine_;
3542     napi_value global;
3543     napi_get_global(env, &global);
3544     napi_value result = nullptr;
3545     result = Worker_Constructor(env, global);
3546     Worker* worker = nullptr;
3547     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3548     // ------- workerEnv---------
3549     napi_env workerEnv = nullptr;
3550     napi_create_runtime(env, &workerEnv);
3551     napi_value workerGlobal = nullptr;
3552     napi_get_global(workerEnv, &workerGlobal);
3553     napi_value argv[3] = {nullptr};
3554     std::string instanceName = "host";
3555     std::string methodName = "postMessage";
3556     int32_t timeout = 300;
3557     napi_create_string_utf8(workerEnv, instanceName.c_str(), instanceName.length(), &argv[0]);
3558     napi_create_string_utf8(workerEnv, methodName.c_str(), methodName.length(), &argv[1]);
3559     napi_create_int32(workerEnv, timeout, &argv[2]);
3560     std::string funcName = "GlobalCall";
3561     napi_value cb = nullptr;
3562     napi_value callResult = nullptr;
3563     // ------- workerEnv---------
3564     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
3565                          Worker::GlobalCall, worker, &cb);
3566     UpdateWorkerState(worker, Worker::RunnerState::TERMINATED);
3567     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
3568     napi_value exception = nullptr;
3569     napi_get_and_clear_last_exception(env, &exception);
3570     ASSERT_TRUE(exception == nullptr);
3571     worker->EraseWorker();
3572     ClearWorkerHandle(worker);
3573     result = Worker_Terminate(env, global);
3574     ASSERT_TRUE(result != nullptr);
3575 }
3576 
3577 HWTEST_F(WorkersTest, WorkerTest043, testing::ext::TestSize.Level0)
3578 {
3579     napi_env env = (napi_env)engine_;
3580     napi_value global;
3581     napi_get_global(env, &global);
3582     napi_value result = nullptr;
3583     result = Worker_Constructor(env, global);
3584     Worker* worker = nullptr;
3585     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3586     // ------- workerEnv---------
3587     napi_env workerEnv = nullptr;
3588     napi_create_runtime(env, &workerEnv);
3589     napi_value workerGlobal = nullptr;
3590     napi_get_global(workerEnv, &workerGlobal);
3591     napi_value argv[3] = {nullptr};
3592     std::string instanceName = "host";
3593     std::string methodName = "postMessage";
3594     int32_t timeout = 300;
3595     napi_create_string_utf8(workerEnv, instanceName.c_str(), instanceName.length(), &argv[0]);
3596     napi_create_string_utf8(workerEnv, methodName.c_str(), methodName.length(), &argv[2]);
3597     napi_create_int32(workerEnv, timeout, &argv[1]);
3598     std::string funcName = "GlobalCall";
3599     napi_value cb = nullptr;
3600     napi_value callResult = nullptr;
3601     // ------- workerEnv---------
3602     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
3603                          Worker::GlobalCall, worker, &cb);
3604     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
3605     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
3606     napi_value exception = nullptr;
3607     napi_get_and_clear_last_exception(env, &exception);
3608     ASSERT_TRUE(exception == nullptr);
3609     worker->EraseWorker();
3610     ClearWorkerHandle(worker);
3611     result = Worker_Terminate(env, global);
3612     ASSERT_TRUE(result != nullptr);
3613 }
3614 
3615 HWTEST_F(WorkersTest, WorkerTest044, testing::ext::TestSize.Level0)
3616 {
3617     napi_env env = (napi_env)engine_;
3618     napi_value global;
3619     napi_get_global(env, &global);
3620     napi_value result = nullptr;
3621     result = Worker_Constructor(env, global);
3622     Worker* worker = nullptr;
3623     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3624     // ------- workerEnv---------
3625     napi_env workerEnv = nullptr;
3626     napi_create_runtime(env, &workerEnv);
3627     napi_value workerGlobal = nullptr;
3628     napi_get_global(workerEnv, &workerGlobal);
3629 
3630     napi_value argv[3] = {nullptr};
3631     std::string instanceName = "host";
3632     std::string methodName = "postMessage";
3633     std::string timeout = "timeout";
3634     napi_create_string_utf8(workerEnv, instanceName.c_str(), instanceName.length(), &argv[0]);
3635     napi_create_string_utf8(workerEnv, methodName.c_str(), methodName.length(), &argv[1]);
3636     napi_create_string_utf8(workerEnv, timeout.c_str(), timeout.length(), &argv[2]);
3637 
3638     std::string funcName = "GlobalCall";
3639     napi_value cb = nullptr;
3640     napi_value callResult = nullptr;
3641     // ------- workerEnv---------
3642     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
3643                          Worker::GlobalCall, worker, &cb);
3644     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
3645     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
3646     napi_value exception = nullptr;
3647     napi_get_and_clear_last_exception(env, &exception);
3648     ASSERT_TRUE(exception == nullptr);
3649     worker->EraseWorker();
3650     ClearWorkerHandle(worker);
3651     result = Worker_Terminate(env, global);
3652     ASSERT_TRUE(result != nullptr);
3653 }
3654 
3655 HWTEST_F(WorkersTest, WorkerTest045, testing::ext::TestSize.Level0)
3656 {
3657     napi_env env = (napi_env)engine_;
3658     napi_value global;
3659     napi_get_global(env, &global);
3660     napi_value result = nullptr;
3661     result = Worker_Constructor(env, global);
3662     Worker* worker = nullptr;
3663     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3664     // ------- workerEnv---------
3665     napi_env workerEnv = nullptr;
3666     napi_create_runtime(env, &workerEnv);
3667     napi_value workerGlobal = nullptr;
3668     napi_get_global(workerEnv, &workerGlobal);
3669 
3670     napi_value argv[3] = {nullptr};
3671     std::string instanceName = "host";
3672     std::string methodName = "postMessage";
3673     int32_t timeout = 300;
3674     napi_create_string_utf8(workerEnv, instanceName.c_str(), instanceName.length(), &argv[0]);
3675     napi_create_string_utf8(workerEnv, methodName.c_str(), methodName.length(), &argv[1]);
3676     napi_create_int32(workerEnv, timeout, &argv[2]);
3677 
3678     std::string funcName = "GlobalCall";
3679     napi_value cb = nullptr;
3680     napi_value callResult = nullptr;
3681     // ------- workerEnv---------
3682     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
3683                          Worker::GlobalCall, worker, &cb);
3684     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
3685     UpdateHostState(worker, Worker::HostState::INACTIVE);
3686     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
3687     napi_value exception = nullptr;
3688     napi_get_and_clear_last_exception(env, &exception);
3689     ASSERT_TRUE(exception == nullptr);
3690     worker->EraseWorker();
3691     ClearWorkerHandle(worker);
3692     result = Worker_Terminate(env, global);
3693     ASSERT_TRUE(result != nullptr);
3694 }
3695 
3696 HWTEST_F(WorkersTest, WorkerTest046, testing::ext::TestSize.Level0)
3697 {
3698     napi_env env = (napi_env)engine_;
3699     napi_value global;
3700     napi_get_global(env, &global);
3701     napi_value result = nullptr;
3702     result = Worker_Constructor(env, global);
3703     Worker* worker = nullptr;
3704     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3705     // ------- workerEnv---------
3706     napi_env workerEnv = nullptr;
3707     napi_create_runtime(env, &workerEnv);
3708     napi_value workerGlobal = nullptr;
3709     napi_get_global(workerEnv, &workerGlobal);
3710 
3711     napi_value argv[3] = {nullptr};
3712     std::string instanceName = "host";
3713     std::string methodName = "postMessage";
3714     int32_t timeout = 300;
3715     napi_create_string_utf8(workerEnv, instanceName.c_str(), instanceName.length(), &argv[0]);
3716     napi_create_string_utf8(workerEnv, methodName.c_str(), methodName.length(), &argv[1]);
3717     napi_create_int32(workerEnv, timeout, &argv[2]);
3718 
3719     std::string funcName = "GlobalCall";
3720     napi_value cb = nullptr;
3721     napi_value callResult = nullptr;
3722     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
3723                          Worker::GlobalCall, worker, &cb);
3724     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
3725     SetMainThread(worker, true);
3726     SetLimitedWorker(worker, false);
3727     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
3728     napi_value exception = nullptr;
3729     napi_get_and_clear_last_exception(env, &exception);
3730     ASSERT_TRUE(exception == nullptr);
3731     SetMainThread(worker, false);
3732     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
3733     napi_get_and_clear_last_exception(env, &exception);
3734     ASSERT_TRUE(exception == nullptr);
3735     SetMainThread(worker, true);
3736     SetLimitedWorker(worker, true);
3737     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
3738     napi_get_and_clear_last_exception(env, &exception);
3739     ASSERT_TRUE(exception == nullptr);
3740     worker->EraseWorker();
3741     SetLimitedWorker(worker, false);
3742     ClearWorkerHandle(worker);
3743     result = Worker_Terminate(env, global);
3744     ASSERT_TRUE(result != nullptr);
3745 }
3746 
3747 HWTEST_F(WorkersTest, WorkerTest047, testing::ext::TestSize.Level0)
3748 {
3749     napi_env env = (napi_env)engine_;
3750     napi_value global;
3751     napi_get_global(env, &global);
3752     napi_value result = nullptr;
3753     result = Worker_Constructor(env, global);
3754     Worker* worker = nullptr;
3755     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3756     napi_value argv[1] = { nullptr };
3757     std::string message = "host";
3758     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
3759     std::string funcName = "ParentPortCancelTask";
3760     napi_value cb = nullptr;
3761     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::ParentPortCancelTask, nullptr, &cb);
3762     napi_call_function(env, nullptr, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
3763     worker->EraseWorker();
3764     ClearWorkerHandle(worker);
3765     result = Worker_Terminate(env, global);
3766     ASSERT_TRUE(result != nullptr);
3767 }
3768 
3769 HWTEST_F(WorkersTest, WorkerTest048, testing::ext::TestSize.Level0)
3770 {
3771     napi_env env = (napi_env)engine_;
3772     napi_value global;
3773     napi_get_global(env, &global);
3774     napi_value result = nullptr;
3775     result = Worker_Constructor(env, global);
3776     Worker* worker = nullptr;
3777     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3778     napi_value argv[1] = { nullptr };
3779     std::string message = "host";
3780     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
3781     std::string funcName = "ParentPortCancelTask";
3782     napi_value cb = nullptr;
3783     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::ParentPortCancelTask, worker, &cb);
3784     UpdateWorkerState(worker, Worker::RunnerState::TERMINATED);
3785     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
3786     worker->EraseWorker();
3787     ClearWorkerHandle(worker);
3788     result = Worker_Terminate(env, global);
3789     ASSERT_TRUE(result != nullptr);
3790 }
3791 
3792 HWTEST_F(WorkersTest, WorkerTest049, testing::ext::TestSize.Level0)
3793 {
3794     napi_env env = (napi_env)engine_;
3795     napi_value global;
3796     napi_get_global(env, &global);
3797     napi_value result = nullptr;
3798     result = Worker_Constructor(env, global);
3799     Worker* worker = nullptr;
3800     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3801     napi_value argv[1] = { nullptr };
3802     std::string message = "host";
3803     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
3804     std::string funcName = "ParentPortCancelTask";
3805     napi_value cb = nullptr;
3806     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::ParentPortCancelTask, worker, &cb);
3807     UpdateWorkerState(worker, Worker::RunnerState::TERMINATEING);
3808     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
3809     worker->EraseWorker();
3810     ClearWorkerHandle(worker);
3811     result = Worker_Terminate(env, global);
3812     ASSERT_TRUE(result != nullptr);
3813 }
3814 
3815 HWTEST_F(WorkersTest, WorkerTest050, testing::ext::TestSize.Level0)
3816 {
3817     napi_env env = (napi_env)engine_;
3818     napi_value global;
3819     napi_get_global(env, &global);
3820     napi_value result = nullptr;
3821     result = Worker_Constructor(env, global);
3822     Worker* worker = nullptr;
3823     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3824     napi_value argv[1] = { nullptr };
3825     std::string message = "host";
3826     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
3827     std::string funcName = "ParentPortCancelTask";
3828     napi_value cb = nullptr;
3829     napi_create_function(env, funcName.c_str(), funcName.size(), Worker::ParentPortCancelTask, worker, &cb);
3830     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
3831     SetWorkerHostEnv(worker, env, true);
3832     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
3833     SetWorkerHostEnv(worker, env, false);
3834     worker->EraseWorker();
3835     ClearWorkerHandle(worker);
3836     result = Worker_Terminate(env, global);
3837     ASSERT_TRUE(result != nullptr);
3838 }
3839 
3840 HWTEST_F(WorkersTest, WorkerTest051, testing::ext::TestSize.Level0)
3841 {
3842     napi_env env = (napi_env)engine_;
3843     napi_value global;
3844     napi_get_global(env, &global);
3845     napi_value result = nullptr;
3846     result = Worker_Constructor(env, global);
3847     Worker* worker = nullptr;
3848     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3849     std::string funcName = "ParentPortAddEventListener";
3850     napi_value cb = nullptr;
3851     napi_value callResult = nullptr;
3852     napi_create_function(env, funcName.c_str(), funcName.size(),
3853                          Worker::ParentPortAddEventListener, worker, &cb);
3854     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
3855     napi_call_function(env, global, cb, 0, nullptr, &callResult);
3856     worker->EraseWorker();
3857     ClearWorkerHandle(worker);
3858     napi_value exception = nullptr;
3859     napi_get_and_clear_last_exception(env, &exception);
3860     ASSERT_TRUE(exception != nullptr);
3861     result = Worker_Terminate(env, global);
3862     ASSERT_TRUE(result != nullptr);
3863 }
3864 
3865 HWTEST_F(WorkersTest, WorkerTest052, testing::ext::TestSize.Level0)
3866 {
3867     napi_env env = (napi_env)engine_;
3868     napi_value global;
3869     napi_get_global(env, &global);
3870     napi_value result = nullptr;
3871     result = Worker_Constructor(env, global);
3872     Worker* worker = nullptr;
3873     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3874     napi_value argv[3] = {nullptr};
3875     std::string message = "host";
3876     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
3877     std::string funcName = "ParentPortAddEventListener";
3878     napi_create_string_utf8(env, funcName.c_str(), funcName.length(), &argv[1]);
3879     napi_value myobject = nullptr;
3880     napi_create_object(env, &myobject);
3881     argv[2] = myobject;
3882     napi_value cb = nullptr;
3883     napi_value callResult = nullptr;
3884     napi_create_function(env, funcName.c_str(), funcName.size(),
3885                          Worker::ParentPortAddEventListener, worker, &cb);
3886     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
3887     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
3888     worker->EraseWorker();
3889     ClearWorkerHandle(worker);
3890     napi_value exception = nullptr;
3891     napi_get_and_clear_last_exception(env, &exception);
3892     ASSERT_TRUE(exception != nullptr);
3893     result = Worker_Terminate(env, global);
3894     ASSERT_TRUE(result != nullptr);
3895 }
3896 
3897 HWTEST_F(WorkersTest, WorkerTest053, testing::ext::TestSize.Level0)
3898 {
3899     napi_env env = (napi_env)engine_;
3900     napi_value global;
3901     napi_get_global(env, &global);
3902     napi_value result = nullptr;
3903     result = Worker_Constructor(env, global);
3904     Worker* worker = nullptr;
3905     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3906     napi_value argv[3] = {nullptr};
3907     std::string message = "host";
3908     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
__anon0020bb762302(napi_env env, napi_callback_info info) 3909     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
3910         return nullptr;
3911     };
3912     std::string funcName = "ParentPortAddEventListener";
3913     napi_value cb = nullptr;
3914     napi_value funcValue = nullptr;
3915     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
3916     argv[1] = funcValue;
3917     ASSERT_TRUE(funcValue != nullptr);
3918     napi_value myobject = nullptr;
3919     napi_create_object(env, &myobject);
3920     argv[2] = myobject;
3921     napi_value callResult = nullptr;
3922     napi_create_function(env, funcName.c_str(), funcName.size(),
3923                          Worker::ParentPortAddEventListener, nullptr, &cb);
3924     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
3925     napi_call_function(env, nullptr, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
3926     worker->EraseWorker();
3927     ClearWorkerHandle(worker);
3928     result = Worker_Terminate(env, global);
3929     ASSERT_TRUE(result != nullptr);
3930 }
3931 
3932 HWTEST_F(WorkersTest, WorkerTest054, testing::ext::TestSize.Level0)
3933 {
3934     napi_env env = (napi_env)engine_;
3935     napi_value global;
3936     napi_get_global(env, &global);
3937     napi_value result = nullptr;
3938     result = Worker_Constructor(env, global);
3939     Worker* worker = nullptr;
3940     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3941     napi_value argv[3] = {nullptr};
3942     std::string message = "host";
3943     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
__anon0020bb762402(napi_env env, napi_callback_info info) 3944     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
3945         return nullptr;
3946     };
3947     std::string funcName = "ParentPortAddEventListener";
3948     napi_value cb = nullptr;
3949     napi_value funcValue = nullptr;
3950     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
3951     argv[1] = funcValue;
3952     ASSERT_TRUE(funcValue != nullptr);
3953     napi_value myobject = nullptr;
3954     napi_create_object(env, &myobject);
3955     argv[2] = myobject;
3956     napi_value callResult = nullptr;
3957     napi_create_function(env, funcName.c_str(), funcName.size(),
3958                          Worker::ParentPortAddEventListener, worker, &cb);
3959     UpdateWorkerState(worker, Worker::RunnerState::TERMINATED);
3960     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
3961     worker->EraseWorker();
3962     ClearWorkerHandle(worker);
3963     result = Worker_Terminate(env, global);
3964     ASSERT_TRUE(result != nullptr);
3965 }
3966 
3967 HWTEST_F(WorkersTest, WorkerTest055, testing::ext::TestSize.Level0)
3968 {
3969     napi_env env = (napi_env)engine_;
3970     napi_value global;
3971     napi_get_global(env, &global);
3972     napi_value result = nullptr;
3973     result = Worker_Constructor(env, global);
3974     Worker* worker = nullptr;
3975     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
3976     napi_value argv[3] = {nullptr};
3977     std::string message = "host";
3978     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
__anon0020bb762502(napi_env env, napi_callback_info info) 3979     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
3980         return nullptr;
3981     };
3982     std::string funcName = "ParentPortAddEventListener";
3983     napi_value cb = nullptr;
3984     napi_value funcValue = nullptr;
3985     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
3986     argv[1] = funcValue;
3987     ASSERT_TRUE(funcValue != nullptr);
3988     napi_value myobject = nullptr;
3989     napi_create_object(env, &myobject);
3990     napi_value onceValue = NapiHelper::CreateBooleanValue(env, true);
3991     napi_set_named_property(env, myobject, "once", onceValue);
3992     argv[2] = myobject;
3993     napi_value callResult = nullptr;
3994     napi_create_function(env, funcName.c_str(), funcName.size(),
3995                          Worker::ParentPortAddEventListener, worker, &cb);
3996     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
3997     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
3998     worker->EraseWorker();
3999     ClearWorkerHandle(worker);
4000     result = Worker_Terminate(env, global);
4001     ASSERT_TRUE(result != nullptr);
4002 }
4003 
4004 HWTEST_F(WorkersTest, WorkerTest056, testing::ext::TestSize.Level0)
4005 {
4006     napi_env env = (napi_env)engine_;
4007     napi_value global;
4008     napi_get_global(env, &global);
4009     napi_value result = nullptr;
4010     result = Worker_Constructor(env, global);
4011     Worker* worker = nullptr;
4012     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4013     napi_value argv[2] = {nullptr};
4014     std::string message = "host";
4015     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
__anon0020bb762602(napi_env env, napi_callback_info info) 4016     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
4017         return nullptr;
4018     };
4019     std::string funcName = "ParentPortAddEventListener";
4020     napi_value cb = nullptr;
4021     napi_value funcValue = nullptr;
4022     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
4023     argv[1] = funcValue;
4024     ASSERT_TRUE(funcValue != nullptr);
4025     napi_value callResult = nullptr;
4026     napi_create_function(env, funcName.c_str(), funcName.size(),
4027                          Worker::ParentPortAddEventListener, worker, &cb);
4028     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
4029     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
4030     worker->EraseWorker();
4031     ClearWorkerHandle(worker);
4032     result = Worker_Terminate(env, global);
4033     ASSERT_TRUE(result != nullptr);
4034 }
4035 
4036 HWTEST_F(WorkersTest, WorkerTest057, testing::ext::TestSize.Level0)
4037 {
4038     napi_env env = (napi_env)engine_;
4039     napi_value global;
4040     napi_get_global(env, &global);
4041     napi_value result = nullptr;
4042     result = Worker_Constructor(env, global);
4043     Worker* worker = nullptr;
4044     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4045     napi_value argv[3] = {nullptr};
4046     std::string message = "host";
4047     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
__anon0020bb762702(napi_env env, napi_callback_info info) 4048     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
4049         return nullptr;
4050     };
4051     std::string funcName = "ParentPortAddEventListener";
4052     napi_value cb = nullptr;
4053     napi_value funcValue = nullptr;
4054     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
4055     argv[1] = funcValue;
4056     ASSERT_TRUE(funcValue != nullptr);
4057     napi_create_string_utf8(env, funcName.c_str(), funcName.length(), &argv[2]);
4058     napi_value callResult = nullptr;
4059     napi_create_function(env, funcName.c_str(), funcName.size(),
4060                          Worker::ParentPortAddEventListener, worker, &cb);
4061     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
4062     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
4063     worker->EraseWorker();
4064     ClearWorkerHandle(worker);
4065     napi_value exception = nullptr;
4066     napi_get_and_clear_last_exception(env, &exception);
4067     ASSERT_TRUE(exception == nullptr);
4068     result = Worker_Terminate(env, global);
4069     ASSERT_TRUE(result != nullptr);
4070 }
4071 
4072 HWTEST_F(WorkersTest, WorkerTest058, testing::ext::TestSize.Level0)
4073 {
4074     napi_env env = (napi_env)engine_;
4075     napi_value global;
4076     napi_get_global(env, &global);
4077     napi_value result = nullptr;
4078     result = Worker_Constructor(env, global);
4079     Worker* worker = nullptr;
4080     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4081     // ------- workerEnv---------
4082     napi_env workerEnv = nullptr;
4083     napi_create_runtime(env, &workerEnv);
4084     napi_value workerGlobal = nullptr;
4085     napi_get_global(workerEnv, &workerGlobal);
4086     napi_value cb = nullptr;
4087     std::string funcName = "ParentPortDispatchEvent";
4088     napi_value callResult = nullptr;
4089     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
4090                          Worker::ParentPortDispatchEvent, worker, &cb);
4091     napi_call_function(workerEnv, workerGlobal, cb, 0, nullptr, &callResult);
4092     worker->EraseWorker();
4093     ClearWorkerHandle(worker);
4094     napi_value exception = nullptr;
4095     napi_get_and_clear_last_exception(env, &exception);
4096     ASSERT_TRUE(exception == nullptr);
4097     result = Worker_Terminate(env, global);
4098     ASSERT_TRUE(result != nullptr);
4099 }
4100 
4101 HWTEST_F(WorkersTest, WorkerTest059, testing::ext::TestSize.Level0)
4102 {
4103     napi_env env = (napi_env)engine_;
4104     napi_value global;
4105     napi_get_global(env, &global);
4106     napi_value result = nullptr;
4107     result = Worker_Constructor(env, global);
4108     Worker* worker = nullptr;
4109     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4110     // ------- workerEnv---------
4111     napi_env workerEnv = nullptr;
4112     napi_create_runtime(env, &workerEnv);
4113     napi_value workerGlobal = nullptr;
4114     napi_get_global(workerEnv, &workerGlobal);
4115 
4116     napi_value argv[1] = {nullptr};
4117     napi_value cb = nullptr;
4118     std::string funcName = "ParentPortDispatchEvent";
4119     const char* messageKeyStr = "type";
4120     napi_create_string_latin1(workerEnv, messageKeyStr, strlen(messageKeyStr), &argv[0]);
4121     napi_value callResult = nullptr;
4122     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
4123                          Worker::ParentPortDispatchEvent, worker, &cb);
4124     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
4125     worker->EraseWorker();
4126     ClearWorkerHandle(worker);
4127     napi_value exception = nullptr;
4128     napi_get_and_clear_last_exception(env, &exception);
4129     ASSERT_TRUE(exception == nullptr);
4130     result = Worker_Terminate(env, global);
4131     ASSERT_TRUE(result != nullptr);
4132 }
4133 
4134 HWTEST_F(WorkersTest, WorkerTest060, testing::ext::TestSize.Level0)
4135 {
4136     napi_env env = (napi_env)engine_;
4137     napi_value global;
4138     napi_get_global(env, &global);
4139     napi_value result = nullptr;
4140     result = Worker_Constructor(env, global);
4141     Worker* worker = nullptr;
4142     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4143     // ------- workerEnv---------
4144     napi_env workerEnv = nullptr;
4145     napi_create_runtime(env, &workerEnv);
4146     napi_value workerGlobal = nullptr;
4147     napi_get_global(workerEnv, &workerGlobal);
4148 
4149     napi_value argv[1] = {nullptr};
4150 
4151     napi_value cb = nullptr;
4152     std::string funcName = "ParentPortDispatchEvent";
4153     napi_value typeValue = nullptr;
4154     uint32_t type = 100; //test 100
4155     napi_create_uint32(env, type, &typeValue);
4156     napi_value object = nullptr;
4157     napi_create_object(workerEnv, &object);
4158     napi_set_named_property(workerEnv, object, "type", typeValue);
4159     argv[0] = object;
4160     napi_value callResult = nullptr;
4161     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
4162                          Worker::ParentPortDispatchEvent, worker, &cb);
4163     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
4164     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
4165     worker->EraseWorker();
4166     ClearWorkerHandle(worker);
4167     napi_value exception = nullptr;
4168     napi_get_and_clear_last_exception(env, &exception);
4169     ASSERT_TRUE(exception == nullptr);
4170     result = Worker_Terminate(env, global);
4171     ASSERT_TRUE(result != nullptr);
4172 }
4173 
4174 HWTEST_F(WorkersTest, WorkerTest061, testing::ext::TestSize.Level0)
4175 {
4176     napi_env env = (napi_env)engine_;
4177     napi_value global;
4178     napi_get_global(env, &global);
4179     napi_value result = nullptr;
4180     result = Worker_Constructor(env, global);
4181     Worker* worker = nullptr;
4182     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4183     // ------- workerEnv---------
4184     napi_env workerEnv = nullptr;
4185     napi_create_runtime(env, &workerEnv);
4186     napi_value workerGlobal = nullptr;
4187     napi_get_global(workerEnv, &workerGlobal);
4188     napi_value argv[1] = {nullptr};
4189     napi_value objresult = nullptr;
4190     napi_create_object(workerEnv, &objresult);
4191     napi_value cb = nullptr;
4192     std::string funcName = "ParentPortDispatchEvent";
4193     napi_value messageKey = nullptr;
4194     const char* messageKeyStr = "type";
4195     napi_create_string_latin1(workerEnv, messageKeyStr, strlen(messageKeyStr), &messageKey);
4196     napi_value messageValue = nullptr;
4197     const char* messageValueStr = "message";
4198     napi_create_string_latin1(workerEnv, messageValueStr, strlen(messageValueStr), &messageValue);
4199     napi_set_property(workerEnv, objresult, messageKey, messageValue);
4200     argv[0] = objresult;
4201     napi_value callResult = nullptr;
4202     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
4203                          Worker::ParentPortDispatchEvent, nullptr, &cb);
4204     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
4205     napi_call_function(workerEnv, nullptr, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
4206     worker->EraseWorker();
4207     ClearWorkerHandle(worker);
4208     napi_value exception = nullptr;
4209     napi_get_and_clear_last_exception(env, &exception);
4210     ASSERT_TRUE(exception == nullptr);
4211     result = Worker_Terminate(env, global);
4212     ASSERT_TRUE(result != nullptr);
4213 }
4214 
4215 HWTEST_F(WorkersTest, WorkerTest062, testing::ext::TestSize.Level0)
4216 {
4217     napi_env env = (napi_env)engine_;
4218     napi_value global;
4219     napi_get_global(env, &global);
4220     napi_value result = nullptr;
4221     result = Worker_Constructor(env, global);
4222     Worker* worker = nullptr;
4223     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4224     // ------- workerEnv---------
4225     napi_env workerEnv = nullptr;
4226     napi_create_runtime(env, &workerEnv);
4227     napi_value workerGlobal = nullptr;
4228     napi_get_global(workerEnv, &workerGlobal);
4229 
4230     napi_value argv[1] = {nullptr};
4231     napi_value objresult = nullptr;
4232     napi_create_object(workerEnv, &objresult);
4233     napi_value cb = nullptr;
4234     std::string funcName = "ParentPortDispatchEvent";
4235     napi_value messageKey = nullptr;
4236     const char* messageKeyStr = "type";
4237     napi_create_string_latin1(workerEnv, messageKeyStr, strlen(messageKeyStr), &messageKey);
4238     napi_value messageValue = nullptr;
4239     const char* messageValueStr = "message";
4240     napi_create_string_latin1(workerEnv, messageValueStr, strlen(messageValueStr), &messageValue);
4241     napi_set_property(workerEnv, objresult, messageKey, messageValue);
4242     argv[0] = objresult;
4243     napi_value callResult = nullptr;
4244     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
4245                          Worker::ParentPortDispatchEvent, worker, &cb);
4246     UpdateWorkerState(worker, Worker::RunnerState::TERMINATED);
4247     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
4248     worker->EraseWorker();
4249     ClearWorkerHandle(worker);
4250     napi_value exception = nullptr;
4251     napi_get_and_clear_last_exception(env, &exception);
4252     ASSERT_TRUE(exception == nullptr);
4253     result = Worker_Terminate(env, global);
4254     ASSERT_TRUE(result != nullptr);
4255 }
4256 
4257 HWTEST_F(WorkersTest, WorkerTest063, testing::ext::TestSize.Level0)
4258 {
4259     napi_env env = (napi_env)engine_;
4260     napi_value global;
4261     napi_get_global(env, &global);
4262     napi_value result = nullptr;
4263     result = Worker_Constructor(env, global);
4264     Worker* worker = nullptr;
4265     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4266 
4267     std::string funcName = "ParentPortRemoveEventListener";
4268     napi_value cb = nullptr;
4269 
4270     napi_create_function(env, funcName.c_str(), funcName.size(),
4271                          Worker::ParentPortRemoveEventListener, worker, &cb);
4272     napi_call_function(env, global, cb, 0, nullptr, &result);
4273     worker->EraseWorker();
4274     ClearWorkerHandle(worker);
4275     napi_value exception = nullptr;
4276     napi_get_and_clear_last_exception(env, &exception);
4277     ASSERT_TRUE(exception != nullptr);
4278     result = Worker_Terminate(env, global);
4279     ASSERT_TRUE(result != nullptr);
4280 }
4281 
4282 HWTEST_F(WorkersTest, WorkerTest064, testing::ext::TestSize.Level0)
4283 {
4284     napi_env env = (napi_env)engine_;
4285     napi_value global;
4286     napi_get_global(env, &global);
4287     napi_value result = nullptr;
4288     result = Worker_Constructor(env, global);
4289     Worker* worker = nullptr;
4290     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4291 
4292     napi_value argv[2] = {nullptr};
4293     std::string message = "host";
4294     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
__anon0020bb762802(napi_env env, napi_callback_info info) 4295     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
4296         return nullptr;
4297     };
4298     napi_value funcValue = nullptr;
4299     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
4300     argv[1] = funcValue;
4301 
4302     std::string funcName = "ParentPortRemoveEventListener";
4303     napi_value cb = nullptr;
4304 
4305     napi_create_function(env, funcName.c_str(), funcName.size(),
4306                          Worker::ParentPortRemoveEventListener, nullptr, &cb);
4307     napi_call_function(env, nullptr, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
4308     worker->EraseWorker();
4309     ClearWorkerHandle(worker);
4310     napi_value exception = nullptr;
4311     napi_get_and_clear_last_exception(env, &exception);
4312     ASSERT_TRUE(exception == nullptr);
4313     result = Worker_Terminate(env, global);
4314     ASSERT_TRUE(result != nullptr);
4315 }
4316 
4317 HWTEST_F(WorkersTest, WorkerTest065, testing::ext::TestSize.Level0)
4318 {
4319     napi_env env = (napi_env)engine_;
4320     napi_value global;
4321     napi_get_global(env, &global);
4322     napi_value result = nullptr;
4323     result = Worker_Constructor(env, global);
4324     Worker* worker = nullptr;
4325     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4326 
4327     napi_value argv[2] = {nullptr};
4328     std::string message = "host";
4329     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
__anon0020bb762902(napi_env env, napi_callback_info info) 4330     auto func = [](napi_env env, napi_callback_info info) -> napi_value {
4331         return nullptr;
4332     };
4333     napi_value funcValue = nullptr;
4334     napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
4335     argv[1] = funcValue;
4336 
4337     std::string funcName = "ParentPortRemoveEventListener";
4338     napi_value cb = nullptr;
4339 
4340     napi_create_function(env, funcName.c_str(), funcName.size(),
4341                          Worker::ParentPortRemoveEventListener, worker, &cb);
4342     UpdateWorkerState(worker, Worker::RunnerState::TERMINATED);
4343     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
4344     worker->EraseWorker();
4345     ClearWorkerHandle(worker);
4346     napi_value exception = nullptr;
4347     napi_get_and_clear_last_exception(env, &exception);
4348     ASSERT_TRUE(exception == nullptr);
4349     result = Worker_Terminate(env, global);
4350     ASSERT_TRUE(result != nullptr);
4351 }
4352 
4353 HWTEST_F(WorkersTest, WorkerTest066, testing::ext::TestSize.Level0)
4354 {
4355     napi_env env = (napi_env)engine_;
4356     napi_value global;
4357     napi_get_global(env, &global);
4358     napi_value result = nullptr;
4359     result = Worker_Constructor(env, global);
4360     Worker* worker = nullptr;
4361     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4362 
4363     napi_value argv[2] = {nullptr};
4364     std::string message = "host";
4365     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
4366 
4367     std::string funcName = "ParentPortRemoveEventListener";
4368     napi_create_string_utf8(env, funcName.c_str(), funcName.length(), &argv[1]);
4369     napi_value cb = nullptr;
4370 
4371     napi_create_function(env, funcName.c_str(), funcName.size(),
4372                          Worker::ParentPortRemoveEventListener, worker, &cb);
4373     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
4374     worker->EraseWorker();
4375     ClearWorkerHandle(worker);
4376     napi_value exception = nullptr;
4377     napi_get_and_clear_last_exception(env, &exception);
4378     ASSERT_TRUE(exception != nullptr);
4379     result = Worker_Terminate(env, global);
4380     ASSERT_TRUE(result != nullptr);
4381 }
4382 
4383 HWTEST_F(WorkersTest, WorkerTest067, testing::ext::TestSize.Level0)
4384 {
4385     napi_env env = (napi_env)engine_;
4386     napi_value global;
4387     napi_get_global(env, &global);
4388     napi_value result = nullptr;
4389     result = Worker_Constructor(env, global);
4390     Worker* worker = nullptr;
4391     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4392 
4393     napi_value argv[1] = {nullptr};
4394     std::string message = "host";
4395     napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
4396 
4397     std::string funcName = "ParentPortRemoveEventListener";
4398     napi_value cb = nullptr;
4399 
4400     napi_create_function(env, funcName.c_str(), funcName.size(),
4401                          Worker::ParentPortRemoveEventListener, worker, &cb);
4402     napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
4403     worker->EraseWorker();
4404     ClearWorkerHandle(worker);
4405     napi_value exception = nullptr;
4406     napi_get_and_clear_last_exception(env, &exception);
4407     ASSERT_TRUE(exception == nullptr);
4408     result = Worker_Terminate(env, global);
4409     ASSERT_TRUE(result != nullptr);
4410 }
4411 
4412 HWTEST_F(WorkersTest, WorkerTest068, testing::ext::TestSize.Level0)
4413 {
4414     napi_env env = (napi_env)engine_;
4415     napi_value global;
4416     napi_get_global(env, &global);
4417     napi_value result = nullptr;
4418     result = Worker_Constructor(env, global);
4419     Worker* worker = nullptr;
4420     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4421     // ------- workerEnv---------
4422     napi_env workerEnv = nullptr;
4423     napi_create_runtime(env, &workerEnv);
4424     napi_value workerGlobal = nullptr;
4425     napi_get_global(workerEnv, &workerGlobal);
4426     napi_value argv[1] = {nullptr};
4427     std::string message = "host";
4428     napi_create_string_utf8(workerEnv, message.c_str(), message.length(), &argv[0]);
4429     std::string funcName = "ParentPortRemoveAllListener";
4430     napi_value cb = nullptr;
4431 
4432     napi_value callResult = nullptr;
4433     // ------- workerEnv---------
4434     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
4435                          Worker::ParentPortRemoveAllListener, nullptr, &cb);
4436     UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
4437     napi_call_function(workerEnv, nullptr, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
4438     worker->EraseWorker();
4439     ClearWorkerHandle(worker);
4440     napi_value exception = nullptr;
4441     napi_get_and_clear_last_exception(env, &exception);
4442     ASSERT_TRUE(exception == nullptr);
4443     result = Worker_Terminate(env, global);
4444     ASSERT_TRUE(result != nullptr);
4445 }
4446 
4447 HWTEST_F(WorkersTest, WorkerTest069, testing::ext::TestSize.Level0)
4448 {
4449     napi_env env = (napi_env)engine_;
4450     napi_value global;
4451     napi_get_global(env, &global);
4452     napi_value result = nullptr;
4453     result = Worker_Constructor(env, global);
4454     Worker* worker = nullptr;
4455     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4456     // ------- workerEnv---------
4457     napi_env workerEnv = nullptr;
4458     napi_create_runtime(env, &workerEnv);
4459     napi_value workerGlobal = nullptr;
4460     napi_get_global(workerEnv, &workerGlobal);
4461     napi_value argv[1] = {nullptr};
4462     std::string message = "host";
4463     napi_create_string_utf8(workerEnv, message.c_str(), message.length(), &argv[0]);
4464     std::string funcName = "ParentPortRemoveAllListener";
4465     napi_value cb = nullptr;
4466 
4467     napi_value callResult = nullptr;
4468     // ------- workerEnv---------
4469     napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
4470                          Worker::ParentPortRemoveAllListener, worker, &cb);
4471     UpdateWorkerState(worker, Worker::RunnerState::TERMINATED);
4472     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
4473     worker->EraseWorker();
4474     ClearWorkerHandle(worker);
4475     napi_value exception = nullptr;
4476     napi_get_and_clear_last_exception(env, &exception);
4477     ASSERT_TRUE(exception == nullptr);
4478     result = Worker_Terminate(env, global);
4479     ASSERT_TRUE(result != nullptr);
4480 }
4481 
4482 HWTEST_F(WorkersTest, WorkerTest070, testing::ext::TestSize.Level0)
4483 {
4484     napi_env env = (napi_env)engine_;
4485     napi_value global;
4486     napi_get_global(env, &global);
4487     napi_value result = nullptr;
4488     result = Worker_Constructor(env, global);
4489     Worker* worker = nullptr;
4490     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4491     RemoveGlobalCallObject(worker, env);
4492     napi_value exception = nullptr;
4493     napi_get_and_clear_last_exception(env, &exception);
4494     ASSERT_TRUE(exception == nullptr);
4495 }
4496 
4497 HWTEST_F(WorkersTest, WorkerTest071, testing::ext::TestSize.Level0)
4498 {
4499     napi_env env = (napi_env)engine_;
4500     napi_value global;
4501     napi_get_global(env, &global);
4502     napi_value result = nullptr;
4503     result = Worker_Constructor(env, global);
4504     Worker* worker = nullptr;
4505     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4506     TestHostOnMessageInner(worker, env);
4507     worker->EraseWorker();
4508     ClearWorkerHandle(worker);
4509     napi_value exception = nullptr;
4510     napi_get_and_clear_last_exception(env, &exception);
4511     ASSERT_TRUE(exception == nullptr);
4512     result = Worker_Terminate(env, global);
4513     ASSERT_TRUE(result != nullptr);
4514 }
4515 
4516 HWTEST_F(WorkersTest, WorkerTest072, testing::ext::TestSize.Level0)
4517 {
4518     napi_env env = (napi_env)engine_;
4519     napi_value global;
4520     napi_get_global(env, &global);
4521     napi_value result = nullptr;
4522     result = Worker_Constructor(env, global);
4523     Worker* worker = nullptr;
4524     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4525     HostOnGlobalCall(worker, env);
4526     worker->EraseWorker();
4527     ClearWorkerHandle(worker);
4528     napi_value exception = nullptr;
4529     napi_get_and_clear_last_exception(env, &exception);
4530     ASSERT_TRUE(exception == nullptr);
4531     result = Worker_Terminate(env, global);
4532     ASSERT_TRUE(result != nullptr);
4533 }
4534 
4535 HWTEST_F(WorkersTest, WorkerTest073, testing::ext::TestSize.Level0)
4536 {
4537     napi_env env = (napi_env)engine_;
4538     napi_value global;
4539     napi_get_global(env, &global);
4540     napi_value result = nullptr;
4541     result = Worker_Constructor(env, global);
4542     Worker* worker = nullptr;
4543     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4544     HostOnGlobalCallInner001(worker, env);
4545     worker->EraseWorker();
4546     ClearWorkerHandle(worker);
4547     napi_value exception = nullptr;
4548     napi_get_and_clear_last_exception(env, &exception);
4549     ASSERT_TRUE(exception == nullptr);
4550     result = Worker_Terminate(env, global);
4551     ASSERT_TRUE(result != nullptr);
4552 }
4553 
4554 HWTEST_F(WorkersTest, WorkerTest074, testing::ext::TestSize.Level0)
4555 {
4556     napi_env env = (napi_env)engine_;
4557     napi_value global;
4558     napi_get_global(env, &global);
4559     napi_value result = nullptr;
4560     result = Worker_Constructor(env, global);
4561     Worker* worker = nullptr;
4562     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4563     HostOnGlobalCallInner002(worker, env);
4564     worker->EraseWorker();
4565     ClearWorkerHandle(worker);
4566     napi_value exception = nullptr;
4567     napi_get_and_clear_last_exception(env, &exception);
4568     ASSERT_TRUE(exception == nullptr);
4569     result = Worker_Terminate(env, global);
4570     ASSERT_TRUE(result != nullptr);
4571 }
4572 
4573 HWTEST_F(WorkersTest, WorkerTest075, testing::ext::TestSize.Level0)
4574 {
4575     napi_env env = (napi_env)engine_;
4576     napi_value global;
4577     napi_get_global(env, &global);
4578     napi_value result = nullptr;
4579     result = Worker_Constructor(env, global);
4580     Worker* worker = nullptr;
4581     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4582     HostOnGlobalCallInner003(worker, env);
4583     worker->EraseWorker();
4584     ClearWorkerHandle(worker);
4585     napi_value exception = nullptr;
4586     napi_get_and_clear_last_exception(env, &exception);
4587     ASSERT_TRUE(exception == nullptr);
4588     result = Worker_Terminate(env, global);
4589     ASSERT_TRUE(result != nullptr);
4590 }
4591 
4592 HWTEST_F(WorkersTest, WorkerTest076, testing::ext::TestSize.Level0)
4593 {
4594     napi_env env = (napi_env)engine_;
4595     napi_value global;
4596     napi_get_global(env, &global);
4597     napi_value result = nullptr;
4598     result = Worker_Constructor(env, global);
4599     Worker* worker = nullptr;
4600     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4601     HostOnGlobalCallInner004(worker, env);
4602     worker->EraseWorker();
4603     ClearWorkerHandle(worker);
4604     napi_value exception = nullptr;
4605     napi_get_and_clear_last_exception(env, &exception);
4606     ASSERT_TRUE(exception != nullptr);
4607     result = Worker_Terminate(env, global);
4608     ASSERT_TRUE(result != nullptr);
4609 }
4610 
4611 HWTEST_F(WorkersTest, WorkerTest077, testing::ext::TestSize.Level0)
4612 {
4613     napi_env env = (napi_env)engine_;
4614     napi_value global;
4615     napi_get_global(env, &global);
4616     napi_value result = nullptr;
4617     result = Worker_Constructor(env, global);
4618     Worker* worker = nullptr;
4619     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4620     HostOnGlobalCallInner005(worker, env);
4621     worker->EraseWorker();
4622     ClearWorkerHandle(worker);
4623     napi_value exception = nullptr;
4624     napi_get_and_clear_last_exception(env, &exception);
4625     ASSERT_TRUE(exception == nullptr);
4626     result = Worker_Terminate(env, global);
4627     ASSERT_TRUE(result != nullptr);
4628 }
4629 
4630 HWTEST_F(WorkersTest, WorkerTest078, testing::ext::TestSize.Level0)
4631 {
4632     napi_env env = (napi_env)engine_;
4633     napi_value global;
4634     napi_get_global(env, &global);
4635     napi_value result = nullptr;
4636     result = Worker_Constructor(env, global);
4637     Worker* worker = nullptr;
4638     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4639     HostOnGlobalCallInner006(worker, env);
4640     worker->EraseWorker();
4641     ClearWorkerHandle(worker);
4642     napi_value exception = nullptr;
4643     napi_get_and_clear_last_exception(env, &exception);
4644     ASSERT_TRUE(exception == nullptr);
4645     result = Worker_Terminate(env, global);
4646     ASSERT_TRUE(result != nullptr);
4647 }
4648 
4649 HWTEST_F(WorkersTest, WorkerTest079, testing::ext::TestSize.Level0)
4650 {
4651     napi_env env = (napi_env)engine_;
4652     napi_value global;
4653     napi_get_global(env, &global);
4654     napi_value result = nullptr;
4655     result = Worker_Constructor(env, global);
4656     Worker* worker = nullptr;
4657     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4658     HandleGlobalCall(worker, env);
4659     worker->EraseWorker();
4660     ClearWorkerHandle(worker);
4661     napi_value exception = nullptr;
4662     napi_get_and_clear_last_exception(env, &exception);
4663     ASSERT_TRUE(exception == nullptr);
4664     result = Worker_Terminate(env, global);
4665     ASSERT_TRUE(result != nullptr);
4666 }
4667 
4668 HWTEST_F(WorkersTest, WorkerTest080, testing::ext::TestSize.Level0)
4669 {
4670     napi_env env = (napi_env)engine_;
4671     napi_value global;
4672     napi_get_global(env, &global);
4673     napi_value result = nullptr;
4674     result = Worker_Constructor(env, global);
4675     Worker* worker = nullptr;
4676     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4677     HostOnError(worker, env);
4678     worker->EraseWorker();
4679     ClearWorkerHandle(worker);
4680     napi_value exception = nullptr;
4681     napi_get_and_clear_last_exception(env, &exception);
4682     ASSERT_TRUE(exception == nullptr);
4683     result = Worker_Terminate(env, global);
4684     ASSERT_TRUE(result != nullptr);
4685 }
4686 
4687 HWTEST_F(WorkersTest, WorkerTest081, testing::ext::TestSize.Level0)
4688 {
4689     napi_env env = (napi_env)engine_;
4690     napi_value global;
4691     napi_get_global(env, &global);
4692     napi_value result = nullptr;
4693     result = Worker_Constructor(env, global);
4694     Worker* worker = nullptr;
4695     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4696     HostOnErrorInner(worker, env);
4697     worker->EraseWorker();
4698     ClearWorkerHandle(worker);
4699     napi_value exception = nullptr;
4700     napi_get_and_clear_last_exception(env, &exception);
4701     ASSERT_TRUE(exception == nullptr);
4702     result = Worker_Terminate(env, global);
4703     ASSERT_TRUE(result != nullptr);
4704 }
4705 
4706 HWTEST_F(WorkersTest, WorkerTest082, testing::ext::TestSize.Level0)
4707 {
4708     napi_env env = (napi_env)engine_;
4709     napi_value global;
4710     napi_get_global(env, &global);
4711     napi_value result = nullptr;
4712     result = Worker_Constructor(env, global);
4713     Worker* worker = nullptr;
4714     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4715     HostOnMessageErrorInner(worker, env);
4716     worker->EraseWorker();
4717     ClearWorkerHandle(worker);
4718     napi_value exception = nullptr;
4719     napi_get_and_clear_last_exception(env, &exception);
4720     ASSERT_TRUE(exception == nullptr);
4721     result = Worker_Terminate(env, global);
4722     ASSERT_TRUE(result != nullptr);
4723 }
4724 
4725 HWTEST_F(WorkersTest, WorkerTest083, testing::ext::TestSize.Level0)
4726 {
4727     napi_env env = (napi_env)engine_;
4728     napi_value global;
4729     napi_get_global(env, &global);
4730     napi_value result = nullptr;
4731     result = Worker_Constructor(env, global);
4732     Worker* worker = nullptr;
4733     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4734     PublishWorkerOverSignal(worker, env);
4735     napi_value exception = nullptr;
4736     napi_get_and_clear_last_exception(env, &exception);
4737     ASSERT_TRUE(exception == nullptr);
4738     ClearWorkerHandle(worker);
4739     result = Worker_Terminate(env, global);
4740     ASSERT_TRUE(result != nullptr);
4741 }
4742 
4743 HWTEST_F(WorkersTest, WorkerTest084, testing::ext::TestSize.Level0)
4744 {
4745     napi_env env = (napi_env)engine_;
4746     napi_value global;
4747     napi_get_global(env, &global);
4748     napi_value result = nullptr;
4749     result = Worker_Constructor(env, global);
4750     Worker* worker = nullptr;
4751     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4752     TestWorkerOnMessageInner(worker, env);
4753     worker->EraseWorker();
4754     ClearWorkerHandle(worker);
4755     napi_value exception = nullptr;
4756     napi_get_and_clear_last_exception(env, &exception);
4757     ASSERT_TRUE(exception == nullptr);
4758     result = Worker_Terminate(env, global);
4759     ASSERT_TRUE(result != nullptr);
4760 }
4761 
4762 HWTEST_F(WorkersTest, WorkerTest085, testing::ext::TestSize.Level0)
4763 {
4764     napi_env env = (napi_env)engine_;
4765     napi_value global;
4766     napi_get_global(env, &global);
4767     napi_value result = nullptr;
4768     result = Worker_Constructor(env, global);
4769     Worker* worker = nullptr;
4770     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4771     HandleEventListeners(worker, env);
4772     worker->EraseWorker();
4773     ClearWorkerHandle(worker);
4774     napi_value exception = nullptr;
4775     napi_get_and_clear_last_exception(env, &exception);
4776     ASSERT_TRUE(exception == nullptr);
4777     result = Worker_Terminate(env, global);
4778     ASSERT_TRUE(result != nullptr);
4779 }
4780 
4781 HWTEST_F(WorkersTest, WorkerTest086, testing::ext::TestSize.Level0)
4782 {
4783     napi_env env = (napi_env)engine_;
4784     napi_value global;
4785     napi_get_global(env, &global);
4786     napi_value result = nullptr;
4787     result = Worker_Constructor(env, global);
4788     Worker* worker = nullptr;
4789     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4790     HandleHostException(worker, env);
4791     worker->EraseWorker();
4792     ClearWorkerHandle(worker);
4793     napi_value exception = nullptr;
4794     napi_get_and_clear_last_exception(env, &exception);
4795     ASSERT_TRUE(exception == nullptr);
4796     result = Worker_Terminate(env, global);
4797     ASSERT_TRUE(result != nullptr);
4798 }
4799 
4800 HWTEST_F(WorkersTest, WorkerTest087, testing::ext::TestSize.Level0)
4801 {
4802     napi_env env = (napi_env)engine_;
4803     napi_value global;
4804     napi_get_global(env, &global);
4805     napi_value result = nullptr;
4806     result = Worker_Constructor(env, global);
4807     Worker* worker = nullptr;
4808     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4809     PostMessageToHostInner(worker, env);
4810     worker->EraseWorker();
4811     ClearWorkerHandle(worker);
4812     napi_value exception = nullptr;
4813     napi_get_and_clear_last_exception(env, &exception);
4814     ASSERT_TRUE(exception == nullptr);
4815     result = Worker_Terminate(env, global);
4816     ASSERT_TRUE(result != nullptr);
4817 }
4818 
4819 HWTEST_F(WorkersTest, WorkerTest088, testing::ext::TestSize.Level0)
4820 {
4821     napi_env env = (napi_env)engine_;
4822     napi_value global;
4823     napi_get_global(env, &global);
4824     napi_value result = nullptr;
4825     result = Worker_Constructor(env, global);
4826     Worker* worker = nullptr;
4827     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4828     RemoveListenerInner(worker, env);
4829     worker->EraseWorker();
4830     ClearWorkerHandle(worker);
4831     napi_value exception = nullptr;
4832     napi_get_and_clear_last_exception(env, &exception);
4833     ASSERT_TRUE(exception == nullptr);
4834     result = Worker_Terminate(env, global);
4835     ASSERT_TRUE(result != nullptr);
4836 }
4837 
4838 HWTEST_F(WorkersTest, WorkerTest089, testing::ext::TestSize.Level0)
4839 {
4840     napi_env env = (napi_env)engine_;
4841     napi_value global;
4842     napi_get_global(env, &global);
4843     napi_value result = nullptr;
4844     result = Worker_Constructor(env, global);
4845     Worker* worker = nullptr;
4846     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4847     ParentPortAddListenerInnerTest(worker, env);
4848     worker->EraseWorker();
4849     ClearWorkerHandle(worker);
4850     napi_value exception = nullptr;
4851     napi_get_and_clear_last_exception(env, &exception);
4852     ASSERT_TRUE(exception == nullptr);
4853     result = Worker_Terminate(env, global);
4854     ASSERT_TRUE(result != nullptr);
4855 }
4856 
4857 HWTEST_F(WorkersTest, WorkerTest090, testing::ext::TestSize.Level0)
4858 {
4859     napi_env env = (napi_env)engine_;
4860     napi_value global;
4861     napi_get_global(env, &global);
4862     napi_value result = nullptr;
4863     result = Worker_Constructor(env, global);
4864     Worker* worker = nullptr;
4865     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4866     ParentPortHandleEventListeners(worker, env);
4867     worker->EraseWorker();
4868     ClearWorkerHandle(worker);
4869     napi_value exception = nullptr;
4870     napi_get_and_clear_last_exception(env, &exception);
4871     ASSERT_TRUE(exception == nullptr);
4872     result = Worker_Terminate(env, global);
4873     ASSERT_TRUE(result != nullptr);
4874 }
4875 
4876 HWTEST_F(WorkersTest, WorkerTest091, testing::ext::TestSize.Level0)
4877 {
4878     napi_env env = (napi_env)engine_;
4879     napi_value global;
4880     napi_get_global(env, &global);
4881     napi_value result = nullptr;
4882     result = Worker_Constructor(env, global);
4883     Worker* worker = nullptr;
4884     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4885     DebuggerOnPostTask(worker, env);
4886     worker->EraseWorker();
4887     ClearWorkerHandle(worker);
4888     napi_value exception = nullptr;
4889     napi_get_and_clear_last_exception(env, &exception);
4890     ASSERT_TRUE(exception == nullptr);
4891     result = Worker_Terminate(env, global);
4892     ASSERT_TRUE(result != nullptr);
4893 }
4894 
4895 HWTEST_F(WorkersTest, WorkerTest092, testing::ext::TestSize.Level0)
4896 {
4897     napi_env env = (napi_env)engine_;
4898     napi_value global;
4899     napi_get_global(env, &global);
4900     napi_value result = nullptr;
4901     result = Worker_Constructor(env, global);
4902     Worker* worker = nullptr;
4903     napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
4904     CloseHostHandle(worker, env);
4905     worker->EraseWorker();
4906     ClearWorkerHandle(worker);
4907     napi_value exception = nullptr;
4908     napi_get_and_clear_last_exception(env, &exception);
4909     ASSERT_TRUE(exception == nullptr);
4910     result = Worker_Terminate(env, global);
4911     ASSERT_TRUE(result != nullptr);
4912 }
4913 
4914 HWTEST_F(NativeEngineTest, WorkerTest093, testing::ext::TestSize.Level0)
4915 {
4916     napi_env env = (napi_env)engine_;
4917     napi_value func = nullptr;
4918     napi_status status = napi_create_function(env, "postMessage", NAPI_AUTO_LENGTH,
4919                                               Worker::PostMessageToHost, nullptr, &func);
4920     ASSERT_TRUE(status == napi_ok);
4921     napi_value globalObj = Commonlibrary::Concurrent::Common::Helper::NapiHelper::GetGlobalObject(env);
4922     ASSERT_TRUE(napi_set_named_property(env, globalObj, "postMessage", func) == napi_ok);
4923 }
4924 
4925 HWTEST_F(NativeEngineTest, WorkerTest094, testing::ext::TestSize.Level0)
4926 {
4927     napi_env env = (napi_env)engine_;
4928     napi_value func = nullptr;
4929     napi_status status = napi_create_function(env, "postMessageWithSharedSendable", NAPI_AUTO_LENGTH,
4930                                               Worker::PostMessageWithSharedSendableToHost, nullptr, &func);
4931     ASSERT_TRUE(status == napi_ok);
4932     napi_value globalObj = Commonlibrary::Concurrent::Common::Helper::NapiHelper::GetGlobalObject(env);
4933     ASSERT_TRUE(napi_set_named_property(env, globalObj, "postMessageWithSharedSendable", func) == napi_ok);
4934 }
4935 
4936 HWTEST_F(NativeEngineTest, WorkerTest095, testing::ext::TestSize.Level0)
4937 {
4938     napi_env env = (napi_env)engine_;
4939     napi_value func = nullptr;
4940     napi_status status = napi_create_function(env, "callGlobalCallObjectMethod", NAPI_AUTO_LENGTH,
4941                                               Worker::GlobalCall, nullptr, &func);
4942     ASSERT_TRUE(status == napi_ok);
4943     napi_value globalObj = Commonlibrary::Concurrent::Common::Helper::NapiHelper::GetGlobalObject(env);
4944     ASSERT_TRUE(napi_set_named_property(env, globalObj, "callGlobalCallObjectMethod", func) == napi_ok);
4945 }
4946 
4947 HWTEST_F(NativeEngineTest, WorkerTest096, testing::ext::TestSize.Level0)
4948 {
4949     napi_env env = (napi_env)engine_;
4950     napi_value func = nullptr;
4951     napi_status status = napi_create_function(env, "close", NAPI_AUTO_LENGTH,
4952                                               Worker::CloseWorker, nullptr, &func);
4953     ASSERT_TRUE(status == napi_ok);
4954     napi_value globalObj = Commonlibrary::Concurrent::Common::Helper::NapiHelper::GetGlobalObject(env);
4955     ASSERT_TRUE(napi_set_named_property(env, globalObj, "close", func) == napi_ok);
4956 }
4957 
4958 HWTEST_F(NativeEngineTest, WorkerTest097, testing::ext::TestSize.Level0)
4959 {
4960     napi_env env = (napi_env)engine_;
4961     napi_value func = nullptr;
4962     napi_status status = napi_create_function(env, "cancelTasks", NAPI_AUTO_LENGTH,
4963                                               Worker::ParentPortCancelTask, nullptr, &func);
4964     ASSERT_TRUE(status == napi_ok);
4965     napi_value globalObj = Commonlibrary::Concurrent::Common::Helper::NapiHelper::GetGlobalObject(env);
4966     ASSERT_TRUE(napi_set_named_property(env, globalObj, "cancelTasks", func) == napi_ok);
4967 }
4968 
4969 HWTEST_F(NativeEngineTest, WorkerTest098, testing::ext::TestSize.Level0)
4970 {
4971     napi_env env = (napi_env)engine_;
4972     napi_value func = nullptr;
4973     napi_status status = napi_create_function(env, "addEventListener", NAPI_AUTO_LENGTH,
4974                                               Worker::ParentPortAddEventListener, nullptr, &func);
4975     ASSERT_TRUE(status == napi_ok);
4976     napi_value globalObj = Commonlibrary::Concurrent::Common::Helper::NapiHelper::GetGlobalObject(env);
4977     ASSERT_TRUE(napi_set_named_property(env, globalObj, "addEventListener", func) == napi_ok);
4978 }
4979 
4980 HWTEST_F(NativeEngineTest, WorkerTest099, testing::ext::TestSize.Level0)
4981 {
4982     napi_env env = (napi_env)engine_;
4983     napi_value func = nullptr;
4984     napi_status status = napi_create_function(env, "dispatchEvent", NAPI_AUTO_LENGTH,
4985                                               Worker::ParentPortDispatchEvent, nullptr, &func);
4986     ASSERT_TRUE(status == napi_ok);
4987     napi_value globalObj = Commonlibrary::Concurrent::Common::Helper::NapiHelper::GetGlobalObject(env);
4988     ASSERT_TRUE(napi_set_named_property(env, globalObj, "dispatchEvent", func) == napi_ok);
4989 }
4990 
4991 HWTEST_F(NativeEngineTest, WorkerTest100, testing::ext::TestSize.Level0)
4992 {
4993     napi_env env = (napi_env)engine_;
4994     napi_value func = nullptr;
4995     napi_status status = napi_create_function(env, "removeEventListener", NAPI_AUTO_LENGTH,
4996                                               Worker::ParentPortRemoveEventListener, nullptr, &func);
4997     ASSERT_TRUE(status == napi_ok);
4998     napi_value globalObj = Commonlibrary::Concurrent::Common::Helper::NapiHelper::GetGlobalObject(env);
4999     ASSERT_TRUE(napi_set_named_property(env, globalObj, "removeEventListener", func) == napi_ok);
5000 }
5001 
5002 HWTEST_F(NativeEngineTest, WorkerTest101, testing::ext::TestSize.Level0)
5003 {
5004     napi_env env = (napi_env)engine_;
5005     napi_value func = nullptr;
5006     napi_status status = napi_create_function(env, "removeAllListener", NAPI_AUTO_LENGTH,
5007                                               Worker::ParentPortRemoveAllListener, nullptr, &func);
5008     ASSERT_TRUE(status == napi_ok);
5009     napi_value globalObj = Commonlibrary::Concurrent::Common::Helper::NapiHelper::GetGlobalObject(env);
5010     ASSERT_TRUE(napi_set_named_property(env, globalObj, "removeAllListener", func) == napi_ok);
5011 }
5012 
5013 HWTEST_F(NativeEngineTest, WorkerTest102, testing::ext::TestSize.Level0)
5014 {
5015     napi_env env = (napi_env)engine_;
5016     napi_value func1 = nullptr;
5017     napi_status status = napi_create_function(env, "postMessage", NAPI_AUTO_LENGTH,
5018                                               Worker::PostMessageToHost, nullptr, &func1);
5019     napi_value func2 = nullptr;
5020     status = napi_create_function(env, "postMessageWithSharedSendable", NAPI_AUTO_LENGTH,
5021                                   Worker::PostMessageWithSharedSendableToHost, nullptr, &func2);
5022     napi_value func3 = nullptr;
5023     status = napi_create_function(env, "callGlobalCallObjectMethod", NAPI_AUTO_LENGTH,
5024                                   Worker::GlobalCall, nullptr, &func3);
5025     napi_value func4 = nullptr;
5026     status = napi_create_function(env, "close", NAPI_AUTO_LENGTH,
5027                                   Worker::CloseWorker, nullptr, &func4);
5028     ASSERT_TRUE(status == napi_ok);
5029     napi_property_descriptor properties[] = {
5030         // napi_default_jsproperty = napi_writable | napi_enumerable | napi_configurable
5031         {"postMessage", nullptr, nullptr, nullptr, nullptr, func1, napi_default, nullptr},
5032         {"postMessageWithSharedSendable", nullptr, nullptr, nullptr, nullptr, func2, napi_default, nullptr},
5033         {"callGlobalCallObjectMethod", nullptr, nullptr, nullptr, nullptr, func3, napi_default, nullptr},
5034         {"close", nullptr, nullptr, nullptr, nullptr, func4, napi_default, nullptr}
5035     };
5036     napi_value globalObj = Commonlibrary::Concurrent::Common::Helper::NapiHelper::GetGlobalObject(env);
5037     status = napi_define_properties(env, globalObj, sizeof(properties) / sizeof(properties[0]), properties);
5038     ASSERT_TRUE(status == napi_ok);
5039     napi_value postMessageCB = GetGlobalProperty(env, "postMessage");
5040     napi_value postMessageWithSSCB = GetGlobalProperty(env, "postMessageWithSharedSendable");
5041     napi_value globalCallObjMethodCB = GetGlobalProperty(env, "callGlobalCallObjectMethod");
5042     napi_value closeCB = GetGlobalProperty(env, "close");
5043     bool isEqual = false;
5044     napi_strict_equals(env, postMessageCB, func1, &isEqual);
5045     ASSERT_TRUE(isEqual);
5046     napi_strict_equals(env, postMessageWithSSCB, func2, &isEqual);
5047     ASSERT_TRUE(isEqual);
5048     napi_strict_equals(env, globalCallObjMethodCB, func3, &isEqual);
5049     ASSERT_TRUE(isEqual);
5050     napi_strict_equals(env, closeCB, func4, &isEqual);
5051     ASSERT_TRUE(isEqual);
5052 }
5053 
5054 HWTEST_F(NativeEngineTest, WorkerTest103, testing::ext::TestSize.Level0)
5055 {
5056     napi_env env = (napi_env)engine_;
5057     napi_value func1 = nullptr;
5058     napi_status status = napi_create_function(env, "cancelTasks", NAPI_AUTO_LENGTH,
5059                                               Worker::ParentPortCancelTask, nullptr, &func1);
5060     napi_value func2 = nullptr;
5061     status = napi_create_function(env, "addEventListener", NAPI_AUTO_LENGTH,
5062                                   Worker::ParentPortAddEventListener, nullptr, &func2);
5063     napi_value func3 = nullptr;
5064     status = napi_create_function(env, "dispatchEvent", NAPI_AUTO_LENGTH,
5065                                   Worker::ParentPortDispatchEvent, nullptr, &func3);
5066     napi_value func4 = nullptr;
5067     status = napi_create_function(env, "removeEventListener", NAPI_AUTO_LENGTH,
5068                                   Worker::ParentPortRemoveEventListener, nullptr, &func4);
5069     napi_value func5 = nullptr;
5070     status = napi_create_function(env, "removeAllListener", NAPI_AUTO_LENGTH,
5071                                   Worker::ParentPortRemoveAllListener, nullptr, &func5);
5072     ASSERT_TRUE(status == napi_ok);
5073     napi_property_descriptor properties[] = {
5074         // napi_default_jsproperty = napi_writable | napi_enumerable | napi_configurable
5075         {"cancelTasks", nullptr, nullptr, nullptr, nullptr, func1, napi_default, nullptr},
5076         {"addEventListener", nullptr, nullptr, nullptr, nullptr, func2, napi_default, nullptr},
5077         {"dispatchEvent", nullptr, nullptr, nullptr, nullptr, func3, napi_default, nullptr},
5078         {"removeEventListener", nullptr, nullptr, nullptr, nullptr, func4, napi_default, nullptr},
5079         {"removeAllListener", nullptr, nullptr, nullptr, nullptr, func5, napi_default, nullptr}
5080     };
5081     napi_value globalObj = Commonlibrary::Concurrent::Common::Helper::NapiHelper::GetGlobalObject(env);
5082     status = napi_define_properties(env, globalObj, sizeof(properties) / sizeof(properties[0]), properties);
5083     ASSERT_TRUE(status == napi_ok);
5084     napi_value cancelTasksCB = GetGlobalProperty(env, "cancelTasks");
5085     napi_value addEventListenerCB = GetGlobalProperty(env, "addEventListener");
5086     napi_value dispatchEventCB = GetGlobalProperty(env, "dispatchEvent");
5087     napi_value removeEventListenerCB = GetGlobalProperty(env, "removeEventListener");
5088     napi_value removeAllListenerCB = GetGlobalProperty(env, "removeAllListener");
5089     bool isEqual = false;
5090     napi_strict_equals(env, cancelTasksCB, func1, &isEqual);
5091     ASSERT_TRUE(isEqual);
5092     napi_strict_equals(env, addEventListenerCB, func2, &isEqual);
5093     ASSERT_TRUE(isEqual);
5094     napi_strict_equals(env, dispatchEventCB, func3, &isEqual);
5095     ASSERT_TRUE(isEqual);
5096     napi_strict_equals(env, removeEventListenerCB, func4, &isEqual);
5097     ASSERT_TRUE(isEqual);
5098     napi_strict_equals(env, removeAllListenerCB, func5, &isEqual);
5099     ASSERT_TRUE(isEqual);
5100 }
5101 
5102 HWTEST_F(WorkersTest, PostMessageTest004, testing::ext::TestSize.Level0)
5103 {
5104     napi_env env = WorkersTest::GetEnv();
5105     Worker *worker = new Worker(env, nullptr);
5106     UpdateMainThreadWorkerFlag(worker, false);
5107     ASSERT_TRUE(worker != nullptr);
5108     uv_loop_t *loop = nullptr;
5109     napi_status status = napi_get_uv_event_loop(env, &loop);
5110     ASSERT_TRUE(status == napi_ok);
5111     InitHostHandle(worker, loop);
5112 
5113     std::thread t(WorkerThreadFunction, worker);
5114     t.detach();
5115     uint32_t number = 200; // 200 : test number
5116     napi_value numVal = nullptr;
5117     status = napi_create_uint32(env, number, &numVal);
5118     ASSERT_TRUE(status == napi_ok);
5119     void *data = nullptr;
5120     napi_value undefined = nullptr;
5121     napi_get_undefined(env, &undefined);
5122     status = napi_serialize(env, numVal, undefined, undefined, &data);
5123     ASSERT_TRUE(status == napi_ok);
5124     uv_sleep(1000); // 1000 : for post and receive message
5125     PostMessage(worker, data);
5126     uv_sleep(1000); // 1000 : for post and receive message
5127 }
5128 
5129 HWTEST_F(WorkersTest, QOSTest001, testing::ext::TestSize.Level0)
5130 {
5131     napi_env env = WorkersTest::GetEnv();
5132     napi_value exportObject = nullptr;
5133     napi_create_object(env, &exportObject);
5134     Worker::InitPriorityObject(env, exportObject);
5135 
5136     napi_value priorityValue = NapiHelper::GetNameProperty(env, exportObject, "ThreadWorkerPriority");
5137     ASSERT_NE(priorityValue, nullptr);
5138 
5139     int32_t temp = -1;
5140     napi_value highValue = NapiHelper::GetNameProperty(env, priorityValue, "HIGH");
5141     ASSERT_NE(highValue, nullptr);
5142     napi_get_value_int32(env, highValue, static_cast<int32_t*>(&temp));
5143     ASSERT_EQ(temp, static_cast<int32_t>(WorkerPriority::HIGH));
5144 
5145     napi_value mediumValue = NapiHelper::GetNameProperty(env, priorityValue, "MEDIUM");
5146     ASSERT_NE(mediumValue, nullptr);
5147     napi_get_value_int32(env, mediumValue, static_cast<int32_t*>(&temp));
5148     ASSERT_EQ(temp, static_cast<int32_t>(WorkerPriority::MEDIUM));
5149 
5150     napi_value lowValue = NapiHelper::GetNameProperty(env, priorityValue, "LOW");
5151     ASSERT_NE(lowValue, nullptr);
5152     napi_get_value_int32(env, lowValue, static_cast<int32_t*>(&temp));
5153     ASSERT_EQ(temp, static_cast<int32_t>(WorkerPriority::LOW));
5154 
5155     napi_value idleValue = NapiHelper::GetNameProperty(env, priorityValue, "IDLE");
5156     ASSERT_NE(idleValue, nullptr);
5157     napi_get_value_int32(env, idleValue, static_cast<int32_t*>(&temp));
5158     ASSERT_EQ(temp, static_cast<int32_t>(WorkerPriority::IDLE));
5159 }
5160 
5161 HWTEST_F(WorkersTest, QOSTest002, testing::ext::TestSize.Level0)
5162 {
5163     napi_env env = WorkersTest::GetEnv();
5164     napi_value object = nullptr;
5165     napi_create_object(env, &object);
5166     std::string str = "test";
5167     napi_value strValue = nullptr;
5168     napi_create_string_utf8(env, str.c_str(), str.length(), &strValue);
5169     napi_set_named_property(env, object, "priority", strValue);
5170     WorkerPriority ret = Worker::GetPriorityArg(env, object);
5171     ASSERT_EQ(ret, WorkerPriority::INVALID);
5172 
5173     napi_value intValue = nullptr;
5174     napi_create_int32(env, -1, &intValue);
5175     napi_set_named_property(env, object, "priority", intValue);
5176     ret = Worker::GetPriorityArg(env, object);
5177     ASSERT_EQ(ret, WorkerPriority::INVALID);
5178 
5179     napi_create_int32(env, static_cast<int32_t>(WorkerPriority::HIGH), &intValue);
5180     napi_set_named_property(env, object, "priority", intValue);
5181     ret = Worker::GetPriorityArg(env, object);
5182     ASSERT_NE(ret, WorkerPriority::INVALID);
5183 
5184     napi_create_int32(env, static_cast<int32_t>(WorkerPriority::MEDIUM), &intValue);
5185     napi_set_named_property(env, object, "priority", intValue);
5186     ret = Worker::GetPriorityArg(env, object);
5187     ASSERT_NE(ret, WorkerPriority::INVALID);
5188 
5189     napi_create_int32(env, static_cast<int32_t>(WorkerPriority::LOW), &intValue);
5190     napi_set_named_property(env, object, "priority", intValue);
5191     ret = Worker::GetPriorityArg(env, object);
5192     ASSERT_NE(ret, WorkerPriority::INVALID);
5193 
5194     napi_create_int32(env, static_cast<int32_t>(WorkerPriority::IDLE), &intValue);
5195     napi_set_named_property(env, object, "priority", intValue);
5196     ret = Worker::GetPriorityArg(env, object);
5197     ASSERT_NE(ret, WorkerPriority::INVALID);
5198 
5199     napi_create_int32(env, 4, &intValue);
5200     napi_set_named_property(env, object, "priority", intValue);
5201     ret = Worker::GetPriorityArg(env, object);
5202     ASSERT_EQ(ret, WorkerPriority::INVALID);
5203 }
5204 
5205 HWTEST_F(WorkersTest, QOSTest003, testing::ext::TestSize.Level0)
5206 {
5207     napi_env env = (napi_env)engine_;
5208     napi_env workerEnv = nullptr;
5209     napi_create_runtime(env, &workerEnv);
5210     napi_value workerGlobal = nullptr;
5211     napi_get_global(workerEnv, &workerGlobal);
5212     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
5213     std::string funcName = "ThreadWorkerConstructor";
5214     napi_value cb = nullptr;
5215     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
5216 
5217     napi_value result = nullptr;
5218     napi_value argv[2] = { nullptr };
5219     std::string script = "entry/ets/workers/@worker.ts";
5220     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
5221 
5222     napi_value object = nullptr;
5223     napi_create_object(workerEnv, &object);
5224     napi_value priorityValue = nullptr;
5225     napi_create_uint32(workerEnv, static_cast<int32_t>(-1), &priorityValue);
5226     napi_set_named_property(workerEnv, object, "priority", priorityValue);
5227     argv[1] = object;
5228 
5229     TryCatch tryCatch(workerEnv);
5230     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
5231     ASSERT_TRUE(tryCatch.HasCaught());
5232     tryCatch.ClearException();
5233     ArkNativeEngine* engine = (ArkNativeEngine*)workerEnv;
5234     if (!engine->lastException_.IsEmpty()) {
5235         engine->lastException_.Empty();
5236     }
5237     std::string strpriority = "kkk";
5238     napi_create_string_utf8(workerEnv, strpriority.c_str(), strpriority.length(), &priorityValue);
5239     napi_set_named_property(workerEnv, object, "priority", priorityValue);
5240     TryCatch tryCatch2(workerEnv);
5241     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
5242     ASSERT_TRUE(tryCatch2.HasCaught());
5243     tryCatch2.ClearException();
5244     if (!engine->lastException_.IsEmpty()) {
5245         engine->lastException_.Empty();
5246     }
5247     Worker_Terminate(workerEnv, workerGlobal);
5248     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
5249 }
5250 
5251 HWTEST_F(WorkersTest, QOSTest004, testing::ext::TestSize.Level0)
5252 {
5253     napi_env env = (napi_env)engine_;
5254     napi_env workerEnv = nullptr;
5255     napi_create_runtime(env, &workerEnv);
5256     napi_value workerGlobal = nullptr;
5257     napi_get_global(workerEnv, &workerGlobal);
5258     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
5259     std::string funcName = "ThreadWorkerConstructor";
5260     napi_value cb = nullptr;
5261     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
5262 
5263     napi_value result = nullptr;
5264     napi_value argv[2] = { nullptr };
5265     std::string script = "entry/ets/workers/@worker.ts";
5266     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
5267 
5268     napi_value object = nullptr;
5269     napi_create_object(workerEnv, &object);
5270     argv[1] = object;
5271 
5272     WorkerPriority priority[] =
5273         {WorkerPriority::HIGH, WorkerPriority::MEDIUM, WorkerPriority::LOW, WorkerPriority::IDLE};
5274     for (int k = 0; k < sizeof(priority) / sizeof(priority[0]); k++)
5275     {
5276         napi_value priorityValue = nullptr;
5277         napi_create_uint32(workerEnv, static_cast<int32_t>(priority[k]), &priorityValue);
5278         napi_set_named_property(workerEnv, object, "priority", priorityValue);
5279         napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
5280         ASSERT_TRUE(result != nullptr);
5281         Worker* worker = nullptr;
5282         napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
5283         bool qosUpdated = false;
__anon0020bb762a02null5284         worker->SetQOSLevelUpdatedCallback([&qosUpdated] { qosUpdated = true; });
5285         uv_sleep(200);
5286         ASSERT_TRUE(qosUpdated);
5287         worker->EraseWorker();
5288         ClearWorkerHandle(worker);
5289     }
5290     result = Worker_Terminate(workerEnv, workerGlobal);
5291     NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
5292     ASSERT_TRUE(result != nullptr);
5293 }
5294 
5295 HWTEST_F(WorkersTest, QOSTest005, testing::ext::TestSize.Level0)
5296 {
5297     napi_env env = (napi_env)engine_;
5298     napi_env workerEnv = nullptr;
5299     napi_create_runtime(env, &workerEnv);
5300     napi_value workerGlobal = nullptr;
5301     napi_get_global(workerEnv, &workerGlobal);
5302     std::string funcName = "WorkerConstructor";
5303     napi_value cb = nullptr;
5304     napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::WorkerConstructor, nullptr, &cb);
5305 
5306     napi_value result = nullptr;
5307     napi_value argv[2] = { nullptr };
5308     std::string script = "entry/ets/workers/@worker.ts";
5309     napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
5310 
5311     napi_value object = nullptr;
5312     napi_create_object(workerEnv, &object);
5313     napi_value priorityValue = nullptr;
5314     napi_create_uint32(workerEnv, static_cast<int32_t>(-1), &priorityValue);
5315     napi_set_named_property(workerEnv, object, "priority", priorityValue);
5316     argv[1] = object;
5317 
5318     TryCatch tryCatch(workerEnv);
5319     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
5320     ASSERT_FALSE(tryCatch.HasCaught());
5321 
5322     std::string strpriority = "kkk";
5323     napi_create_string_utf8(workerEnv, strpriority.c_str(), strpriority.length(), &priorityValue);
5324     napi_set_named_property(workerEnv, object, "priority", priorityValue);
5325     TryCatch tryCatch2(workerEnv);
5326     napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
5327     ASSERT_FALSE(tryCatch2.HasCaught());
5328     uv_sleep(200);
5329 }
5330 
5331 HWTEST_F(WorkersTest, MaxLimitTest0010, testing::ext::TestSize.Level0)
5332 {
5333     auto checker = std::make_shared<WorkerChecker>();
5334     checker->CreateWorkerList(false, MAX_WORKERS_COUNT + NUM_10);
5335     int32_t failed = checker->GetFailedCount();
5336     checker->DeleteWorkerList();
5337     ASSERT_EQ(failed, NUM_10);
5338 }
5339 
5340 HWTEST_F(WorkersTest, MaxLimitTest0011, testing::ext::TestSize.Level0)
5341 {
5342     auto checker = std::make_shared<WorkerChecker>();
5343     checker->CreateWorkerList(false, MAX_WORKERS_COUNT - NUM_1);
5344     int32_t failed = checker->GetFailedCount();
5345     ASSERT_EQ(failed, 0);
5346 
5347     auto checker2 = std::make_shared<WorkerChecker>();
5348     checker2->CreateWorkerList(false, NUM_1);
5349     failed = checker2->GetFailedCount();
5350     ASSERT_EQ(failed, 0);
5351 
5352     auto checker3 = std::make_shared<WorkerChecker>();
5353     checker3->CreateWorkerList(false, NUM_1);
5354     failed = checker3->GetFailedCount();
5355     ASSERT_EQ(failed, NUM_1);
5356     checker3->DeleteWorkerList();
5357 
5358     checker2->DeleteWorkerList();
5359     auto checker4 = std::make_shared<WorkerChecker>();
5360     checker4->CreateWorkerList(false, NUM_1);
5361     failed = checker4->GetFailedCount();
5362     ASSERT_EQ(failed, 0);
5363     checker4->DeleteWorkerList();
5364 
5365     checker->DeleteWorkerList();
5366 }
5367 
5368 HWTEST_F(WorkersTest, MaxLimitTest0020, testing::ext::TestSize.Level0)
5369 {
5370     auto checker = std::make_shared<ArkRuntimeChecker>();
5371     checker->CreateArkRuntimeList(MAX_ARKRUNTIME_COUNT + NUM_10);
5372     int32_t failed = checker->GetFailedCount();
5373     checker->DeleteArkRuntimeList();
5374     ASSERT_EQ(failed, NUM_10);
5375 }
5376 
5377 HWTEST_F(WorkersTest, MaxLimitTest0021, testing::ext::TestSize.Level0)
5378 {
5379     auto checker = std::make_shared<ArkRuntimeChecker>();
5380     checker->CreateArkRuntimeList(MAX_ARKRUNTIME_COUNT - NUM_1);
5381     int32_t failed = checker->GetFailedCount();
5382     ASSERT_EQ(failed, 0);
5383 
5384     auto checker2 = std::make_shared<ArkRuntimeChecker>();
5385     checker2->CreateArkRuntimeList(NUM_10);
5386     failed = checker2->GetFailedCount();
5387     ASSERT_EQ(failed, NUM_10 - NUM_1);
5388 
5389     auto checker3 = std::make_shared<ArkRuntimeChecker>();
5390     checker3->CreateArkRuntimeList(NUM_1);
5391     failed = checker3->GetFailedCount();
5392     ASSERT_EQ(failed, NUM_1);
5393 
5394     checker3->DeleteArkRuntimeList();
5395     checker2->DeleteArkRuntimeList();
5396 
5397     auto checker4 = std::make_shared<ArkRuntimeChecker>();
5398     checker4->CreateArkRuntimeList(NUM_1);
5399     failed = checker4->GetFailedCount();
5400     ASSERT_EQ(failed, 0);
5401     checker4->DeleteArkRuntimeList();
5402 
5403     checker->DeleteArkRuntimeList();
5404 }
5405 
5406 HWTEST_F(WorkersTest, MaxLimitTest0030, testing::ext::TestSize.Level0)
5407 {
5408     auto arkRuntimeChecker = std::make_shared<ArkRuntimeChecker>();
5409     arkRuntimeChecker->CreateArkRuntimeList(MAX_ARKRUNTIME_COUNT + NUM_10);
5410     int32_t failed1 = arkRuntimeChecker->GetFailedCount();
5411     auto workerChecker = std::make_shared<WorkerChecker>();
5412     workerChecker->CreateWorkerList(false, MAX_WORKERS_COUNT);
5413     int32_t failed2 = workerChecker->GetFailedCount();
5414     workerChecker->DeleteWorkerList();
5415     ASSERT_EQ(failed2, MAX_WORKERS_COUNT + MAX_ARKRUNTIME_COUNT - MAX_JSTHREAD_COUNT);
5416     arkRuntimeChecker->DeleteArkRuntimeList();
5417     ASSERT_EQ(failed1, NUM_10);
5418 }
5419 
5420 HWTEST_F(WorkersTest, MaxLimitTest0031, testing::ext::TestSize.Level0)
5421 {
5422     auto arkRuntimeChecker = std::make_shared<ArkRuntimeChecker>();
5423     arkRuntimeChecker->CreateArkRuntimeList(MAX_ARKRUNTIME_COUNT + NUM_10);
5424     int32_t failed1 = arkRuntimeChecker->GetFailedCount();
5425     auto workerChecker2 = std::make_shared<WorkerChecker>();
5426     workerChecker2->CreateWorkerList(false, MAX_JSTHREAD_COUNT - MAX_ARKRUNTIME_COUNT - NUM_10);
5427     int32_t failed2 = workerChecker2->GetFailedCount();
5428 
5429     auto workerChecker3 = std::make_shared<WorkerChecker>();
5430     workerChecker3->CreateWorkerList(true, NUM_10 + NUM_1);
5431     int32_t failed3 = workerChecker3->GetFailedCount();
5432     ASSERT_EQ(failed3, NUM_1);
5433     workerChecker3->DeleteWorkerList();
5434 
5435     workerChecker2->DeleteWorkerList();
5436     ASSERT_EQ(failed2, 0);
5437     arkRuntimeChecker->DeleteArkRuntimeList();
5438     ASSERT_EQ(failed1, NUM_10);
5439 }
5440 
5441 HWTEST_F(WorkersTest, MaxLimitTest004, testing::ext::TestSize.Level0)
5442 {
5443     auto workerChecker = std::make_shared<WorkerChecker>();
5444     workerChecker->CreateWorkerList(false, MAX_WORKERS_COUNT + NUM_10);
5445     int32_t failed1 = workerChecker->GetFailedCount();
5446     auto arkRuntimeChecker = std::make_shared<ArkRuntimeChecker>();
5447     arkRuntimeChecker->CreateArkRuntimeList(MAX_ARKRUNTIME_COUNT);
5448     int32_t failed2 = arkRuntimeChecker->GetFailedCount();
5449     workerChecker->DeleteWorkerList();
5450     ASSERT_EQ(failed1, NUM_10);
5451     arkRuntimeChecker->DeleteArkRuntimeList();
5452     ASSERT_EQ(failed2, MAX_WORKERS_COUNT + MAX_ARKRUNTIME_COUNT - MAX_JSTHREAD_COUNT);
5453 }
5454 
5455 HWTEST_F(WorkersTest, MaxLimitTest005, testing::ext::TestSize.Level0)
5456 {
5457     auto workerChecker = std::make_shared<WorkerChecker>();
5458     workerChecker->CreateWorkerList(false, MAX_WORKERS_COUNT - NUM_10);
5459     int32_t failed1 = workerChecker->GetFailedCount();
5460     ASSERT_EQ(failed1, 0);
5461 
5462     auto arkRuntimeChecker = std::make_shared<ArkRuntimeChecker>();
5463     arkRuntimeChecker->CreateArkRuntimeList(MAX_JSTHREAD_COUNT - MAX_WORKERS_COUNT + NUM_10 - NUM_1);
5464     int32_t failed2 = arkRuntimeChecker->GetFailedCount();
5465     ASSERT_EQ(failed2, 0);
5466 
5467     auto arkRuntimeChecker2 = std::make_shared<ArkRuntimeChecker>();
5468     arkRuntimeChecker2->CreateArkRuntimeList(NUM_10);
5469     failed2 = arkRuntimeChecker2->GetFailedCount();
5470     ASSERT_EQ(failed2, NUM_10 - NUM_1);
5471     arkRuntimeChecker2->DeleteArkRuntimeList();
5472 
5473     auto arkRuntimeChecker3 = std::make_shared<ArkRuntimeChecker>();
5474     arkRuntimeChecker3->CreateArkRuntimeList(NUM_1);
5475     failed2 = arkRuntimeChecker3->GetFailedCount();
5476     ASSERT_EQ(failed2, 0);
5477 
5478     auto arkRuntimeChecker4 = std::make_shared<ArkRuntimeChecker>();
5479     arkRuntimeChecker4->CreateArkRuntimeList(NUM_1);
5480     failed2 = arkRuntimeChecker4->GetFailedCount();
5481     ASSERT_EQ(failed2, NUM_1);
5482 
5483     arkRuntimeChecker3->DeleteArkRuntimeList();
5484     arkRuntimeChecker4->DeleteArkRuntimeList();
5485 
5486     workerChecker->DeleteWorkerList();
5487     arkRuntimeChecker->DeleteArkRuntimeList();
5488 }
5489