1 /*
2  * Copyright (c) 2023-2024 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 #include <climits>
16 #include <gtest/gtest.h>
17 #include <iostream>
18 
19 #include "file_util.h"
20 #include "parameter_ex.h"
21 #include "trace_collector.h"
22 #include "trace_manager.h"
23 
24 using namespace testing::ext;
25 using namespace OHOS::HiviewDFX;
26 using namespace OHOS::HiviewDFX::UCollectUtil;
27 using namespace OHOS::HiviewDFX::UCollect;
28 
29 namespace {
30 TraceManager g_traceManager;
31 constexpr uint32_t TIME_0S = 0;
32 constexpr uint32_t TIME_10S = 10;
33 constexpr uint32_t TIME_20S = 20;
34 constexpr uint32_t TIME_30S = 30;
35 }
36 
37 class TraceCollectorTest : public testing::Test {
38 public:
SetUp()39     void SetUp() {};
TearDown()40     void TearDown() {};
SetUpTestCase()41     static void SetUpTestCase() {};
TearDownTestCase()42     static void TearDownTestCase() {};
43 };
44 
45 /**
46  * @tc.name: TraceCollectorTest001
47  * @tc.desc: used to test TraceCollector for xperf dump
48  * @tc.type: FUNC
49 */
50 HWTEST_F(TraceCollectorTest, TraceCollectorTest001, TestSize.Level1)
51 {
52     const std::vector<std::string> tagGroups = {"scene_performance"};
53     UCollect::TraceCaller caller = UCollect::TraceCaller::XPERF;
54     std::shared_ptr<TraceCollector> collector = TraceCollector::Create();
55     ASSERT_EQ(g_traceManager.OpenSnapshotTrace(tagGroups), 0);
56     sleep(10);
57     std::cout << "caller : " << caller << std::endl;
58     CollectResult<std::vector<std::string>> resultDumpTrace = collector->DumpTrace(caller);
59     std::vector<std::string> items = resultDumpTrace.data;
60     std::cout << "collect DumpTrace result size : " << items.size() << std::endl;
61     for (auto it = items.begin(); it != items.end(); it++) {
62         std::cout << "collect DumpTrace result path : " << it->c_str() << std::endl;
63     }
64     ASSERT_TRUE(resultDumpTrace.data.size() >= 0);
65     ASSERT_TRUE(g_traceManager.CloseTrace() == 0);
66 }
67 
68 /**
69  * @tc.name: TraceCollectorTest002
70  * @tc.desc: used to test TraceCollector for xpower dump
71  * @tc.type: FUNC
72 */
73 HWTEST_F(TraceCollectorTest, TraceCollectorTest002, TestSize.Level1)
74 {
75     const std::vector<std::string> tagGroups = {"scene_performance"};
76     UCollect::TraceCaller caller = UCollect::TraceCaller::XPOWER;
77     std::shared_ptr<TraceCollector> collector = TraceCollector::Create();
78     ASSERT_EQ(g_traceManager.OpenSnapshotTrace(tagGroups), 0);
79     sleep(10);
80     std::cout << "caller : " << caller << std::endl;
81     CollectResult<std::vector<std::string>> resultDumpTrace = collector->DumpTrace(caller);
82     std::vector<std::string> items = resultDumpTrace.data;
83     std::cout << "collect DumpTrace result size : " << items.size() << std::endl;
84     for (auto it = items.begin(); it != items.end(); it++) {
85         std::cout << "collect DumpTrace result path : " << it->c_str() << std::endl;
86     }
87     ASSERT_TRUE(resultDumpTrace.data.size() >= 0);
88     ASSERT_TRUE(g_traceManager.CloseTrace() == 0);
89 }
90 
91 /**
92  * @tc.name: TraceCollectorTest003
93  * @tc.desc: used to test TraceCollector for reliability dump
94  * @tc.type: FUNC
95 */
96 HWTEST_F(TraceCollectorTest, TraceCollectorTest003, TestSize.Level1)
97 {
98     const std::vector<std::string> tagGroups = {"scene_performance"};
99     std::shared_ptr<TraceCollector> collector = TraceCollector::Create();
100     UCollect::TraceCaller caller = UCollect::TraceCaller::RELIABILITY;
101     ASSERT_EQ(g_traceManager.OpenSnapshotTrace(tagGroups), 0);
102     sleep(10);
103     std::cout << "caller : " << caller << std::endl;
104     CollectResult<std::vector<std::string>> resultDumpTrace = collector->DumpTrace(caller);
105     std::vector<std::string> items = resultDumpTrace.data;
106     std::cout << "collect DumpTrace result size : " << items.size() << std::endl;
107     for (auto it = items.begin(); it != items.end(); it++) {
108         std::cout << "collect DumpTrace result path : " << it->c_str() << std::endl;
109     }
110     ASSERT_TRUE(resultDumpTrace.data.size() >= 0);
111     ASSERT_TRUE(g_traceManager.CloseTrace() == 0);
112 }
113 
114 /**
115  * @tc.name: TraceCollectorTest004
116  * @tc.desc: used to test TraceCollector for command
117  * @tc.type: FUNC
118 */
119 HWTEST_F(TraceCollectorTest, TraceCollectorTest004, TestSize.Level1)
120 {
121     const std::string args = "tags:sched clockType:boot bufferSize:1024 overwrite:1";
122     std::shared_ptr<TraceCollector> collector = TraceCollector::Create();
123     ASSERT_TRUE(g_traceManager.OpenRecordingTrace(args) == 0);
124 
125     CollectResult<int32_t> resultTraceOn = collector->TraceOn();
126     std::cout << "collect TraceOn result " << resultTraceOn.retCode << std::endl;
127     ASSERT_TRUE(resultTraceOn.retCode == UcError::SUCCESS);
128     sleep(10);
129     CollectResult<std::vector<std::string>> resultTraceOff = collector->TraceOff();
130     std::vector<std::string> items = resultTraceOff.data;
131     for (auto it = items.begin(); it != items.end(); it++) {
132         std::cout << "collect TraceOff result path : " << it->c_str() << std::endl;
133     }
134     ASSERT_TRUE(resultTraceOff.retCode == UcError::SUCCESS);
135     ASSERT_TRUE(resultTraceOff.data.size() > 0);
136     ASSERT_TRUE(g_traceManager.CloseTrace() == 0);
137 }
138 
139 /**
140  * @tc.name: TraceCollectorTest005
141  * @tc.desc: used to test TraceCollector for BetaClub dump
142  * @tc.type: FUNC
143 */
144 HWTEST_F(TraceCollectorTest, TraceCollectorTest005, TestSize.Level1)
145 {
146     const std::vector<std::string> tagGroups = {"scene_performance"};
147     UCollect::TraceCaller caller = UCollect::TraceCaller::BETACLUB;
148     std::shared_ptr<TraceCollector> collector = TraceCollector::Create();
149     ASSERT_EQ(g_traceManager.OpenSnapshotTrace(tagGroups), 0);
150     sleep(10);
151     std::cout << "caller : " << caller << std::endl;
152     CollectResult<std::vector<std::string>> resultDumpTrace = collector->DumpTrace(caller);
153     std::vector<std::string> items = resultDumpTrace.data;
154     std::cout << "collect DumpTrace result size : " << items.size() << std::endl;
155     for (auto it = items.begin(); it != items.end(); it++) {
156         std::cout << "collect DumpTrace result path : " << it->c_str() << std::endl;
157     }
158     if (Parameter::IsBetaVersion()) {
159         ASSERT_EQ(resultDumpTrace.retCode, UcError::SUCCESS);
160     }
161     ASSERT_TRUE(resultDumpTrace.data.size() >= 0);
162     ASSERT_TRUE(g_traceManager.CloseTrace() == 0);
163 }
164 
165 /**
166  * @tc.name: TraceCollectorTest006
167  * @tc.desc: used to test TraceCollector for Other dump
168  * @tc.type: FUNC
169 */
170 HWTEST_F(TraceCollectorTest, TraceCollectorTest006, TestSize.Level1)
171 {
172     const std::vector<std::string> tagGroups = {"scene_performance"};
173     UCollect::TraceCaller caller = UCollect::TraceCaller::OTHER;
174     std::shared_ptr<TraceCollector> collector = TraceCollector::Create();
175     ASSERT_EQ(g_traceManager.OpenSnapshotTrace(tagGroups), 0);
176     sleep(10);
177     std::cout << "caller : " << caller << std::endl;
178     CollectResult<std::vector<std::string>> resultDumpTrace = collector->DumpTrace(caller);
179     std::vector<std::string> items = resultDumpTrace.data;
180     std::cout << "collect DumpTrace result size : " << items.size() << std::endl;
181     for (auto it = items.begin(); it != items.end(); it++) {
182         std::cout << "collect DumpTrace result path : " << it->c_str() << std::endl;
183     }
184     if (Parameter::IsBetaVersion()) {
185         ASSERT_EQ(resultDumpTrace.retCode, UcError::SUCCESS);
186     }
187     ASSERT_TRUE(resultDumpTrace.data.size() >= 0);
188     ASSERT_TRUE(g_traceManager.CloseTrace() == 0);
189 }
190 
191 /**
192  * @tc.name: TraceCollectorTest007
193  * @tc.desc: used to test g_traceManager
194  * @tc.type: FUNC
195 */
196 HWTEST_F(TraceCollectorTest, TraceCollectorTest007, TestSize.Level1)
197 {
198     const std::vector<std::string> tagGroups = {"scene_performance"};
199     ASSERT_EQ(g_traceManager.OpenSnapshotTrace(tagGroups), 0);
200     const std::string args = "tags:sched clockType:boot bufferSize:1024 overwrite:1";
201     ASSERT_TRUE(g_traceManager.OpenRecordingTrace(args) == 0);
202     ASSERT_TRUE(g_traceManager.CloseTrace() == 0);
203 }
204 
205 /**
206  * @tc.name: TraceCollectorTest008
207  * @tc.desc: used to test g_traceManager
208  * @tc.type: FUNC
209 */
210 HWTEST_F(TraceCollectorTest, TraceCollectorTest008, TestSize.Level1)
211 {
212     const std::vector<std::string> tagGroups = {"scene_performance"};
213     ASSERT_EQ(g_traceManager.OpenSnapshotTrace(tagGroups), 0);
214     ASSERT_TRUE(g_traceManager.CloseTrace() == 0);
215 }
216 
217 /**
218  * @tc.name: TraceCollectorTest009
219  * @tc.desc: used to test g_traceManager
220  * @tc.type: FUNC
221 */
222 HWTEST_F(TraceCollectorTest, TraceCollectorTest009, TestSize.Level1)
223 {
224     const std::string args = "tags:sched clockType:boot bufferSize:1024 overwrite:1";
225     ASSERT_TRUE(g_traceManager.OpenRecordingTrace(args) == 0);
226     ASSERT_TRUE(g_traceManager.CloseTrace() == 0);
227 }
228 
229 /**
230  * @tc.name: TraceCollectorTest010
231  * @tc.desc: used to test g_traceManager
232  * @tc.type: FUNC
233 */
234 HWTEST_F(TraceCollectorTest, TraceCollectorTest010, TestSize.Level1)
235 {
236     const std::string args = "tags:sched clockType:boot bufferSize:1024 overwrite:1";
237     ASSERT_TRUE(g_traceManager.OpenRecordingTrace(args) == 0);
238     ASSERT_TRUE(g_traceManager.RecoverTrace() == 0);
239     ASSERT_TRUE(g_traceManager.CloseTrace() == 0);
240 }
241 
242 /**
243  * @tc.name: TraceCollectorTest011
244  * @tc.desc: used to test g_traceManager
245  * @tc.type: FUNC
246 */
247 HWTEST_F(TraceCollectorTest, TraceCollectorTest011, TestSize.Level1)
248 {
249     const std::vector<std::string> tagGroups = {"scene_performance"};
250     ASSERT_EQ(g_traceManager.OpenSnapshotTrace(tagGroups), 0);
251     ASSERT_TRUE(g_traceManager.RecoverTrace() == 0);
252     ASSERT_TRUE(g_traceManager.CloseTrace() == 0);
253 }
254 
255 /**
256  * @tc.name: TraceCollectorTest0012
257  * @tc.desc: used to test TraceCollector for Develop dump
258  * @tc.type: FUNC
259 */
260 HWTEST_F(TraceCollectorTest, TraceCollectorTest012, TestSize.Level1)
261 {
262     const std::vector<std::string> tagGroups = {"scene_performance"};
263     UCollect::TraceCaller caller = UCollect::TraceCaller::DEVELOP;
264     std::shared_ptr<TraceCollector> collector = TraceCollector::Create();
265     ASSERT_EQ(g_traceManager.OpenSnapshotTrace(tagGroups), 0);
266     sleep(10);
267     std::cout << "caller : " << caller << std::endl;
268     CollectResult<std::vector<std::string>> resultDumpTrace = collector->DumpTrace(caller);
269     std::vector<std::string> items = resultDumpTrace.data;
270     std::cout << "collect DumpTrace result size : " << items.size() << std::endl;
271     for (auto it = items.begin(); it != items.end(); it++) {
272         std::cout << "collect DumpTrace result path : " << it->c_str() << std::endl;
273     }
274     if (Parameter::IsBetaVersion()) {
275         ASSERT_EQ(resultDumpTrace.retCode, UcError::SUCCESS);
276     }
277     ASSERT_TRUE(resultDumpTrace.data.size() >= 0);
278     ASSERT_TRUE(g_traceManager.CloseTrace() == 0);
279 }
280 
281 /**
282  * @tc.name: TraceCollectorTest0013
283  * @tc.desc: used to test trace file in /share is zipped
284  * @tc.type: FUNC
285 */
286 HWTEST_F(TraceCollectorTest, TraceCollectorTest013, TestSize.Level1)
287 {
288     std::vector<std::string> traceFiles;
289     FileUtil::GetDirFiles("/data/log/hiview/unified_collection/trace/share/", traceFiles, false);
290     for (auto &path : traceFiles) {
291         if (path.find("temp") == std::string::npos) {
292             std::cout << "trace in share path: " << path.c_str() << std::endl;
293             ASSERT_TRUE(path.find("zip") != std::string::npos);
294         }
295     }
296 }
297 
298 /**
299  * @tc.name: TraceCollectorTest0014
300  * @tc.desc: test interface DumpTraceWithDuration for 0 second
301  * @tc.type: FUNC
302  */
303 HWTEST_F(TraceCollectorTest, TraceCollectorTest014, TestSize.Level1)
304 {
305     const std::vector<std::string> tagGroups = {"scene_performance"};
306     UCollect::TraceCaller caller = UCollect::TraceCaller::DEVELOP;
307     std::shared_ptr<TraceCollector> collector = TraceCollector::Create();
308     ASSERT_EQ(g_traceManager.OpenSnapshotTrace(tagGroups), 0);
309     sleep(TIME_10S);
310     std::cout << "caller : " << caller << std::endl;
311     CollectResult<std::vector<std::string>> resultDumpTrace = collector->DumpTraceWithDuration(caller, TIME_0S);
312     std::vector<std::string> items = resultDumpTrace.data;
313     std::cout << "collect DumpTrace result size : " << items.size() << std::endl;
314     for (auto it = items.begin(); it != items.end(); it++) {
315         std::cout << "collect DumpTrace result path : " << it->c_str() << std::endl;
316     }
317     if (Parameter::IsBetaVersion()) {
318         ASSERT_EQ(resultDumpTrace.retCode, UcError::SUCCESS);
319     }
320     ASSERT_TRUE(g_traceManager.CloseTrace() == 0);
321 }
322 
323 /**
324  * @tc.name: TraceCollectorTest0015
325  * @tc.desc: test interface DumpTraceWithDuration for 20 second
326  * @tc.type: FUNC
327 */
328 HWTEST_F(TraceCollectorTest, TraceCollectorTest015, TestSize.Level1)
329 {
330     const std::vector<std::string> tagGroups = {"scene_performance"};
331     UCollect::TraceCaller caller = UCollect::TraceCaller::DEVELOP;
332     std::shared_ptr<TraceCollector> collector = TraceCollector::Create();
333     ASSERT_EQ(g_traceManager.OpenSnapshotTrace(tagGroups), 0);
334     sleep(TIME_30S);
335     std::cout << "caller : " << caller << std::endl;
336     CollectResult<std::vector<std::string>> resultDumpTrace = collector->DumpTraceWithDuration(caller, TIME_20S);
337     std::vector<std::string> items = resultDumpTrace.data;
338     std::cout << "collect DumpTrace result size : " << items.size() << std::endl;
339     for (auto it = items.begin(); it != items.end(); it++) {
340         std::cout << "collect DumpTrace result path : " << it->c_str() << std::endl;
341     }
342     if (Parameter::IsBetaVersion()) {
343         ASSERT_EQ(resultDumpTrace.retCode, UcError::SUCCESS);
344     }
345     ASSERT_TRUE(resultDumpTrace.data.size() >= 0);
346     ASSERT_TRUE(g_traceManager.CloseTrace() == 0);
347 }
348 
349 /**
350  * @tc.name: TraceCollectorTest0016
351  * @tc.desc: test interface DumpTraceWithDuration for UINT32_MAX
352  * @tc.type: FUNC
353 */
354 HWTEST_F(TraceCollectorTest, TraceCollectorTest016, TestSize.Level1)
355 {
356     const std::vector<std::string> tagGroups = {"scene_performance"};
357     UCollect::TraceCaller caller = UCollect::TraceCaller::DEVELOP;
358     std::shared_ptr<TraceCollector> collector = TraceCollector::Create();
359     ASSERT_EQ(g_traceManager.OpenSnapshotTrace(tagGroups), 0);
360     sleep(TIME_30S);
361     std::cout << "caller : " << caller << std::endl;
362     CollectResult<std::vector<std::string>> resultDumpTrace = collector->DumpTraceWithDuration(caller, UINT32_MAX);
363     std::vector<std::string> items = resultDumpTrace.data;
364     std::cout << "collect DumpTrace result size : " << items.size() << std::endl;
365     for (auto it = items.begin(); it != items.end(); it++) {
366         std::cout << "collect DumpTrace result path : " << it->c_str() << std::endl;
367     }
368     if (Parameter::IsBetaVersion()) {
369         ASSERT_EQ(resultDumpTrace.retCode, UcError::SUCCESS);
370     }
371     ASSERT_TRUE(resultDumpTrace.data.size() >= 0);
372     ASSERT_TRUE(g_traceManager.CloseTrace() == 0);
373 }
374 
375 /**
376  * @tc.name: TraceCollectorTest017
377  * @tc.desc: used to test TraceCollector for hiview dump
378  * @tc.type: FUNC
379 */
380 HWTEST_F(TraceCollectorTest, TraceCollectorTest017, TestSize.Level1)
381 {
382     const std::vector<std::string> tagGroups = {"scene_performance"};
383     UCollect::TraceCaller caller = UCollect::TraceCaller::HIVIEW;
384     std::shared_ptr<TraceCollector> collector = TraceCollector::Create();
385     ASSERT_EQ(g_traceManager.OpenSnapshotTrace(tagGroups), 0);
386     sleep(10);
387     std::cout << "caller : " << caller << std::endl;
388     CollectResult<std::vector<std::string>> resultDumpTrace = collector->DumpTrace(caller);
389     std::vector<std::string> items = resultDumpTrace.data;
390     std::cout << "collect DumpTrace result size : " << items.size() << std::endl;
391     for (auto it = items.begin(); it != items.end(); it++) {
392         std::cout << "collect DumpTrace result path : " << it->c_str() << std::endl;
393     }
394     if (Parameter::IsBetaVersion()) {
395         ASSERT_EQ(resultDumpTrace.retCode, UcError::SUCCESS);
396     }
397     ASSERT_TRUE(resultDumpTrace.data.size() >= 0);
398     ASSERT_TRUE(g_traceManager.CloseTrace() == 0);
399 }
400