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