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