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