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