1484543d1Sopenharmony_ci/* 2484543d1Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3484543d1Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4484543d1Sopenharmony_ci * you may not use this file except in compliance with the License. 5484543d1Sopenharmony_ci * You may obtain a copy of the License at 6484543d1Sopenharmony_ci * 7484543d1Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8484543d1Sopenharmony_ci * 9484543d1Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10484543d1Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11484543d1Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12484543d1Sopenharmony_ci * See the License for the specific language governing permissions and 13484543d1Sopenharmony_ci * limitations under the License. 14484543d1Sopenharmony_ci */ 15484543d1Sopenharmony_ci 16484543d1Sopenharmony_ci#include <gtest/gtest.h> 17484543d1Sopenharmony_ci#include "ffrt_inner.h" 18484543d1Sopenharmony_ci#include "dfx/bbox/bbox.h" 19484543d1Sopenharmony_ci#include "c/queue_ext.h" 20484543d1Sopenharmony_ci#include "../common.h" 21484543d1Sopenharmony_ci 22484543d1Sopenharmony_ciusing namespace ffrt; 23484543d1Sopenharmony_ci 24484543d1Sopenharmony_ciextern void SaveTheBbox(); 25484543d1Sopenharmony_ci 26484543d1Sopenharmony_ciusing namespace testing; 27484543d1Sopenharmony_ci#ifdef HWTEST_TESTING_EXT_ENABLE 28484543d1Sopenharmony_ciusing namespace testing::ext; 29484543d1Sopenharmony_ci#endif 30484543d1Sopenharmony_ci 31484543d1Sopenharmony_ciclass DfxTest : public testing::Test { 32484543d1Sopenharmony_ciprotected: 33484543d1Sopenharmony_ci static void SetUpTestCase() 34484543d1Sopenharmony_ci { 35484543d1Sopenharmony_ci } 36484543d1Sopenharmony_ci 37484543d1Sopenharmony_ci static void TearDownTestCase() 38484543d1Sopenharmony_ci { 39484543d1Sopenharmony_ci } 40484543d1Sopenharmony_ci 41484543d1Sopenharmony_ci virtual void SetUp() 42484543d1Sopenharmony_ci { 43484543d1Sopenharmony_ci } 44484543d1Sopenharmony_ci 45484543d1Sopenharmony_ci virtual void TearDown() 46484543d1Sopenharmony_ci { 47484543d1Sopenharmony_ci } 48484543d1Sopenharmony_ci}; 49484543d1Sopenharmony_ci 50484543d1Sopenharmony_ciHWTEST_F(DfxTest, bboxtest, TestSize.Level1) 51484543d1Sopenharmony_ci{ 52484543d1Sopenharmony_ci SaveTheBbox(); 53484543d1Sopenharmony_ci} 54484543d1Sopenharmony_ci 55484543d1Sopenharmony_ciHWTEST_F(DfxTest, tracetest, TestSize.Level1) 56484543d1Sopenharmony_ci{ 57484543d1Sopenharmony_ci int x = 0; 58484543d1Sopenharmony_ci ffrt::submit( 59484543d1Sopenharmony_ci [&]() { 60484543d1Sopenharmony_ci ffrt::set_trace_tag("task"); 61484543d1Sopenharmony_ci x++; 62484543d1Sopenharmony_ci ffrt::clear_trace_tag(); 63484543d1Sopenharmony_ci }, {}, {}); 64484543d1Sopenharmony_ci ffrt::wait(); 65484543d1Sopenharmony_ci EXPECT_EQ(x, 1); 66484543d1Sopenharmony_ci} 67484543d1Sopenharmony_ci 68484543d1Sopenharmony_cistatic struct sigaction s_oldSa[SIGSYS + 1]; // SIGSYS = 31 69484543d1Sopenharmony_ci 70484543d1Sopenharmony_cistatic void SignalHandler(int signo, siginfo_t* info, void* context __attribute__((unused))) 71484543d1Sopenharmony_ci{ 72484543d1Sopenharmony_ci SaveTheBbox(); 73484543d1Sopenharmony_ci 74484543d1Sopenharmony_ci // we need to deregister our signal handler for that signal before continuing. 75484543d1Sopenharmony_ci sigaction(signo, &s_oldSa[signo], nullptr); 76484543d1Sopenharmony_ci} 77484543d1Sopenharmony_ci 78484543d1Sopenharmony_cistatic void SignalReg(int signo) 79484543d1Sopenharmony_ci{ 80484543d1Sopenharmony_ci sigaction(signo, nullptr, &s_oldSa[signo]); 81484543d1Sopenharmony_ci struct sigaction newAction; 82484543d1Sopenharmony_ci newAction.sa_flags = SA_RESTART | SA_SIGINFO; 83484543d1Sopenharmony_ci newAction.sa_sigaction = SignalHandler; 84484543d1Sopenharmony_ci sigaction(signo, &newAction, nullptr); 85484543d1Sopenharmony_ci} 86484543d1Sopenharmony_ci 87484543d1Sopenharmony_ciHWTEST_F(DfxTest, queue_dfx_bbox_normal_task_0001, TestSize.Level1) 88484543d1Sopenharmony_ci{ 89484543d1Sopenharmony_ci // 异常信号用例,测试bbox功能正常; 90484543d1Sopenharmony_ci int x = 0; 91484543d1Sopenharmony_ci ffrt::mutex lock; 92484543d1Sopenharmony_ci 93484543d1Sopenharmony_ci pid_t pid = fork(); 94484543d1Sopenharmony_ci if (!pid) { 95484543d1Sopenharmony_ci printf("pid = %d, thread id= %d start\n", getpid(), pid); 96484543d1Sopenharmony_ci 97484543d1Sopenharmony_ci auto basic1Func = [&]() { 98484543d1Sopenharmony_ci lock.lock(); 99484543d1Sopenharmony_ci ffrt_usleep(2000); 100484543d1Sopenharmony_ci x = x + 1; 101484543d1Sopenharmony_ci lock.unlock(); 102484543d1Sopenharmony_ci }; 103484543d1Sopenharmony_ci 104484543d1Sopenharmony_ci auto basic2Func = [&]() { 105484543d1Sopenharmony_ci ffrt_usleep(3000); 106484543d1Sopenharmony_ci SignalReg(SIGABRT); 107484543d1Sopenharmony_ci raise(SIGABRT); // 向自身进程发送SIGABR 108484543d1Sopenharmony_ci }; 109484543d1Sopenharmony_ci 110484543d1Sopenharmony_ci auto basic3Func = [&]() { 111484543d1Sopenharmony_ci ffrt_usleep(5000); 112484543d1Sopenharmony_ci x = x + 1; 113484543d1Sopenharmony_ci }; 114484543d1Sopenharmony_ci 115484543d1Sopenharmony_ci for (int i = 0; i < 20; i++) { 116484543d1Sopenharmony_ci ffrt::submit(basic1Func, {}, {}, ffrt::task_attr().qos(static_cast<int>(ffrt::qos_default))); 117484543d1Sopenharmony_ci } 118484543d1Sopenharmony_ci for (int i = 0; i < 10; i++) { 119484543d1Sopenharmony_ci ffrt::submit(basic3Func, {}, {}, ffrt::task_attr().qos(static_cast<int>(ffrt::qos_default))); 120484543d1Sopenharmony_ci } 121484543d1Sopenharmony_ci auto task = ffrt::submit_h(basic2Func, {}, {}, ffrt::task_attr().qos(static_cast<int>(ffrt::qos_background))); 122484543d1Sopenharmony_ci 123484543d1Sopenharmony_ci ffrt::wait({task}); 124484543d1Sopenharmony_ci printf("pid = %d, thread id= %d end\n", getpid(), pid); 125484543d1Sopenharmony_ci exit(0); 126484543d1Sopenharmony_ci } 127484543d1Sopenharmony_ci sleep(1); 128484543d1Sopenharmony_ci} 129484543d1Sopenharmony_ci 130484543d1Sopenharmony_ciHWTEST_F(DfxTest, queue_dfx_bbox_queue_task_0001, TestSize.Level1) 131484543d1Sopenharmony_ci{ 132484543d1Sopenharmony_ci // 异常信号用例,测试bbox功能正常; 133484543d1Sopenharmony_ci int x = 0; 134484543d1Sopenharmony_ci ffrt::mutex lock; 135484543d1Sopenharmony_ci 136484543d1Sopenharmony_ci pid_t pid = fork(); 137484543d1Sopenharmony_ci if (!pid) { 138484543d1Sopenharmony_ci printf("pid = %d, thread id= %d start\n", getpid(), pid); 139484543d1Sopenharmony_ci ffrt_queue_attr_t queue_attr; 140484543d1Sopenharmony_ci ffrt_queue_attr_t queue_attr2; 141484543d1Sopenharmony_ci (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须 142484543d1Sopenharmony_ci ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr); 143484543d1Sopenharmony_ci (void)ffrt_queue_attr_init(&queue_attr2); // 初始化属性,必须 144484543d1Sopenharmony_ci ffrt_queue_t queue_handle2 = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr2); 145484543d1Sopenharmony_ci std::function<void()> basic1Func = [&]() { 146484543d1Sopenharmony_ci lock.lock(); 147484543d1Sopenharmony_ci ffrt_usleep(5000); 148484543d1Sopenharmony_ci x = x + 1; 149484543d1Sopenharmony_ci lock.unlock(); 150484543d1Sopenharmony_ci }; 151484543d1Sopenharmony_ci 152484543d1Sopenharmony_ci auto basic3Func = [&]() { 153484543d1Sopenharmony_ci lock.lock(); 154484543d1Sopenharmony_ci sleep(2); 155484543d1Sopenharmony_ci lock.unlock(); 156484543d1Sopenharmony_ci }; 157484543d1Sopenharmony_ci 158484543d1Sopenharmony_ci auto task = ffrt::submit_h(basic3Func, {}, {}, ffrt::task_attr().qos(static_cast<int>(ffrt::qos_background))); 159484543d1Sopenharmony_ci ffrt_queue_submit(queue_handle, create_function_wrapper(basic1Func, ffrt_function_kind_queue), nullptr); 160484543d1Sopenharmony_ci ffrt_queue_submit(queue_handle2, create_function_wrapper(basic1Func, ffrt_function_kind_queue), nullptr); 161484543d1Sopenharmony_ci 162484543d1Sopenharmony_ci SaveTheBbox(); 163484543d1Sopenharmony_ci ffrt::wait({task}); 164484543d1Sopenharmony_ci ffrt_queue_attr_destroy(&queue_attr); 165484543d1Sopenharmony_ci ffrt_queue_destroy(queue_handle); 166484543d1Sopenharmony_ci ffrt_queue_attr_destroy(&queue_attr2); 167484543d1Sopenharmony_ci ffrt_queue_destroy(queue_handle2); 168484543d1Sopenharmony_ci printf("pid = %d, thread id= %d end\n", getpid(), pid); 169484543d1Sopenharmony_ci exit(0); 170484543d1Sopenharmony_ci } 171484543d1Sopenharmony_ci sleep(1); 172484543d1Sopenharmony_ci} 173