1/* 2 * Copyright (C) 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 */ 15import faultlogger from '@ohos.faultLogger' 16import hiSysEvent from '@ohos.hiSysEvent' 17import faultloggerTestNapi from "libfaultlogger_test_napi_xts.so" 18import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium' 19export default function FaultlogJsTest() { 20 21describe("FaultlogJsTest", function () { 22 beforeAll(function() { 23 console.info('FaultlogJsTest beforeAll called') 24 }) 25 26 afterAll(function() { 27 console.info('FaultlogJsTest afterAll called') 28 }) 29 30 beforeEach(function() { 31 console.info('FaultlogJsTest beforeEach called') 32 }) 33 34 afterEach(function() { 35 console.info('FaultlogJsTest afterEach called') 36 }) 37 38 async function msleep(time) { 39 let timeoutID = null; 40 let promise = new Promise((resolve, reject) => { 41 timeoutID = setTimeout(() => resolve("done!"), time) 42 }); 43 let result = await promise; 44 clearTimeout(timeoutID); 45 } 46 47 function BeginSubscriptionOnEvent(domainName, eventName, onEventCallback) { 48 let watchRules = [{ 49 domain: domainName, 50 name: eventName, 51 ruleType: hiSysEvent.RuleType.WHOLE_WORD, 52 }] 53 let watcher = { 54 rules: watchRules, 55 onEvent: (info) => { 56 onEventCallback(info) 57 }, 58 onServiceDied: () => { 59 // do something here. 60 } 61 } 62 try { 63 hiSysEvent.addWatcher(watcher) 64 } catch (err) { 65 console.error(`>>> error code: ${err.code}, error msg: ${err.message}`); 66 expect(false).assertTrue(); 67 } 68 return watcher 69 } 70 71 function EndSubscriptionOnEvent(watcher) { 72 try { 73 hiSysEvent.removeWatcher(watcher) 74 } catch (err) { 75 console.error(`>>> error code: ${err.code}, error msg: ${err.message}`); 76 expect(false).assertTrue(); 77 } 78 } 79 80 /** 81 * @tc.number test_0200 82 * @tc.name DFX_DFR_Faultlogger_Interface_0200 83 * @tc.desc 检验函数参数输入错误时程序是否会崩溃 84 * @tc.size MediumTest 85 * @tc.type Function 86 * @tc.level Level2 87 */ 88 it('DFX_DFR_Faultlogger_Interface_0200', 0, async function (done) { 89 console.info("---------------------------DFX_DFR_Faultlogger_Interface_0200----------------------------------"); 90 try { 91 let ret1 = faultlogger.querySelfFaultLog("faultloggertestsummary01"); 92 console.info("DFX_DFR_Faultlogger_Interface_0200 ret1 == " + ret1); 93 expect(ret1).assertEqual(undefined); 94 95 let ret2 = faultlogger.querySelfFaultLog(faultlogger.FaultType.JS_CRASH, "faultloggertestsummary01"); 96 console.info("DFX_DFR_Faultlogger_Interface_0200 ret2 == " + ret2); 97 expect(ret2).assertEqual(undefined); 98 99 let ret3 = faultlogger.querySelfFaultLog(); 100 console.info("DFX_DFR_Faultlogger_Interface_0200 ret3 == " + ret3); 101 expect(ret3).assertEqual(undefined); 102 done(); 103 return; 104 } catch(err) { 105 console.info(err); 106 } 107 expect(false).assertTrue(); 108 done(); 109 }) 110 111 /** 112 * @tc.number test_0400 113 * @tc.name DFX_DFR_Faultlogger_Interface_0400 114 * @tc.desc 检验promise同步方式获取faultlog CPP_CRASH日志 115 * @tc.size MediumTest 116 * @tc.type Function 117 * @tc.level Level2 118 */ 119 it('DFX_DFR_Faultlogger_Interface_0400', 0, async function (done) { 120 console.info("---------------------------DFX_DFR_Faultlogger_Interface_0400----------------------------------"); 121 try { 122 let now = Date.now(); 123 console.info("DFX_DFR_Faultlogger_Interface_0400 2 + " + now); 124 let subscribedEventCnt = 0; 125 let watcher = BeginSubscriptionOnEvent("RELIABILITY", "CPP_CRASH", (info) => { 126 subscribedEventCnt++ 127 }) 128 console.info("start triggerCppCrash"); 129 const res = faultloggerTestNapi.triggerCppCrash(); 130 console.info("DFX_DFR_Faultlogger_Interface_0400 res:" + res); 131 while (subscribedEventCnt < 1) { 132 await msleep(100); 133 } 134 EndSubscriptionOnEvent(watcher) 135 console.info("--------DFX_DFR_Faultlogger_Interface_0400 4" + "----------"); 136 let ret = await faultlogger.querySelfFaultLog(faultlogger.FaultType.CPP_CRASH); 137 console.info("DFX_DFR_Faultlogger_Interface_0400 query ret length:" + ret.length); 138 expect(ret.length).assertLarger(0); 139 console.info("DFX_DFR_Faultlogger_Interface_0400 check reason, index:" + (ret[0].reason.indexOf("Signal:SIGABRT"))); 140 expect(ret[0].reason.indexOf("Signal:SIGABRT") != -1).assertTrue(); 141 console.info("DFX_DFR_Faultlogger_Interface_0400 fullLog length:" + ret[0].fullLog.length); 142 console.info("DFX_DFR_Faultlogger_Interface_0400 check fullLog, index:" + ret[0].fullLog.indexOf("Fault thread info")); 143 expect(ret[0].fullLog.indexOf("Fault thread info") != -1).assertTrue(); 144 expect(typeof(ret[0].pid) == "number").assertTrue(); 145 expect(typeof(ret[0].uid) == "number").assertTrue(); 146 expect(typeof(ret[0].type) == "number").assertTrue(); 147 expect(typeof(ret[0].timestamp) == "number").assertTrue(); 148 expect(typeof(ret[0].reason) == "string").assertTrue(); 149 expect(typeof(ret[0].module) == "string").assertTrue(); 150 expect(typeof(ret[0].summary) == "string").assertTrue(); 151 expect(typeof(ret[0].fullLog) == "string").assertTrue(); 152 console.info("--------DFX_DFR_Faultlogger_Interface_0400 5" + "----------"); 153 done(); 154 return; 155 } catch (err) { 156 console.info("catch (err) == " + err); 157 } 158 console.info("DFX_DFR_Faultlogger_Interface_0400 error"); 159 expect(false).assertTrue(); 160 done(); 161 }) 162 163 /** 164 * @tc.number test_0500 165 * @tc.name DFX_DFR_Faultlogger_Interface_0500 166 * @tc.desc 检验promise同步方式获取faultlog JS_CRASH日志 167 * @tc.size MediumTest 168 * @tc.type Function 169 * @tc.level Level2 170 */ 171 it('DFX_DFR_Faultlogger_Interface_0500', 0, async function (done) { 172 console.info("---------------------------DFX_DFR_Faultlogger_Interface_0500----------------------------------"); 173 try { 174 const loopTimes = 10; 175 let subscribedEventCnt = 0; 176 let watcher = BeginSubscriptionOnEvent("ACE", "JS_ERROR", (info) => { 177 subscribedEventCnt++ 178 }) 179 let now = Date.now(); 180 console.info("DFX_DFR_Faultlogger_Interface_0500 2 + " + now); 181 hiSysEvent.write({ 182 domain: "ACE", 183 name: "JS_ERROR", 184 eventType: hiSysEvent.EventType.FAULT, 185 params: { 186 PID: 487, 187 UID:103, 188 PACKAGE_NAME: "com.ohos.faultlogger.test", 189 PROCESS_NAME: "com.ohos.faultlogger.test", 190 MSG: "faultlogger testcase test.", 191 REASON: "faultlogger testcase test." 192 } 193 }).then( 194 (value) => { 195 console.log(`HiSysEvent json-callback-success value=${value}`); 196 }) 197 while (subscribedEventCnt < 1) { 198 await msleep(100); 199 } 200 EndSubscriptionOnEvent(watcher) 201 console.info("--------DFX_DFR_Faultlogger_Interface_0500 4" + "----------"); 202 let ret = await faultlogger.querySelfFaultLog(faultlogger.FaultType.JS_CRASH); 203 console.info("DFX_DFR_Faultlogger_Interface_0500 ret == " + ret.length); 204 if (ret.length > 0) { 205 expect(true).assertTrue(); 206 } else { 207 expect(false).assertTrue(); 208 } 209 for (let i = 0; i < ret.length; i++) { 210 console.info("faultloggertestsummary03 " + i + " fullLog.length " + ret[i].fullLog.length); 211 } 212 done(); 213 return; 214 } catch (err) { 215 console.info("catch (err) == " + err); 216 } 217 console.info("DFX_DFR_Faultlogger_Interface_0500 error"); 218 expect(false).assertTrue(); 219 done(); 220 }) 221 222 /** 223 * @tc.number test_0300 224 * @tc.name DFX_DFR_Faultlogger_Interface_0300 225 * @tc.desc 检验promise同步方式获取faultlog APP_FREEZE日志 226 * @tc.size MediumTest 227 * @tc.type Function 228 * @tc.level Level2 229 */ 230 it('DFX_DFR_Faultlogger_Interface_0300', 0, async function (done) { 231 console.info("---------------------------DFX_DFR_Faultlogger_Interface_0300----------------------------------"); 232 try { 233 let now = Date.now(); 234 console.info("DFX_DFR_Faultlogger_Interface_0300 2 + " + now); 235 let module = "ohos.faultloggerjs.test"; 236 const loopTimes = 10; 237 let subscribedEventCnt = 0; 238 let watcher = BeginSubscriptionOnEvent("RELIABILITY", "APP_FREEZE", (info) => { 239 subscribedEventCnt++ 240 }) 241 for (let i = 0; i < loopTimes; i++) { 242 console.info("--------DFX_DFR_Faultlogger_Interface_0300 3 + " + i + "----------"); 243 faultlogger.addFaultLog(i - 400, 244 faultlogger.FaultType.APP_FREEZE, module, "faultloggertestsummary04 " + i); 245 await msleep(300); 246 } 247 while (subscribedEventCnt < loopTimes) { 248 await msleep(100); 249 } 250 EndSubscriptionOnEvent(watcher) 251 252 console.info("--------DFX_DFR_Faultlogger_Interface_0300 4" + "----------"); 253 let ret = await faultlogger.querySelfFaultLog(faultlogger.FaultType.APP_FREEZE); 254 console.info("DFX_DFR_Faultlogger_Interface_0300 ret == " + ret.length); 255 expect(ret.length).assertEqual(loopTimes); 256 for (let i = 0; i < loopTimes; i++) { 257 console.info("faultloggertestsummary04 " + i + " fullLog.length " + ret[i].fullLog.length); 258 if (ret[i].fullLog.indexOf("faultloggertestsummary04 " + (loopTimes - 1 - i)) != -1) { 259 console.info("DFX_DFR_Faultlogger_Interface_0300 " + ret[i].fullLog.length); 260 expect(true).assertTrue(); 261 } else { 262 expect(false).assertTrue(); 263 } 264 } 265 done(); 266 return; 267 } catch (err) { 268 console.info("catch (err) == " + err); 269 } 270 console.info("DFX_DFR_Faultlogger_Interface_0300 error"); 271 expect(false).assertTrue(); 272 done(); 273 }) 274 275 /** 276 * @tc.number test_0100 277 * @tc.name DFX_DFR_Faultlogger_Interface_0100 278 * @tc.desc 检验通过回调方式获取faultlog日志 279 * @tc.size MediumTest 280 * @tc.type Function 281 * @tc.level Level2 282 */ 283 it('DFX_DFR_Faultlogger_Interface_0100', 0, async function (done) { 284 console.info("---------------------------DFX_DFR_Faultlogger_Interface_0100----------------------------------"); 285 try { 286 let now = Date.now(); 287 console.info("DFX_DFR_Faultlogger_Interface_0100 start + " + now); 288 let subscribedEventCnt = 0; 289 let watcher = BeginSubscriptionOnEvent("RELIABILITY", "CPP_CRASH", (info) => { 290 subscribedEventCnt++ 291 }) 292 console.info("start triggerCppCrash"); 293 const res = faultloggerTestNapi.triggerCppCrash(); 294 console.info("DFX_DFR_Faultlogger_Interface_0100 res:" + res); 295 while (subscribedEventCnt < 1) { 296 await msleep(100); 297 } 298 EndSubscriptionOnEvent(watcher) 299 console.info("--------DFX_DFR_Faultlogger_Interface_0100 4----------"); 300 function queryFaultLogCallback(error, ret) { 301 if (error) { 302 console.info('DFX_DFR_Faultlogger_Interface_0100 once error is ' + error); 303 } else { 304 console.info("DFX_DFR_Faultlogger_Interface_0100 query ret length:" + ret.length); 305 expect(ret.length).assertLarger(0); 306 console.info("DFX_DFR_Faultlogger_Interface_0100 check reason, index:" + (ret[0].reason.indexOf("Signal:SIGABRT"))); 307 expect(ret[0].reason.indexOf("Signal:SIGABRT") != -1).assertTrue(); 308 console.info("DFX_DFR_Faultlogger_Interface_0100 check fullLog, index:" + ret[0].fullLog.indexOf("Fault thread info")); 309 expect(ret[0].fullLog.indexOf("Fault thread info") != -1).assertTrue(); 310 } 311 done(); 312 } 313 faultlogger.querySelfFaultLog(faultlogger.FaultType.CPP_CRASH, queryFaultLogCallback); 314 return; 315 } catch (err) { 316 console.info(err); 317 } 318 console.info("DFX_DFR_Faultlogger_Interface_0100 error"); 319 expect(false).assertTrue(); 320 done(); 321 }) 322 323 /** 324 * @tc.number test_0600 325 * @tc.name DFX_DFR_Faultlogger_Interface_0600 326 * @tc.desc 检验query函数正常入参 327 * @tc.size MediumTest 328 * @tc.type Function 329 * @tc.level Level2 330 */ 331 it('DFX_DFR_Faultlogger_Interface_0600', 0, function () { 332 console.info("---------------------------DFX_DFR_Faultlogger_Interface_0600----------------------------------"); 333 try { 334 let ret = faultlogger.query("faultloggertestsummary06"); 335 console.info("DFX_DFR_Faultlogger_Interface_0600 ret == " + ret); 336 expect(ret).assertTrue(); 337 return; 338 } catch(err) { 339 console.info(err.code); 340 console.info(err.message); 341 expect(err.code == 401).assertTrue(); 342 } 343 }) 344 345 /** 346 * @tc.number test_0700 347 * @tc.name DFX_DFR_Faultlogger_Interface_0700 348 * @tc.desc 检验query函数入参数量为2时程序是否会崩溃 349 * @tc.size MediumTest 350 * @tc.type Function 351 * @tc.level Level2 352 */ 353 it('DFX_DFR_Faultlogger_Interface_0700', 0, function () { 354 console.info("---------------------------DFX_DFR_Faultlogger_Interface_0700----------------------------------"); 355 try { 356 let ret = faultlogger.query(faultlogger.FaultType.JS_CRASH, "faultloggertestsummary07"); 357 console.info("DFX_DFR_Faultlogger_Interface_0700 ret == " + ret); 358 return; 359 } catch(err) { 360 console.info(err.code); 361 console.info(err.message); 362 expect(err.code == 401).assertTrue(); 363 } 364 }) 365 366 /** 367 * @tc.number test_0800 368 * @tc.name DFX_DFR_Faultlogger_Interface_0800 369 * @tc.desc 检验query函数入参为空时程序是否会崩溃 370 * @tc.size MediumTest 371 * @tc.type Function 372 * @tc.level Level2 373 */ 374 it('DFX_DFR_Faultlogger_Interface_0800', 0, function () { 375 console.info("---------------------------DFX_DFR_Faultlogger_Interface_0800----------------------------------"); 376 try { 377 let ret = faultlogger.query(); 378 console.info("DFX_DFR_Faultlogger_Interface_0800 ret == " + ret); 379 return; 380 } catch(err) { 381 console.info(err.code); 382 console.info(err.message); 383 expect(err.code == 401).assertTrue(); 384 } 385 }) 386 387 /** 388 * @tc.number test_0900 389 * @tc.name DFX_DFR_Faultlogger_Interface_0900 390 * @tc.desc 检验promise同步方式获取faultlog JS_CRASH日志 391 * @tc.size MediumTest 392 * @tc.type Function 393 * @tc.level Level2 394 */ 395 it('DFX_DFR_Faultlogger_Interface_0900', 0, async function (done) { 396 console.info("---------------------------DFX_DFR_Faultlogger_Interface_0900----------------------------------"); 397 try { 398 let subscribedEventCnt = 0; 399 let watcher = BeginSubscriptionOnEvent("ACE", "JS_ERROR", (info) => { 400 subscribedEventCnt++ 401 }) 402 let now = Date.now(); 403 console.info("DFX_DFR_Faultlogger_Interface_0900 2 + " + now); 404 hiSysEvent.write({ 405 domain: "ACE", 406 name: "JS_ERROR", 407 eventType: hiSysEvent.EventType.FAULT, 408 params: { 409 PID: 487, 410 UID:103, 411 PACKAGE_NAME: "com.ohos.faultlogger.test", 412 PROCESS_NAME: "com.ohos.faultlogger.test", 413 MSG: "faultlogger testcase test.", 414 REASON: "faultlogger testcase test." 415 } 416 }).then( 417 (value) => { 418 console.log(`HiSysEvent json-callback-success value=${value}`); 419 }) 420 while (subscribedEventCnt < 1) { 421 await msleep(100); 422 } 423 EndSubscriptionOnEvent(watcher) 424 console.info("--------DFX_DFR_Faultlogger_Interface_0900 4" + "----------"); 425 let ret = await faultlogger.query(faultlogger.FaultType.JS_CRASH); 426 console.info("DFX_DFR_Faultlogger_Interface_0900 ret == " + ret.length); 427 if (ret.length > 0) { 428 expect(true).assertTrue(); 429 } else { 430 expect(false).assertTrue(); 431 } 432 for (let i = 0; i < ret.length; i++) { 433 console.info("faultloggertestsummary08 " + i + " fullLog.length " + ret[i].fullLog.length); 434 } 435 done(); 436 return; 437 } catch (err) { 438 console.info("catch (err) == " + err); 439 } 440 console.info("DFX_DFR_Faultlogger_Interface_0900 error"); 441 expect(false).assertTrue(); 442 done(); 443 }) 444 445 /** 446 * @tc.number test_1000 447 * @tc.name DFX_DFR_Faultlogger_Interface_1000 448 * @tc.desc 检验promise同步方式获取faultlog APP_FREEZE日志 449 * @tc.size MediumTest 450 * @tc.type Function 451 * @tc.level Level2 452 */ 453 it('DFX_DFR_Faultlogger_Interface_1000', 0, async function (done) { 454 console.info("---------------------------DFX_DFR_Faultlogger_Interface_1000----------------------------------"); 455 try { 456 let now = Date.now(); 457 console.info("DFX_DFR_Faultlogger_Interface_1000 2 + " + now); 458 let module = "ohos.faultloggerjs.test"; 459 const loopTimes = 10; 460 let subscribedEventCnt = 0; 461 let watcher = BeginSubscriptionOnEvent("RELIABILITY", "APP_FREEZE", (info) => { 462 subscribedEventCnt++ 463 }) 464 for (let i = 0; i < loopTimes; i++) { 465 console.info("--------DFX_DFR_Faultlogger_Interface_1000 3 + " + i + "----------"); 466 faultlogger.addFaultLog(i - 200, 467 faultlogger.FaultType.APP_FREEZE, module, "faultloggertestsummary09 " + i); 468 await msleep(300); 469 } 470 while (subscribedEventCnt < loopTimes) { 471 await msleep(100); 472 } 473 EndSubscriptionOnEvent(watcher) 474 console.info("--------DFX_DFR_Faultlogger_Interface_1000 4" + "----------"); 475 let ret = await faultlogger.query(faultlogger.FaultType.APP_FREEZE); 476 console.info("DFX_DFR_Faultlogger_Interface_1000 ret == " + ret.length); 477 expect(ret.length).assertEqual(loopTimes); 478 for (let i = 0; i < loopTimes; i++) { 479 console.info("faultloggertestsummary09 " + i + " fullLog.length " + ret[i].fullLog.length); 480 if (ret[i].fullLog.indexOf("faultloggertestsummary09 " + (loopTimes - 1 - i)) != -1) { 481 console.info("DFX_DFR_Faultlogger_Interface_1000 " + ret[i].fullLog.length); 482 expect(true).assertTrue(); 483 } else { 484 expect(false).assertTrue(); 485 } 486 } 487 console.info("--------DFX_DFR_Faultlogger_Interface_1000 5" + "----------"); 488 ret = await faultlogger.querySelfFaultLog(faultlogger.FaultType.NO_SPECIFIC); 489 console.info("DFX_DFR_Faultlogger_Interface_1000 ret == " + ret.length); 490 expect(ret.length).assertEqual(loopTimes); 491 done(); 492 return; 493 } catch (err) { 494 console.info("catch (err) == " + err); 495 } 496 console.info("DFX_DFR_Faultlogger_Interface_1000 error"); 497 expect(false).assertTrue(); 498 done(); 499 }) 500 501 /** 502 * @tc.number test_1100 503 * @tc.name DFX_DFR_Faultlogger_Interface_1100 504 * @tc.desc 检验通过回调方式获取faultlog日志 505 * @tc.size MediumTest 506 * @tc.type Function 507 * @tc.level Level2 508 */ 509 it('DFX_DFR_Faultlogger_Interface_1100', 0, async function (done) { 510 console.info("---------------------------DFX_DFR_Faultlogger_Interface_1100----------------------------------"); 511 try { 512 let now = Date.now(); 513 console.info("DFX_DFR_Faultlogger_Interface_1100 start + " + now); 514 let subscribedEventCnt = 0; 515 let watcher = BeginSubscriptionOnEvent("RELIABILITY", "CPP_CRASH", (info) => { 516 subscribedEventCnt++ 517 }) 518 console.info("start triggerCppCrash"); 519 const res = faultloggerTestNapi.triggerCppCrash(); 520 console.info("DFX_DFR_Faultlogger_Interface_1100 res:" + res); 521 while (subscribedEventCnt < 1 ) { 522 await msleep(100); 523 } 524 EndSubscriptionOnEvent(watcher) 525 console.info("--------DFX_DFR_Faultlogger_Interface_1100 4----------"); 526 function queryFaultLogCallback(error, ret) { 527 if (error) { 528 console.info('DFX_DFR_Faultlogger_Interface_1100 once error is ' + error); 529 } else { 530 console.info("DFX_DFR_Faultlogger_Interface_1100 query ret length:" + ret.length); 531 expect(ret.length).assertLarger(0); 532 console.info("DFX_DFR_Faultlogger_Interface_1100 check reason, index:" + (ret[0].reason.indexOf("Signal:SIGABRT"))); 533 expect(ret[0].reason.indexOf("Signal:SIGABRT") != -1).assertTrue(); 534 console.info("DFX_DFR_Faultlogger_Interface_1100 check fullLog, index:" + ret[0].fullLog.indexOf("Fault thread info")); 535 expect(ret[0].fullLog.indexOf("Fault thread info") != -1).assertTrue(); 536 } 537 done(); 538 } 539 faultlogger.query(faultlogger.FaultType.CPP_CRASH, queryFaultLogCallback); 540 return; 541 } catch (err) { 542 console.info(err); 543 } 544 console.info("DFX_DFR_Faultlogger_Interface_1100 error"); 545 expect(false).assertTrue(); 546 done(); 547 }) 548}) 549} 550