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