• 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 "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, &currentTime);
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