• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved.
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 <hwext/gtest-ext.h>
17 #include <hwext/gtest-tag.h>
18 #include <fcntl.h>
19 #include <fstream>
20 #include <iostream>
21 #include <string>
22 #include <unistd.h>
23 
24 #include "file.h"
25 #include "arkts/pbreader_js_memory_parser.h"
26 #include "arkts/pbreader_js_cpu_profiler_parser.h"
27 #include "js_heap_config.pb.h"
28 #include "js_heap_config.pbreader.h"
29 #include "js_heap_result.pb.h"
30 #include "js_heap_result.pbreader.h"
31 #include "trace_streamer_selector.h"
32 
33 using namespace testing::ext;
34 using namespace SysTuning;
35 using namespace SysTuning::TraceStreamer;
36 namespace SysTuning {
37 namespace TraceStreamer {
38 const char *RESULT1 = "{\"id\":3,\"result\":{}}";
39 const char *RESULT2 =
40     "{\"id\":3,\"result\":{\"profile\":{\"tid\":1394,\"startTime\":8013755173,\"endTime\":8034596087,\"gcTime\":0,"
41     "\"cInterpreterTime\":0,\"asmInterpreterTime\":0,\"aotTime\":0,\"builtinTime\":0,\"napiTime\":0,"
42     "\"arkuiEngineTime\":0,\"runtimeTime\":0,\"otherTime\":20840914,\"nodes\":[{\"id\":1,\"callFrame\":{"
43     "\"functionName\":\"(root)\",\"scriptId\":\"0\",\"url\":\"\",\"lineNumber\":-1,\"columnNumber\":-1},"
44     "\"hitCount\":0,\"children\":[2,3,4]},{\"id\":2,\"callFrame\":{\"functionName\":\"(program)\",\"scriptId\":"
45     "\"0\",\"url\":\"\",\"lineNumber\":-1,\"columnNumber\":-1},\"hitCount\":113097,\"children\":[]},{\"id\":3,"
46     "\"callFrame\":{\"functionName\":\"(idle)\",\"scriptId\":\"0\",\"url\":\"\",\"lineNumber\":-1,\"columnNumber\":"
47     "-1},\"hitCount\":0,\"children\":[]},{\"id\":4,\"callFrame\":{\"functionName\":\"anonymous\",\"scriptId\":"
48     "\"1\",\"url\":\"D:/workspace_ohos_system/Music/entry/build/default/intermediates/assets_jsbundle/default/ets/"
49     "pages/"
50     "index_.js\",\"lineNumber\":2922,\"columnNumber\":36},\"hitCount\":1,\"children\":[]}],\"samples\":[2,3,4,2,2,"
51     "2,2,3,3,3,3,4,4,4],\"timeDeltas\":[99,72,215,637,96,288,36,89,94,54,26,598,784,522]}}}";
52 const char *RESULT3 =
53     "{\"id\":3,\"result\":{\"data\":{\"tid\":1394,\"startTime\":8013755173,\"endTime\":8034596087,\"gcTime\":0,"
54     "\"cInterpreterTime\":0,\"asmInterpreterTime\":0,\"aotTime\":0,\"builtinTime\":0,\"napiTime\":0,"
55     "\"arkuiEngineTime\":0,\"runtimeTime\":0,\"otherTime\":20840914,\"nodes\":[{\"id\":1,\"callFrame\":{"
56     "\"functionName\":\"(root)\",\"scriptId\":\"0\",\"url\":\"\",\"lineNumber\":-1,\"columnNumber\":-1},"
57     "\"hitCount\":0,\"children\":[2,3,4]},{\"id\":2,\"callFrame\":{\"functionName\":\"(program)\",\"scriptId\":"
58     "\"0\",\"url\":\"\",\"lineNumber\":-1,\"columnNumber\":-1},\"hitCount\":113097,\"children\":[]},{\"id\":3,"
59     "\"callFrame\":{\"functionName\":\"(idle)\",\"scriptId\":\"0\",\"url\":\"\",\"lineNumber\":-1,\"columnNumber\":"
60     "-1},\"hitCount\":0,\"children\":[]},{\"id\":4,\"callFrame\":{\"functionName\":\"anonymous\",\"scriptId\":"
61     "\"1\",\"url\":\"D:/workspace_ohos_system/Music/entry/build/default/intermediates/assets_jsbundle/default/ets/"
62     "pages/"
63     "index_.js\",\"lineNumber\":2922,\"columnNumber\":36},\"hitCount\":1,\"children\":[]}],\"samples\":[2,3,4,2,2,"
64     "2,2,3,3,3,3,4,4,4],\"timeDeltas\":[99,72,215,637,96,288,36,89,94,54,26,598,784,522]}}}";
65 const uint32_t PROFILER_INTERVAL = 1000;
66 
67 class JsCpuProfilerTest : public ::testing::Test {
68 public:
SetUp()69     void SetUp()
70     {
71         stream_.InitFilter();
72     }
73 
TearDown()74     void TearDown() {}
75 
SetArkTSConfig()76     std::string SetArkTSConfig()
77     {
78         const int32_t pid = 1734;
79         ArkTSConfig arkTSConfig;
80         arkTSConfig.set_pid(pid);
81         arkTSConfig.set_type(::ArkTSConfig_HeapType(ArkTSConfig_HeapType_INVALID));
82         arkTSConfig.set_enable_cpu_profiler(0);
83         arkTSConfig.set_cpu_profiler_interval(PROFILER_INTERVAL);
84 
85         std::string strConfig = "";
86         arkTSConfig.SerializeToString(&strConfig);
87         return strConfig;
88     }
89 
90 public:
91     SysTuning::TraceStreamer::TraceStreamerSelector stream_ = {};
92 };
93 /**
94  * @tc.name: cpuProfilerParserNodesbyArkTs
95  * @tc.desc: cpuProfiler parser nodes
96  * @tc.type: FUNC
97  */
98 HWTEST_F(JsCpuProfilerTest, cpuProfilerParserNodesbyArkTs, TestSize.Level1)
99 {
100     TS_LOGI("test39-1");
101     std::string strConfig = SetArkTSConfig();
102     PbreaderJSMemoryParser htraceJSMemoryParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
103     ProtoReader::BytesView tracePacket(reinterpret_cast<const uint8_t *>(strConfig.data()), strConfig.size());
104     htraceJSMemoryParser.ParseJSMemoryConfig(tracePacket);
105 
106     ArkTSResult jsHeapResult1;
107     jsHeapResult1.set_result(RESULT1);
108     std::string strResult1 = "";
109     jsHeapResult1.SerializeToString(&strResult1);
110     ProtoReader::BytesView tracePacket1(reinterpret_cast<const uint8_t *>(strResult1.data()), strResult1.size());
111     ProfilerPluginDataHeader profilerPluginData;
112     htraceJSMemoryParser.Parse(tracePacket1, PROFILER_INTERVAL, 0, 0, profilerPluginData);
113 
114     ArkTSResult jsHeapResult2;
115     jsHeapResult2.set_result(RESULT2);
116     std::string strResult2 = "";
117     jsHeapResult2.SerializeToString(&strResult2);
118     ProtoReader::BytesView tracePacket4(reinterpret_cast<const uint8_t *>(strResult2.data()), strResult2.size());
119     htraceJSMemoryParser.Parse(tracePacket4, 13000, 0, 0, profilerPluginData);
120     htraceJSMemoryParser.Finish();
121 
122     auto jsCpuProfilerNodeData = stream_.traceDataCache_->GetConstJsCpuProfilerNodeData();
123     ASSERT_EQ(4, jsCpuProfilerNodeData.Size());
124     EXPECT_EQ("0", jsCpuProfilerNodeData.ScriptIds()[0]);
125     EXPECT_EQ(stream_.traceDataCache_->GetDataIndex(""), jsCpuProfilerNodeData.Urls()[0]);
126     EXPECT_EQ(-1, jsCpuProfilerNodeData.LineNumbers()[0]);
127     EXPECT_EQ(-1, jsCpuProfilerNodeData.ColumnNumbers()[0]);
128     EXPECT_EQ(0, jsCpuProfilerNodeData.HitCounts()[0]);
129 
130     ASSERT_EQ(4, jsCpuProfilerNodeData.Size());
131     EXPECT_EQ("0", jsCpuProfilerNodeData.ScriptIds()[1]);
132     EXPECT_EQ(stream_.traceDataCache_->GetDataIndex(""), jsCpuProfilerNodeData.Urls()[1]);
133     EXPECT_EQ(-1, jsCpuProfilerNodeData.LineNumbers()[1]);
134     EXPECT_EQ(-1, jsCpuProfilerNodeData.ColumnNumbers()[1]);
135     EXPECT_EQ(113097, jsCpuProfilerNodeData.HitCounts()[1]);
136 }
137 
138 /**
139  * @tc.name: cpuProfilerParserSamplesbyArkTs
140  * @tc.desc: cpuProfiler parser samples
141  * @tc.type: FUNC
142  */
143 HWTEST_F(JsCpuProfilerTest, cpuProfilerParserSamplesbyArkTs, TestSize.Level1)
144 {
145     TS_LOGI("test39-2");
146     std::string strConfig = SetArkTSConfig();
147     PbreaderJSMemoryParser htraceJSMemoryParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
148     ProtoReader::BytesView tracePacket(reinterpret_cast<const uint8_t *>(strConfig.data()), strConfig.size());
149     htraceJSMemoryParser.ParseJSMemoryConfig(tracePacket);
150 
151     ArkTSResult jsHeapResult1;
152     jsHeapResult1.set_result(RESULT1);
153     std::string strResult1 = "";
154     jsHeapResult1.SerializeToString(&strResult1);
155     ProtoReader::BytesView tracePacket1(reinterpret_cast<const uint8_t *>(strResult1.data()), strResult1.size());
156     ProfilerPluginDataHeader profilerPluginData;
157     htraceJSMemoryParser.Parse(tracePacket1, 10000, 0, 0, profilerPluginData);
158 
159     ArkTSResult jsHeapResult2;
160     jsHeapResult2.set_result(RESULT2);
161     std::string strResult2 = "";
162     jsHeapResult2.SerializeToString(&strResult2);
163     ProtoReader::BytesView tracePacket4(reinterpret_cast<const uint8_t *>(strResult2.data()), strResult2.size());
164     htraceJSMemoryParser.Parse(tracePacket4, 13000, 0, 0, profilerPluginData);
165     htraceJSMemoryParser.Finish();
166 
167     auto jsCpuProfilerSampleData = stream_.traceDataCache_->GetConstJsCpuProfilerSampleData();
168     EXPECT_EQ(2, jsCpuProfilerSampleData.FunctionIds()[0]);
169     EXPECT_EQ(8013755173000, jsCpuProfilerSampleData.StartTimes()[0]);
170     EXPECT_EQ(8013755245000, jsCpuProfilerSampleData.EndTimes()[0]);
171     EXPECT_EQ(72000, jsCpuProfilerSampleData.Durs()[0]);
172     EXPECT_EQ(3, jsCpuProfilerSampleData.FunctionIds()[1]);
173     EXPECT_EQ(8013755245000, jsCpuProfilerSampleData.StartTimes()[1]);
174     EXPECT_EQ(8013755460000, jsCpuProfilerSampleData.EndTimes()[1]);
175     EXPECT_EQ(215000, jsCpuProfilerSampleData.Durs()[1]);
176     EXPECT_EQ(4, jsCpuProfilerSampleData.FunctionIds()[2]);
177     EXPECT_EQ(8013755460000, jsCpuProfilerSampleData.StartTimes()[2]);
178     EXPECT_EQ(8013756097000, jsCpuProfilerSampleData.EndTimes()[2]);
179     EXPECT_EQ(637000, jsCpuProfilerSampleData.Durs()[2]);
180     EXPECT_EQ(2, jsCpuProfilerSampleData.FunctionIds()[3]);
181     EXPECT_EQ(8013756097000, jsCpuProfilerSampleData.StartTimes()[3]);
182     EXPECT_EQ(8013756606000, jsCpuProfilerSampleData.EndTimes()[3]);
183     EXPECT_EQ(509000, jsCpuProfilerSampleData.Durs()[3]);
184 }
185 
186 /**
187  * @tc.name: cpuProfilerParserNoProfilebyArkTs
188  * @tc.desc: cpuProfiler parser no profile
189  * @tc.type: FUNC
190  */
191 HWTEST_F(JsCpuProfilerTest, cpuProfilerParserNoProfilebyArkTs, TestSize.Level1)
192 {
193     TS_LOGI("test39-3");
194     std::string strConfig = SetArkTSConfig();
195     PbreaderJSMemoryParser htraceJSMemoryParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
196     ProtoReader::BytesView tracePacket(reinterpret_cast<const uint8_t *>(strConfig.data()), strConfig.size());
197     htraceJSMemoryParser.ParseJSMemoryConfig(tracePacket);
198 
199     ArkTSResult jsHeapResult1;
200     jsHeapResult1.set_result(RESULT1);
201     std::string strResult1 = "";
202     jsHeapResult1.SerializeToString(&strResult1);
203     ProtoReader::BytesView tracePacket1(reinterpret_cast<const uint8_t *>(strResult1.data()), strResult1.size());
204     ProfilerPluginDataHeader profilerPluginData;
205     htraceJSMemoryParser.Parse(tracePacket1, 10000, 0, 0, profilerPluginData);
206 
207     ArkTSResult jsHeapResult2;
208     jsHeapResult2.set_result(RESULT3);
209     std::string strResult2 = "";
210     jsHeapResult2.SerializeToString(&strResult2);
211     ProtoReader::BytesView tracePacket4(reinterpret_cast<const uint8_t *>(strResult2.data()), strResult2.size());
212     htraceJSMemoryParser.Parse(tracePacket4, 13000, 0, 0, profilerPluginData);
213     htraceJSMemoryParser.Finish();
214 
215     EXPECT_EQ(0, stream_.traceDataCache_->GetConstJsCpuProfilerNodeData().Size());
216 }
217 } // namespace TraceStreamer
218 } // namespace SysTuning
219