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