• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  */
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 "htrace_js_memory_parser.h"
26 #include "htrace_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 class JsCpuProfilerTest : public ::testing::Test {
39 public:
SetUp()40     void SetUp()
41     {
42         stream_.InitFilter();
43     }
44 
TearDown()45     void TearDown() {}
46 
47 public:
48     SysTuning::TraceStreamer::TraceStreamerSelector stream_ = {};
49 };
50 /**
51  * @tc.name: cpuProfilerParserNodesbyArkTs
52  * @tc.desc: cpuProfiler parser nodes
53  * @tc.type: FUNC
54  */
55 HWTEST_F(JsCpuProfilerTest, cpuProfilerParserNodesbyArkTs, TestSize.Level1)
56 {
57     TS_LOGI("test39-1");
58     const int32_t pid = 1734;
59     ArkTSConfig arkTSConfig;
60     arkTSConfig.set_pid(pid);
61     arkTSConfig.set_type(::ArkTSConfig_HeapType(ArkTSConfig_HeapType_INVALID));
62     arkTSConfig.set_enable_cpu_profiler(0);
63     arkTSConfig.set_cpu_profiler_interval(1000);
64     std::string strConfig = "";
65     arkTSConfig.SerializeToString(&strConfig);
66 
67     HtraceJSMemoryParser htraceJSMemoryParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
68     ProtoReader::BytesView tracePacket(reinterpret_cast<const uint8_t*>(strConfig.data()), strConfig.size());
69     htraceJSMemoryParser.ParseJSMemoryConfig(tracePacket);
70     const char* result1 = "{\"id\":3,\"result\":{}}";
71     const char* result2 =
72         "{\"id\":3,\"result\":{\"profile\":{\"tid\":1394,\"startTime\":8013755173,\"endTime\":8034596087,\"gcTime\":0,"
73         "\"cInterpreterTime\":0,\"asmInterpreterTime\":0,\"aotTime\":0,\"builtinTime\":0,\"napiTime\":0,"
74         "\"arkuiEngineTime\":0,\"runtimeTime\":0,\"otherTime\":20840914,\"nodes\":[{\"id\":1,\"callFrame\":{"
75         "\"functionName\":\"(root)\",\"scriptId\":\"0\",\"url\":\"\",\"lineNumber\":-1,\"columnNumber\":-1},"
76         "\"hitCount\":0,\"children\":[2,3,4]},{\"id\":2,\"callFrame\":{\"functionName\":\"(program)\",\"scriptId\":"
77         "\"0\",\"url\":\"\",\"lineNumber\":-1,\"columnNumber\":-1},\"hitCount\":113097,\"children\":[]},{\"id\":3,"
78         "\"callFrame\":{\"functionName\":\"(idle)\",\"scriptId\":\"0\",\"url\":\"\",\"lineNumber\":-1,\"columnNumber\":"
79         "-1},\"hitCount\":0,\"children\":[]},{\"id\":4,\"callFrame\":{\"functionName\":\"anonymous\",\"scriptId\":"
80         "\"1\",\"url\":\"D:/workspace_ohos_system/Music/entry/build/default/intermediates/assets_jsbundle/default/ets/"
81         "pages/"
82         "index_.js\",\"lineNumber\":2922,\"columnNumber\":36},\"hitCount\":1,\"children\":[]}],\"samples\":[2,3,4,2,2,"
83         "2,2,3,3,3,3,4,4,4],\"timeDeltas\":[99,72,215,637,96,288,36,89,94,54,26,598,784,522]}}}";
84 
85     ArkTSResult jsHeapResult1;
86     jsHeapResult1.set_result(result1);
87     std::string strResult1 = "";
88     jsHeapResult1.SerializeToString(&strResult1);
89     ProtoReader::BytesView tracePacket1(reinterpret_cast<const uint8_t*>(strResult1.data()), strResult1.size());
90     htraceJSMemoryParser.Parse(tracePacket1, 10000);
91 
92     ArkTSResult jsHeapResult2;
93     jsHeapResult2.set_result(result2);
94     std::string strResult2 = "";
95     jsHeapResult2.SerializeToString(&strResult2);
96     ProtoReader::BytesView tracePacket4(reinterpret_cast<const uint8_t*>(strResult2.data()), strResult2.size());
97     htraceJSMemoryParser.Parse(tracePacket4, 13000);
98     htraceJSMemoryParser.Finish();
99 
100     auto size = stream_.traceDataCache_->GetConstJsCpuProfilerNodeData().Size();
101     EXPECT_EQ(4, size);
102     auto scriptId = stream_.traceDataCache_->GetConstJsCpuProfilerNodeData().ScriptIds()[0];
103     EXPECT_EQ("0", scriptId);
104     auto url = stream_.traceDataCache_->GetConstJsCpuProfilerNodeData().Urls()[0];
105     EXPECT_EQ(stream_.traceDataCache_->GetDataIndex(""), url);
106     auto lineNumber = stream_.traceDataCache_->GetConstJsCpuProfilerNodeData().LineNumbers()[0];
107     EXPECT_EQ(-1, lineNumber);
108     auto columnNumber = stream_.traceDataCache_->GetConstJsCpuProfilerNodeData().ColumnNumbers()[0];
109     EXPECT_EQ(-1, columnNumber);
110     auto hitCount = stream_.traceDataCache_->GetConstJsCpuProfilerNodeData().HitCounts()[0];
111     EXPECT_EQ(0, hitCount);
112 
113     auto size1 = stream_.traceDataCache_->GetConstJsCpuProfilerNodeData().Size();
114     EXPECT_EQ(4, size1);
115     auto scriptId1 = stream_.traceDataCache_->GetConstJsCpuProfilerNodeData().ScriptIds()[1];
116     EXPECT_EQ("0", scriptId1);
117     auto url1 = stream_.traceDataCache_->GetConstJsCpuProfilerNodeData().Urls()[1];
118     EXPECT_EQ(stream_.traceDataCache_->GetDataIndex(""), url1);
119     auto lineNumber1 = stream_.traceDataCache_->GetConstJsCpuProfilerNodeData().LineNumbers()[1];
120     EXPECT_EQ(-1, lineNumber1);
121     auto columnNumber1 = stream_.traceDataCache_->GetConstJsCpuProfilerNodeData().ColumnNumbers()[1];
122     EXPECT_EQ(-1, columnNumber1);
123     auto hitCount1 = stream_.traceDataCache_->GetConstJsCpuProfilerNodeData().HitCounts()[1];
124     EXPECT_EQ(113097, hitCount1);
125 }
126 
127 /**
128  * @tc.name: cpuProfilerParserSamplesbyArkTs
129  * @tc.desc: cpuProfiler parser samples
130  * @tc.type: FUNC
131  */
132 HWTEST_F(JsCpuProfilerTest, cpuProfilerParserSamplesbyArkTs, TestSize.Level1)
133 {
134     TS_LOGI("test39-2");
135     const int32_t pid = 1734;
136     ArkTSConfig arkTSConfig;
137     arkTSConfig.set_pid(pid);
138     arkTSConfig.set_type(::ArkTSConfig_HeapType(ArkTSConfig_HeapType_INVALID));
139     arkTSConfig.set_enable_cpu_profiler(0);
140     arkTSConfig.set_cpu_profiler_interval(1000);
141     std::string strConfig = "";
142     arkTSConfig.SerializeToString(&strConfig);
143 
144     HtraceJSMemoryParser htraceJSMemoryParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
145     ProtoReader::BytesView tracePacket(reinterpret_cast<const uint8_t*>(strConfig.data()), strConfig.size());
146     htraceJSMemoryParser.ParseJSMemoryConfig(tracePacket);
147     const char* result1 = "{\"id\":3,\"result\":{}}";
148     const char* result2 =
149         "{\"id\":3,\"result\":{\"profile\":{\"tid\":1394,\"startTime\":8013755173,\"endTime\":8034596087,\"gcTime\":0,"
150         "\"cInterpreterTime\":0,\"asmInterpreterTime\":0,\"aotTime\":0,\"builtinTime\":0,\"napiTime\":0,"
151         "\"arkuiEngineTime\":0,\"runtimeTime\":0,\"otherTime\":20840914,\"nodes\":[{\"id\":1,\"callFrame\":{"
152         "\"functionName\":\"(root)\",\"scriptId\":\"0\",\"url\":\"\",\"lineNumber\":-1,\"columnNumber\":-1},"
153         "\"hitCount\":0,\"children\":[2,3,4]},{\"id\":2,\"callFrame\":{\"functionName\":\"(program)\",\"scriptId\":"
154         "\"0\",\"url\":\"\",\"lineNumber\":-1,\"columnNumber\":-1},\"hitCount\":113097,\"children\":[]},{\"id\":3,"
155         "\"callFrame\":{\"functionName\":\"(idle)\",\"scriptId\":\"0\",\"url\":\"\",\"lineNumber\":-1,\"columnNumber\":"
156         "-1},\"hitCount\":0,\"children\":[]},{\"id\":4,\"callFrame\":{\"functionName\":\"anonymous\",\"scriptId\":"
157         "\"1\",\"url\":\"D:/workspace_ohos_system/Music/entry/build/default/intermediates/assets_jsbundle/default/ets/"
158         "pages/"
159         "index_.js\",\"lineNumber\":2922,\"columnNumber\":36},\"hitCount\":1,\"children\":[]}],\"samples\":[2,3,4,2,2,"
160         "2,2,3,3,3,3,4,4,4],\"timeDeltas\":[99,72,215,637,96,288,36,89,94,54,26,598,784,522]}}}";
161 
162     ArkTSResult jsHeapResult1;
163     jsHeapResult1.set_result(result1);
164     std::string strResult1 = "";
165     jsHeapResult1.SerializeToString(&strResult1);
166     ProtoReader::BytesView tracePacket1(reinterpret_cast<const uint8_t*>(strResult1.data()), strResult1.size());
167     htraceJSMemoryParser.Parse(tracePacket1, 10000);
168 
169     ArkTSResult jsHeapResult2;
170     jsHeapResult2.set_result(result2);
171     std::string strResult2 = "";
172     jsHeapResult2.SerializeToString(&strResult2);
173     ProtoReader::BytesView tracePacket4(reinterpret_cast<const uint8_t*>(strResult2.data()), strResult2.size());
174     htraceJSMemoryParser.Parse(tracePacket4, 13000);
175     htraceJSMemoryParser.Finish();
176 
177     auto sampleFunctionId1 = stream_.traceDataCache_->GetConstJsCpuProfilerSampleData().FunctionIds()[0];
178     EXPECT_EQ(2, sampleFunctionId1);
179     auto startTime1 = stream_.traceDataCache_->GetConstJsCpuProfilerSampleData().StartTimes()[0];
180     EXPECT_EQ(8013755173000, startTime1);
181     auto endTime1 = stream_.traceDataCache_->GetConstJsCpuProfilerSampleData().EndTimes()[0];
182     EXPECT_EQ(8013755245000, endTime1);
183     auto dur1 = stream_.traceDataCache_->GetConstJsCpuProfilerSampleData().Durs()[0];
184     EXPECT_EQ(72000, dur1);
185     auto sampleFunctionId2 = stream_.traceDataCache_->GetConstJsCpuProfilerSampleData().FunctionIds()[1];
186     EXPECT_EQ(3, sampleFunctionId2);
187     auto startTime2 = stream_.traceDataCache_->GetConstJsCpuProfilerSampleData().StartTimes()[1];
188     EXPECT_EQ(8013755245000, startTime2);
189     auto endTime2 = stream_.traceDataCache_->GetConstJsCpuProfilerSampleData().EndTimes()[1];
190     EXPECT_EQ(8013755460000, endTime2);
191     auto dur2 = stream_.traceDataCache_->GetConstJsCpuProfilerSampleData().Durs()[1];
192     EXPECT_EQ(72000, dur2);
193     auto sampleFunctionId3 = stream_.traceDataCache_->GetConstJsCpuProfilerSampleData().FunctionIds()[2];
194     EXPECT_EQ(4, sampleFunctionId3);
195     auto startTime3 = stream_.traceDataCache_->GetConstJsCpuProfilerSampleData().StartTimes()[2];
196     EXPECT_EQ(8013755460000, startTime3);
197     auto endTime3 = stream_.traceDataCache_->GetConstJsCpuProfilerSampleData().EndTimes()[2];
198     EXPECT_EQ(8013756097000, endTime3);
199     auto dur3 = stream_.traceDataCache_->GetConstJsCpuProfilerSampleData().Durs()[2];
200     EXPECT_EQ(637000, dur3);
201     auto sampleFunctionId4 = stream_.traceDataCache_->GetConstJsCpuProfilerSampleData().FunctionIds()[3];
202     EXPECT_EQ(2, sampleFunctionId4);
203     auto startTime4 = stream_.traceDataCache_->GetConstJsCpuProfilerSampleData().StartTimes()[3];
204     EXPECT_EQ(8013756097000, startTime4);
205     auto endTime4 = stream_.traceDataCache_->GetConstJsCpuProfilerSampleData().EndTimes()[3];
206     EXPECT_EQ(8013756606000, endTime4);
207     auto dur4 = stream_.traceDataCache_->GetConstJsCpuProfilerSampleData().Durs()[3];
208     EXPECT_EQ(509000, dur4);
209 }
210 
211 /**
212  * @tc.name: cpuProfilerParserNoProfilebyArkTs
213  * @tc.desc: cpuProfiler parser no profile
214  * @tc.type: FUNC
215  */
216 HWTEST_F(JsCpuProfilerTest, cpuProfilerParserNoProfilebyArkTs, TestSize.Level1)
217 {
218     TS_LOGI("test39-3");
219     const int32_t pid = 1734;
220     ArkTSConfig arkTSConfig;
221     arkTSConfig.set_pid(pid);
222     arkTSConfig.set_type(::ArkTSConfig_HeapType(ArkTSConfig_HeapType_INVALID));
223     arkTSConfig.set_enable_cpu_profiler(0);
224     arkTSConfig.set_cpu_profiler_interval(1000);
225     std::string strConfig = "";
226     arkTSConfig.SerializeToString(&strConfig);
227 
228     HtraceJSMemoryParser htraceJSMemoryParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
229     ProtoReader::BytesView tracePacket(reinterpret_cast<const uint8_t*>(strConfig.data()), strConfig.size());
230     htraceJSMemoryParser.ParseJSMemoryConfig(tracePacket);
231     const char* result1 = "{\"id\":3,\"result\":{}}";
232     const char* result2 =
233         "{\"id\":3,\"result\":{\"data\":{\"tid\":1394,\"startTime\":8013755173,\"endTime\":8034596087,\"gcTime\":0,"
234         "\"cInterpreterTime\":0,\"asmInterpreterTime\":0,\"aotTime\":0,\"builtinTime\":0,\"napiTime\":0,"
235         "\"arkuiEngineTime\":0,\"runtimeTime\":0,\"otherTime\":20840914,\"nodes\":[{\"id\":1,\"callFrame\":{"
236         "\"functionName\":\"(root)\",\"scriptId\":\"0\",\"url\":\"\",\"lineNumber\":-1,\"columnNumber\":-1},"
237         "\"hitCount\":0,\"children\":[2,3,4]},{\"id\":2,\"callFrame\":{\"functionName\":\"(program)\",\"scriptId\":"
238         "\"0\",\"url\":\"\",\"lineNumber\":-1,\"columnNumber\":-1},\"hitCount\":113097,\"children\":[]},{\"id\":3,"
239         "\"callFrame\":{\"functionName\":\"(idle)\",\"scriptId\":\"0\",\"url\":\"\",\"lineNumber\":-1,\"columnNumber\":"
240         "-1},\"hitCount\":0,\"children\":[]},{\"id\":4,\"callFrame\":{\"functionName\":\"anonymous\",\"scriptId\":"
241         "\"1\",\"url\":\"D:/workspace_ohos_system/Music/entry/build/default/intermediates/assets_jsbundle/default/ets/"
242         "pages/"
243         "index_.js\",\"lineNumber\":2922,\"columnNumber\":36},\"hitCount\":1,\"children\":[]}],\"samples\":[2,3,4,2,2,"
244         "2,2,3,3,3,3,4,4,4],\"timeDeltas\":[99,72,215,637,96,288,36,89,94,54,26,598,784,522]}}}";
245 
246     ArkTSResult jsHeapResult1;
247     jsHeapResult1.set_result(result1);
248     std::string strResult1 = "";
249     jsHeapResult1.SerializeToString(&strResult1);
250     ProtoReader::BytesView tracePacket1(reinterpret_cast<const uint8_t*>(strResult1.data()), strResult1.size());
251     htraceJSMemoryParser.Parse(tracePacket1, 10000);
252 
253     ArkTSResult jsHeapResult2;
254     jsHeapResult2.set_result(result2);
255     std::string strResult2 = "";
256     jsHeapResult2.SerializeToString(&strResult2);
257     ProtoReader::BytesView tracePacket4(reinterpret_cast<const uint8_t*>(strResult2.data()), strResult2.size());
258     htraceJSMemoryParser.Parse(tracePacket4, 13000);
259     htraceJSMemoryParser.Finish();
260 
261     auto size = stream_.traceDataCache_->GetConstJsCpuProfilerNodeData().Size();
262     EXPECT_EQ(0, size);
263 }
264 } // namespace TraceStreamer
265 } // namespace SysTuning
266