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