• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }