1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <thread>
17 #include <uv.h>
18
19 #include "ark_native_engine.h"
20 #include "message_queue.h"
21 #include "test.h"
22 #include "napi/native_api.h"
23 #include "napi/native_node_api.h"
24 #include "tools/log.h"
25 #include "worker.h"
26
27 #define SELLP_MS 200
28
29 #define ASSERT_CHECK_CALL(call) \
30 { \
31 ASSERT_EQ(call, napi_ok); \
32 }
33
34 #define ASSERT_CHECK_VALUE_TYPE(env, value, type) \
35 { \
36 napi_valuetype valueType = napi_undefined; \
37 ASSERT_TRUE(value != nullptr); \
38 ASSERT_CHECK_CALL(napi_typeof(env, value, &valueType)); \
39 ASSERT_EQ(valueType, type); \
40 }
41
42 using namespace Commonlibrary::Concurrent::WorkerModule;
43
44 namespace Commonlibrary::Concurrent::WorkerModule {
45 class WorkersTest : public testing::Test {
46 public:
SetUpTestSuite()47 static void SetUpTestSuite()
48 {
49 InitializeEngine();
50 }
51
TearDownTestSuite()52 static void TearDownTestSuite()
53 {
54 DestroyEngine();
55 }
56
InitializeEngine()57 static void InitializeEngine()
58 {
59 panda::RuntimeOption option;
60 option.SetGcType(panda::RuntimeOption::GC_TYPE::GEN_GC);
61 const int64_t poolSize = 0x1000000; // 16M
62 option.SetGcPoolSize(poolSize);
63 option.SetLogLevel(panda::RuntimeOption::LOG_LEVEL::ERROR);
64 option.SetDebuggerLibraryPath("");
65 vm_ = panda::JSNApi::CreateJSVM(option);
66 ASSERT_TRUE(vm_ != nullptr);
67 engine_ = new ArkNativeEngine(vm_, nullptr);
68 engine_->SetInitWorkerFunc([](NativeEngine*) {});
69 }
70
DestroyEngine()71 static void DestroyEngine()
72 {
73 if (engine_) {
74 delete engine_;
75 engine_ = nullptr;
76 }
77 panda::JSNApi::DestroyJSVM(vm_);
78 }
79
GetEnv()80 static napi_env GetEnv()
81 {
82 return reinterpret_cast<napi_env>(engine_);
83 }
84
WorkerOnMessage(const uv_async_t * req)85 static void WorkerOnMessage(const uv_async_t *req)
86 {
87 Worker *worker = static_cast<Worker*>(req->data);
88 ASSERT_NE(worker, nullptr);
89 napi_env workerEnv = worker->GetWorkerEnv();
90 void *data = nullptr;
91 while (worker->workerMessageQueue_.DeQueue(&data)) {
92 if (data == nullptr) {
93 return;
94 }
95 napi_value result = nullptr;
96 napi_status status = napi_deserialize(workerEnv, data, &result);
97 ASSERT_TRUE(status == napi_ok);
98 uint32_t number = 0;
99 status = napi_get_value_uint32(workerEnv, result, &number);
100 ASSERT_TRUE(status == napi_ok);
101 ASSERT_TRUE(number != 0);
102 napi_delete_serialization_data(workerEnv, data);
103 number = 1000; // 1000 : test number
104 napi_value numVal = nullptr;
105 status = napi_create_uint32(workerEnv, number, &numVal);
106 ASSERT_TRUE(status == napi_ok);
107 napi_value undefined = nullptr;
108 napi_get_undefined(workerEnv, &undefined);
109 void *workerData = nullptr;
110 status = napi_serialize_inner(workerEnv, numVal, undefined, undefined, false, true, &workerData);
111 ASSERT_TRUE(status == napi_ok);
112 ASSERT_NE(workerData, nullptr);
113 worker->PostMessageToHostInner(workerData);
114 }
115 }
116
HostOnMessage(const uv_async_t * req)117 static void HostOnMessage(const uv_async_t *req)
118 {
119 Worker *worker = static_cast<Worker*>(req->data);
120 ASSERT_NE(worker, nullptr);
121 void *data = nullptr;
122 while (worker->hostMessageQueue_.DeQueue(&data)) {
123 if (data == nullptr) {
124 return;
125 }
126 napi_env hostEnv = worker->GetHostEnv();
127 napi_value result = nullptr;
128 napi_status status = napi_deserialize(hostEnv, data, &result);
129 ASSERT_TRUE(status == napi_ok);
130 uint32_t number = 0;
131 status = napi_get_value_uint32(hostEnv, result, &number);
132 ASSERT_TRUE(status == napi_ok);
133 ASSERT_EQ(number, 1000); // 1000 : test number
134 napi_delete_serialization_data(hostEnv, data);
135 }
136 }
137
WorkerThreadFunction(void * data)138 static void WorkerThreadFunction(void *data)
139 {
140 auto worker = reinterpret_cast<Worker*>(data);
141 napi_env hostEnv = worker->GetHostEnv();
142 ASSERT_NE(hostEnv, nullptr);
143 napi_env workerEnv = nullptr;
144 napi_status status = napi_create_runtime(hostEnv, &workerEnv);
145 ASSERT_TRUE(status == napi_ok);
146 worker->SetWorkerEnv(workerEnv);
147 uv_loop_t *workerLoop = nullptr;
148 status = napi_get_uv_event_loop(workerEnv, &workerLoop);
149 ASSERT_TRUE(status == napi_ok);
150 worker->workerOnMessageSignal_ = new uv_async_t;
151 uv_async_init(workerLoop, worker->workerOnMessageSignal_, reinterpret_cast<uv_async_cb>(WorkerOnMessage));
152 worker->workerOnMessageSignal_->data = worker;
153 worker->Loop();
154 }
155
UpdateMainThreadWorkerFlag(Worker * worker,bool isMainThreadWorker)156 static void UpdateMainThreadWorkerFlag(Worker *worker, bool isMainThreadWorker)
157 {
158 worker->isMainThreadWorker_ = isMainThreadWorker;
159 }
160
InitHostHandle(Worker * worker,uv_loop_t * loop)161 static void InitHostHandle(Worker *worker, uv_loop_t *loop)
162 {
163 worker->hostOnMessageSignal_ = new uv_async_t;
164 uv_async_init(loop, worker->hostOnMessageSignal_, reinterpret_cast<uv_async_cb>(HostOnMessage));
165 worker->hostOnMessageSignal_->data = worker;
166 }
167
PostMessage(Worker * worker,void * message)168 static void PostMessage(Worker *worker, void *message)
169 {
170 worker->PostMessageInner(message);
171 }
172
UpdateWorkerState(Worker * worker,Worker::RunnerState state)173 static void UpdateWorkerState(Worker *worker, Worker::RunnerState state)
174 {
175 bool done = false;
176 do {
177 Worker::RunnerState oldState = worker->runnerState_.load(std::memory_order_acquire);
178 done = worker->runnerState_.compare_exchange_strong(oldState, state);
179 } while (!done);
180 }
181
SetCloseWorkerProp(Worker * worker,napi_env env)182 static void SetCloseWorkerProp(Worker *worker, napi_env env)
183 {
184 worker->SetWorkerEnv(env);
185 uv_loop_t* loop = worker->GetWorkerLoop();
186 ASSERT_TRUE(loop != nullptr);
187 worker->workerOnMessageSignal_ = new uv_async_t;
188 uv_async_init(loop, worker->workerOnMessageSignal_, reinterpret_cast<uv_async_cb>(
189 UpdateMainThreadWorkerFlag));
190 worker->workerOnMessageSignal_->data = worker;
191 uv_async_init(loop, &worker->debuggerOnPostTaskSignal_, reinterpret_cast<uv_async_cb>(
192 UpdateWorkerState));
193 }
194 protected:
195 static thread_local NativeEngine *engine_;
196 static thread_local EcmaVM *vm_;
197 };
198
199 thread_local NativeEngine *WorkersTest::engine_ = nullptr;
200 thread_local EcmaVM *WorkersTest::vm_ = nullptr;
201 }
202
203 // worker constructor
Worker_Constructor(napi_env env,napi_value global)204 napi_value Worker_Constructor(napi_env env, napi_value global)
205 {
206 std::string funcName = "WorkerConstructor";
207 napi_value cb = nullptr;
208 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::WorkerConstructor, nullptr, &cb);
209
210 napi_value result = nullptr;
211 napi_value argv[2] = { nullptr };
212 std::string script = "entry/ets/workers/@worker.ts";
213 napi_create_string_utf8(env, script.c_str(), script.length(), &argv[0]);
214 std::string type = "classic";
215 std::string name = "WorkerThread";
216 napi_value typeValue = nullptr;
217 napi_value nameValue = nullptr;
218 napi_create_string_utf8(env, name.c_str(), name.length(), &nameValue);
219 napi_create_string_utf8(env, type.c_str(), type.length(), &typeValue);
220
221 napi_value object = nullptr;
222 napi_create_object(env, &object);
223
224 napi_set_named_property(env, object, "name", nameValue);
225 napi_set_named_property(env, object, "type", typeValue);
226 argv[1] = object;
227
228 napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
229 uv_sleep(SELLP_MS);
230 napi_env newEnv = nullptr;
231 napi_create_runtime(env, &newEnv);
232 return result;
233 }
234
235 // worker terminate
Worker_Terminate(napi_env env,napi_value global)236 napi_value Worker_Terminate(napi_env env, napi_value global)
237 {
238 std::string funcName = "Terminate";
239 napi_value cb = nullptr;
240 napi_value result = nullptr;
241 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::Terminate, nullptr, &cb);
242 napi_call_function(env, global, cb, 0, nullptr, &result);
243 return result;
244 }
245
246 // worker WorkerConstructor
247 HWTEST_F(WorkersTest, WorkerConstructorTest001, testing::ext::TestSize.Level0)
248 {
249 napi_env env = (napi_env)engine_;
250 napi_value global;
251 napi_get_global(env, &global);
252
253 napi_value result = nullptr;
254 result = Worker_Constructor(env, global);
255
256 Worker* worker = nullptr;
257 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
258 std::string nameResult = worker->GetName();
259 ASSERT_EQ(nameResult, "WorkerThread");
260 std::string scriptResult = worker->GetScript();
261 ASSERT_EQ(scriptResult, "entry/ets/workers/@worker.ts");
262 worker->EraseWorker();
263 result = Worker_Terminate(env, global);
264
265 ASSERT_TRUE(result != nullptr);
266 }
267
268 //worker PostMessage
269 HWTEST_F(WorkersTest, PostMessageTest001, testing::ext::TestSize.Level0)
270 {
271 napi_env env = (napi_env)engine_;
272 napi_value global;
273 napi_get_global(env, &global);
274
275 napi_value result = nullptr;
276 result = Worker_Constructor(env, global);
277
278 Worker* worker = nullptr;
279 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
280
281 napi_value argv[1] = { nullptr };
282 std::string message = "host";
283 napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
284 std::string funcName = "PostMessage";
285 napi_value cb = nullptr;
286 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessage, worker, &cb);
287 UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
288 napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
289 worker->EraseWorker();
290 result = Worker_Terminate(env, global);
291 ASSERT_TRUE(result != nullptr);
292 }
293
294 //worker PostMessage
295 HWTEST_F(WorkersTest, PostMessageTest002, testing::ext::TestSize.Level0)
296 {
297 napi_env env = (napi_env)engine_;
298 napi_value global;
299 napi_get_global(env, &global);
300
301 napi_value result = nullptr;
302 result = Worker_Constructor(env, global);
303 Worker* worker = nullptr;
304 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
305
306 napi_value argv[1] = { nullptr };
307 std::string message = "host";
308 napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
309
310 std::string funcName = "PostMessage";
311 napi_value cb = nullptr;
312
313 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessage, nullptr, &cb);
314 napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
315
316 worker->EraseWorker();
317 result = Worker_Terminate(env, global);
318 ASSERT_TRUE(result != nullptr);
319 }
320
321 //worker PostMessage
322 HWTEST_F(WorkersTest, PostMessageTest003, testing::ext::TestSize.Level0)
323 {
324 napi_env env = (napi_env)engine_;
325 napi_value global;
326 napi_get_global(env, &global);
327
328 napi_value result = nullptr;
329 result = Worker_Constructor(env, global);
330
331 Worker* worker = nullptr;
332 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
333 worker->UpdateWorkerState(Worker::RunnerState::TERMINATED);
334
335 napi_value argv[1] = { nullptr };
336 std::string message = "host";
337 napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
338 std::string funcName = "PostMessage";
339 napi_value cb = nullptr;
340 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessage, worker, &cb);
341 napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
342
343 uv_async_t* req = new uv_async_t;
344 req->data = worker;
345 Worker::WorkerOnMessage(req);
346
347 worker->EraseWorker();
348 result = Worker_Terminate(env, global);
349 ASSERT_TRUE(result != nullptr);
350 }
351
352 //worker PostMessage
353 HWTEST_F(WorkersTest, PostMessageToHostTest001, testing::ext::TestSize.Level0)
354 {
355 napi_env env = (napi_env)engine_;
356 napi_value global;
357 napi_get_global(env, &global);
358
359 napi_value result = nullptr;
360 result = Worker_Constructor(env, global);
361
362 Worker* worker = nullptr;
363 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
364 napi_value argv[1] = { nullptr };
365 std::string message = "host";
366 napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
367
368 std::string funcName = "PostMessageToHost";
369 napi_value cb = nullptr;
370 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessageToHost, worker, &cb);
371 UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
372 napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
373 uv_async_t* req = new uv_async_t;
374 req->data = worker;
375 Worker::HostOnMessage(req);
376
377 worker->EraseWorker();
378 result = Worker_Terminate(env, global);
379 ASSERT_TRUE(result != nullptr);
380 }
381
382 //worker PostMessageToHost
383 HWTEST_F(WorkersTest, PostMessageToHostTest002, testing::ext::TestSize.Level0)
384 {
385 napi_env env = (napi_env)engine_;
386 napi_value global;
387 napi_get_global(env, &global);
388
389 napi_value result = nullptr;
390 result = Worker_Constructor(env, global);
391 Worker* worker = nullptr;
392 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
393
394 napi_value argv[1] = { nullptr };
395 std::string message = "host";
396 napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
397
398 std::string funcName = "PostMessageToHost";
399 napi_value cb = nullptr;
400 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessageToHost, nullptr, &cb);
401 napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
402
403 worker->EraseWorker();
404 result = Worker_Terminate(env, global);
405 ASSERT_TRUE(result != nullptr);
406 }
407
408 //worker PostMessageToHost
409 HWTEST_F(WorkersTest, PostMessageToHostTest003, testing::ext::TestSize.Level0)
410 {
411 napi_env env = (napi_env)engine_;
412 napi_value global;
413 napi_get_global(env, &global);
414
415 napi_value arrayresult = nullptr;
416 ASSERT_CHECK_CALL(napi_create_object(env, &arrayresult));
417 ASSERT_CHECK_VALUE_TYPE(env, arrayresult, napi_object);
418 const char testStr[] = "1234567";
419 napi_value strAttribute = nullptr;
420 ASSERT_CHECK_CALL(napi_create_string_utf8(env, testStr, strlen(testStr), &strAttribute));
421 ASSERT_CHECK_VALUE_TYPE(env, strAttribute, napi_string);
422 ASSERT_CHECK_CALL(napi_set_named_property(env, arrayresult, "strAttribute", strAttribute));
423
424 napi_value retStrAttribute = nullptr;
425 ASSERT_CHECK_CALL(napi_get_named_property(env, arrayresult, "strAttribute", &retStrAttribute));
426 ASSERT_CHECK_VALUE_TYPE(env, retStrAttribute, napi_string);
427
428 int32_t testNumber = 12345; // 12345 : indicates any number
429 napi_value numberAttribute = nullptr;
430 ASSERT_CHECK_CALL(napi_create_int32(env, testNumber, &numberAttribute));
431 ASSERT_CHECK_VALUE_TYPE(env, numberAttribute, napi_number);
432 ASSERT_CHECK_CALL(napi_set_named_property(env, arrayresult, "numberAttribute", numberAttribute));
433
434 napi_value propNames = nullptr;
435 ASSERT_CHECK_CALL(napi_get_property_names(env, arrayresult, &propNames));
436 ASSERT_CHECK_VALUE_TYPE(env, propNames, napi_object);
437
438 napi_value result = nullptr;
439 result = Worker_Constructor(env, global);
440
441 Worker* worker = nullptr;
442 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
443 napi_value argv[2] = { nullptr };
444 std::string message = "";
445 napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
446 std::string funcName = "PostMessageToHost";
447 argv[1] = propNames;
448 napi_value cb = nullptr;
449 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessageToHost, worker, &cb);
450 UpdateWorkerState(worker, Worker::RunnerState::STARTING);
451 worker->UpdateWorkerState(Worker::RunnerState::RUNNING);
452 napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
453 worker->EraseWorker();
454 result = Worker_Terminate(env, global);
455 ASSERT_TRUE(result != nullptr);
456 }
457
458 //worker EventListener
459 HWTEST_F(WorkersTest, EventListenerTest001, testing::ext::TestSize.Level0)
460 {
461 napi_env env = (napi_env)engine_;
462 napi_value global;
463 napi_get_global(env, &global);
464 napi_value result = nullptr;
465 result = Worker_Constructor(env, global);
466 Worker* worker = nullptr;
467 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
468
469 napi_value argv[2] = {nullptr};
470 std::string message = "host";
471 napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
__anon81fda76e0202(napi_env env, napi_callback_info info) 472 auto func = [](napi_env env, napi_callback_info info) -> napi_value {
473 return nullptr;
474 };
475 napi_value funcValue = nullptr;
476 napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
477 argv[1] = funcValue;
478
479 std::string funcName = "On";
480 napi_value cb = nullptr;
481 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::On, worker, &cb);
482 napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
483
484 funcName = "Once";
485 cb = nullptr;
486 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::Once, worker, &cb);
487 napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
488
489 funcName = "AddEventListener";
490 cb = nullptr;
491 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::AddEventListener, worker, &cb);
492 napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
493
494 funcName = "RemoveEventListener";
495 cb = nullptr;
496 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::RemoveEventListener, worker, &cb);
497 napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
498
499 funcName = "Off";
500 cb = nullptr;
501 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::Off, worker, &cb);
502 napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
503
504 worker->EraseWorker();
505 result = Worker_Terminate(env, global);
506 ASSERT_TRUE(result != nullptr);
507 }
508
509 //worker EventListener
510 HWTEST_F(WorkersTest, EventListenerTest002, testing::ext::TestSize.Level0)
511 {
512 napi_env env = (napi_env)engine_;
513 napi_value global;
514 napi_get_global(env, &global);
515 napi_value result = nullptr;
516 result = Worker_Constructor(env, global);
517 Worker* worker = nullptr;
518 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
519 napi_value argv[3] = {nullptr};
520 std::string message = "host";
521 napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
__anon81fda76e0302(napi_env env, napi_callback_info info) 522 auto func = [](napi_env env, napi_callback_info info) -> napi_value {
523 return nullptr;
524 };
525 napi_value funcValue = nullptr;
526 napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
527 argv[1] = funcValue;
528 std::string funcName = "On";
529 napi_value cb = nullptr;
530 funcName = "Once";
531 cb = nullptr;
532 napi_value myobject = nullptr;
533 napi_create_object(env, &myobject);
534
535 argv[2] = myobject;
536 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::Once, worker, &cb);
537 UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
538 napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
539 worker->EraseWorker();
540 result = Worker_Terminate(env, global);
541 ASSERT_TRUE(result != nullptr);
542 }
543
544 //worker DispatchEvent
545 HWTEST_F(WorkersTest, DispatchEventTest001, testing::ext::TestSize.Level0)
546 {
547 napi_env env = (napi_env)engine_;
548 napi_value global;
549 napi_get_global(env, &global);
550 napi_value result = nullptr;
551 result = Worker_Constructor(env, global);
552 Worker* worker = nullptr;
553 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
554 napi_value argv1[2] = {nullptr};
555 std::string message = "host";
556 napi_create_string_utf8(env, message.c_str(), message.length(), &argv1[0]);
__anon81fda76e0402(napi_env env, napi_callback_info info) 557 auto func = [](napi_env env, napi_callback_info info) -> napi_value {
558 return nullptr;
559 };
560 napi_value funcValue = nullptr;
561 napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
562 argv1[1] = funcValue;
563
564 std::string funcName = "Once";
565 napi_value cb = nullptr;
566 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::Once, worker, &cb);
567 napi_call_function(env, global, cb, sizeof(argv1) / sizeof(argv1[0]), argv1, &result);
568 napi_value argv[1] = {nullptr};
569
570 napi_value typeValue = nullptr;
571 std::string type = "message";
572 napi_create_string_utf8(env, type.c_str(), type.length(), &typeValue);
573
574 napi_value object = nullptr;
575 napi_create_object(env, &object);
576 napi_set_named_property(env, object, "type", typeValue);
577 argv[0] = object;
578
579 funcName = "DispatchEvent";
580 cb = nullptr;
581 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::DispatchEvent, worker, &cb);
582 UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
583 napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
584 worker->EraseWorker();
585 result = Worker_Terminate(env, global);
586 ASSERT_TRUE(result != nullptr);
587 }
588
589 //worker ParentPortAddEventListener
590 HWTEST_F(WorkersTest, ParentPortAddEventListenerTest001, testing::ext::TestSize.Level0)
591 {
592 napi_env env = (napi_env)engine_;
593 napi_value global;
594 napi_get_global(env, &global);
595 napi_value result = nullptr;
596 result = Worker_Constructor(env, global);
597 Worker* worker = nullptr;
598 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
599 napi_value argv[3] = {nullptr};
600 std::string message = "host";
601 napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
__anon81fda76e0502(napi_env env, napi_callback_info info) 602 auto func = [](napi_env env, napi_callback_info info) -> napi_value {
603 return nullptr;
604 };
605
606 std::string funcName = "ParentPortAddEventListener";
607 napi_value cb = nullptr;
608 napi_value funcValue = nullptr;
609 napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
610 argv[1] = funcValue;
611 ASSERT_TRUE(funcValue != nullptr);
612 napi_value myobject = nullptr;
613 napi_create_object(env, &myobject);
614 argv[2] = myobject;
615 napi_value callResult = nullptr;
616 // ------- workerEnv---------
617 napi_create_function(env, funcName.c_str(), funcName.size(),
618 Worker::ParentPortAddEventListener, worker, &cb);
619 UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
620 napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
621 worker->EraseWorker();
622 result = Worker_Terminate(env, global);
623 ASSERT_TRUE(result != nullptr);
624 }
625
626 //worker ParentPortRemoveAllListener
627 HWTEST_F(WorkersTest, ParentPortRemoveAllListenerTest001, testing::ext::TestSize.Level0)
628 {
629 napi_env env = (napi_env)engine_;
630 napi_value global;
631 napi_get_global(env, &global);
632 napi_value result = nullptr;
633 result = Worker_Constructor(env, global);
634 Worker* worker = nullptr;
635 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
636 // ------- workerEnv---------
637 napi_env workerEnv = nullptr;
638 napi_create_runtime(env, &workerEnv);
639 napi_value workerGlobal = nullptr;
640 napi_get_global(workerEnv, &workerGlobal);
641 napi_value argv[1] = {nullptr};
642 std::string message = "host";
643 napi_create_string_utf8(workerEnv, message.c_str(), message.length(), &argv[0]);
644 std::string funcName = "ParentPortRemoveAllListener";
645 napi_value cb = nullptr;
646
647 napi_value callResult = nullptr;
648 // ------- workerEnv---------
649 napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
650 Worker::ParentPortRemoveAllListener, worker, &cb);
651 UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
652 napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
653 worker->EraseWorker();
654 result = Worker_Terminate(env, global);
655 ASSERT_TRUE(result != nullptr);
656 }
657
658 //worker ParentPortDispatchEvent
659 HWTEST_F(WorkersTest, ParentPortDispatchEventTest001, testing::ext::TestSize.Level0)
660 {
661 napi_env env = (napi_env)engine_;
662 napi_value global;
663 napi_get_global(env, &global);
664 napi_value result = nullptr;
665 result = Worker_Constructor(env, global);
666 Worker* worker = nullptr;
667 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
668 // ------- workerEnv---------
669 napi_env workerEnv = nullptr;
670 napi_create_runtime(env, &workerEnv);
671 napi_value workerGlobal = nullptr;
672 napi_get_global(workerEnv, &workerGlobal);
673
674 napi_value argv[1] = {nullptr};
675 napi_value objresult = nullptr;
676 napi_create_object(workerEnv, &objresult);
677 napi_value cb = nullptr;
678 std::string funcName = "ParentPortDispatchEvent";
679 napi_value messageKey = nullptr;
680 const char* messageKeyStr = "type";
681 napi_create_string_latin1(workerEnv, messageKeyStr, strlen(messageKeyStr), &messageKey);
682 napi_value messageValue = nullptr;
683 const char* messageValueStr = "message";
684 napi_create_string_latin1(workerEnv, messageValueStr, strlen(messageValueStr), &messageValue);
685 napi_set_property(workerEnv, objresult, messageKey, messageValue);
686 argv[0] = objresult;
687 napi_value callResult = nullptr;
688 // ------- workerEnv---------
689 napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
690 Worker::ParentPortDispatchEvent, worker, &cb);
691 UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
692 napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
693 worker->EraseWorker();
694 result = Worker_Terminate(env, global);
695 ASSERT_TRUE(result != nullptr);
696 }
697
698 //worker ParentPortRemoveEventListener
699 HWTEST_F(WorkersTest, ParentPortRemoveEventListenerTest001, testing::ext::TestSize.Level0)
700 {
701 napi_env env = (napi_env)engine_;
702 napi_value global;
703 napi_get_global(env, &global);
704 napi_value result = nullptr;
705 result = Worker_Constructor(env, global);
706 Worker* worker = nullptr;
707 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
708 // ------- workerEnv---------
709 napi_env workerEnv = nullptr;
710 napi_create_runtime(env, &workerEnv);
711 napi_value workerGlobal = nullptr;
712 napi_get_global(workerEnv, &workerGlobal);
713
714 napi_value argv[2] = {nullptr};
715 std::string message = "host";
716 napi_create_string_utf8(workerEnv, message.c_str(), message.length(), &argv[0]);
__anon81fda76e0602(napi_env env, napi_callback_info info) 717 auto func = [](napi_env env, napi_callback_info info) -> napi_value {
718 return nullptr;
719 };
720 std::string funcName = "ParentPortRemoveEventListener";
721 napi_value cb = nullptr;
722 napi_value funcValue = nullptr;
723 napi_create_function(workerEnv, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue);
724 argv[1] = funcValue;
725
726 napi_value callResult = nullptr;
727 // ------- workerEnv---------
728 napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
729 Worker::ParentPortRemoveEventListener, worker, &cb);
730 UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
731 napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
732 worker->EraseWorker();
733 result = Worker_Terminate(env, global);
734 ASSERT_TRUE(result != nullptr);
735 }
736
737 //worker GlobalCall
738 HWTEST_F(WorkersTest, GlobalCallTest001, testing::ext::TestSize.Level0)
739 {
740 napi_env env = (napi_env)engine_;
741 napi_value global;
742 napi_get_global(env, &global);
743 napi_value result = nullptr;
744 result = Worker_Constructor(env, global);
745 Worker* worker = nullptr;
746 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
747 // ------- workerEnv---------
748 napi_env workerEnv = nullptr;
749 napi_create_runtime(env, &workerEnv);
750 napi_value workerGlobal = nullptr;
751 napi_get_global(workerEnv, &workerGlobal);
752
753 napi_value argv[3] = {nullptr};
754 std::string instanceName = "host";
755 std::string methodName = "postMessage";
756 int32_t timeout = 300;
757 napi_create_string_utf8(workerEnv, instanceName.c_str(), instanceName.length(), &argv[0]);
758 napi_create_string_utf8(workerEnv, methodName.c_str(), methodName.length(), &argv[1]);
759 napi_create_int32(workerEnv, timeout, &argv[2]);
760
761 std::string funcName = "GlobalCall";
762 napi_value cb = nullptr;
763 napi_value callResult = nullptr;
764 // ------- workerEnv---------
765 napi_create_function(workerEnv, funcName.c_str(), funcName.size(),
766 Worker::GlobalCall, worker, &cb);
767 UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
768 napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
769 uv_async_t* req = new uv_async_t;
770 req->data = worker;
771 Worker::HostOnGlobalCall(req);
772 worker->EraseWorker();
773 result = Worker_Terminate(env, global);
774 ASSERT_TRUE(result != nullptr);
775 }
776
777 //messageQueue DeQueue_QUEUE_IS_NULL
778 HWTEST_F(WorkersTest, MessageQueueTest001, testing::ext::TestSize.Level0)
779 {
780 MessageQueue queue;
781 ASSERT_TRUE(queue.IsEmpty());
782 MessageDataType data = nullptr;
783 ASSERT_FALSE(queue.DeQueue(&data));
784 }
785
786 //messageQueue DeQueue_DATA_IS_NULL
787 HWTEST_F(WorkersTest, MessageQueueTest002, testing::ext::TestSize.Level0)
788 {
789 napi_env env = (napi_env)engine_;
790 MessageQueue queue;
791 MessageDataType data = nullptr;
792 napi_value undefined = NapiHelper::GetUndefinedValue(env);
793 napi_serialize_inner(env, undefined, undefined, undefined, false, true, &data);
794 queue.EnQueue(data);
795 ASSERT_TRUE(queue.DeQueue(nullptr));
796 queue.Clear(env);
797 }
798
799 //messageQueue MARKEDMESSAGEQUEUE
800 HWTEST_F(WorkersTest, MarkedMessageQueue001, testing::ext::TestSize.Level0)
801 {
802 napi_env env = (napi_env)engine_;
803 MarkedMessageQueue queue;
804 MessageDataType data = nullptr;
805 napi_value undefined = NapiHelper::GetUndefinedValue(env);
806 napi_serialize_inner(env, undefined, undefined, undefined, false, true, &data);
807 queue.Push(1, data);
808 queue.Pop();
809 ASSERT_TRUE(queue.IsEmpty());
810
811 MessageDataType dataType = nullptr;
812 napi_serialize_inner(env, undefined, undefined, undefined, false, true, &dataType);
813 queue.Push(2, dataType);
814 std::pair<uint32_t, MessageDataType> pair = queue.Front();
815 ASSERT_EQ(pair.first, 2);
816 queue.Clear(env);
817 ASSERT_TRUE(queue.IsEmpty());
818 }
819
820 HWTEST_F(WorkersTest, WorkerTest001, testing::ext::TestSize.Level0)
821 {
822 napi_env env = (napi_env)engine_;
823 napi_value global;
824 napi_get_global(env, &global);
825 napi_value result = nullptr;
826 result = Worker_Constructor(env, global);
827 Worker* worker = nullptr;
828 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
829 napi_env workerEnv = nullptr;
830 napi_create_runtime(env, &workerEnv);
831 napi_value exports = nullptr;
832 napi_create_object(workerEnv, &exports);
833 Worker::InitWorker(workerEnv, exports);
834 worker->EraseWorker();
835 result = Worker_Terminate(env, global);
836 ASSERT_TRUE(result != nullptr);
837 }
838
839 HWTEST_F(WorkersTest, WorkerTest002, testing::ext::TestSize.Level0)
840 {
841 napi_env env = (napi_env)engine_;
842 napi_value global;
843 napi_get_global(env, &global);
844 napi_value result = nullptr;
845 result = Worker_Constructor(env, global);
846 Worker* worker = nullptr;
847 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
848
849 napi_value argv[2] = {nullptr};
850 std::string instanceName = "MainThread";
851 napi_create_string_utf8(env, instanceName.c_str(), instanceName.length(), &argv[0]);
852 napi_value obj = nullptr;
853 napi_create_object(env, &obj);
854 argv[1] = obj;
855
856 std::string funcName = "RegisterGlobalCallObject";
857 napi_value cb = nullptr;
858 napi_value callResult = nullptr;
859 // ------- workerEnv---------
860 napi_create_function(env, funcName.c_str(), funcName.size(),
861 Worker::RegisterGlobalCallObject, worker, &cb);
862 UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
863 napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
864 worker->EraseWorker();
865 result = Worker_Terminate(env, global);
866 ASSERT_TRUE(result != nullptr);
867 }
868
869 HWTEST_F(WorkersTest, WorkerTest003, 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
879 napi_value argv[1] = {nullptr};
880 std::string instanceName = "MainThread";
881 napi_create_string_utf8(env, instanceName.c_str(), instanceName.length(), &argv[0]);
882
883 std::string funcName = "UnregisterGlobalCallObject";
884 napi_value cb = nullptr;
885 napi_value callResult = nullptr;
886 // ------- workerEnv---------
887 napi_create_function(env, funcName.c_str(), funcName.size(),
888 Worker::UnregisterGlobalCallObject, worker, &cb);
889 UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
890 napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &callResult);
891 worker->EraseWorker();
892 result = Worker_Terminate(env, global);
893 ASSERT_TRUE(result != nullptr);
894 }
895
896 HWTEST_F(WorkersTest, WorkerTest004, testing::ext::TestSize.Level0)
897 {
898 napi_env env = (napi_env)engine_;
899 napi_env workerEnv = nullptr;
900 napi_create_runtime(env, &workerEnv);
901 napi_value workerGlobal = nullptr;
902 napi_get_global(workerEnv, &workerGlobal);
903 NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
904 std::string funcName = "LimitedWorkerConstructor";
905 napi_value cb = nullptr;
906 napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::LimitedWorkerConstructor, nullptr, &cb);
907
908 napi_value result = nullptr;
909 napi_value argv[2] = { nullptr };
910 std::string script = "entry/ets/workers/@worker.ts";
911 napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
912 std::string type = "classic";
913 std::string name = "WorkerThread";
914 napi_value typeValue = nullptr;
915 napi_value nameValue = nullptr;
916 napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
917 napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
918
919 napi_value object = nullptr;
920 napi_create_object(workerEnv, &object);
921
922 napi_set_named_property(workerEnv, object, "name", nameValue);
923 napi_set_named_property(workerEnv, object, "type", typeValue);
924 argv[1] = object;
925
926 napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
927 uv_sleep(200);
928 Worker* worker = nullptr;
929 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
930 worker->EraseWorker();
931 result = Worker_Terminate(workerEnv, workerGlobal);
932 NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
933 ASSERT_TRUE(result != nullptr);
934 }
935
936 HWTEST_F(WorkersTest, WorkerTest005, testing::ext::TestSize.Level0)
937 {
938 napi_env env = (napi_env)engine_;
939 napi_env workerEnv = nullptr;
940 napi_create_runtime(env, &workerEnv);
941 napi_value workerGlobal = nullptr;
942 napi_get_global(workerEnv, &workerGlobal);
943 NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
944 std::string funcName = "ThreadWorkerConstructor";
945 napi_value cb = nullptr;
946 napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
947
948 napi_value result = nullptr;
949 napi_value argv[2] = { nullptr };
950 std::string script = "entry/ets/workers/@worker.ts";
951 napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
952 std::string type = "classic";
953 std::string name = "WorkerThread";
954 napi_value typeValue = nullptr;
955 napi_value nameValue = nullptr;
956 napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
957 napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
958
959 napi_value object = nullptr;
960 napi_create_object(workerEnv, &object);
961
962 napi_set_named_property(workerEnv, object, "name", nameValue);
963 napi_set_named_property(workerEnv, object, "type", typeValue);
964 argv[1] = object;
965
966 napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
967 uv_sleep(200);
968 Worker* worker = nullptr;
969 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
970 worker->EraseWorker();
971 result = Worker_Terminate(workerEnv, workerGlobal);
972 NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
973 ASSERT_TRUE(result != nullptr);
974 }
975
976 HWTEST_F(WorkersTest, WorkerTest006, testing::ext::TestSize.Level0)
977 {
978 napi_env env = (napi_env)engine_;
979 napi_value global;
980 napi_get_global(env, &global);
981
982 napi_value result = nullptr;
983 result = Worker_Constructor(env, global);
984
985 Worker* worker = nullptr;
986 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
987
988 napi_value argv[1] = { nullptr };
989 std::string message = "host";
990 napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
991 std::string funcName = "PostMessageWithSharedSendable";
992 napi_value cb = nullptr;
993 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessageWithSharedSendable, worker, &cb);
994 UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
995 napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
996
997 worker->EraseWorker();
998 result = Worker_Terminate(env, global);
999 ASSERT_TRUE(result != nullptr);
1000 }
1001
1002 HWTEST_F(WorkersTest, WorkerTest007, testing::ext::TestSize.Level0)
1003 {
1004 napi_env env = (napi_env)engine_;
1005 napi_value global;
1006 napi_get_global(env, &global);
1007
1008 napi_value result = nullptr;
1009 result = Worker_Constructor(env, global);
1010
1011 Worker* worker = nullptr;
1012 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1013
1014 napi_value argv[1] = { nullptr };
1015
1016 std::string funcName = "RemoveAllListener";
1017 napi_value cb = nullptr;
1018 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::RemoveAllListener, worker, &cb);
1019 UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1020 napi_call_function(env, global, cb, 1, argv, &result);
1021 worker->EraseWorker();
1022 result = Worker_Terminate(env, global);
1023 ASSERT_TRUE(result != nullptr);
1024 }
1025
1026 HWTEST_F(WorkersTest, WorkerTest008, testing::ext::TestSize.Level0)
1027 {
1028 napi_env env = (napi_env)engine_;
1029 napi_value global;
1030 napi_get_global(env, &global);
1031
1032 napi_value result = nullptr;
1033 result = Worker_Constructor(env, global);
1034
1035 Worker* worker = nullptr;
1036 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1037
1038 napi_value argv[1] = { nullptr };
1039 std::string message = "host";
1040 napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
1041
1042 std::string funcName = "CancelTask";
1043 napi_value cb = nullptr;
1044 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::CancelTask, worker, &cb);
1045 UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1046 napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1047 worker->EraseWorker();
1048 result = Worker_Terminate(env, global);
1049 ASSERT_TRUE(result != nullptr);
1050 }
1051
1052 HWTEST_F(WorkersTest, WorkerTest009, testing::ext::TestSize.Level0)
1053 {
1054 napi_env env = (napi_env)engine_;
1055 napi_value global;
1056 napi_get_global(env, &global);
1057
1058 napi_value result = nullptr;
1059 result = Worker_Constructor(env, global);
1060
1061 Worker* worker = nullptr;
1062 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1063 napi_value argv[1] = { nullptr };
1064 std::string message = "host";
1065 napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
1066
1067 std::string funcName = "PostMessageWithSharedSendableToHost";
1068 napi_value cb = nullptr;
1069 napi_create_function(env, funcName.c_str(), funcName.size(),
1070 Worker::PostMessageWithSharedSendableToHost, worker, &cb);
1071 UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1072 napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1073 uv_async_t* req = new uv_async_t;
1074 req->data = worker;
1075 Worker::HostOnMessage(req);
1076
1077 worker->EraseWorker();
1078 result = Worker_Terminate(env, global);
1079 ASSERT_TRUE(result != nullptr);
1080 }
1081
1082 HWTEST_F(WorkersTest, WorkerTest010, testing::ext::TestSize.Level0)
1083 {
1084 napi_env env = (napi_env)engine_;
1085 napi_value global;
1086 napi_get_global(env, &global);
1087
1088 napi_value result = nullptr;
1089 result = Worker_Constructor(env, global);
1090
1091 Worker* worker = nullptr;
1092 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1093 napi_value argv[1] = { nullptr };
1094 std::string message = "host";
1095 napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
1096
1097 std::string funcName = "ParentPortCancelTask";
1098 napi_value cb = nullptr;
1099 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::ParentPortCancelTask, worker, &cb);
1100 UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1101 napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1102 worker->EraseWorker();
1103 result = Worker_Terminate(env, global);
1104 ASSERT_TRUE(result != nullptr);
1105 }
1106
1107 HWTEST_F(WorkersTest, WorkerTest011, testing::ext::TestSize.Level0)
1108 {
1109 napi_env env = (napi_env)engine_;
1110 napi_value global;
1111 napi_get_global(env, &global);
1112
1113 napi_value result = nullptr;
1114 result = Worker_Constructor(env, global);
1115
1116 Worker* worker = nullptr;
1117 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1118 UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1119 uv_async_t* req = new uv_async_t;
1120 req->data = nullptr;
1121 Worker::HostOnError(req);
1122 req->data = worker;
1123 Worker::HostOnError(req);
1124 worker->EraseWorker();
1125 ASSERT_TRUE(result != nullptr);
1126 }
1127
1128 //worker PostMessage
1129 HWTEST_F(WorkersTest, WorkerTest012, testing::ext::TestSize.Level0)
1130 {
1131 napi_env env = (napi_env)engine_;
1132 napi_value global;
1133 napi_get_global(env, &global);
1134
1135 napi_value result = nullptr;
1136 result = Worker_Constructor(env, global);
1137
1138 Worker* worker = nullptr;
1139 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1140
1141 napi_value argv[1] = { nullptr };
1142 std::string message = "host";
1143 napi_create_string_utf8(env, message.c_str(), message.length(), &argv[0]);
1144 std::string funcName = "PostMessage";
1145 napi_value cb = nullptr;
1146 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::PostMessage, worker, &cb);
1147 UpdateWorkerState(worker, Worker::RunnerState::RUNNING);
1148 napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1149
1150 worker->EraseWorker();
1151 result = Worker_Terminate(env, global);
1152 ASSERT_TRUE(result != nullptr);
1153 }
1154
1155
1156 HWTEST_F(WorkersTest, CloseWorkerTest001, testing::ext::TestSize.Level0)
1157 {
1158 napi_env env = (napi_env)engine_;
1159 napi_value global;
1160 napi_get_global(env, &global);
1161 napi_value result = nullptr;
1162 std::string funcName = "CloseWorker";
1163 napi_value cb = nullptr;
1164 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::CloseWorker, nullptr, &cb);
1165 napi_call_function(env, global, cb, 0, nullptr, &result);
1166 ASSERT_TRUE(result != nullptr);
1167 }
1168
1169 HWTEST_F(WorkersTest, CloseWorkerTest002, testing::ext::TestSize.Level0)
1170 {
1171 napi_env env = (napi_env)engine_;
1172 napi_value global;
1173 napi_get_global(env, &global);
1174
1175 napi_value result = nullptr;
1176 result = Worker_Constructor(env, global);
1177
1178 Worker* worker = nullptr;
1179 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1180 ASSERT_TRUE(worker != nullptr);
1181
1182 std::string funcName = "CloseWorker";
1183 napi_value cb = nullptr;
1184 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::CloseWorker, worker, &cb);
1185 SetCloseWorkerProp(worker, env);
1186 napi_call_function(env, global, cb, 0, nullptr, &result);
1187 worker->EraseWorker();
1188 ASSERT_TRUE(result != nullptr);
1189 }
1190
1191 HWTEST_F(WorkersTest, InitWorkerTest001, testing::ext::TestSize.Level0)
1192 {
1193 napi_env env = (napi_env)engine_;
1194 napi_value exports = nullptr;
1195 napi_create_object(env, &exports);
1196 Worker::InitWorker(env, exports);
1197 ASSERT_TRUE(exports != nullptr);
1198 }
1199
1200 HWTEST_F(WorkersTest, InitWorkerTest002, testing::ext::TestSize.Level0)
1201 {
1202 napi_env env = (napi_env)engine_;
1203 napi_env workerEnv = nullptr;
1204 napi_create_runtime(env, &workerEnv);
1205 napi_value workerGlobal = nullptr;
1206 napi_get_global(workerEnv, &workerGlobal);
1207 NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
1208 std::string funcName = "ThreadWorkerConstructor";
1209 napi_value cb = nullptr;
1210 napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
1211
1212 napi_value result = nullptr;
1213 napi_value argv[2] = { nullptr };
1214 std::string script = "entry/ets/workers/@worker.ts";
1215 napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
1216 std::string type = "classic";
1217 std::string name = "WorkerThread";
1218 napi_value typeValue = nullptr;
1219 napi_value nameValue = nullptr;
1220 napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
1221 napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
1222
1223 napi_value object = nullptr;
1224 napi_create_object(workerEnv, &object);
1225
1226 napi_set_named_property(workerEnv, object, "name", nameValue);
1227 napi_set_named_property(workerEnv, object, "type", typeValue);
1228 argv[1] = object;
1229
1230 napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1231 uv_sleep(200);
1232 Worker* worker = nullptr;
1233 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1234 ASSERT_TRUE(worker != nullptr);
1235 worker->SetWorkerEnv(workerEnv);
1236 NativeEngine* workerEngine = reinterpret_cast<NativeEngine*>(workerEnv);
1237 workerEngine->MarkRestrictedWorkerThread();
1238 napi_value exports = nullptr;
1239 napi_create_object(env, &exports);
1240 Worker::InitWorker(workerEnv, exports);
1241 worker->EraseWorker();
1242 NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
1243 ASSERT_TRUE(result != nullptr);
1244 }
1245
1246 HWTEST_F(WorkersTest, InitWorkerTest003, testing::ext::TestSize.Level0)
1247 {
1248 napi_env env = (napi_env)engine_;
1249 napi_env workerEnv = nullptr;
1250 napi_create_runtime(env, &workerEnv);
1251 napi_value workerGlobal = nullptr;
1252 napi_get_global(workerEnv, &workerGlobal);
1253 NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
1254 std::string funcName = "ThreadWorkerConstructor";
1255 napi_value cb = nullptr;
1256 napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
1257
1258 napi_value result = nullptr;
1259 napi_value argv[2] = { nullptr };
1260 std::string script = "entry/ets/workers/@worker.ts";
1261 napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
1262 std::string type = "classic";
1263 std::string name = "WorkerThread";
1264 napi_value typeValue = nullptr;
1265 napi_value nameValue = nullptr;
1266 napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
1267 napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
1268
1269 napi_value object = nullptr;
1270 napi_create_object(workerEnv, &object);
1271
1272 napi_set_named_property(workerEnv, object, "name", nameValue);
1273 napi_set_named_property(workerEnv, object, "type", typeValue);
1274 argv[1] = object;
1275
1276 napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1277
1278 uv_sleep(200);
1279 Worker* worker = new Worker(env, nullptr);
1280 napi_wrap(env, result, worker, nullptr, nullptr, nullptr);
1281 worker->SetWorkerEnv(workerEnv);
1282 NativeEngine* workerEngine = reinterpret_cast<NativeEngine*>(workerEnv);
1283 workerEngine->MarkTaskPoolThread();
1284 napi_value exports = nullptr;
1285 napi_create_object(env, &exports);
1286 Worker::InitWorker(workerEnv, exports);
1287 worker->EraseWorker();
1288 NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
1289 ASSERT_TRUE(result != nullptr);
1290 }
1291
1292 HWTEST_F(WorkersTest, InitWorkerTest004, testing::ext::TestSize.Level0)
1293 {
1294 napi_env env = (napi_env)engine_;
1295 napi_env workerEnv = nullptr;
1296 napi_create_runtime(env, &workerEnv);
1297 napi_value workerGlobal = nullptr;
1298 napi_get_global(workerEnv, &workerGlobal);
1299 NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
1300 std::string funcName = "ThreadWorkerConstructor";
1301 napi_value cb = nullptr;
1302 napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
1303
1304 napi_value result = nullptr;
1305 napi_value argv[2] = { nullptr };
1306 std::string script = "entry/ets/workers/@worker.ts";
1307 napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
1308 std::string type = "classic";
1309 std::string name = "WorkerThread";
1310 napi_value typeValue = nullptr;
1311 napi_value nameValue = nullptr;
1312 napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
1313 napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
1314
1315 napi_value object = nullptr;
1316 napi_create_object(workerEnv, &object);
1317
1318 napi_set_named_property(workerEnv, object, "name", nameValue);
1319 napi_set_named_property(workerEnv, object, "type", typeValue);
1320 argv[1] = object;
1321
1322 napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1323
1324 uv_sleep(200);
1325 Worker* worker = nullptr;
1326 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1327 worker->SetWorkerEnv(workerEnv);
1328 NativeEngine* workerEngine = reinterpret_cast<NativeEngine*>(workerEnv);
1329 workerEngine->MarkWorkerThread();
1330 napi_value exports = nullptr;
1331 napi_create_object(workerEnv, &exports);
1332 Worker::InitWorker(workerEnv, exports);
1333 worker->EraseWorker();
1334 NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
1335 ASSERT_TRUE(result != nullptr);
1336 }
1337
1338 HWTEST_F(WorkersTest, InitWorkerTest005, testing::ext::TestSize.Level0)
1339 {
1340 napi_env env = (napi_env)engine_;
1341 napi_env workerEnv = nullptr;
1342 napi_create_runtime(env, &workerEnv);
1343 napi_value workerGlobal = nullptr;
1344 napi_get_global(workerEnv, &workerGlobal);
1345 NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
1346
1347 std::string funcName = "LimitedWorkerConstructor";
1348 napi_value cb = nullptr;
1349 napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::LimitedWorkerConstructor, nullptr, &cb);
1350
1351 napi_value result = nullptr;
1352 napi_value argv[2] = { nullptr };
1353 std::string script = "entry/ets/workers/@worker.ts";
1354 napi_create_string_utf8(workerEnv, script.c_str(), script.length(), &argv[0]);
1355 std::string type = "classic";
1356 std::string name = "WorkerThread";
1357 napi_value typeValue = nullptr;
1358 napi_value nameValue = nullptr;
1359 napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
1360 napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
1361
1362 napi_value object = nullptr;
1363 napi_create_object(workerEnv, &object);
1364
1365 napi_set_named_property(workerEnv, object, "name", nameValue);
1366 napi_set_named_property(workerEnv, object, "type", typeValue);
1367 argv[1] = object;
1368
1369 napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1370
1371 uv_sleep(200);
1372 Worker* worker = nullptr;
1373 napi_unwrap(env, result, reinterpret_cast<void**>(&worker));
1374 worker->SetWorkerEnv(workerEnv);
1375 NativeEngine* workerEngine = reinterpret_cast<NativeEngine*>(workerEnv);
1376 workerEngine->MarkRestrictedWorkerThread();
1377 napi_value exports = nullptr;
1378 napi_create_object(workerEnv, &exports);
1379 Worker::InitWorker(workerEnv, exports);
1380 worker->EraseWorker();
1381 NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
1382 ASSERT_TRUE(result != nullptr);
1383 }
1384
1385 HWTEST_F(WorkersTest, ConstructorTest001, testing::ext::TestSize.Level0)
1386 {
1387 napi_env env = WorkersTest::GetEnv();
1388 Worker *worker = new Worker(env, nullptr);
1389 ASSERT_TRUE(worker != nullptr);
1390 napi_env hostEnv = worker->GetHostEnv();
1391 ASSERT_TRUE(env == hostEnv);
1392 napi_env workerEnv = worker->GetWorkerEnv();
1393 ASSERT_TRUE(workerEnv == nullptr);
1394 delete worker;
1395 worker = nullptr;
1396 }
1397
1398 HWTEST_F(WorkersTest, ConstructorTest002, testing::ext::TestSize.Level0)
1399 {
1400 napi_env env = (napi_env)engine_;
1401 napi_value global = nullptr;
1402 napi_get_global(env, &global);
1403
1404 std::string funcName = "LimitedWorkerConstructor";
1405 napi_value cb = nullptr;
1406 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::LimitedWorkerConstructor, nullptr, &cb);
1407
1408 napi_value result = nullptr;
1409 napi_value argv[2] = { nullptr };
1410 std::string script = "entry/ets/workers/@worker.ts";
1411 napi_create_string_utf8(env, script.c_str(), script.length(), &argv[0]);
1412 std::string type = "classic";
1413 std::string name = "WorkerThread";
1414 napi_value typeValue = nullptr;
1415 napi_value nameValue = nullptr;
1416 napi_create_string_utf8(env, name.c_str(), name.length(), &nameValue);
1417 napi_create_string_utf8(env, type.c_str(), type.length(), &typeValue);
1418
1419 napi_value object = nullptr;
1420 napi_create_object(env, &object);
1421
1422 napi_set_named_property(env, object, "name", nameValue);
1423 napi_set_named_property(env, object, "type", typeValue);
1424 argv[1] = object;
1425
1426 napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1427 uv_sleep(200);
1428 ASSERT_TRUE(result == nullptr);
1429 }
1430
1431 HWTEST_F(WorkersTest, ConstructorTest003, testing::ext::TestSize.Level0)
1432 {
1433 napi_env env = (napi_env)engine_;
1434 napi_value global = nullptr;
1435 napi_get_global(env, &global);
1436
1437 std::string funcName = "ThreadWorkerConstructor";
1438 napi_value cb = nullptr;
1439 napi_create_function(env, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
1440
1441 napi_value result = nullptr;
1442 napi_value argv[2] = { nullptr };
1443 std::string script = "entry/ets/workers/@worker.ts";
1444 napi_create_string_utf8(env, script.c_str(), script.length(), &argv[0]);
1445 std::string type = "classic";
1446 std::string name = "WorkerThread";
1447 napi_value typeValue = nullptr;
1448 napi_value nameValue = nullptr;
1449 napi_create_string_utf8(env, name.c_str(), name.length(), &nameValue);
1450 napi_create_string_utf8(env, type.c_str(), type.length(), &typeValue);
1451
1452 napi_value object = nullptr;
1453 napi_create_object(env, &object);
1454
1455 napi_set_named_property(env, object, "name", nameValue);
1456 napi_set_named_property(env, object, "type", typeValue);
1457 argv[1] = object;
1458
1459 napi_call_function(env, global, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1460 uv_sleep(200);
1461 ASSERT_TRUE(result == nullptr);
1462 }
1463
1464 HWTEST_F(WorkersTest, ConstructorTest004, testing::ext::TestSize.Level0)
1465 {
1466 napi_env env = (napi_env)engine_;
1467 napi_env workerEnv = nullptr;
1468 napi_create_runtime(env, &workerEnv);
1469 napi_value workerGlobal = nullptr;
1470 napi_get_global(workerEnv, &workerGlobal);
1471 NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
1472 std::string funcName = "ThreadWorkerConstructor";
1473 napi_value cb = nullptr;
1474 napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
1475
1476 napi_value result = nullptr;
1477 napi_call_function(workerEnv, workerGlobal, cb, 0, nullptr, &result);
1478 uv_sleep(200);
1479 NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
1480 ASSERT_TRUE(result == nullptr);
1481 }
1482
1483 HWTEST_F(WorkersTest, ConstructorTest005, testing::ext::TestSize.Level0)
1484 {
1485 napi_env env = (napi_env)engine_;
1486 napi_env workerEnv = nullptr;
1487 napi_create_runtime(env, &workerEnv);
1488 napi_value workerGlobal = nullptr;
1489 napi_get_global(workerEnv, &workerGlobal);
1490 NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::OLD, WorkerVersion::NONE);
1491 std::string funcName = "ThreadWorkerConstructor";
1492 napi_value cb = nullptr;
1493 napi_create_function(workerEnv, funcName.c_str(), funcName.size(), Worker::ThreadWorkerConstructor, nullptr, &cb);
1494
1495 napi_value result = nullptr;
1496 napi_value argv[2] = { nullptr };
1497 int32_t script = 200;
1498 napi_create_int32(workerEnv, script, &argv[0]);
1499 std::string type = "classic";
1500 std::string name = "WorkerThread";
1501 napi_value typeValue = nullptr;
1502 napi_value nameValue = nullptr;
1503 napi_create_string_utf8(workerEnv, name.c_str(), name.length(), &nameValue);
1504 napi_create_string_utf8(workerEnv, type.c_str(), type.length(), &typeValue);
1505
1506 napi_value object = nullptr;
1507 napi_create_object(workerEnv, &object);
1508
1509 napi_set_named_property(workerEnv, object, "name", nameValue);
1510 napi_set_named_property(workerEnv, object, "type", typeValue);
1511 argv[1] = object;
1512
1513 napi_call_function(workerEnv, workerGlobal, cb, sizeof(argv) / sizeof(argv[0]), argv, &result);
1514 NativeEngine::GetMainThreadEngine()->CheckAndSetWorkerVersion(WorkerVersion::NEW, WorkerVersion::OLD);
1515 uv_sleep(200);
1516 ASSERT_TRUE(result == nullptr);
1517 }
1518
1519 HWTEST_F(WorkersTest, PostMessageTest004, testing::ext::TestSize.Level0)
1520 {
1521 napi_env env = WorkersTest::GetEnv();
1522 Worker *worker = new Worker(env, nullptr);
1523 UpdateMainThreadWorkerFlag(worker, false);
1524 ASSERT_TRUE(worker != nullptr);
1525 uv_loop_t *loop = nullptr;
1526 napi_status status = napi_get_uv_event_loop(env, &loop);
1527 ASSERT_TRUE(status == napi_ok);
1528 InitHostHandle(worker, loop);
1529
1530 std::thread t(WorkerThreadFunction, worker);
1531 t.detach();
1532 uint32_t number = 200; // 200 : test number
1533 napi_value numVal = nullptr;
1534 status = napi_create_uint32(env, number, &numVal);
1535 ASSERT_TRUE(status == napi_ok);
1536 void *data = nullptr;
1537 napi_value undefined = nullptr;
1538 napi_get_undefined(env, &undefined);
1539 status = napi_serialize(env, numVal, undefined, undefined, &data);
1540 ASSERT_TRUE(status == napi_ok);
1541 uv_sleep(1000); // 1000 : for post and receive message
1542 PostMessage(worker, data);
1543 uv_sleep(1000); // 1000 : for post and receive message
1544 }