1 /* 2 * Copyright (c) 2025 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 #include <gtest/gtest.h> 16 17 #include <cstdint> 18 #include <cstdio> 19 #include <dlfcn.h> 20 #include <filesystem> 21 22 #include "dfx_jsvm.h" 23 #include "dfx_log.h" 24 25 using namespace testing; 26 using namespace testing::ext; 27 using namespace std; 28 29 namespace OHOS { 30 namespace HiviewDFX { 31 bool g_jsvmEnable = false; 32 33 class JsvmTest : public testing::Test { 34 public: SetUpTestCase()35 static void SetUpTestCase() {} TearDownTestCase()36 static void TearDownTestCase() {} SetUp()37 void SetUp() 38 { 39 std::string filePath; 40 #if defined(__arm__) 41 filePath = "/system/lib/ndk/libjsvm.so"; 42 #elif defined(__aarch64__) 43 filePath = "/system/lib64/ndk/libjsvm.so"; 44 #endif 45 g_jsvmEnable = filesystem::exists(filePath); 46 } TearDown()47 void TearDown() {} 48 }; 49 50 /** 51 * @tc.name: JsvmTest001 52 * @tc.desc: test JsvmCreateJsSymbolExtractor function 53 * @tc.type: FUNC 54 */ 55 HWTEST_F(JsvmTest, JsvmTest001, TestSize.Level2) 56 { 57 GTEST_LOG_(INFO) << "JsvmTest001: start."; 58 uintptr_t extractorPtr = 0; 59 if (g_jsvmEnable) { 60 DfxJsvm::Instance().JsvmCreateJsSymbolExtractor(&extractorPtr, getpid()); 61 ASSERT_NE(DfxJsvm::Instance().jsvmCreateJsSymbolExtractorFn_, nullptr); 62 DfxJsvm::Instance().JsvmCreateJsSymbolExtractor(&extractorPtr, getpid()); 63 ASSERT_NE(DfxJsvm::Instance().jsvmCreateJsSymbolExtractorFn_, nullptr); 64 DfxJsvm::Instance().JsvmDestroyJsSymbolExtractor(extractorPtr); 65 ASSERT_NE(DfxJsvm::Instance().jsvmDestroyJsSymbolExtractorFn_, nullptr); 66 DfxJsvm::Instance().JsvmDestroyJsSymbolExtractor(extractorPtr); 67 ASSERT_NE(DfxJsvm::Instance().jsvmDestroyJsSymbolExtractorFn_, nullptr); 68 } else { 69 DfxJsvm::Instance().JsvmCreateJsSymbolExtractor(&extractorPtr, getpid()); 70 ASSERT_EQ(DfxJsvm::Instance().jsvmCreateJsSymbolExtractorFn_, nullptr); 71 DfxJsvm::Instance().JsvmDestroyJsSymbolExtractor(extractorPtr); 72 ASSERT_EQ(DfxJsvm::Instance().jsvmDestroyJsSymbolExtractorFn_, nullptr); 73 } 74 75 GTEST_LOG_(INFO) << "JsvmTest001: end."; 76 } 77 78 /** 79 * @tc.name: JsvmTest002 80 * @tc.desc: test ParseJsvmFrameInfo function 81 * @tc.type: FUNC 82 */ 83 HWTEST_F(JsvmTest, JsvmTest002, TestSize.Level2) 84 { 85 GTEST_LOG_(INFO) << "JsvmTest002: start."; 86 uintptr_t pc = 0; 87 uintptr_t extractorPtr = 0; 88 JsvmFunction *jsFunction = nullptr; 89 if (g_jsvmEnable) { 90 DfxJsvm::Instance().ParseJsvmFrameInfo(pc, extractorPtr, jsFunction); 91 ASSERT_NE(DfxJsvm::Instance().parseJsvmFrameInfoFn_, nullptr); 92 DfxJsvm::Instance().ParseJsvmFrameInfo(pc, extractorPtr, jsFunction); 93 ASSERT_NE(DfxJsvm::Instance().parseJsvmFrameInfoFn_, nullptr); 94 } else { 95 DfxJsvm::Instance().ParseJsvmFrameInfo(pc, extractorPtr, jsFunction); 96 ASSERT_EQ(DfxJsvm::Instance().parseJsvmFrameInfoFn_, nullptr); 97 } 98 99 GTEST_LOG_(INFO) << "JsvmTest002: end."; 100 } 101 102 /** 103 * @tc.name: JsvmTest003 104 * @tc.desc: test StepJsvmFrame function 105 * @tc.type: FUNC 106 */ 107 HWTEST_F(JsvmTest, JsvmTest003, TestSize.Level2) 108 { 109 GTEST_LOG_(INFO) << "JsvmTest003: start."; 110 void *obj = nullptr; 111 ReadMemFunc readMemFn = nullptr; 112 JsvmStepParam *jsvmParam = nullptr; 113 DfxJsvm::Instance().StepJsvmFrame(obj, readMemFn, jsvmParam); 114 int a = 0; 115 obj = &a; 116 DfxJsvm::Instance().StepJsvmFrame(obj, readMemFn, jsvmParam); 117 ASSERT_EQ(DfxJsvm::Instance().stepJsvmFn_, nullptr); 118 GTEST_LOG_(INFO) << "JsvmTest003: end."; 119 } 120 } 121 }