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 "export_test.h" 19 #include "ffrt_profiler_config.pb.h" 20 #include "ffrt_profiler_result.pb.h" 21 #include "pbreader_parser.h" 22 #include "trace_streamer_selector.h" 23 24 using namespace testing::ext; 25 using namespace SysTuning::TraceStreamer; 26 27 namespace SysTuning { 28 namespace TraceStreamer { 29 class PbreaderFfrtParserTest : public ::testing::Test { 30 public: SetUp()31 void SetUp() 32 { 33 selector_.InitFilter(); 34 selector_.pbreaderParser_ = 35 std::make_unique<PbreaderParser>(selector_.GetTraceDataCache(), selector_.GetStreamFilter()); 36 ffrtDetailParser_ = std::make_unique<PbreaderFfrtDetailParser>( 37 selector_.GetTraceDataCache(), selector_.GetStreamFilter(), 38 selector_.GetPbreaderParser()->htraceCpuDetailParser_->eventParser_.get()); 39 } 40 TearDown()41 void TearDown() {} 42 43 private: SetFfrtSrcClockid(FfrtProfilerConfig::ClockId destClockId)44 void SetFfrtSrcClockid(FfrtProfilerConfig::ClockId destClockId) 45 { 46 PbreaderDataSegment dataSeg; 47 FfrtProfilerConfig ffrtCfg; 48 ffrtCfg.set_clock_id(destClockId); 49 dataSeg.seg = std::make_shared<std::string>(); 50 ffrtCfg.SerializeToString(dataSeg.seg.get()); 51 dataSeg.protoData.data_ = reinterpret_cast<const uint8_t *>(dataSeg.seg->data()); 52 dataSeg.protoData.size_ = dataSeg.seg->size(); 53 ffrtDetailParser_->SetFfrtSrcClockid(dataSeg); 54 EXPECT_EQ(ffrtDetailParser_->ffrtClockid_, destClockId); 55 } 56 57 public: 58 SysTuning::TraceStreamer::TraceStreamerSelector selector_ = {}; 59 std::unique_ptr<PbreaderFfrtDetailParser> ffrtDetailParser_; 60 }; 61 /** 62 * @tc.name: SetFfrtSrcClockid 63 * @tc.desc: Set ffrt src clockid 64 * @tc.type: FUNC 65 */ 66 HWTEST_F(PbreaderFfrtParserTest, SetFfrtSrcClockid, TestSize.Level1) 67 { 68 TS_LOGI("test45-1"); 69 SetFfrtSrcClockid(FfrtProfilerConfig::BOOTTIME); 70 SetFfrtSrcClockid(FfrtProfilerConfig::REALTIME); 71 SetFfrtSrcClockid(FfrtProfilerConfig::REALTIME_COARSE); 72 SetFfrtSrcClockid(FfrtProfilerConfig::MONOTONIC); 73 SetFfrtSrcClockid(FfrtProfilerConfig::MONOTONIC_COARSE); 74 SetFfrtSrcClockid(FfrtProfilerConfig::MONOTONIC_RAW); 75 } 76 /** 77 * @tc.name: ParserAll 78 * @tc.desc: Parser ffrt all data 79 * @tc.type: FUNC 80 */ 81 HWTEST_F(PbreaderFfrtParserTest, ParserAll, TestSize.Level1) 82 { 83 TS_LOGI("test45-2"); 84 const std::string ffrtBinPath = "../../test/resource/pbreader_ffrt.htrace"; 85 EXPECT_TRUE(ParseTraceFile(selector_, ffrtBinPath)); 86 } 87 /** 88 * @tc.name: Parser 89 * @tc.desc: Parser ffrt comm and trace data 90 * @tc.type: FUNC 91 */ 92 HWTEST_F(PbreaderFfrtParserTest, Parser, TestSize.Level1) 93 { 94 TS_LOGI("test45-3"); 95 std::string buf; 96 bool haveSplitSeg = false; 97 PbreaderDataSegment dataSeg; 98 auto tid = gettid(); 99 auto pid = getpid(); 100 // case 1: for ffrt comm result 101 FfrtProfilerResult ffrtCommResult; 102 auto commResultEvent = ffrtCommResult.add_ffrt_event(); 103 commResultEvent->set_pid(pid); 104 commResultEvent->set_tid(tid); 105 commResultEvent->set_process_name("PbreaderFfrtParserTest"); 106 commResultEvent->set_thread_name("PbreaderFfrtParserTest"); 107 ffrtCommResult.SerializeToString(&buf); 108 dataSeg.seg = std::make_shared<std::string>(buf); 109 dataSeg.protoData = 110 ProtoReader::BytesView(reinterpret_cast<const uint8_t *>(dataSeg.seg->data()), dataSeg.seg->size()); 111 EXPECT_TRUE(ffrtDetailParser_->taskNameIndexMap_.Empty()); 112 ffrtDetailParser_->Parser(dataSeg, haveSplitSeg); 113 EXPECT_TRUE(!ffrtDetailParser_->taskNameIndexMap_.Empty()); 114 // case 2: for ffrt trace result 115 struct timespec currentTime; 116 clock_gettime(CLOCK_BOOTTIME, ¤tTime); 117 auto cpu = 0; 118 FfrtProfilerResult ffrtTraceResult; 119 auto ffrtTraceEvent = ffrtTraceResult.add_ffrt_event(); 120 ffrtTraceEvent->set_pid(pid); 121 ffrtTraceEvent->set_tid(tid); 122 ffrtTraceEvent->set_tv_sec(currentTime.tv_sec); 123 ffrtTraceEvent->set_tv_nsec(currentTime.tv_nsec); 124 ffrtTraceEvent->mutable_trace()->set_cpu(cpu); 125 ffrtTraceEvent->mutable_trace()->set_trace_type("B"); 126 ffrtTraceEvent->mutable_trace()->set_label("onSubmit"); 127 ffrtTraceResult.SerializeToString(&buf); 128 dataSeg.seg = std::make_shared<std::string>(buf); 129 dataSeg.protoData = 130 ProtoReader::BytesView(reinterpret_cast<const uint8_t *>(dataSeg.seg->data()), dataSeg.seg->size()); 131 EXPECT_TRUE(ffrtDetailParser_->eventParser_->htraceEventList_.empty()); 132 ffrtDetailParser_->Parser(dataSeg, haveSplitSeg); 133 EXPECT_TRUE(!ffrtDetailParser_->eventParser_->htraceEventList_.empty()); 134 } 135 136 } // namespace TraceStreamer 137 } // namespace SysTuning 138