1/* 2 * Copyright (c) 2020-2021 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 <stdio.h> 17#include <unistd.h> 18#include <string.h> 19#include <stdlib.h> 20#include <setjmp.h> 21#include <time.h> 22#include <sys/time.h> 23#include <sys/resource.h> 24 25#include "gtest/gtest.h" 26#include "XtsActsUtil.h" 27 28using namespace testing::ext; 29 30class ActsProcessApiTest : public testing::Test { 31protected: 32 // SetUpTestCase: Testsuit setup, run before 1st testcase 33 static void SetUpTestCase(void) 34 { 35 } 36 // TearDownTestCase: Testsuit teardown, run after last testcase 37 static void TearDownTestCase(void) 38 { 39 } 40 // Testcase setup 41 virtual void SetUp() 42 { 43 errno = 0; 44 } 45 // Testcase teardown 46 virtual void TearDown() 47 { 48 } 49}; 50 51jmp_buf g_buf; 52void TestLongjmp01(void) 53{ 54 LogPrint(" TestLongjmp() Start\n"); 55 _longjmp(g_buf, 1); 56 LogPrint(" TestLongjmp() End\n"); 57} 58 59void TestLongjmp02(void) 60{ 61 LogPrint(" TestLongjmp() Start\n"); 62 longjmp(g_buf, 1); 63 LogPrint(" TestLongjmp() End\n"); 64} 65 66static void *ThreadFunc(void* arg) 67{ 68 LogPrint(" This is ThreadFunc()\n"); 69 return nullptr; 70} 71 72/** 73* @tc.number SUB_KERNEL_NDKAPI_PROCESS_LONGJMP_0100 74* @tc.name test _longjmp api 75* @tc.desc [C- SOFTWARE -0200] 76*/ 77HWTEST_F(ActsProcessApiTest, testLongjmp0100, Function | MediumTest | Level1) { 78 int flagVal = 1; 79 80 if (setjmp(g_buf)) { 81 LogPrint(" back TestLongjmp()\n"); 82 flagVal = 0; 83 } else { 84 LogPrint(" first time to setjmp\n"); 85 flagVal = 1; 86 TestLongjmp01(); 87 } 88 89 EXPECT_EQ(flagVal, 0) << "ErrInfo: _longjmp fail."; 90} 91 92/** 93* @tc.number SUB_KERNEL_NDKAPI_PROCESS_LONGJMP_0200 94* @tc.name test longjmp api 95* @tc.desc [C- SOFTWARE -0200] 96*/ 97HWTEST_F(ActsProcessApiTest, testLongjmp0200, Function | MediumTest | Level1) { 98 int flagVal = 1; 99 100 if (setjmp(g_buf)) { 101 LogPrint(" back TestLongjmp()\n"); 102 flagVal = 0; 103 } else { 104 LogPrint(" first time to setjmp\n"); 105 flagVal = 1; 106 TestLongjmp02(); 107 } 108 109 EXPECT_EQ(flagVal, 0) << "ErrInfo: longjmp fail."; 110} 111 112/** 113* @tc.number SUB_KERNEL_NDKAPI_PROCESS_SETJMP_0100 114* @tc.name test _setjmp api 115* @tc.desc [C- SOFTWARE -0200] 116*/ 117HWTEST_F(ActsProcessApiTest, testSetjmp0100, Function | MediumTest | Level1) { 118 int returnVal; 119 120 returnVal = _setjmp(g_buf); 121 LogPrint(" _setjmp env:='struct jmp_buf', --> returnVal:='%d'\n", returnVal); 122 123 if (returnVal != 0) { 124 LogPrint(" back testLongjmp()\n"); 125 ASSERT_NE(returnVal, 0) << "ErrInfo: second time _setjmp EQ 0, --> returnVal:='" << returnVal << "'"; 126 } else { 127 LogPrint(" first time to setjmp\n"); 128 ASSERT_EQ(returnVal, 0) << "ErrInfo: first time _setjmp not EQ 0, --> returnVal:='" << returnVal << "'"; 129 TestLongjmp01(); 130 } 131} 132 133/** 134* @tc.number SUB_KERNEL_NDKAPI_PROCESS_SETJMP_0200 135* @tc.name test setjmp api 136* @tc.desc [C- SOFTWARE -0200] 137*/ 138HWTEST_F(ActsProcessApiTest, testSetjmp0200, Function | MediumTest | Level1) { 139 int returnVal; 140 141 returnVal = setjmp(g_buf); 142 LogPrint(" setjmp env:='struct jmp_buf', returnVal:='%d'\n", returnVal); 143 144 if (returnVal != 0) { 145 LogPrint(" back testLongjmp()\n"); 146 ASSERT_NE(returnVal, 0) << "ErrInfo: second time setjmp EQ 0, --> returnVal:='" << returnVal << "'"; 147 } else { 148 LogPrint(" first time to setjmp\n"); 149 ASSERT_EQ(returnVal, 0) << "ErrInfo: first time setjmp not EQ 0, --> returnVal:='" << returnVal << "'"; 150 TestLongjmp02(); 151 } 152} 153 154/** 155* @tc.number SUB_KERNEL_NDKAPI_PROCESS_PTHREAD_SETNAME_NP_0100 156* @tc.name test pthread_setname_np api 157* @tc.desc [C- SOFTWARE -0200] 158*/ 159HWTEST_F(ActsProcessApiTest, testPthreadSetnameNp0100, Function | MediumTest | Level1) { 160 pthread_t thisThread; 161 int returnVal; 162 163 thisThread = pthread_self(); 164 LogPrint(" pthread_self(), --> return pthread_t:='%u(0x%x)'\n", 165 (unsigned int)thisThread, (unsigned int)thisThread); 166 167 returnVal = pthread_setname_np(thisThread, "funcThreadName"); 168 LogPrint(" pthread_setname_np thread:='%u(0x%x)' *name:='funcThreadName', " 169 "--> returnVal:='%d'\n", thisThread, thisThread, returnVal); 170 171 EXPECT_EQ(returnVal, 0) 172 << "ErrInfo: pthread_setname_np thread:='" << thisThread 173 << "(0x" << thisThread << ")' *name:='funcThreadName', " 174 << "--> returnVal:='" << returnVal << "'"; 175} 176 177/** 178* @tc.number SUB_KERNEL_NDKAPI_PROCESS_PTHREAD_SETNAME_NP_1000 179* @tc.name test pthread_setname_np api para stringlong 180* @tc.desc [C- SOFTWARE -0200] 181*/ 182HWTEST_F(ActsProcessApiTest, testPthreadSetnameNp1000, Function | MediumTest | Level1) { 183 pthread_t thisThread; 184 int returnVal; 185 186 thisThread = pthread_self(); 187 LogPrint(" pthread_self(), --> return pthread_t:='%u(0x%x)'\n", 188 (unsigned int)thisThread, (unsigned int)thisThread); 189 190 returnVal = pthread_setname_np(thisThread, "funcThreadNamelongName"); 191 LogPrint(" pthread_setname_np thread:='%u(0x%x)' *name:='funcThreadNamelongName', " 192 "--> returnVal:='%d'\n", thisThread, thisThread, returnVal); 193 194 EXPECT_NE(returnVal, 0) 195 << "ErrInfo: pthread_setname_np thread:='" << thisThread 196 << "(0x" << thisThread << ")' *name:='funcThreadNamelongName'," 197 << " --> returnVal:='" << returnVal << "'"; 198 EXPECT_EQ(returnVal, ERANGE) 199 << "ErrInfo: pthread_setname_np thread:='" << thisThread 200 << "(0x" << thisThread << ")' *name:='funcThreadNamelongName'," 201 << " --> returnVal:='" << returnVal << "'"; 202} 203 204/** 205* @tc.number SUB_KERNEL_NDKAPI_PROCESS_PTHREAD_SETNAME_NP_1100 206* @tc.name test pthread_setname_np api para notsupport 207* @tc.desc [C- SOFTWARE -0200] 208*/ 209HWTEST_F(ActsProcessApiTest, testPthreadSetnameNp1100, Function | MediumTest | Level1) { 210 pthread_t newThread; 211 int returnVal; 212 213 returnVal = pthread_create(&newThread, NULL, ThreadFunc, NULL); 214 LogPrint(" pthread_create *thread:='&newThread' *attr:='NULL' *start_routine:='ThreadFunc' arg:='NULL', \n"); 215 LogPrint(" --> returnVal:='%d', newThread:='%u(0x%x)', size:=%d\n", 216 returnVal, newThread, newThread, sizeof(newThread)); 217 218 returnVal = pthread_setname_np(newThread, "fThreadName"); 219 LogPrint(" pthread_setname_np thread:='%u(0x%x)' *name:='fThreadName', " 220 "--> returnVal:='%d'\n", newThread, newThread, returnVal); 221 222 EXPECT_NE(returnVal, 0) 223 << "ErrInfo: pthread_setname_np thread:='" << newThread 224 << "(0x" << newThread << ")' *name:='fThreadName'," 225 << " --> returnVal:='" << returnVal << "'"; 226 EXPECT_EQ(pthread_join(newThread, nullptr), 0) << "pthread join errno = " << errno; 227} 228 229/** 230* @tc.number SUB_KERNEL_NDKAPI_PROCESS_PTHREAD_ATTR_GETGUARDSIZE_0100 231* @tc.name test pthread_attr_getguardsize api 232* @tc.desc [C- SOFTWARE -0200] 233*/ 234HWTEST_F(ActsProcessApiTest, testPthreadAttrGetguardsize0100, Function | MediumTest | Level1) { 235 pthread_t newThread; 236 pthread_attr_t threadAttr = {}; 237 int returnVal; 238 239 returnVal = pthread_create(&newThread, &threadAttr, ThreadFunc, NULL); 240 LogPrint(" pthread_create *thread:='&newThread' *attr:='&threadAttr' " 241 "*start_routine:='ThreadFunc' arg:='NULL', \n"); 242 LogPrint(" --> returnVal:='%d',newThread:='%u(0x%x)'\n", returnVal, newThread, newThread); 243 244 size_t guardsize; 245 returnVal = pthread_attr_getguardsize(&threadAttr, &guardsize); 246 LogPrint(" pthread_attr_getguardsize attr:='&threadAttr' guardsize:='&guardsize'," 247 " --> returnVal:='%d', guardsize:='%d'\n", returnVal, guardsize); 248 249 EXPECT_EQ(returnVal, 0) 250 << "ErrInfo: pthread_attr_getguardsize attr:='&threadAttr' guardsize:='&guardsize'," 251 << " --> returnVal:='" << returnVal << "', guardsize:='" << guardsize << "'"; 252 253 returnVal = pthread_attr_setguardsize(&threadAttr, 4096); 254 LogPrint(" pthread_attr_setguardsize attr:='&threadAttr' guardsize:='4096'," 255 " --> returnVal:='%d', guardsize:='%d'\n", returnVal, guardsize); 256 257 returnVal = pthread_attr_getguardsize(&threadAttr, &guardsize); 258 LogPrint(" pthread_attr_getguardsize attr:='&threadAttr' guardsize:='&guardsize'," 259 " --> returnVal:='%d', guardsize:='%d'\n", returnVal, guardsize); 260 261 EXPECT_EQ(returnVal, 0) 262 << "ErrInfo: pthread_attr_getguardsize attr:='&threadAttr' guardsize:='&guardsize'," 263 << " --> returnVal:='" << returnVal << "', guardsize:='" << guardsize << "'"; 264 EXPECT_EQ(guardsize, 4096) 265 << "ErrInfo: pthread_attr_getguardsize attr:='&threadAttr' guardsize:='&guardsize'," 266 << " --> returnVal:='" << returnVal << "', guardsize:='" << guardsize << "'"; 267 EXPECT_EQ(pthread_join(newThread, nullptr), 0) << "pthread join errno = " << errno; 268} 269