From 587f3f4bc42266e308fd746a5e15a80b9667f138 Mon Sep 17 00:00:00 2001 From: zhuruigan Date: Tue, 1 Jul 2025 10:48:47 +0800 Subject: [PATCH] test-ut Signed-off-by: zhuruigan Change-Id: I4d9fc62b5e1e83045b010f3b137bca977e17dddf --- .../taskpool/async_runner_manager.cpp | 18 ++++++---- js_concurrent_module/taskpool/test/test.cpp | 33 ++++++++++++++++--- js_concurrent_module/taskpool/test/test.h | 2 ++ .../taskpool/test/test_taskpool.cpp | 22 ++++++++++++- 4 files changed, 62 insertions(+), 13 deletions(-) diff --git a/js_concurrent_module/taskpool/async_runner_manager.cpp b/js_concurrent_module/taskpool/async_runner_manager.cpp index e1b91b4f..47b8f08f 100644 --- a/js_concurrent_module/taskpool/async_runner_manager.cpp +++ b/js_concurrent_module/taskpool/async_runner_manager.cpp @@ -33,23 +33,25 @@ AsyncRunner* AsyncRunnerManager::CreateOrGetGlobalRunner(napi_env env, napi_valu uint32_t runningCapacity, uint32_t waitingCapacity) { AsyncRunner *asyncRunner = nullptr; + bool isNew = false; { std::unique_lock lock(globalAsyncRunnerMutex_); auto iter = globalAsyncRunner_.find(name); if (iter == globalAsyncRunner_.end()) { asyncRunner = AsyncRunner::CreateGlobalRunner(name, runningCapacity, waitingCapacity); globalAsyncRunner_.emplace(name, asyncRunner); + isNew = true; } else { asyncRunner = iter->second; bool res = asyncRunner->CheckGlobalRunnerParams(env, runningCapacity, waitingCapacity); if (!res) { return nullptr; } - if (!FindRunnerAndRef(asyncRunner->asyncRunnerId_)) { - return nullptr; - } } } + if (!isNew && !FindRunnerAndRef(asyncRunner->asyncRunnerId_)) { + return nullptr; + } return asyncRunner; } @@ -150,14 +152,16 @@ bool AsyncRunnerManager::FindRunnerAndRef(uint64_t asyncRunnerId) bool AsyncRunnerManager::UnrefAndDestroyRunner(AsyncRunner* asyncRunner) { - std::unique_lock lock(asyncRunnersMutex_); - if (asyncRunner->DecreaseAsyncCount() != 0) { - return false; + { + std::unique_lock lock(asyncRunnersMutex_); + if (asyncRunner->DecreaseAsyncCount() != 0) { + return false; + } + RemoveAsyncRunner(asyncRunner->asyncRunnerId_); } if (asyncRunner->isGlobalRunner_) { RemoveGlobalAsyncRunner(asyncRunner->name_); } - RemoveAsyncRunner(asyncRunner->asyncRunnerId_); delete asyncRunner; asyncRunner = nullptr; return true; diff --git a/js_concurrent_module/taskpool/test/test.cpp b/js_concurrent_module/taskpool/test/test.cpp index 31e29e1a..f5d946da 100755 --- a/js_concurrent_module/taskpool/test/test.cpp +++ b/js_concurrent_module/taskpool/test/test.cpp @@ -1001,22 +1001,45 @@ void NativeEngineTest::PerformTask(napi_env env, void* data) id = taskManager.taskQueues_[i]->DequeueTaskId(); } } - taskManager.workers_.clear(); - taskManager.idleWorkers_.clear(); Worker* worker = reinterpret_cast(WorkerConstructor(env)); napi_env workerEnv = nullptr; napi_create_runtime(env, &workerEnv); worker->workerEnv_ = workerEnv; - taskManager.workers_.insert(worker); - taskManager.idleWorkers_.insert(worker); Task* task = reinterpret_cast(data); taskManager.StoreTask(task); taskManager.SetIsPerformIdle(false); taskManager.taskQueues_[task->asyncTaskPriority_]->EnqueueTaskId(task->taskId_); - uv_async_t* req = new uv_async_t; req->data = worker; Worker::PerformTask(req); usleep(100000); // 100000: is sleep 100ms } + +void NativeEngineTest::GetIdleTaskByPriority(napi_env env) +{ + TaskManager& taskManager = TaskManager::GetInstance(); + uint32_t id = 0; + for (size_t i = 0; i < taskManager.taskQueues_.size(); i++) { + id = taskManager.taskQueues_[i]->DequeueTaskId(); + while (id != 0) { + id = taskManager.taskQueues_[i]->DequeueTaskId(); + } + } + Task* task = new Task(); + taskManager.StoreTask(task); + auto& taskQueue = taskManager.taskQueues_[Priority::IDLE]; + taskQueue->EnqueueTaskId(task->taskId_); + taskManager.GetTaskByPriority(taskQueue, Priority::IDLE); + taskManager.SetIsPerformIdle(false); + taskManager.tasks_.clear(); + delete task; +} + +void NativeEngineTest::WorkerRunningScope(napi_env env) +{ + Worker* worker = reinterpret_cast(WorkerConstructor(env)); + worker->priority_ = Priority::IDLE; + worker->workerEnv_ = env; + Worker::RunningScope runningScope(worker); +} } // namespace Commonlibrary::Concurrent::TaskPoolModule \ No newline at end of file diff --git a/js_concurrent_module/taskpool/test/test.h b/js_concurrent_module/taskpool/test/test.h index d4a13135..80255132 100644 --- a/js_concurrent_module/taskpool/test/test.h +++ b/js_concurrent_module/taskpool/test/test.h @@ -92,6 +92,8 @@ public: static void StoreTaskId(Worker* worker, uint32_t taskId); static void RemoveTaskId(Worker* worker, uint32_t taskId); static bool FindTaskId(Worker* worker, uint32_t taskId); + static void GetIdleTaskByPriority(napi_env env); + static void WorkerRunningScope(napi_env env); class ExceptionScope { public: diff --git a/js_concurrent_module/taskpool/test/test_taskpool.cpp b/js_concurrent_module/taskpool/test/test_taskpool.cpp index e6edd99e..3bd68d88 100644 --- a/js_concurrent_module/taskpool/test/test_taskpool.cpp +++ b/js_concurrent_module/taskpool/test/test_taskpool.cpp @@ -6388,10 +6388,30 @@ HWTEST_F(NativeEngineTest, TaskpoolTest314, testing::ext::TestSize.Level0) uint32_t taskId = taskManager.CalculateTaskId(reinterpret_cast(task)); task->taskId_ = taskId; task->isValid_ = false; - task->asyncTaskPriority_ = Priority::IDLE; + task->asyncTaskPriority_ = Priority::MEDIUM; void* data = reinterpret_cast(task); NativeEngineTest::PerformTask(env, data); napi_value exception = nullptr; napi_get_and_clear_last_exception(env, &exception); ASSERT_TRUE(exception == nullptr); +} + +HWTEST_F(NativeEngineTest, TaskpoolTest315, testing::ext::TestSize.Level0) +{ + napi_env env = (napi_env)engine_; + ExceptionScope scope(env); + NativeEngineTest::GetIdleTaskByPriority(env); + napi_value exception = nullptr; + napi_get_and_clear_last_exception(env, &exception); + ASSERT_TRUE(exception == nullptr); +} + +HWTEST_F(NativeEngineTest, TaskpoolTest316, testing::ext::TestSize.Level0) +{ + napi_env env = (napi_env)engine_; + ExceptionScope scope(env); + NativeEngineTest::WorkerRunningScope(env); + napi_value exception = nullptr; + napi_get_and_clear_last_exception(env, &exception); + ASSERT_TRUE(exception == nullptr); } \ No newline at end of file -- Gitee