1/*
2 * Copyright (c) 2024 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 <cstdint>
17#include <fstream>
18#include <memory>
19#include <string>
20#include <utility>
21
22#include <gtest/gtest.h>
23
24#include "ecmascript/napi/include/jsnapi.h"
25#include "ecmascript/ohos/aot_runtime_info.h"
26#include "ecmascript/ohos/tests/mock/mock_aot_runtime_info.h"
27#include "ecmascript/platform/aot_crash_info.h"
28#include "ecmascript/platform/file.h"
29#include "ecmascript/tests/test_helper.h"
30
31using namespace panda;
32using namespace panda::ecmascript;
33using namespace panda::ecmascript::kungfu;
34
35namespace panda::test {
36class CrashTest : public testing::Test {
37public:
38    static void SetUpTestCase()
39    {
40        GTEST_LOG_(INFO) << "SetUpTestCase";
41    }
42
43    static void TearDownTestCase()
44    {
45        GTEST_LOG_(INFO) << "TearDownCase";
46    }
47
48    void SetUp() override {}
49    void TearDown() override {}
50
51    MockAotRuntimeInfo mockAotRuntimeInfo;
52protected:
53    EcmaVM *vm_ {nullptr};
54};
55
56HWTEST_F_L0(CrashTest, CrashGetBuildId)
57{
58    char soBuildId[NAME_MAX];
59    ohos::AotRuntimeInfo *runtimeInfo = new MockAotRuntimeInfo();
60    runtimeInfo->GetRuntimeBuildId(soBuildId, NAME_MAX);
61    ASSERT_TRUE(std::string(soBuildId).size() > 0);
62    ASSERT_EQ(std::string(soBuildId), "abcd1234567890");
63}
64
65HWTEST_F_L0(CrashTest, GetMicrosecondsTimeStamp)
66{
67    char timestamp[ohos::AotRuntimeInfo::TIME_STAMP_SIZE];
68    ohos::AotRuntimeInfo *runtimeInfo = new MockAotRuntimeInfo();
69    runtimeInfo->GetMicrosecondsTimeStamp(timestamp, ohos::AotRuntimeInfo::TIME_STAMP_SIZE);
70    ASSERT_TRUE(std::string(timestamp).size() > 0);
71    ASSERT_EQ(std::string(timestamp), "1970-01-01 00:00:00");
72}
73
74HWTEST_F_L0(CrashTest, BuildCrashRuntimeInfo)
75{
76    char timestamp[ohos::AotRuntimeInfo::TIME_STAMP_SIZE];
77    char soBuildId[NAME_MAX];
78    ohos::AotRuntimeInfo *runtimeInfo = new MockAotRuntimeInfo();
79    runtimeInfo->GetMicrosecondsTimeStamp(timestamp, ohos::AotRuntimeInfo::TIME_STAMP_SIZE);
80    runtimeInfo->GetRuntimeBuildId(soBuildId, NAME_MAX);
81    char sanboxRealPath[PATH_MAX];
82    mkdir(MockAotRuntimeInfo::SANBOX_DIR, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
83    std::ofstream file(sanboxRealPath);
84    file.close();
85    runtimeInfo->GetCrashSandBoxRealPath(sanboxRealPath, NAME_MAX);
86
87    runtimeInfo->BuildCrashRuntimeInfo(ecmascript::ohos::RuntimeInfoType::AOT_CRASH);
88    runtimeInfo->BuildCrashRuntimeInfo(ecmascript::ohos::RuntimeInfoType::AOT_CRASH);
89    runtimeInfo->BuildCrashRuntimeInfo(ecmascript::ohos::RuntimeInfoType::AOT_CRASH);
90    runtimeInfo->BuildCrashRuntimeInfo(ecmascript::ohos::RuntimeInfoType::JS);
91    runtimeInfo->BuildCrashRuntimeInfo(ecmascript::ohos::RuntimeInfoType::JIT);
92    runtimeInfo->BuildCrashRuntimeInfo(ecmascript::ohos::RuntimeInfoType::OTHERS);
93
94    std::map<ecmascript::ohos::RuntimeInfoType, int> escapeMap = runtimeInfo->CollectCrashSum();
95    ASSERT_EQ(escapeMap[ecmascript::ohos::RuntimeInfoType::AOT_CRASH], 3);
96    ASSERT_EQ(escapeMap[ecmascript::ohos::RuntimeInfoType::JS], 1);
97    ASSERT_EQ(escapeMap[ecmascript::ohos::RuntimeInfoType::JIT], 1);
98    ASSERT_EQ(escapeMap[ecmascript::ohos::RuntimeInfoType::OTHERS], 1);
99    ASSERT_EQ(runtimeInfo->GetCompileCountByType(ecmascript::ohos::RuntimeInfoType::AOT_CRASH), 3);
100
101    unlink(sanboxRealPath);
102    rmdir(MockAotRuntimeInfo::SANBOX_DIR);
103}
104
105HWTEST_F_L0(CrashTest, BuildCompileRuntimeInfo)
106{
107    char timestamp[ohos::AotRuntimeInfo::TIME_STAMP_SIZE];
108    char soBuildId[NAME_MAX];
109    ohos::AotRuntimeInfo *runtimeInfo = new MockAotRuntimeInfo();
110    runtimeInfo->GetMicrosecondsTimeStamp(timestamp, ohos::AotRuntimeInfo::TIME_STAMP_SIZE);
111    runtimeInfo->GetRuntimeBuildId(soBuildId, NAME_MAX);
112    char sanboxRealPath[PATH_MAX];
113    mkdir(MockAotRuntimeInfo::SANBOX_DIR, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
114    std::ofstream file(sanboxRealPath);
115    file.close();
116    runtimeInfo->GetCrashSandBoxRealPath(sanboxRealPath, NAME_MAX);
117
118    runtimeInfo->BuildCompileRuntimeInfo(ecmascript::ohos::RuntimeInfoType::AOT_CRASH, sanboxRealPath);
119    runtimeInfo->BuildCompileRuntimeInfo(ecmascript::ohos::RuntimeInfoType::AOT_CRASH, sanboxRealPath);
120    runtimeInfo->BuildCompileRuntimeInfo(ecmascript::ohos::RuntimeInfoType::AOT_CRASH, sanboxRealPath);
121    runtimeInfo->BuildCompileRuntimeInfo(ecmascript::ohos::RuntimeInfoType::JS, sanboxRealPath);
122    runtimeInfo->BuildCompileRuntimeInfo(ecmascript::ohos::RuntimeInfoType::JIT, sanboxRealPath);
123    runtimeInfo->BuildCompileRuntimeInfo(ecmascript::ohos::RuntimeInfoType::OTHERS, sanboxRealPath);
124    std::map<ecmascript::ohos::RuntimeInfoType, int> escapeMapRealPath = runtimeInfo->CollectCrashSum(sanboxRealPath);
125    ASSERT_EQ(escapeMapRealPath[ecmascript::ohos::RuntimeInfoType::AOT_CRASH], 3);
126    ASSERT_EQ(escapeMapRealPath[ecmascript::ohos::RuntimeInfoType::JS], 1);
127    ASSERT_EQ(escapeMapRealPath[ecmascript::ohos::RuntimeInfoType::JIT], 1);
128    ASSERT_EQ(escapeMapRealPath[ecmascript::ohos::RuntimeInfoType::OTHERS], 1);
129    ASSERT_EQ(runtimeInfo->GetCompileCountByType(ecmascript::ohos::RuntimeInfoType::AOT_CRASH, sanboxRealPath), 3);
130
131    unlink(sanboxRealPath);
132    rmdir(MockAotRuntimeInfo::SANBOX_DIR);
133}
134
135HWTEST_F_L0(CrashTest, CrashGetRuntimeInfoByPath)
136{
137    char timestamp[ohos::AotRuntimeInfo::TIME_STAMP_SIZE];
138    char soBuildId[NAME_MAX];
139    ohos::AotRuntimeInfo *runtimeInfo = new MockAotRuntimeInfo(true);
140
141    runtimeInfo->GetMicrosecondsTimeStamp(timestamp, ohos::AotRuntimeInfo::TIME_STAMP_SIZE);
142    runtimeInfo->GetRuntimeBuildId(soBuildId, NAME_MAX);
143    char sanboxRealPath[PATH_MAX];
144    mkdir(MockAotRuntimeInfo::SANBOX_DIR, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
145    std::ofstream file(sanboxRealPath);
146    file.close();
147
148    runtimeInfo->GetCrashSandBoxRealPath(sanboxRealPath, NAME_MAX);
149    runtimeInfo->BuildCrashRuntimeInfo(ecmascript::ohos::RuntimeInfoType::AOT_CRASH);
150    runtimeInfo->CollectCrashSum();
151
152    unlink(sanboxRealPath);
153    rmdir(MockAotRuntimeInfo::SANBOX_DIR);
154}
155} // namespace panda::test