1 /* 2 * Copyright (c) 2023-2024 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 #ifndef TEST_CONVERTXML_UNITTEST_TEST_H 17 #define TEST_CONVERTXML_UNITTEST_TEST_H 18 19 #include "native_engine.h" 20 21 #include "gtest/gtest.h" 22 #include <string> 23 24 #if defined(ENABLE_TASKPOOL_FFRT) 25 #include "c/executor_task.h" 26 #include "ffrt_inner.h" 27 #endif 28 29 namespace Commonlibrary::Concurrent::TaskPoolModule { 30 class Worker; 31 class NativeEngineTest : public testing::Test { 32 public: 33 NativeEngineTest(); 34 virtual ~NativeEngineTest(); SetUp()35 void SetUp() override {} TearDown()36 void TearDown() override {} 37 38 static napi_value IsConcurrent(napi_env env, napi_value argv[], size_t argc); 39 static napi_value GetTaskPoolInfo(napi_env env, napi_value argv[], size_t argc); 40 static napi_value TerminateTask(napi_env env, napi_value argv[], size_t argc); 41 static napi_value Execute(napi_env env, napi_value argv[], size_t argc); 42 static napi_value ExecuteDelayed(napi_env env, napi_value argv[], size_t argc); 43 static napi_value Cancel(napi_env env, napi_value argv[], size_t argc); 44 static void DelayTask(uv_timer_t* handle); 45 static napi_value ExecuteGroup(napi_env env, napi_value taskGroup); 46 static napi_value ExecutePeriodically(napi_env env, napi_value argv[], size_t argc); 47 static void PeriodicTaskCallback(uv_timer_t* handle); 48 static void UpdateGroupInfoByResult(napi_env env, uv_timer_t* handle, napi_value res, bool success); 49 50 static void TaskGroupDestructor(napi_env env, void* data); 51 static void SequenceRunnerDestructor(napi_env env, void* data); 52 static void TryTriggerExpand(); 53 static void CheckForBlockedWorkers(napi_env env); 54 static void TriggerShrink(napi_env env); 55 static void foo(const uv_async_t* req); 56 static void NotifyShrink(napi_env env); 57 static void TryExpand(napi_env env); 58 static void CancelTask(napi_env env); 59 static void NotifyWorkerIdle(napi_env env); 60 static void EnqueueTaskId(napi_env env); 61 static void GetTaskByPriority(napi_env env); 62 static void RestoreWorker(napi_env env); 63 static void StoreDependentId(uint32_t taskId, uint32_t dependentId); 64 static void StoreDependentTaskId(uint32_t taskId, uint32_t dependentId); 65 static void StoreTaskDuration(uint32_t taskId); 66 static void InitTaskManager(napi_env env); 67 static void NotifyDependencyTaskInfo(napi_env env); 68 static void StoreTaskDependency(napi_env env); 69 static void RemoveTaskDependency(napi_env env); 70 static void ReleaseTaskData(napi_env env); 71 static void CheckTask(napi_env env); 72 static void CancelGroupTask(napi_env env); 73 static void TriggerSeqRunner(napi_env env); 74 static void UpdateGroupState(napi_env env); 75 static void ReleaseWorkerHandles(napi_env env); 76 static void DebuggerOnPostTask(napi_env env); 77 static void PerformTask(napi_env env); 78 static void PerformTask(napi_env env, void* data); 79 static void NotifyHandleTaskResult(napi_env env); 80 static void TaskResultCallback(napi_env env); 81 static void HandleFunctionResult(napi_env env); 82 static void* WorkerConstructor(napi_env env); 83 static pid_t GetWorkerTid(uv_timer_t* handle); 84 static void WorkerPostTask(napi_env env); 85 static void ResetTaskManager(); 86 static void CheckAndCreateAsyncRunner(napi_env env, napi_value name, napi_value runningCapacity, 87 napi_value waitingCapacity); 88 static void AsyncRunnerDestructor(napi_env env, void* data); 89 static void AddTasksToAsyncRunner(void* asyncData, void* taskData); 90 static void RemoveSequenceRunnerByName(std::string name); 91 static void RemoveSequenceRunner(uint64_t seqId); 92 static void StoreTaskId(Worker* worker, uint32_t taskId); 93 static void RemoveTaskId(Worker* worker, uint32_t taskId); 94 static bool FindTaskId(Worker* worker, uint32_t taskId); 95 static void GetIdleTaskByPriority(napi_env env); 96 static void WorkerRunningScope(napi_env env); 97 static void SetNonIdleTaskNum(uint32_t num); 98 static void EnqueueTaskIdToQueue(void* data); 99 static void DecreaseTaskNum(); 100 static void ResetPerformIdleState(napi_env env); 101 static void SetTotalTaskNum(uint32_t num); 102 static void ExecuteOnReceiveDataCallback(void* callbackInfo, void* resultInfo); 103 static void TriggerTask(void* data, bool isCancel); 104 105 class ExceptionScope { 106 public: ExceptionScope(napi_env env)107 explicit ExceptionScope(napi_env env) : env_(env) {} ~ExceptionScope()108 ~ExceptionScope() 109 { 110 napi_value exception = nullptr; 111 napi_get_and_clear_last_exception(env_, &exception); 112 } 113 private: 114 napi_env env_ = nullptr; 115 }; 116 117 protected: 118 NativeEngine* engine_ = nullptr; 119 }; 120 121 class SendableUtils { 122 public: 123 SendableUtils() = default; 124 ~SendableUtils() = default; 125 126 static napi_value CreateSendableClass(napi_env env); 127 static napi_value CreateSendableInstance(napi_env env); 128 static napi_value Foo(napi_env env, napi_callback_info info); 129 static napi_value Bar(napi_env env, napi_callback_info info); 130 }; 131 } // namespace Commonlibrary::Concurrent::TaskPoolModule 132 #endif // TEST_CONVERTXML_UNITTEST_TEST_H