1/* 2 * Copyright (c) 2021 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 16#include <gtest/gtest.h> 17#include <vector> 18#include <unistd.h> 19 20#include "directory_ex.h" 21#include "executor/zip_output.h" 22#include "executor/fd_output.h" 23#include "executor/zipfolder_output.h" 24#define private public 25#include "raw_param.h" 26#undef private 27 28using namespace std; 29using namespace testing::ext; 30using namespace OHOS; 31using namespace OHOS::HiviewDFX; 32namespace OHOS { 33namespace HiviewDFX { 34class HidumperOutputTest : public testing::Test { 35public: 36 static void SetUpTestCase(void); 37 static void TearDownTestCase(void); 38 void SetUp(); 39 void TearDown(); 40 41protected: 42 static const std::string FILE_ROOT; 43}; 44 45void HidumperOutputTest::SetUpTestCase(void) 46{ 47 ForceCreateDirectory(FILE_ROOT); 48} 49void HidumperOutputTest::TearDownTestCase(void) 50{ 51 ForceRemoveDirectory(FILE_ROOT); 52} 53void HidumperOutputTest::SetUp(void) 54{ 55} 56void HidumperOutputTest::TearDown(void) 57{ 58} 59 60const std::string HidumperOutputTest::FILE_ROOT = "/data/local/tmp/hidumper_test/"; 61 62/** 63 * @tc.name: HidumperOutputTest001 64 * @tc.desc: Test ZipOutpu with multibytes content. 65 * @tc.type: FUNC 66 */ 67HWTEST_F(HidumperOutputTest, HidumperOutputTest001, TestSize.Level3) 68{ 69 auto parameter = std::make_shared<DumperParameter>(); 70 auto dump_datas = std::make_shared<std::vector<std::vector<std::string>>>(); 71 auto zip_output = make_shared<ZipOutput>(); 72 73 // multibytes content 74 { 75 std::string line_content; 76 line_content = "根据输出结果(win32 + vc 编译器)可以看到," 77 "strShort 对象的地址和 c_str() 的地址很接近," 78 "都在 strShort 对象的栈控件内," 79 "而 strLong 的 c_str() 地址很明显与 strLong 对象地址不同,是在 heap 中分配的."; 80 std::vector<std::string> line_vector; 81 line_vector.push_back(line_content); 82 dump_datas->push_back(line_vector); 83 } 84 85 DumperOpts opts; 86 opts.path_ = FILE_ROOT + "GZ_HidumperOutputTest001.gz"; 87 parameter->SetOpts(opts); 88 89 auto config = std::make_shared<DumpCfg>(); 90 zip_output->SetDumpConfig(config); 91 92 DumpStatus ret = zip_output->PreExecute(parameter, dump_datas); 93 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "PreExecute failed."; 94 95 ret = zip_output->Execute(); 96 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "Execute failed."; 97 98 ret = zip_output->AfterExecute(); 99 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "AfterExecute failed."; 100} 101 102/** 103 * @tc.name: HidumperOutputTest002 104 * @tc.desc: Test ZipOutpu with content size touch buffer size. 105 * @tc.type: FUNC 106 */ 107HWTEST_F(HidumperOutputTest, HidumperOutputTest002, TestSize.Level3) 108{ 109 auto parameter = std::make_shared<DumperParameter>(); 110 auto dump_datas = std::make_shared<std::vector<std::vector<std::string>>>(); 111 auto zip_output = make_shared<ZipOutput>(); 112 113 // Touch Buffer Size 114 { 115 std::string line_content; 116 line_content = "HidumperOutputTest001 big one!HidumperOutputTest001 big one!" 117 "HidumperOutputTest001 big one!HidumperOutputTest001 big one!" 118 "HidumperOutputTest001 big one!HidumperOutputTest001 big one!" 119 "HidumperOutputTest001 big one!HidumperOutputTest001 big one!" 120 "HidumperOut123456"; 121 std::vector<std::string> line_vector; 122 line_vector.push_back(line_content); 123 dump_datas->push_back(line_vector); 124 } 125 126 DumperOpts opts; 127 opts.path_ = FILE_ROOT + "GZ_HidumperOutputTest002.gz"; 128 parameter->SetOpts(opts); 129 130 DumpStatus ret = zip_output->PreExecute(parameter, dump_datas); 131 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "PreExecute failed."; 132 133 ret = zip_output->Execute(); 134 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "Execute failed."; 135 136 ret = zip_output->AfterExecute(); 137 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "AfterExecute failed."; 138} 139 140/** 141 * @tc.name: HidumperOutputTest003 142 * @tc.desc: Test ZipOutpu with content size touch buffer size - 1. 143 * @tc.type: FUNC 144 */ 145HWTEST_F(HidumperOutputTest, HidumperOutputTest003, TestSize.Level3) 146{ 147 auto parameter = std::make_shared<DumperParameter>(); 148 auto dump_datas = std::make_shared<std::vector<std::vector<std::string>>>(); 149 auto zip_output = make_shared<ZipOutput>(); 150 151 // Touch Buffer Size - 1 152 { 153 std::string line_content; 154 line_content = "HidumperOutputTest003 big one!" 155 "HidumperOutputTest003 big one!" 156 "HidumperOutputTest003 big one!" 157 "HidumperOutputTest003 big one!" 158 "HidumperOutputTest003 big one!" 159 "HidumperOutputTest003 big one!" 160 "HidumperOutputTest003 big one!" 161 "HidumperOutputTest003 big one!" 162 "HidumperOu12345"; 163 std::vector<std::string> line_vector; 164 line_vector.push_back(line_content); 165 dump_datas->push_back(line_vector); 166 } 167 168 DumperOpts opts; 169 opts.path_ = FILE_ROOT + "GZ_HidumperOutputTest003.gz"; 170 parameter->SetOpts(opts); 171 172 DumpStatus ret = zip_output->PreExecute(parameter, dump_datas); 173 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "PreExecute failed."; 174 175 ret = zip_output->Execute(); 176 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "Execute failed."; 177 178 ret = zip_output->AfterExecute(); 179 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "AfterExecute failed."; 180} 181 182/** 183 * @tc.name: HidumperOutputTest004 184 * @tc.desc: Test ZipOutpu with content size touch buffer size + 1. 185 * @tc.type: FUNC 186 */ 187HWTEST_F(HidumperOutputTest, HidumperOutputTest004, TestSize.Level3) 188{ 189 auto parameter = std::make_shared<DumperParameter>(); 190 auto dump_datas = std::make_shared<std::vector<std::vector<std::string>>>(); 191 auto zip_output = make_shared<ZipOutput>(); 192 193 // Touch Buffer Size + 1 194 { 195 std::string line_content; 196 line_content = "HidumperOutputTest004 big one!" 197 "HidumperOutputTest004 big one!" 198 "HidumperOutputTest004 big one!" 199 "HidumperOutputTest004 big one!" 200 "HidumperOutputTest004 big one!" 201 "HidumperOutputTest004 big one!" 202 "HidumperOutputTest004 big one!" 203 "HidumperOutputTest004 big one!" 204 "HidumperOu1234567"; 205 std::vector<std::string> line_vector; 206 line_vector.push_back(line_content); 207 dump_datas->push_back(line_vector); 208 } 209 210 DumperOpts opts; 211 opts.path_ = FILE_ROOT + "GZ_HidumperOutputTest004.gz"; 212 parameter->SetOpts(opts); 213 214 DumpStatus ret = zip_output->PreExecute(parameter, dump_datas); 215 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "PreExecute failed."; 216 217 ret = zip_output->Execute(); 218 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "Execute failed."; 219 220 ret = zip_output->AfterExecute(); 221 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "AfterExecute failed."; 222} 223 224/** 225 * @tc.name: HidumperOutputTest005 226 * @tc.desc: Test ZipOutpu with multi lines content. 227 * @tc.type: FUNC 228 */ 229HWTEST_F(HidumperOutputTest, HidumperOutputTest005, TestSize.Level3) 230{ 231 auto parameter = std::make_shared<DumperParameter>(); 232 auto dump_datas = std::make_shared<std::vector<std::vector<std::string>>>(); 233 auto zip_output = make_shared<ZipOutput>(); 234 235 // Multi lines 236 for (int i = 1; i < 1000; i++) { 237 std::string line_content; 238 line_content = "HidumperOutputTest005 big one!" 239 "HidumperOutputTest005 big two!" 240 "HidumperOutputTest005 big three!" 241 "HidumperOutputTest005 big four!" 242 "HidumperOutputTest005 big five!" 243 "HidumperOutputTest005 big six!" 244 "HidumperOutputTest005 big seven!" 245 "HidumperOutputTest005 big eight!" 246 "HidumperOutputTest005 big nine!" 247 "HidumperOutputTest005 big ten!" 248 "HidumperOutputTest005 big eleven!" 249 "HidumperOutputTest005 big twelve!" 250 "HidumperOutputTest005 big thirteen!" 251 "HidumperOutputTest005 big fourteen!"; 252 std::vector<std::string> line_vector; 253 line_vector.push_back(line_content); 254 dump_datas->push_back(line_vector); 255 } 256 257 DumperOpts opts; 258 opts.path_ = FILE_ROOT + "GZ_HidumperOutputTest005.gz"; 259 parameter->SetOpts(opts); 260 261 DumpStatus ret = zip_output->PreExecute(parameter, dump_datas); 262 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "PreExecute failed."; 263 264 ret = zip_output->Execute(); 265 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "Execute failed."; 266 267 ret = zip_output->AfterExecute(); 268 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "AfterExecute failed."; 269} 270 271/** 272 * @tc.name: HidumperOutputTest006 273 * @tc.desc: Test ZipOutpu with short string. 274 * @tc.type: FUNC 275 */ 276HWTEST_F(HidumperOutputTest, HidumperOutputTest006, TestSize.Level3) 277{ 278 auto parameter = std::make_shared<DumperParameter>(); 279 auto dump_datas = std::make_shared<std::vector<std::vector<std::string>>>(); 280 auto zip_output = make_shared<ZipOutput>(); 281 282 std::string line_content; 283 line_content = "cmd is:"; 284 std::vector<std::string> line_vector; 285 line_vector.push_back(line_content); 286 dump_datas->push_back(line_vector); 287 288 DumperOpts opts; 289 opts.path_ = FILE_ROOT + "GZ_HidumperOutputTest006.gz"; 290 parameter->SetOpts(opts); 291 292 DumpStatus ret = zip_output->PreExecute(parameter, dump_datas); 293 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "PreExecute failed."; 294 295 ret = zip_output->Execute(); 296 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "Execute failed."; 297 298 ret = zip_output->AfterExecute(); 299 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "AfterExecute failed."; 300} 301 302/** 303 * @tc.name: HidumperOutputTest008 304 * @tc.desc: Test ZipOutpu with short string. 305 * @tc.type: FUNC 306 */ 307HWTEST_F(HidumperOutputTest, HidumperOutputTest008, TestSize.Level3) 308{ 309 auto parameter = std::make_shared<DumperParameter>(); 310 auto dumpDatas = std::make_shared<std::vector<std::vector<std::string>>>(); 311 auto zipFdOutput = make_shared<ZipFolderOutput>(); 312 313 DumperOpts opts; 314 opts.path_ = FILE_ROOT + "zipOutputTest.gz"; 315 parameter->SetOpts(opts); 316 317 std::string srcpath = "/data/log/hilog"; 318 std::vector<std::u16string> args; 319 auto rawparam = std::make_shared<RawParam>(0, 1, 0, args, -1); 320 rawparam->SetFolder(srcpath); 321 parameter->setClientCallback(rawparam); 322 323 DumpStatus ret = zipFdOutput -> PreExecute(parameter, dumpDatas); 324 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "PreExecute failed."; 325 326 ret = zipFdOutput->Execute(); 327 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "Execute failed."; 328 329 ret = zipFdOutput->AfterExecute(); 330 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "AfterExecute failed."; 331 332 zipFdOutput->Reset(); 333} 334 335/** 336 * @tc.name: HidumperOutputTest009 337 * @tc.desc: Test ZipOutpu with multibytes content. 338 * @tc.type: FUNC 339 */ 340HWTEST_F(HidumperOutputTest, HidumperOutputTest009, TestSize.Level3) 341{ 342 auto parameter = std::make_shared<DumperParameter>(); 343 auto dump_datas = std::make_shared<std::vector<std::vector<std::string>>>(); 344 auto zip_output = make_shared<ZipOutput>(); 345 346 // multibytes content 347 { 348 std::string line_content; 349 for (int i = 0; i < 1025; i++) { // 1025: loop size 350 line_content += "HidumperOutputTest000008 big one"; 351 } 352 std::vector<std::string> line_vector; 353 line_vector.push_back(line_content); 354 dump_datas->push_back(line_vector); 355 } 356 357 DumperOpts opts; 358 opts.path_ = FILE_ROOT + "GZ_HidumperOutputTest008.gz"; 359 parameter->SetOpts(opts); 360 361 auto config = std::make_shared<DumpCfg>(); 362 zip_output->SetDumpConfig(config); 363 364 DumpStatus ret = zip_output->PreExecute(parameter, dump_datas); 365 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "PreExecute failed."; 366 367 ret = zip_output->Execute(); 368 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "Execute failed."; 369 370 ret = zip_output->AfterExecute(); 371 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "AfterExecute failed."; 372} 373 374/** 375 * @tc.name: HidumperOutputTest007 376 * @tc.desc: Test FdOutput. 377 * @tc.type: FUNC 378 */ 379HWTEST_F(HidumperOutputTest, HidumperOutputTest007, TestSize.Level3) 380{ 381 auto parameter = std::make_shared<DumperParameter>(); 382 std::vector<std::u16string> args; 383 auto reqCtl = std::make_shared<RawParam>(0, 0, 0, args, STDOUT_FILENO); 384 parameter->setClientCallback(reqCtl); 385 auto dumpDatas = std::make_shared<std::vector<std::vector<std::string>>>(); 386 auto fdOutput = make_shared<FDOutput>(); 387 388 std::string lineContent; 389 lineContent = "this is FdOutputTest"; 390 std::vector<std::string> lineVector; 391 lineVector.push_back(lineContent); 392 dumpDatas->push_back(lineVector); 393 394 DumpStatus ret = fdOutput->PreExecute(parameter, dumpDatas); 395 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "PreExecute failed."; 396 397 ret = fdOutput->Execute(); 398 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "Execute failed."; 399 400 ret = fdOutput->AfterExecute(); 401 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "AfterExecute failed."; 402} 403} // namespace HiviewDFX 404} // namespace OHOS 405