148f512ceSopenharmony_ci/* 248f512ceSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 348f512ceSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 448f512ceSopenharmony_ci * you may not use this file except in compliance with the License. 548f512ceSopenharmony_ci * You may obtain a copy of the License at 648f512ceSopenharmony_ci * 748f512ceSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 848f512ceSopenharmony_ci * 948f512ceSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1048f512ceSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1148f512ceSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1248f512ceSopenharmony_ci * See the License for the specific language governing permissions and 1348f512ceSopenharmony_ci * limitations under the License. 1448f512ceSopenharmony_ci */ 1548f512ceSopenharmony_ci#include "subcommand_stat_test.h" 1648f512ceSopenharmony_ci 1748f512ceSopenharmony_ci#include <algorithm> 1848f512ceSopenharmony_ci#include <cinttypes> 1948f512ceSopenharmony_ci#include <condition_variable> 2048f512ceSopenharmony_ci#include <mutex> 2148f512ceSopenharmony_ci#include <regex> 2248f512ceSopenharmony_ci#include <sstream> 2348f512ceSopenharmony_ci#include <thread> 2448f512ceSopenharmony_ci 2548f512ceSopenharmony_ci#include <gmock/gmock.h> 2648f512ceSopenharmony_ci#include <gtest/gtest.h> 2748f512ceSopenharmony_ci#include <hilog/log.h> 2848f512ceSopenharmony_ci#include <sched.h> 2948f512ceSopenharmony_ci 3048f512ceSopenharmony_ci#include "perf_events.h" 3148f512ceSopenharmony_ci#include "tracked_command.h" 3248f512ceSopenharmony_ci 3348f512ceSopenharmony_ciusing namespace testing::ext; 3448f512ceSopenharmony_ciusing namespace std; 3548f512ceSopenharmony_ciusing namespace OHOS::HiviewDFX; 3648f512ceSopenharmony_cinamespace OHOS { 3748f512ceSopenharmony_cinamespace Developtools { 3848f512ceSopenharmony_cinamespace HiPerf { 3948f512ceSopenharmony_cistatic std::atomic<bool> g_wait = false; 4048f512ceSopenharmony_ciclass SubCommandStatTest : public testing::Test { 4148f512ceSopenharmony_cipublic: 4248f512ceSopenharmony_ci static void SetUpTestCase(void); 4348f512ceSopenharmony_ci static void TearDownTestCase(void); 4448f512ceSopenharmony_ci void SetUp(); 4548f512ceSopenharmony_ci void TearDown(); 4648f512ceSopenharmony_ci 4748f512ceSopenharmony_ci static void TestCodeThread(int &tid); 4848f512ceSopenharmony_ci bool FindExpectStr(const std::string &stringOut, const std::string &counterNames) const; 4948f512ceSopenharmony_ci uint EffectiveCounter(const std::string &stringOut, 5048f512ceSopenharmony_ci const std::vector<std::string> &counterNames, 5148f512ceSopenharmony_ci uint &effectiveHeadCounter) const; 5248f512ceSopenharmony_ci uint EffectiveCounter(const std::string &stringOut, const std::string &counterNames, 5348f512ceSopenharmony_ci uint &effectiveHeadCounter) const; 5448f512ceSopenharmony_ci int CounterValue(const std::string &stringOut, const std::string &configName) const; 5548f512ceSopenharmony_ci void CheckGroupCoverage(const std::string &stringOut, 5648f512ceSopenharmony_ci const std::string &groupCounterName) const; 5748f512ceSopenharmony_ci 5848f512ceSopenharmony_ci const std::vector<std::string> defaultConfigNames_ = { 5948f512ceSopenharmony_ci "hw-branch-misses", 6048f512ceSopenharmony_ci "hw-cpu-cycles", 6148f512ceSopenharmony_ci "hw-instructions", 6248f512ceSopenharmony_ci#if defined(__aarch64__) 6348f512ceSopenharmony_ci "hw-stalled-cycles-backend", 6448f512ceSopenharmony_ci "hw-stalled-cycles-frontend", 6548f512ceSopenharmony_ci#endif 6648f512ceSopenharmony_ci "sw-context-switches", 6748f512ceSopenharmony_ci "sw-page-faults", 6848f512ceSopenharmony_ci "sw-task-clock", 6948f512ceSopenharmony_ci }; 7048f512ceSopenharmony_ci 7148f512ceSopenharmony_ci const int defaultRunTimeoutMs = 4100; 7248f512ceSopenharmony_ci const std::string timeReportStr = "Report at "; 7348f512ceSopenharmony_ci static std::mutex mtx; 7448f512ceSopenharmony_ci static std::condition_variable cv; 7548f512ceSopenharmony_ci}; 7648f512ceSopenharmony_ci 7748f512ceSopenharmony_cistd::mutex SubCommandStatTest::mtx; 7848f512ceSopenharmony_cistd::condition_variable SubCommandStatTest::cv; 7948f512ceSopenharmony_ci 8048f512ceSopenharmony_civoid SubCommandStatTest::SetUpTestCase() {} 8148f512ceSopenharmony_ci 8248f512ceSopenharmony_civoid SubCommandStatTest::TearDownTestCase() {} 8348f512ceSopenharmony_ci 8448f512ceSopenharmony_civoid SubCommandStatTest::SetUp() 8548f512ceSopenharmony_ci{ 8648f512ceSopenharmony_ci ASSERT_EQ(SubCommand::GetSubCommands().size(), 0u); 8748f512ceSopenharmony_ci ASSERT_EQ(RegisterSubCommandStat(), true); 8848f512ceSopenharmony_ci} 8948f512ceSopenharmony_ci 9048f512ceSopenharmony_civoid SubCommandStatTest::TearDown() 9148f512ceSopenharmony_ci{ 9248f512ceSopenharmony_ci SubCommand::ClearSubCommands(); 9348f512ceSopenharmony_ci ASSERT_EQ(SubCommand::GetSubCommands().size(), 0u); 9448f512ceSopenharmony_ci} 9548f512ceSopenharmony_ci 9648f512ceSopenharmony_civoid SubCommandStatTest::TestCodeThread(int &tid) 9748f512ceSopenharmony_ci{ 9848f512ceSopenharmony_ci std::vector<std::unique_ptr<char[]>> mems; 9948f512ceSopenharmony_ci tid = gettid(); 10048f512ceSopenharmony_ci printf("TestCodeThread:%d ++\n", tid); 10148f512ceSopenharmony_ci 10248f512ceSopenharmony_ci const int sum = 10; 10348f512ceSopenharmony_ci const int num = 2; 10448f512ceSopenharmony_ci 10548f512ceSopenharmony_ci constexpr size_t memSize {1024}; 10648f512ceSopenharmony_ci for (uint i = 0; i < sum * memSize; i++) { 10748f512ceSopenharmony_ci if (i % num == 0) { 10848f512ceSopenharmony_ci mems.push_back(std::make_unique<char[]>(memSize)); 10948f512ceSopenharmony_ci } else { 11048f512ceSopenharmony_ci mems.push_back(std::make_unique<char[]>(memSize * num)); 11148f512ceSopenharmony_ci } 11248f512ceSopenharmony_ci } 11348f512ceSopenharmony_ci 11448f512ceSopenharmony_ci for (uint i = 0; i < sum * memSize; i++) { 11548f512ceSopenharmony_ci mems.pop_back(); 11648f512ceSopenharmony_ci } 11748f512ceSopenharmony_ci if (g_wait) { 11848f512ceSopenharmony_ci std::unique_lock<std::mutex> lock(mtx); 11948f512ceSopenharmony_ci cv.wait(lock); 12048f512ceSopenharmony_ci } 12148f512ceSopenharmony_ci printf("TestCodeThread:%d --\n", tid); 12248f512ceSopenharmony_ci} 12348f512ceSopenharmony_ci 12448f512ceSopenharmony_ciuint SubCommandStatTest::EffectiveCounter(const std::string &stringOut, 12548f512ceSopenharmony_ci const std::string &counterNames, 12648f512ceSopenharmony_ci uint &effectiveHeadCounter) const 12748f512ceSopenharmony_ci{ 12848f512ceSopenharmony_ci std::string filterCounterNames {}; 12948f512ceSopenharmony_ci filterCounterNames = StringReplace(counterNames, ":u", ""); 13048f512ceSopenharmony_ci filterCounterNames = StringReplace(filterCounterNames, ":k", ""); 13148f512ceSopenharmony_ci return EffectiveCounter(stringOut, StringSplit(filterCounterNames, ","), effectiveHeadCounter); 13248f512ceSopenharmony_ci} 13348f512ceSopenharmony_ci 13448f512ceSopenharmony_cibool SubCommandStatTest::FindExpectStr(const std::string &stringOut, 13548f512ceSopenharmony_ci const std::string &counterNames) const 13648f512ceSopenharmony_ci{ 13748f512ceSopenharmony_ci auto lines = StringSplit(stringOut, "\n"); 13848f512ceSopenharmony_ci for (auto line : lines) { 13948f512ceSopenharmony_ci if (line.find(counterNames.c_str()) != std::string::npos) { 14048f512ceSopenharmony_ci return true; 14148f512ceSopenharmony_ci } 14248f512ceSopenharmony_ci } 14348f512ceSopenharmony_ci 14448f512ceSopenharmony_ci return false; 14548f512ceSopenharmony_ci} 14648f512ceSopenharmony_ci 14748f512ceSopenharmony_ciuint SubCommandStatTest::EffectiveCounter(const std::string &stringOut, 14848f512ceSopenharmony_ci const std::vector<std::string> &counterNames, 14948f512ceSopenharmony_ci uint &effectiveHeadCounter) const 15048f512ceSopenharmony_ci{ 15148f512ceSopenharmony_ci uint effectiveCounter = 0; 15248f512ceSopenharmony_ci for (auto name : counterNames) { 15348f512ceSopenharmony_ci EXPECT_NE(stringOut.find(name), std::string::npos); 15448f512ceSopenharmony_ci } 15548f512ceSopenharmony_ci auto lines = StringSplit(stringOut, "\n"); 15648f512ceSopenharmony_ci for (auto line : lines) { 15748f512ceSopenharmony_ci if (line.find(timeReportStr.c_str()) != std::string::npos) { 15848f512ceSopenharmony_ci printf("reset the count because found: '%s'\n", timeReportStr.c_str()); 15948f512ceSopenharmony_ci // reset the count 16048f512ceSopenharmony_ci effectiveCounter = 0; 16148f512ceSopenharmony_ci effectiveHeadCounter++; 16248f512ceSopenharmony_ci continue; 16348f512ceSopenharmony_ci } 16448f512ceSopenharmony_ci auto tokens = StringSplit(line.c_str(), " "); 16548f512ceSopenharmony_ci constexpr size_t sizeLimit {2}; 16648f512ceSopenharmony_ci std::regex pattern("^\\d+[,\\d{3}]*"); 16748f512ceSopenharmony_ci if (tokens.size() > sizeLimit && 16848f512ceSopenharmony_ci (IsDigits(tokens[0]) || std::regex_match(tokens[0], pattern))) { 16948f512ceSopenharmony_ci if (find(counterNames.begin(), counterNames.end(), tokens[1]) != counterNames.end()) { 17048f512ceSopenharmony_ci uint64_t count = std::stoull(tokens[0]); 17148f512ceSopenharmony_ci effectiveCounter++; 17248f512ceSopenharmony_ci printf("[%u] found %s:%s count %" PRIu64 "\n", effectiveCounter, tokens[1].c_str(), 17348f512ceSopenharmony_ci tokens[0].c_str(), count); 17448f512ceSopenharmony_ci } 17548f512ceSopenharmony_ci } 17648f512ceSopenharmony_ci } 17748f512ceSopenharmony_ci 17848f512ceSopenharmony_ci // no more count than max 17948f512ceSopenharmony_ci printf("effectiveCounter %u \n", effectiveCounter); 18048f512ceSopenharmony_ci printf("effectiveHeadCounter %u \n", effectiveHeadCounter); 18148f512ceSopenharmony_ci 18248f512ceSopenharmony_ci return effectiveCounter; 18348f512ceSopenharmony_ci} 18448f512ceSopenharmony_ci 18548f512ceSopenharmony_ciint SubCommandStatTest::CounterValue(const std::string &stringOut, 18648f512ceSopenharmony_ci const std::string &configName) const 18748f512ceSopenharmony_ci{ 18848f512ceSopenharmony_ci int res {-1}; 18948f512ceSopenharmony_ci auto lines = StringSplit(stringOut, "\n"); 19048f512ceSopenharmony_ci for (auto line : lines) { 19148f512ceSopenharmony_ci auto tokens = StringSplit(line.c_str(), " "); 19248f512ceSopenharmony_ci constexpr size_t sizeLimit {2}; 19348f512ceSopenharmony_ci if (tokens.size() > sizeLimit and IsDigits(tokens[0])) { 19448f512ceSopenharmony_ci if (tokens[1] == configName) { 19548f512ceSopenharmony_ci uint64_t count = std::stoull(tokens[0]); 19648f512ceSopenharmony_ci res += count; 19748f512ceSopenharmony_ci } 19848f512ceSopenharmony_ci } 19948f512ceSopenharmony_ci } 20048f512ceSopenharmony_ci if (res != -1) { 20148f512ceSopenharmony_ci ++res; 20248f512ceSopenharmony_ci } 20348f512ceSopenharmony_ci return res; 20448f512ceSopenharmony_ci} 20548f512ceSopenharmony_ci 20648f512ceSopenharmony_civoid SubCommandStatTest::CheckGroupCoverage(const std::string &stringOut, 20748f512ceSopenharmony_ci const std::string &groupCounterName) const 20848f512ceSopenharmony_ci{ 20948f512ceSopenharmony_ci std::string filterGroupCounterName = StringReplace(groupCounterName, ":u", ""); 21048f512ceSopenharmony_ci filterGroupCounterName = StringReplace(filterGroupCounterName, ":k", ""); 21148f512ceSopenharmony_ci auto groupCounterNames = StringSplit(filterGroupCounterName, ","); 21248f512ceSopenharmony_ci 21348f512ceSopenharmony_ci for (auto name : groupCounterNames) { 21448f512ceSopenharmony_ci EXPECT_NE(stringOut.find(name), std::string::npos); 21548f512ceSopenharmony_ci } 21648f512ceSopenharmony_ci std::string groupCoverage; 21748f512ceSopenharmony_ci auto lines = StringSplit(stringOut, "\n"); 21848f512ceSopenharmony_ci for (auto line : lines) { 21948f512ceSopenharmony_ci auto tokens = StringSplit(line.c_str(), " "); 22048f512ceSopenharmony_ci if (find(groupCounterNames.begin(), groupCounterNames.end(), tokens[1]) != 22148f512ceSopenharmony_ci groupCounterNames.end()) { 22248f512ceSopenharmony_ci if (groupCoverage.empty()) { 22348f512ceSopenharmony_ci groupCoverage = tokens.back(); 22448f512ceSopenharmony_ci } else { 22548f512ceSopenharmony_ci EXPECT_EQ(groupCoverage, tokens.back()); 22648f512ceSopenharmony_ci } 22748f512ceSopenharmony_ci } 22848f512ceSopenharmony_ci } 22948f512ceSopenharmony_ci} 23048f512ceSopenharmony_ci 23148f512ceSopenharmony_ci/** 23248f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_a 23348f512ceSopenharmony_ci * @tc.desc: -a 23448f512ceSopenharmony_ci * @tc.type: FUNC 23548f512ceSopenharmony_ci */ 23648f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_a, TestSize.Level1) 23748f512ceSopenharmony_ci{ 23848f512ceSopenharmony_ci StdoutRecord stdoutRecord; 23948f512ceSopenharmony_ci stdoutRecord.Start(); 24048f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 24148f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand("stat -a -c 0 -d 3 --dumpoptions"), true); 24248f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 24348f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 24448f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 24548f512ceSopenharmony_ci 24648f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 24748f512ceSopenharmony_ci if (HasFailure()) { 24848f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 24948f512ceSopenharmony_ci } 25048f512ceSopenharmony_ci 25148f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 25248f512ceSopenharmony_ci uint effectiveHeadCounter = 0; 25348f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, defaultConfigNames_, effectiveHeadCounter), 25448f512ceSopenharmony_ci (defaultConfigNames_.size() - 1)); 25548f512ceSopenharmony_ci} 25648f512ceSopenharmony_ci 25748f512ceSopenharmony_ci/** 25848f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_a1 25948f512ceSopenharmony_ci * @tc.desc: -a 26048f512ceSopenharmony_ci * @tc.type: FUNC 26148f512ceSopenharmony_ci */ 26248f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_a1, TestSize.Level1) 26348f512ceSopenharmony_ci{ 26448f512ceSopenharmony_ci StdoutRecord stdoutRecord; 26548f512ceSopenharmony_ci stdoutRecord.Start(); 26648f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 26748f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand("stat -a -d 3 --dumpoptions"), true); 26848f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 26948f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 27048f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 27148f512ceSopenharmony_ci 27248f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 27348f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 27448f512ceSopenharmony_ci if (HasFailure()) { 27548f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 27648f512ceSopenharmony_ci } 27748f512ceSopenharmony_ci 27848f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 27948f512ceSopenharmony_ci uint effectiveHeadCounter = 0; 28048f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, defaultConfigNames_, effectiveHeadCounter), 28148f512ceSopenharmony_ci (defaultConfigNames_.size() - 1)); 28248f512ceSopenharmony_ci} 28348f512ceSopenharmony_ci 28448f512ceSopenharmony_ci/** 28548f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_a2 28648f512ceSopenharmony_ci * @tc.desc: -a 28748f512ceSopenharmony_ci * @tc.type: FUNC 28848f512ceSopenharmony_ci */ 28948f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_a2, TestSize.Level1) 29048f512ceSopenharmony_ci{ 29148f512ceSopenharmony_ci StdoutRecord stdoutRecord; 29248f512ceSopenharmony_ci stdoutRecord.Start(); 29348f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 29448f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand("stat -a -d 3"), true); 29548f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 29648f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 29748f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 29848f512ceSopenharmony_ci 29948f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 30048f512ceSopenharmony_ci if (HasFailure()) { 30148f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 30248f512ceSopenharmony_ci } 30348f512ceSopenharmony_ci 30448f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 30548f512ceSopenharmony_ci uint effectiveHeadCounter = 0; 30648f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, defaultConfigNames_, effectiveHeadCounter), 30748f512ceSopenharmony_ci (defaultConfigNames_.size() - 1)); 30848f512ceSopenharmony_ci} 30948f512ceSopenharmony_ci 31048f512ceSopenharmony_ci/** 31148f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_a3 31248f512ceSopenharmony_ci * @tc.desc: -a 31348f512ceSopenharmony_ci * @tc.type: FUNC 31448f512ceSopenharmony_ci */ 31548f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_a3, TestSize.Level1) 31648f512ceSopenharmony_ci{ 31748f512ceSopenharmony_ci StdoutRecord stdoutRecord; 31848f512ceSopenharmony_ci stdoutRecord.Start(); 31948f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 32048f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand("stat -a -c 0 -d 3"), true); 32148f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 32248f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 32348f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 32448f512ceSopenharmony_ci 32548f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 32648f512ceSopenharmony_ci if (HasFailure()) { 32748f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 32848f512ceSopenharmony_ci } 32948f512ceSopenharmony_ci 33048f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 33148f512ceSopenharmony_ci uint effectiveHeadCounter = 0; 33248f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, defaultConfigNames_, effectiveHeadCounter), 33348f512ceSopenharmony_ci (defaultConfigNames_.size() - 1)); 33448f512ceSopenharmony_ci} 33548f512ceSopenharmony_ci 33648f512ceSopenharmony_ci/** 33748f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_a4 33848f512ceSopenharmony_ci * @tc.desc: -a 33948f512ceSopenharmony_ci * @tc.type: FUNC 34048f512ceSopenharmony_ci */ 34148f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_a4, TestSize.Level1) 34248f512ceSopenharmony_ci{ 34348f512ceSopenharmony_ci StdoutRecord stdoutRecord; 34448f512ceSopenharmony_ci stdoutRecord.Start(); 34548f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 34648f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand("stat -a test"), false); 34748f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 34848f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 34948f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 35048f512ceSopenharmony_ci 35148f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 35248f512ceSopenharmony_ci if (HasFailure()) { 35348f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 35448f512ceSopenharmony_ci } 35548f512ceSopenharmony_ci 35648f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 35748f512ceSopenharmony_ci std::string expectStr = "failed"; 35848f512ceSopenharmony_ci EXPECT_EQ(FindExpectStr(stringOut, expectStr), true); 35948f512ceSopenharmony_ci} 36048f512ceSopenharmony_ci 36148f512ceSopenharmony_ci/** 36248f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_c 36348f512ceSopenharmony_ci * @tc.desc: -c 36448f512ceSopenharmony_ci * @tc.type: FUNC 36548f512ceSopenharmony_ci */ 36648f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_c, TestSize.Level1) 36748f512ceSopenharmony_ci{ 36848f512ceSopenharmony_ci int tid1 = 0; 36948f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 37048f512ceSopenharmony_ci 37148f512ceSopenharmony_ci printf("wait child thread run.\n"); 37248f512ceSopenharmony_ci while (tid1 == 0) { 37348f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 37448f512ceSopenharmony_ci } 37548f512ceSopenharmony_ci // we need bound us to cpu which we selelct 37648f512ceSopenharmony_ci cpu_set_t mask, oldMask; 37748f512ceSopenharmony_ci CPU_ZERO(&mask); 37848f512ceSopenharmony_ci CPU_SET(1, &mask); 37948f512ceSopenharmony_ci 38048f512ceSopenharmony_ci sched_getaffinity(0, sizeof(cpu_set_t), &oldMask); 38148f512ceSopenharmony_ci sched_setaffinity(0, sizeof(cpu_set_t), &mask); 38248f512ceSopenharmony_ci EXPECT_LE(CPU_COUNT(&mask), CPU_COUNT(&oldMask)); 38348f512ceSopenharmony_ci 38448f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 38548f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 38648f512ceSopenharmony_ci cmdstr += " -c 0 -d 3 --dumpoptions"; 38748f512ceSopenharmony_ci 38848f512ceSopenharmony_ci StdoutRecord stdoutRecord; 38948f512ceSopenharmony_ci stdoutRecord.Start(); 39048f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 39148f512ceSopenharmony_ci g_wait = true; 39248f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), true); 39348f512ceSopenharmony_ci g_wait = false; 39448f512ceSopenharmony_ci { 39548f512ceSopenharmony_ci std::unique_lock<std::mutex> lock(mtx); 39648f512ceSopenharmony_ci cv.notify_all(); 39748f512ceSopenharmony_ci } 39848f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 39948f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 40048f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 40148f512ceSopenharmony_ci 40248f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 40348f512ceSopenharmony_ci if (HasFailure()) { 40448f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 40548f512ceSopenharmony_ci } 40648f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 40748f512ceSopenharmony_ci uint effectiveHeadCounter = 0u; 40848f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, defaultConfigNames_, effectiveHeadCounter), 40948f512ceSopenharmony_ci (defaultConfigNames_.size() - 1)); 41048f512ceSopenharmony_ci 41148f512ceSopenharmony_ci if (stringOut.find("event not support") == std::string::npos) { 41248f512ceSopenharmony_ci EXPECT_NE(stringOut.find("Timeout exit"), std::string::npos); 41348f512ceSopenharmony_ci } 41448f512ceSopenharmony_ci 41548f512ceSopenharmony_ci sched_setaffinity(0, sizeof(cpu_set_t), &oldMask); 41648f512ceSopenharmony_ci sched_getaffinity(0, sizeof(cpu_set_t), &mask); 41748f512ceSopenharmony_ci EXPECT_EQ(CPU_COUNT(&mask), CPU_COUNT(&oldMask)); 41848f512ceSopenharmony_ci t1.join(); 41948f512ceSopenharmony_ci} 42048f512ceSopenharmony_ci 42148f512ceSopenharmony_ci/** 42248f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_c1 42348f512ceSopenharmony_ci * @tc.desc: -c 42448f512ceSopenharmony_ci * @tc.type: FUNC 42548f512ceSopenharmony_ci */ 42648f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_c1, TestSize.Level1) 42748f512ceSopenharmony_ci{ 42848f512ceSopenharmony_ci int tid1 = 0; 42948f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 43048f512ceSopenharmony_ci while (tid1 == 0) { 43148f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 43248f512ceSopenharmony_ci } 43348f512ceSopenharmony_ci 43448f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 43548f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 43648f512ceSopenharmony_ci cmdstr += " -c 1 -d 3"; 43748f512ceSopenharmony_ci 43848f512ceSopenharmony_ci StdoutRecord stdoutRecord; 43948f512ceSopenharmony_ci stdoutRecord.Start(); 44048f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 44148f512ceSopenharmony_ci g_wait = true; 44248f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), true); 44348f512ceSopenharmony_ci g_wait = false; 44448f512ceSopenharmony_ci { 44548f512ceSopenharmony_ci std::unique_lock<std::mutex> lock(mtx); 44648f512ceSopenharmony_ci cv.notify_all(); 44748f512ceSopenharmony_ci } 44848f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 44948f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 45048f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 45148f512ceSopenharmony_ci 45248f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 45348f512ceSopenharmony_ci if (HasFailure()) { 45448f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 45548f512ceSopenharmony_ci } 45648f512ceSopenharmony_ci 45748f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 45848f512ceSopenharmony_ci uint effectiveHeadCounter = 0; 45948f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, defaultConfigNames_, effectiveHeadCounter), 46048f512ceSopenharmony_ci (defaultConfigNames_.size() - 1)); 46148f512ceSopenharmony_ci t1.join(); 46248f512ceSopenharmony_ci} 46348f512ceSopenharmony_ci 46448f512ceSopenharmony_ci/** 46548f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_c2 46648f512ceSopenharmony_ci * @tc.desc: -c 46748f512ceSopenharmony_ci * @tc.type: FUNC 46848f512ceSopenharmony_ci */ 46948f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_c2, TestSize.Level1) 47048f512ceSopenharmony_ci{ 47148f512ceSopenharmony_ci int tid1 = 0; 47248f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 47348f512ceSopenharmony_ci while (tid1 == 0) { 47448f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 47548f512ceSopenharmony_ci } 47648f512ceSopenharmony_ci 47748f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 47848f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 47948f512ceSopenharmony_ci cmdstr += " -c 0,1 -d 3"; 48048f512ceSopenharmony_ci 48148f512ceSopenharmony_ci StdoutRecord stdoutRecord; 48248f512ceSopenharmony_ci stdoutRecord.Start(); 48348f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 48448f512ceSopenharmony_ci g_wait = true; 48548f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), true); 48648f512ceSopenharmony_ci g_wait = false; 48748f512ceSopenharmony_ci { 48848f512ceSopenharmony_ci std::unique_lock<std::mutex> lock(mtx); 48948f512ceSopenharmony_ci cv.notify_all(); 49048f512ceSopenharmony_ci } 49148f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 49248f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 49348f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 49448f512ceSopenharmony_ci 49548f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 49648f512ceSopenharmony_ci if (HasFailure()) { 49748f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 49848f512ceSopenharmony_ci } 49948f512ceSopenharmony_ci 50048f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 50148f512ceSopenharmony_ci uint effectiveHeadCounter = 0; 50248f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, defaultConfigNames_, effectiveHeadCounter), 50348f512ceSopenharmony_ci (defaultConfigNames_.size() - 1)); 50448f512ceSopenharmony_ci t1.join(); 50548f512ceSopenharmony_ci} 50648f512ceSopenharmony_ci 50748f512ceSopenharmony_ci/** 50848f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_c3 50948f512ceSopenharmony_ci * @tc.desc: -c 51048f512ceSopenharmony_ci * @tc.type: FUNC 51148f512ceSopenharmony_ci */ 51248f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_c3, TestSize.Level1) 51348f512ceSopenharmony_ci{ 51448f512ceSopenharmony_ci StdoutRecord stdoutRecord; 51548f512ceSopenharmony_ci stdoutRecord.Start(); 51648f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 51748f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand("stat -a -c 0,1 -d 3"), true); 51848f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 51948f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 52048f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 52148f512ceSopenharmony_ci 52248f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 52348f512ceSopenharmony_ci if (HasFailure()) { 52448f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 52548f512ceSopenharmony_ci } 52648f512ceSopenharmony_ci 52748f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 52848f512ceSopenharmony_ci uint effectiveHeadCounter = 0; 52948f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, defaultConfigNames_, effectiveHeadCounter), 53048f512ceSopenharmony_ci (defaultConfigNames_.size() - 1)); 53148f512ceSopenharmony_ci} 53248f512ceSopenharmony_ci 53348f512ceSopenharmony_ci/** 53448f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_c4 53548f512ceSopenharmony_ci * @tc.desc: -c 53648f512ceSopenharmony_ci * @tc.type: FUNC 53748f512ceSopenharmony_ci */ 53848f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_c4, TestSize.Level1) 53948f512ceSopenharmony_ci{ 54048f512ceSopenharmony_ci int tid1 = 0; 54148f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 54248f512ceSopenharmony_ci while (tid1 == 0) { 54348f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 54448f512ceSopenharmony_ci } 54548f512ceSopenharmony_ci 54648f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 54748f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 54848f512ceSopenharmony_ci cmdstr += " -c test -d 3"; 54948f512ceSopenharmony_ci 55048f512ceSopenharmony_ci StdoutRecord stdoutRecord; 55148f512ceSopenharmony_ci stdoutRecord.Start(); 55248f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 55348f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), false); 55448f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 55548f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 55648f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 55748f512ceSopenharmony_ci 55848f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 55948f512ceSopenharmony_ci if (HasFailure()) { 56048f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 56148f512ceSopenharmony_ci } 56248f512ceSopenharmony_ci 56348f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 56448f512ceSopenharmony_ci std::string expectStr = "incorrect option"; 56548f512ceSopenharmony_ci EXPECT_EQ(FindExpectStr(stringOut, expectStr), true); 56648f512ceSopenharmony_ci t1.join(); 56748f512ceSopenharmony_ci} 56848f512ceSopenharmony_ci 56948f512ceSopenharmony_ci/** 57048f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_c5 57148f512ceSopenharmony_ci * @tc.desc: -c 57248f512ceSopenharmony_ci * @tc.type: FUNC 57348f512ceSopenharmony_ci */ 57448f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_c5, TestSize.Level1) 57548f512ceSopenharmony_ci{ 57648f512ceSopenharmony_ci int tid1 = 0; 57748f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 57848f512ceSopenharmony_ci while (tid1 == 0) { 57948f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 58048f512ceSopenharmony_ci } 58148f512ceSopenharmony_ci 58248f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 58348f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 58448f512ceSopenharmony_ci cmdstr += " -c -2 -d 3"; 58548f512ceSopenharmony_ci 58648f512ceSopenharmony_ci StdoutRecord stdoutRecord; 58748f512ceSopenharmony_ci stdoutRecord.Start(); 58848f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 58948f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), false); 59048f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 59148f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 59248f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 59348f512ceSopenharmony_ci 59448f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 59548f512ceSopenharmony_ci if (HasFailure()) { 59648f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 59748f512ceSopenharmony_ci } 59848f512ceSopenharmony_ci 59948f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 60048f512ceSopenharmony_ci std::string expectStr = "Invalid -c value"; 60148f512ceSopenharmony_ci EXPECT_EQ(FindExpectStr(stringOut, expectStr), true); 60248f512ceSopenharmony_ci t1.join(); 60348f512ceSopenharmony_ci} 60448f512ceSopenharmony_ci 60548f512ceSopenharmony_ci/** 60648f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_d 60748f512ceSopenharmony_ci * @tc.desc: -d 60848f512ceSopenharmony_ci * @tc.type: FUNC 60948f512ceSopenharmony_ci */ 61048f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_d, TestSize.Level1) 61148f512ceSopenharmony_ci{ 61248f512ceSopenharmony_ci int tid1 = 0; 61348f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 61448f512ceSopenharmony_ci while (tid1 == 0) { 61548f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 61648f512ceSopenharmony_ci } 61748f512ceSopenharmony_ci 61848f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 61948f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 62048f512ceSopenharmony_ci cmdstr += " -c 0 -d 3 --dumpoptions"; 62148f512ceSopenharmony_ci 62248f512ceSopenharmony_ci StdoutRecord stdoutRecord; 62348f512ceSopenharmony_ci stdoutRecord.Start(); 62448f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 62548f512ceSopenharmony_ci g_wait = true; 62648f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), true); 62748f512ceSopenharmony_ci g_wait = false; 62848f512ceSopenharmony_ci { 62948f512ceSopenharmony_ci std::unique_lock<std::mutex> lock(mtx); 63048f512ceSopenharmony_ci cv.notify_all(); 63148f512ceSopenharmony_ci } 63248f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 63348f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 63448f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 63548f512ceSopenharmony_ci 63648f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 63748f512ceSopenharmony_ci if (HasFailure()) { 63848f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 63948f512ceSopenharmony_ci } 64048f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 64148f512ceSopenharmony_ci uint effectiveHeadCounter = 0u; 64248f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, defaultConfigNames_, effectiveHeadCounter), 64348f512ceSopenharmony_ci (defaultConfigNames_.size() - 1)); 64448f512ceSopenharmony_ci t1.join(); 64548f512ceSopenharmony_ci} 64648f512ceSopenharmony_ci 64748f512ceSopenharmony_ci/** 64848f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_p 64948f512ceSopenharmony_ci * @tc.desc: -p 65048f512ceSopenharmony_ci * @tc.type: FUNC 65148f512ceSopenharmony_ci */ 65248f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_p, TestSize.Level1) 65348f512ceSopenharmony_ci{ 65448f512ceSopenharmony_ci int tid1 = 0; 65548f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 65648f512ceSopenharmony_ci while (tid1 == 0) { 65748f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 65848f512ceSopenharmony_ci } 65948f512ceSopenharmony_ci 66048f512ceSopenharmony_ci std::string cmdstr = "stat -p -1 -d 3"; 66148f512ceSopenharmony_ci 66248f512ceSopenharmony_ci StdoutRecord stdoutRecord; 66348f512ceSopenharmony_ci stdoutRecord.Start(); 66448f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 66548f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), false); 66648f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 66748f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 66848f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 66948f512ceSopenharmony_ci 67048f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 67148f512ceSopenharmony_ci if (HasFailure()) { 67248f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 67348f512ceSopenharmony_ci } 67448f512ceSopenharmony_ci 67548f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 67648f512ceSopenharmony_ci std::string expectStr = "Invalid -p value"; 67748f512ceSopenharmony_ci EXPECT_EQ(FindExpectStr(stringOut, expectStr), true); 67848f512ceSopenharmony_ci t1.join(); 67948f512ceSopenharmony_ci} 68048f512ceSopenharmony_ci 68148f512ceSopenharmony_ci/** 68248f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_p 68348f512ceSopenharmony_ci * @tc.desc: -p 68448f512ceSopenharmony_ci * @tc.type: FUNC 68548f512ceSopenharmony_ci */ 68648f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_p1, TestSize.Level1) 68748f512ceSopenharmony_ci{ 68848f512ceSopenharmony_ci int tid1 = 0; 68948f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 69048f512ceSopenharmony_ci while (tid1 == 0) { 69148f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 69248f512ceSopenharmony_ci } 69348f512ceSopenharmony_ci 69448f512ceSopenharmony_ci std::string cmdstr = "stat -a --app test -d 3"; 69548f512ceSopenharmony_ci 69648f512ceSopenharmony_ci StdoutRecord stdoutRecord; 69748f512ceSopenharmony_ci stdoutRecord.Start(); 69848f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 69948f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), false); 70048f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 70148f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 70248f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 70348f512ceSopenharmony_ci 70448f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 70548f512ceSopenharmony_ci if (HasFailure()) { 70648f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 70748f512ceSopenharmony_ci } 70848f512ceSopenharmony_ci 70948f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 71048f512ceSopenharmony_ci std::string expectStr = "You cannot specify -a and --app at the same time"; 71148f512ceSopenharmony_ci EXPECT_EQ(FindExpectStr(stringOut, expectStr), true); 71248f512ceSopenharmony_ci t1.join(); 71348f512ceSopenharmony_ci} 71448f512ceSopenharmony_ci 71548f512ceSopenharmony_ci/** 71648f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_p2 71748f512ceSopenharmony_ci * @tc.desc: -p 71848f512ceSopenharmony_ci * @tc.type: FUNC 71948f512ceSopenharmony_ci */ 72048f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_p2, TestSize.Level1) 72148f512ceSopenharmony_ci{ 72248f512ceSopenharmony_ci int tid1 = 0; 72348f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 72448f512ceSopenharmony_ci while (tid1 == 0) { 72548f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 72648f512ceSopenharmony_ci } 72748f512ceSopenharmony_ci 72848f512ceSopenharmony_ci std::string cmdstr = "stat --app test -p 1234 -d 3"; 72948f512ceSopenharmony_ci 73048f512ceSopenharmony_ci StdoutRecord stdoutRecord; 73148f512ceSopenharmony_ci stdoutRecord.Start(); 73248f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 73348f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), false); 73448f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 73548f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 73648f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 73748f512ceSopenharmony_ci 73848f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 73948f512ceSopenharmony_ci if (HasFailure()) { 74048f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 74148f512ceSopenharmony_ci } 74248f512ceSopenharmony_ci 74348f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 74448f512ceSopenharmony_ci std::string expectStr = "You cannot specify --app and -t/-p at the same time"; 74548f512ceSopenharmony_ci EXPECT_EQ(FindExpectStr(stringOut, expectStr), true); 74648f512ceSopenharmony_ci t1.join(); 74748f512ceSopenharmony_ci} 74848f512ceSopenharmony_ci 74948f512ceSopenharmony_ci/** 75048f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_chkms 75148f512ceSopenharmony_ci * @tc.desc: --chkms 75248f512ceSopenharmony_ci * @tc.type: FUNC 75348f512ceSopenharmony_ci */ 75448f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_ch, TestSize.Level1) 75548f512ceSopenharmony_ci{ 75648f512ceSopenharmony_ci int tid1 = 0; 75748f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 75848f512ceSopenharmony_ci while (tid1 == 0) { 75948f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 76048f512ceSopenharmony_ci } 76148f512ceSopenharmony_ci 76248f512ceSopenharmony_ci std::string cmdstr = "stat -a -d 3 --chkms 201"; 76348f512ceSopenharmony_ci 76448f512ceSopenharmony_ci StdoutRecord stdoutRecord; 76548f512ceSopenharmony_ci stdoutRecord.Start(); 76648f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 76748f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), false); 76848f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 76948f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 77048f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 77148f512ceSopenharmony_ci 77248f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 77348f512ceSopenharmony_ci if (HasFailure()) { 77448f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 77548f512ceSopenharmony_ci } 77648f512ceSopenharmony_ci 77748f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 77848f512ceSopenharmony_ci std::string expectStr = "Invalid --chkms value '201'"; 77948f512ceSopenharmony_ci EXPECT_EQ(FindExpectStr(stringOut, expectStr), true); 78048f512ceSopenharmony_ci t1.join(); 78148f512ceSopenharmony_ci} 78248f512ceSopenharmony_ci 78348f512ceSopenharmony_ci/** 78448f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_aa 78548f512ceSopenharmony_ci * @tc.desc: aa 78648f512ceSopenharmony_ci * @tc.type: FUNC 78748f512ceSopenharmony_ci */ 78848f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_aa, TestSize.Level1) 78948f512ceSopenharmony_ci{ 79048f512ceSopenharmony_ci int tid1 = 0; 79148f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 79248f512ceSopenharmony_ci while (tid1 == 0) { 79348f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 79448f512ceSopenharmony_ci } 79548f512ceSopenharmony_ci 79648f512ceSopenharmony_ci std::string cmdstr = "stat aa --app 123 -d 3"; 79748f512ceSopenharmony_ci 79848f512ceSopenharmony_ci StdoutRecord stdoutRecord; 79948f512ceSopenharmony_ci stdoutRecord.Start(); 80048f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 80148f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), false); 80248f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 80348f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 80448f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 80548f512ceSopenharmony_ci 80648f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 80748f512ceSopenharmony_ci if (HasFailure()) { 80848f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 80948f512ceSopenharmony_ci } 81048f512ceSopenharmony_ci 81148f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 81248f512ceSopenharmony_ci std::string expectStr = "You cannot specify a cmd and --app at the same time"; 81348f512ceSopenharmony_ci EXPECT_EQ(FindExpectStr(stringOut, expectStr), true); 81448f512ceSopenharmony_ci t1.join(); 81548f512ceSopenharmony_ci} 81648f512ceSopenharmony_ci 81748f512ceSopenharmony_ci/** 81848f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_d1 81948f512ceSopenharmony_ci * @tc.desc: -d 82048f512ceSopenharmony_ci * @tc.type: FUNC 82148f512ceSopenharmony_ci */ 82248f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_d1, TestSize.Level1) 82348f512ceSopenharmony_ci{ 82448f512ceSopenharmony_ci StdoutRecord stdoutRecord; 82548f512ceSopenharmony_ci stdoutRecord.Start(); 82648f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 82748f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand("stat -a -d 3 --dumpoptions"), true); 82848f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 82948f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 83048f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 83148f512ceSopenharmony_ci 83248f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 83348f512ceSopenharmony_ci if (HasFailure()) { 83448f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 83548f512ceSopenharmony_ci } 83648f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 83748f512ceSopenharmony_ci uint effectiveHeadCounter = 0u; 83848f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, defaultConfigNames_, effectiveHeadCounter), 83948f512ceSopenharmony_ci (defaultConfigNames_.size() - 1)); 84048f512ceSopenharmony_ci} 84148f512ceSopenharmony_ci 84248f512ceSopenharmony_ci/** 84348f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_d2 84448f512ceSopenharmony_ci * @tc.desc: -d 84548f512ceSopenharmony_ci * @tc.type: FUNC 84648f512ceSopenharmony_ci */ 84748f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_d2, TestSize.Level1) 84848f512ceSopenharmony_ci{ 84948f512ceSopenharmony_ci int tid1 = 0; 85048f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 85148f512ceSopenharmony_ci while (tid1 == 0) { 85248f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 85348f512ceSopenharmony_ci } 85448f512ceSopenharmony_ci 85548f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 85648f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 85748f512ceSopenharmony_ci cmdstr += " -d -1"; 85848f512ceSopenharmony_ci 85948f512ceSopenharmony_ci StdoutRecord stdoutRecord; 86048f512ceSopenharmony_ci stdoutRecord.Start(); 86148f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 86248f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), false); 86348f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 86448f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 86548f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 86648f512ceSopenharmony_ci 86748f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 86848f512ceSopenharmony_ci if (HasFailure()) { 86948f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 87048f512ceSopenharmony_ci } 87148f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 87248f512ceSopenharmony_ci std::string expectStr = "failed"; 87348f512ceSopenharmony_ci EXPECT_EQ(FindExpectStr(stringOut, expectStr), true); 87448f512ceSopenharmony_ci t1.join(); 87548f512ceSopenharmony_ci} 87648f512ceSopenharmony_ci 87748f512ceSopenharmony_ci/** 87848f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_d3 87948f512ceSopenharmony_ci * @tc.desc: -d 88048f512ceSopenharmony_ci * @tc.type: FUNC 88148f512ceSopenharmony_ci */ 88248f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_d3, TestSize.Level1) 88348f512ceSopenharmony_ci{ 88448f512ceSopenharmony_ci int tid1 = 0; 88548f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 88648f512ceSopenharmony_ci while (tid1 == 0) { 88748f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 88848f512ceSopenharmony_ci } 88948f512ceSopenharmony_ci 89048f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 89148f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 89248f512ceSopenharmony_ci cmdstr += " -d test"; 89348f512ceSopenharmony_ci 89448f512ceSopenharmony_ci StdoutRecord stdoutRecord; 89548f512ceSopenharmony_ci stdoutRecord.Start(); 89648f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 89748f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), false); 89848f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 89948f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 90048f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 90148f512ceSopenharmony_ci 90248f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 90348f512ceSopenharmony_ci if (HasFailure()) { 90448f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 90548f512ceSopenharmony_ci } 90648f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 90748f512ceSopenharmony_ci std::string expectStr = "incorrect option"; 90848f512ceSopenharmony_ci EXPECT_EQ(FindExpectStr(stringOut, expectStr), true); 90948f512ceSopenharmony_ci t1.join(); 91048f512ceSopenharmony_ci} 91148f512ceSopenharmony_ci 91248f512ceSopenharmony_ci/** 91348f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_d4 91448f512ceSopenharmony_ci * @tc.desc: -d 91548f512ceSopenharmony_ci * @tc.type: FUNC 91648f512ceSopenharmony_ci */ 91748f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_d4, TestSize.Level1) 91848f512ceSopenharmony_ci{ 91948f512ceSopenharmony_ci int tid1 = 0; 92048f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 92148f512ceSopenharmony_ci while (tid1 == 0) { 92248f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 92348f512ceSopenharmony_ci } 92448f512ceSopenharmony_ci 92548f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 92648f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 92748f512ceSopenharmony_ci cmdstr += " -c 0,1 -d 1"; 92848f512ceSopenharmony_ci 92948f512ceSopenharmony_ci StdoutRecord stdoutRecord; 93048f512ceSopenharmony_ci stdoutRecord.Start(); 93148f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 93248f512ceSopenharmony_ci g_wait = true; 93348f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), true); 93448f512ceSopenharmony_ci g_wait = false; 93548f512ceSopenharmony_ci { 93648f512ceSopenharmony_ci std::unique_lock<std::mutex> lock(mtx); 93748f512ceSopenharmony_ci cv.notify_all(); 93848f512ceSopenharmony_ci } 93948f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 94048f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 94148f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 94248f512ceSopenharmony_ci 94348f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 94448f512ceSopenharmony_ci if (HasFailure()) { 94548f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 94648f512ceSopenharmony_ci } 94748f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 94848f512ceSopenharmony_ci uint effectiveHeadCounter = 0u; 94948f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, defaultConfigNames_, effectiveHeadCounter), 95048f512ceSopenharmony_ci (defaultConfigNames_.size() - 1)); 95148f512ceSopenharmony_ci t1.join(); 95248f512ceSopenharmony_ci} 95348f512ceSopenharmony_ci 95448f512ceSopenharmony_ci 95548f512ceSopenharmony_ci/** 95648f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_d5 95748f512ceSopenharmony_ci * @tc.desc: -d 95848f512ceSopenharmony_ci * @tc.type: FUNC 95948f512ceSopenharmony_ci */ 96048f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_d5, TestSize.Level1) 96148f512ceSopenharmony_ci{ 96248f512ceSopenharmony_ci int tid1 = 0; 96348f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 96448f512ceSopenharmony_ci while (tid1 == 0) { 96548f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); // 10: sleep 10ms 96648f512ceSopenharmony_ci } 96748f512ceSopenharmony_ci 96848f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 96948f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 97048f512ceSopenharmony_ci cmdstr += " -c 0 -d 3 --dumpoptions --per-core"; 97148f512ceSopenharmony_ci 97248f512ceSopenharmony_ci StdoutRecord stdoutRecord; 97348f512ceSopenharmony_ci stdoutRecord.Start(); 97448f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 97548f512ceSopenharmony_ci g_wait = true; 97648f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), true); 97748f512ceSopenharmony_ci g_wait = false; 97848f512ceSopenharmony_ci { 97948f512ceSopenharmony_ci std::unique_lock<std::mutex> lock(mtx); 98048f512ceSopenharmony_ci cv.notify_all(); 98148f512ceSopenharmony_ci } 98248f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 98348f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 98448f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 98548f512ceSopenharmony_ci 98648f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 98748f512ceSopenharmony_ci if (HasFailure()) { 98848f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 98948f512ceSopenharmony_ci } 99048f512ceSopenharmony_ci t1.join(); 99148f512ceSopenharmony_ci} 99248f512ceSopenharmony_ci 99348f512ceSopenharmony_ci/** 99448f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_d6 99548f512ceSopenharmony_ci * @tc.desc: -d 99648f512ceSopenharmony_ci * @tc.type: FUNC 99748f512ceSopenharmony_ci */ 99848f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_d6, TestSize.Level1) 99948f512ceSopenharmony_ci{ 100048f512ceSopenharmony_ci int tid1 = 0; 100148f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 100248f512ceSopenharmony_ci while (tid1 == 0) { 100348f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); // 10: sleep 10ms 100448f512ceSopenharmony_ci } 100548f512ceSopenharmony_ci 100648f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 100748f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 100848f512ceSopenharmony_ci cmdstr += " -c 0 -d 3 --dumpoptions --per-thread"; 100948f512ceSopenharmony_ci 101048f512ceSopenharmony_ci StdoutRecord stdoutRecord; 101148f512ceSopenharmony_ci stdoutRecord.Start(); 101248f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 101348f512ceSopenharmony_ci g_wait = true; 101448f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), true); 101548f512ceSopenharmony_ci g_wait = false; 101648f512ceSopenharmony_ci { 101748f512ceSopenharmony_ci std::unique_lock<std::mutex> lock(mtx); 101848f512ceSopenharmony_ci cv.notify_all(); 101948f512ceSopenharmony_ci } 102048f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 102148f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 102248f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 102348f512ceSopenharmony_ci 102448f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 102548f512ceSopenharmony_ci if (HasFailure()) { 102648f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 102748f512ceSopenharmony_ci } 102848f512ceSopenharmony_ci t1.join(); 102948f512ceSopenharmony_ci} 103048f512ceSopenharmony_ci 103148f512ceSopenharmony_ci/** 103248f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_i 103348f512ceSopenharmony_ci * @tc.desc: -i 103448f512ceSopenharmony_ci * @tc.type: FUNC 103548f512ceSopenharmony_ci */ 103648f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_i, TestSize.Level1) 103748f512ceSopenharmony_ci{ 103848f512ceSopenharmony_ci int tid1 = 0; 103948f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 104048f512ceSopenharmony_ci while (tid1 == 0) { 104148f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 104248f512ceSopenharmony_ci } 104348f512ceSopenharmony_ci 104448f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 104548f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 104648f512ceSopenharmony_ci cmdstr += " -c 0 -d 3 -i 1000 --dumpoptions"; 104748f512ceSopenharmony_ci 104848f512ceSopenharmony_ci StdoutRecord stdoutRecord; 104948f512ceSopenharmony_ci stdoutRecord.Start(); 105048f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 105148f512ceSopenharmony_ci g_wait = true; 105248f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), true); 105348f512ceSopenharmony_ci g_wait = false; 105448f512ceSopenharmony_ci { 105548f512ceSopenharmony_ci std::unique_lock<std::mutex> lock(mtx); 105648f512ceSopenharmony_ci cv.notify_all(); 105748f512ceSopenharmony_ci } 105848f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 105948f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 106048f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 106148f512ceSopenharmony_ci 106248f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 106348f512ceSopenharmony_ci if (HasFailure()) { 106448f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 106548f512ceSopenharmony_ci } 106648f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 106748f512ceSopenharmony_ci uint effectiveHeadCounter = 0u; 106848f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, defaultConfigNames_, effectiveHeadCounter), 106948f512ceSopenharmony_ci (defaultConfigNames_.size() - 1)); 107048f512ceSopenharmony_ci 107148f512ceSopenharmony_ci if (stringOut.find("event not support") == std::string::npos) { 107248f512ceSopenharmony_ci EXPECT_GE(effectiveHeadCounter, 3u); 107348f512ceSopenharmony_ci } 107448f512ceSopenharmony_ci t1.join(); 107548f512ceSopenharmony_ci} 107648f512ceSopenharmony_ci 107748f512ceSopenharmony_ci/** 107848f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_i1 107948f512ceSopenharmony_ci * @tc.desc: -i 108048f512ceSopenharmony_ci * @tc.type: FUNC 108148f512ceSopenharmony_ci */ 108248f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_i1, TestSize.Level1) 108348f512ceSopenharmony_ci{ 108448f512ceSopenharmony_ci int tid1 = 0; 108548f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 108648f512ceSopenharmony_ci while (tid1 == 0) { 108748f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 108848f512ceSopenharmony_ci } 108948f512ceSopenharmony_ci 109048f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 109148f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 109248f512ceSopenharmony_ci cmdstr += " -c 0 -d 3 -i 500 --dumpoptions"; 109348f512ceSopenharmony_ci 109448f512ceSopenharmony_ci StdoutRecord stdoutRecord; 109548f512ceSopenharmony_ci stdoutRecord.Start(); 109648f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 109748f512ceSopenharmony_ci g_wait = true; 109848f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), true); 109948f512ceSopenharmony_ci g_wait = false; 110048f512ceSopenharmony_ci { 110148f512ceSopenharmony_ci std::unique_lock<std::mutex> lock(mtx); 110248f512ceSopenharmony_ci cv.notify_all(); 110348f512ceSopenharmony_ci } 110448f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 110548f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 110648f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 110748f512ceSopenharmony_ci 110848f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 110948f512ceSopenharmony_ci if (HasFailure()) { 111048f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 111148f512ceSopenharmony_ci } 111248f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 111348f512ceSopenharmony_ci uint effectiveHeadCounter = 0u; 111448f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, defaultConfigNames_, effectiveHeadCounter), 111548f512ceSopenharmony_ci (defaultConfigNames_.size() - 1)); 111648f512ceSopenharmony_ci 111748f512ceSopenharmony_ci EXPECT_GE(effectiveHeadCounter, 3u); 111848f512ceSopenharmony_ci t1.join(); 111948f512ceSopenharmony_ci} 112048f512ceSopenharmony_ci 112148f512ceSopenharmony_ci/** 112248f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_i2 112348f512ceSopenharmony_ci * @tc.desc: -i 112448f512ceSopenharmony_ci * @tc.type: FUNC 112548f512ceSopenharmony_ci */ 112648f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_i2, TestSize.Level1) 112748f512ceSopenharmony_ci{ 112848f512ceSopenharmony_ci int tid1 = 0; 112948f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 113048f512ceSopenharmony_ci while (tid1 == 0) { 113148f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 113248f512ceSopenharmony_ci } 113348f512ceSopenharmony_ci 113448f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 113548f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 113648f512ceSopenharmony_ci cmdstr += " -c 0 -d 3 -i -1 --dumpoptions"; 113748f512ceSopenharmony_ci 113848f512ceSopenharmony_ci StdoutRecord stdoutRecord; 113948f512ceSopenharmony_ci stdoutRecord.Start(); 114048f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 114148f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), false); 114248f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 114348f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 114448f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 114548f512ceSopenharmony_ci 114648f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 114748f512ceSopenharmony_ci if (HasFailure()) { 114848f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 114948f512ceSopenharmony_ci } 115048f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 115148f512ceSopenharmony_ci std::string expectStr = "failed"; 115248f512ceSopenharmony_ci EXPECT_EQ(FindExpectStr(stringOut, expectStr), true); 115348f512ceSopenharmony_ci t1.join(); 115448f512ceSopenharmony_ci} 115548f512ceSopenharmony_ci 115648f512ceSopenharmony_ci/** 115748f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_i2 115848f512ceSopenharmony_ci * @tc.desc: -i 115948f512ceSopenharmony_ci * @tc.type: FUNC 116048f512ceSopenharmony_ci */ 116148f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_i3, TestSize.Level1) 116248f512ceSopenharmony_ci{ 116348f512ceSopenharmony_ci int tid1 = 0; 116448f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 116548f512ceSopenharmony_ci while (tid1 == 0) { 116648f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 116748f512ceSopenharmony_ci } 116848f512ceSopenharmony_ci 116948f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 117048f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 117148f512ceSopenharmony_ci cmdstr += " -c 0 -d 3 -i test --dumpoptions"; 117248f512ceSopenharmony_ci 117348f512ceSopenharmony_ci StdoutRecord stdoutRecord; 117448f512ceSopenharmony_ci stdoutRecord.Start(); 117548f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 117648f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), false); 117748f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 117848f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 117948f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 118048f512ceSopenharmony_ci 118148f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 118248f512ceSopenharmony_ci if (HasFailure()) { 118348f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 118448f512ceSopenharmony_ci } 118548f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 118648f512ceSopenharmony_ci std::string expectStr = "incorrect"; 118748f512ceSopenharmony_ci EXPECT_EQ(FindExpectStr(stringOut, expectStr), true); 118848f512ceSopenharmony_ci t1.join(); 118948f512ceSopenharmony_ci} 119048f512ceSopenharmony_ci 119148f512ceSopenharmony_ci/** 119248f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_i4 119348f512ceSopenharmony_ci * @tc.desc: -i 119448f512ceSopenharmony_ci * @tc.type: FUNC 119548f512ceSopenharmony_ci */ 119648f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_i4, TestSize.Level1) 119748f512ceSopenharmony_ci{ 119848f512ceSopenharmony_ci int tid1 = 0; 119948f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 120048f512ceSopenharmony_ci while (tid1 == 0) { 120148f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 120248f512ceSopenharmony_ci } 120348f512ceSopenharmony_ci 120448f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 120548f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 120648f512ceSopenharmony_ci cmdstr += " -c 0 -d 1 -i 100 --dumpoptions"; 120748f512ceSopenharmony_ci 120848f512ceSopenharmony_ci StdoutRecord stdoutRecord; 120948f512ceSopenharmony_ci stdoutRecord.Start(); 121048f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 121148f512ceSopenharmony_ci g_wait = true; 121248f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), true); 121348f512ceSopenharmony_ci g_wait = false; 121448f512ceSopenharmony_ci { 121548f512ceSopenharmony_ci std::unique_lock<std::mutex> lock(mtx); 121648f512ceSopenharmony_ci cv.notify_all(); 121748f512ceSopenharmony_ci } 121848f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 121948f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 122048f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 122148f512ceSopenharmony_ci 122248f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 122348f512ceSopenharmony_ci if (HasFailure()) { 122448f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 122548f512ceSopenharmony_ci } 122648f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 122748f512ceSopenharmony_ci uint effectiveHeadCounter = 0u; 122848f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, defaultConfigNames_, effectiveHeadCounter), 122948f512ceSopenharmony_ci (defaultConfigNames_.size() - 1)); 123048f512ceSopenharmony_ci 123148f512ceSopenharmony_ci EXPECT_GE(effectiveHeadCounter, 3u); 123248f512ceSopenharmony_ci t1.join(); 123348f512ceSopenharmony_ci} 123448f512ceSopenharmony_ci 123548f512ceSopenharmony_ci/** 123648f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_e 123748f512ceSopenharmony_ci * @tc.desc: -e261 123848f512ceSopenharmony_ci * @tc.type: FUNC 123948f512ceSopenharmony_ci */ 124048f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_e, TestSize.Level1) 124148f512ceSopenharmony_ci{ 124248f512ceSopenharmony_ci int tid1 = 0; 124348f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 124448f512ceSopenharmony_ci while (tid1 == 0) { 124548f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 124648f512ceSopenharmony_ci } 124748f512ceSopenharmony_ci 124848f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 124948f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 125048f512ceSopenharmony_ci cmdstr += " -e hw-instructions -c 0 -d 3 --dumpoptions"; 125148f512ceSopenharmony_ci 125248f512ceSopenharmony_ci StdoutRecord stdoutRecord; 125348f512ceSopenharmony_ci stdoutRecord.Start(); 125448f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 125548f512ceSopenharmony_ci g_wait = true; 125648f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), true); 125748f512ceSopenharmony_ci g_wait = false; 125848f512ceSopenharmony_ci { 125948f512ceSopenharmony_ci std::unique_lock<std::mutex> lock(mtx); 126048f512ceSopenharmony_ci cv.notify_all(); 126148f512ceSopenharmony_ci } 126248f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 126348f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 126448f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 126548f512ceSopenharmony_ci 126648f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 126748f512ceSopenharmony_ci if (HasFailure()) { 126848f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 126948f512ceSopenharmony_ci } 127048f512ceSopenharmony_ci const std::vector<std::string> configNmaes = {"hw-instructions"}; 127148f512ceSopenharmony_ci uint effectiveHeadCounter = 0u; 127248f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, configNmaes, effectiveHeadCounter), configNmaes.size()); 127348f512ceSopenharmony_ci t1.join(); 127448f512ceSopenharmony_ci} 127548f512ceSopenharmony_ci 127648f512ceSopenharmony_ci/** 127748f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_e1 127848f512ceSopenharmony_ci * @tc.desc: -e261 127948f512ceSopenharmony_ci * @tc.type: FUNC 128048f512ceSopenharmony_ci */ 128148f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_e1, TestSize.Level1) 128248f512ceSopenharmony_ci{ 128348f512ceSopenharmony_ci int tid1 = 0; 128448f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 128548f512ceSopenharmony_ci while (tid1 == 0) { 128648f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 128748f512ceSopenharmony_ci } 128848f512ceSopenharmony_ci 128948f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 129048f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 129148f512ceSopenharmony_ci cmdstr += " -e hw-branch-misses -c 0 -d 3 --dumpoptions"; 129248f512ceSopenharmony_ci 129348f512ceSopenharmony_ci StdoutRecord stdoutRecord; 129448f512ceSopenharmony_ci stdoutRecord.Start(); 129548f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 129648f512ceSopenharmony_ci g_wait = true; 129748f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), true); 129848f512ceSopenharmony_ci g_wait = false; 129948f512ceSopenharmony_ci { 130048f512ceSopenharmony_ci std::unique_lock<std::mutex> lock(mtx); 130148f512ceSopenharmony_ci cv.notify_all(); 130248f512ceSopenharmony_ci } 130348f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 130448f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 130548f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 130648f512ceSopenharmony_ci 130748f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 130848f512ceSopenharmony_ci if (HasFailure()) { 130948f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 131048f512ceSopenharmony_ci } 131148f512ceSopenharmony_ci const std::vector<std::string> configNmaes = {"hw-branch-misses"}; 131248f512ceSopenharmony_ci uint effectiveHeadCounter = 0u; 131348f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, configNmaes, effectiveHeadCounter), configNmaes.size()); 131448f512ceSopenharmony_ci t1.join(); 131548f512ceSopenharmony_ci} 131648f512ceSopenharmony_ci 131748f512ceSopenharmony_ci/** 131848f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_e2 131948f512ceSopenharmony_ci * @tc.desc: -e261 132048f512ceSopenharmony_ci * @tc.type: FUNC 132148f512ceSopenharmony_ci */ 132248f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_e2, TestSize.Level1) 132348f512ceSopenharmony_ci{ 132448f512ceSopenharmony_ci int tid1 = 0; 132548f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 132648f512ceSopenharmony_ci while (tid1 == 0) { 132748f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 132848f512ceSopenharmony_ci } 132948f512ceSopenharmony_ci 133048f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 133148f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 133248f512ceSopenharmony_ci cmdstr += " -e hw-cpu-cycles -c 0 -d 3 --dumpoptions"; 133348f512ceSopenharmony_ci 133448f512ceSopenharmony_ci StdoutRecord stdoutRecord; 133548f512ceSopenharmony_ci stdoutRecord.Start(); 133648f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 133748f512ceSopenharmony_ci g_wait = true; 133848f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), true); 133948f512ceSopenharmony_ci g_wait = false; 134048f512ceSopenharmony_ci { 134148f512ceSopenharmony_ci std::unique_lock<std::mutex> lock(mtx); 134248f512ceSopenharmony_ci cv.notify_all(); 134348f512ceSopenharmony_ci } 134448f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 134548f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 134648f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 134748f512ceSopenharmony_ci 134848f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 134948f512ceSopenharmony_ci if (HasFailure()) { 135048f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 135148f512ceSopenharmony_ci } 135248f512ceSopenharmony_ci const std::vector<std::string> configNmaes = {"hw-cpu-cycles"}; 135348f512ceSopenharmony_ci uint effectiveHeadCounter = 0u; 135448f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, configNmaes, effectiveHeadCounter), configNmaes.size()); 135548f512ceSopenharmony_ci t1.join(); 135648f512ceSopenharmony_ci} 135748f512ceSopenharmony_ci 135848f512ceSopenharmony_ci/** 135948f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_e3 136048f512ceSopenharmony_ci * @tc.desc: -e261 136148f512ceSopenharmony_ci * @tc.type: FUNC 136248f512ceSopenharmony_ci */ 136348f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_e3, TestSize.Level1) 136448f512ceSopenharmony_ci{ 136548f512ceSopenharmony_ci int tid1 = 0; 136648f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 136748f512ceSopenharmony_ci while (tid1 == 0) { 136848f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 136948f512ceSopenharmony_ci } 137048f512ceSopenharmony_ci 137148f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 137248f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 137348f512ceSopenharmony_ci cmdstr += " -e hw-instructions -c 0 -d 3 --dumpoptions"; 137448f512ceSopenharmony_ci 137548f512ceSopenharmony_ci StdoutRecord stdoutRecord; 137648f512ceSopenharmony_ci stdoutRecord.Start(); 137748f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 137848f512ceSopenharmony_ci g_wait = true; 137948f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), true); 138048f512ceSopenharmony_ci g_wait = false; 138148f512ceSopenharmony_ci { 138248f512ceSopenharmony_ci std::unique_lock<std::mutex> lock(mtx); 138348f512ceSopenharmony_ci cv.notify_all(); 138448f512ceSopenharmony_ci } 138548f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 138648f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 138748f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 138848f512ceSopenharmony_ci 138948f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 139048f512ceSopenharmony_ci if (HasFailure()) { 139148f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 139248f512ceSopenharmony_ci } 139348f512ceSopenharmony_ci const std::vector<std::string> configNmaes = {"hw-instructions"}; 139448f512ceSopenharmony_ci uint effectiveHeadCounter = 0u; 139548f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, configNmaes, effectiveHeadCounter), configNmaes.size()); 139648f512ceSopenharmony_ci t1.join(); 139748f512ceSopenharmony_ci} 139848f512ceSopenharmony_ci 139948f512ceSopenharmony_ci/** 140048f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_e4 140148f512ceSopenharmony_ci * @tc.desc: -e261 140248f512ceSopenharmony_ci * @tc.type: FUNC 140348f512ceSopenharmony_ci */ 140448f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_e4, TestSize.Level1) 140548f512ceSopenharmony_ci{ 140648f512ceSopenharmony_ci int tid1 = 0; 140748f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 140848f512ceSopenharmony_ci while (tid1 == 0) { 140948f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 141048f512ceSopenharmony_ci } 141148f512ceSopenharmony_ci 141248f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 141348f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 141448f512ceSopenharmony_ci cmdstr += " -e hw-branch-test -c 0 -d 3 --dumpoptions"; 141548f512ceSopenharmony_ci 141648f512ceSopenharmony_ci StdoutRecord stdoutRecord; 141748f512ceSopenharmony_ci stdoutRecord.Start(); 141848f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 141948f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), false); 142048f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 142148f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 142248f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 142348f512ceSopenharmony_ci 142448f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 142548f512ceSopenharmony_ci if (HasFailure()) { 142648f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 142748f512ceSopenharmony_ci } 142848f512ceSopenharmony_ci std::string expectStr = "event is not supported"; 142948f512ceSopenharmony_ci EXPECT_EQ(FindExpectStr(stringOut, expectStr), true); 143048f512ceSopenharmony_ci t1.join(); 143148f512ceSopenharmony_ci} 143248f512ceSopenharmony_ci 143348f512ceSopenharmony_ci/** 143448f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_g 143548f512ceSopenharmony_ci * @tc.desc: -g 143648f512ceSopenharmony_ci * @tc.type: FUNC 143748f512ceSopenharmony_ci */ 143848f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_g, TestSize.Level1) 143948f512ceSopenharmony_ci{ 144048f512ceSopenharmony_ci int tid1 = 0; 144148f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 144248f512ceSopenharmony_ci while (tid1 == 0) { 144348f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 144448f512ceSopenharmony_ci } 144548f512ceSopenharmony_ci 144648f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 144748f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 144848f512ceSopenharmony_ci cmdstr += " -g hw-branch-misses" 144948f512ceSopenharmony_ci " -g hw-cpu-cycles,hw-instructions" 145048f512ceSopenharmony_ci " -c 0 -d 3 --dumpoptions"; 145148f512ceSopenharmony_ci 145248f512ceSopenharmony_ci StdoutRecord stdoutRecord; 145348f512ceSopenharmony_ci stdoutRecord.Start(); 145448f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 145548f512ceSopenharmony_ci g_wait = true; 145648f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), true); 145748f512ceSopenharmony_ci g_wait = false; 145848f512ceSopenharmony_ci { 145948f512ceSopenharmony_ci std::unique_lock<std::mutex> lock(mtx); 146048f512ceSopenharmony_ci cv.notify_all(); 146148f512ceSopenharmony_ci } 146248f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 146348f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 146448f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 146548f512ceSopenharmony_ci 146648f512ceSopenharmony_ci const std::string stringOut = stdoutRecord.Stop(); 146748f512ceSopenharmony_ci if (HasFailure()) { 146848f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 146948f512ceSopenharmony_ci } 147048f512ceSopenharmony_ci 147148f512ceSopenharmony_ci const std::vector<std::string> configNmaes = { 147248f512ceSopenharmony_ci "hw-branch-misses", 147348f512ceSopenharmony_ci "hw-cpu-cycles", 147448f512ceSopenharmony_ci "hw-instructions", 147548f512ceSopenharmony_ci }; 147648f512ceSopenharmony_ci uint effectiveHeadCounter = 0u; 147748f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, configNmaes, effectiveHeadCounter), configNmaes.size()); 147848f512ceSopenharmony_ci t1.join(); 147948f512ceSopenharmony_ci} 148048f512ceSopenharmony_ci 148148f512ceSopenharmony_ci/** 148248f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_g1 148348f512ceSopenharmony_ci * @tc.desc: -g 148448f512ceSopenharmony_ci * @tc.type: FUNC 148548f512ceSopenharmony_ci */ 148648f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_g1, TestSize.Level1) 148748f512ceSopenharmony_ci{ 148848f512ceSopenharmony_ci int tid1 = 0; 148948f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 149048f512ceSopenharmony_ci while (tid1 == 0) { 149148f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 149248f512ceSopenharmony_ci } 149348f512ceSopenharmony_ci 149448f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 149548f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 149648f512ceSopenharmony_ci cmdstr += " -g hw-instructions,hw-branch-misses" 149748f512ceSopenharmony_ci " -c 0 -d 3 --dumpoptions"; 149848f512ceSopenharmony_ci 149948f512ceSopenharmony_ci StdoutRecord stdoutRecord; 150048f512ceSopenharmony_ci stdoutRecord.Start(); 150148f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 150248f512ceSopenharmony_ci g_wait = true; 150348f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), true); 150448f512ceSopenharmony_ci g_wait = false; 150548f512ceSopenharmony_ci { 150648f512ceSopenharmony_ci std::unique_lock<std::mutex> lock(mtx); 150748f512ceSopenharmony_ci cv.notify_all(); 150848f512ceSopenharmony_ci } 150948f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 151048f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 151148f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 151248f512ceSopenharmony_ci 151348f512ceSopenharmony_ci const std::string stringOut = stdoutRecord.Stop(); 151448f512ceSopenharmony_ci if (HasFailure()) { 151548f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 151648f512ceSopenharmony_ci } 151748f512ceSopenharmony_ci 151848f512ceSopenharmony_ci const std::vector<std::string> configNmaes = { 151948f512ceSopenharmony_ci "hw-instructions", 152048f512ceSopenharmony_ci "hw-branch-misses", 152148f512ceSopenharmony_ci }; 152248f512ceSopenharmony_ci uint effectiveHeadCounter = 0u; 152348f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, configNmaes, effectiveHeadCounter), configNmaes.size()); 152448f512ceSopenharmony_ci t1.join(); 152548f512ceSopenharmony_ci} 152648f512ceSopenharmony_ci 152748f512ceSopenharmony_ci/** 152848f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_g2 152948f512ceSopenharmony_ci * @tc.desc: -g 153048f512ceSopenharmony_ci * @tc.type: FUNC 153148f512ceSopenharmony_ci */ 153248f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_g2, TestSize.Level1) 153348f512ceSopenharmony_ci{ 153448f512ceSopenharmony_ci int tid1 = 0; 153548f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 153648f512ceSopenharmony_ci while (tid1 == 0) { 153748f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 153848f512ceSopenharmony_ci } 153948f512ceSopenharmony_ci 154048f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 154148f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 154248f512ceSopenharmony_ci cmdstr += " -g hw-cpu-cycles,hw-instructions" 154348f512ceSopenharmony_ci " -c 0 -d 3 --dumpoptions"; 154448f512ceSopenharmony_ci 154548f512ceSopenharmony_ci StdoutRecord stdoutRecord; 154648f512ceSopenharmony_ci stdoutRecord.Start(); 154748f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 154848f512ceSopenharmony_ci g_wait = true; 154948f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), true); 155048f512ceSopenharmony_ci g_wait = false; 155148f512ceSopenharmony_ci { 155248f512ceSopenharmony_ci std::unique_lock<std::mutex> lock(mtx); 155348f512ceSopenharmony_ci cv.notify_all(); 155448f512ceSopenharmony_ci } 155548f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 155648f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 155748f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 155848f512ceSopenharmony_ci 155948f512ceSopenharmony_ci const std::string stringOut = stdoutRecord.Stop(); 156048f512ceSopenharmony_ci if (HasFailure()) { 156148f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 156248f512ceSopenharmony_ci } 156348f512ceSopenharmony_ci 156448f512ceSopenharmony_ci const std::vector<std::string> configNmaes = { 156548f512ceSopenharmony_ci "hw-cpu-cycles", 156648f512ceSopenharmony_ci "hw-instructions", 156748f512ceSopenharmony_ci }; 156848f512ceSopenharmony_ci uint effectiveHeadCounter = 0u; 156948f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, configNmaes, effectiveHeadCounter), configNmaes.size()); 157048f512ceSopenharmony_ci t1.join(); 157148f512ceSopenharmony_ci} 157248f512ceSopenharmony_ci 157348f512ceSopenharmony_ci/** 157448f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_g3 157548f512ceSopenharmony_ci * @tc.desc: -g 157648f512ceSopenharmony_ci * @tc.type: FUNC 157748f512ceSopenharmony_ci */ 157848f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_g3, TestSize.Level1) 157948f512ceSopenharmony_ci{ 158048f512ceSopenharmony_ci int tid1 = 0; 158148f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 158248f512ceSopenharmony_ci while (tid1 == 0) { 158348f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 158448f512ceSopenharmony_ci } 158548f512ceSopenharmony_ci 158648f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 158748f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 158848f512ceSopenharmony_ci cmdstr += " -g hw-cpu-test,hw-instructions" 158948f512ceSopenharmony_ci " -c 0 -d 3 --dumpoptions"; 159048f512ceSopenharmony_ci 159148f512ceSopenharmony_ci StdoutRecord stdoutRecord; 159248f512ceSopenharmony_ci stdoutRecord.Start(); 159348f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 159448f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), false); 159548f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 159648f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 159748f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 159848f512ceSopenharmony_ci 159948f512ceSopenharmony_ci const std::string stringOut = stdoutRecord.Stop(); 160048f512ceSopenharmony_ci if (HasFailure()) { 160148f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 160248f512ceSopenharmony_ci } 160348f512ceSopenharmony_ci 160448f512ceSopenharmony_ci std::string expectStr = "event is not supported"; 160548f512ceSopenharmony_ci EXPECT_EQ(FindExpectStr(stringOut, expectStr), true); 160648f512ceSopenharmony_ci t1.join(); 160748f512ceSopenharmony_ci} 160848f512ceSopenharmony_ci 160948f512ceSopenharmony_ci/** 161048f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_g_uk 161148f512ceSopenharmony_ci * @tc.desc: -g u:k 161248f512ceSopenharmony_ci * @tc.type: FUNC 161348f512ceSopenharmony_ci */ 161448f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_g_uk, TestSize.Level1) 161548f512ceSopenharmony_ci{ 161648f512ceSopenharmony_ci int tid1 = 0; 161748f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 161848f512ceSopenharmony_ci while (tid1 == 0) { 161948f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 162048f512ceSopenharmony_ci } 162148f512ceSopenharmony_ci 162248f512ceSopenharmony_ci std::string cmdstr = "stat -p "; 162348f512ceSopenharmony_ci cmdstr += std::to_string(tid1); 162448f512ceSopenharmony_ci cmdstr += " -g hw-branch-misses:k" 162548f512ceSopenharmony_ci " -g hw-cpu-cycles:k,hw-instructions:k" 162648f512ceSopenharmony_ci " -c 0 -d 3 --dumpoptions"; 162748f512ceSopenharmony_ci 162848f512ceSopenharmony_ci StdoutRecord stdoutRecord; 162948f512ceSopenharmony_ci stdoutRecord.Start(); 163048f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 163148f512ceSopenharmony_ci g_wait = true; 163248f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), true); 163348f512ceSopenharmony_ci g_wait = false; 163448f512ceSopenharmony_ci { 163548f512ceSopenharmony_ci std::unique_lock<std::mutex> lock(mtx); 163648f512ceSopenharmony_ci cv.notify_all(); 163748f512ceSopenharmony_ci } 163848f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 163948f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 164048f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 164148f512ceSopenharmony_ci 164248f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 164348f512ceSopenharmony_ci if (HasFailure()) { 164448f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 164548f512ceSopenharmony_ci } 164648f512ceSopenharmony_ci const std::vector<std::string> configNmaes = { 164748f512ceSopenharmony_ci "hw-branch-misses:k", 164848f512ceSopenharmony_ci "hw-cpu-cycles:k", 164948f512ceSopenharmony_ci "hw-instructions:k", 165048f512ceSopenharmony_ci }; 165148f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 165248f512ceSopenharmony_ci uint effectiveHeadCounter = 0u; 165348f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, configNmaes, effectiveHeadCounter), configNmaes.size()); 165448f512ceSopenharmony_ci CheckGroupCoverage(stringOut, "hw-branch-misses:k"); 165548f512ceSopenharmony_ci CheckGroupCoverage(stringOut, "hw-cpu-cycles:k,hw-instructions:k"); 165648f512ceSopenharmony_ci t1.join(); 165748f512ceSopenharmony_ci} 165848f512ceSopenharmony_ci 165948f512ceSopenharmony_ci/** 166048f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_p_t 166148f512ceSopenharmony_ci * @tc.desc: -p -t 166248f512ceSopenharmony_ci * @tc.type: FUNC 166348f512ceSopenharmony_ci */ 166448f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_p_t, TestSize.Level1) 166548f512ceSopenharmony_ci{ 166648f512ceSopenharmony_ci int tid1 = 0; 166748f512ceSopenharmony_ci int tid2 = 0; 166848f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 166948f512ceSopenharmony_ci std::thread t2(SubCommandStatTest::TestCodeThread, std::ref(tid2)); 167048f512ceSopenharmony_ci 167148f512ceSopenharmony_ci printf("wait child thread run.\n"); 167248f512ceSopenharmony_ci while (tid1 * tid2 == 0) { 167348f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 167448f512ceSopenharmony_ci } 167548f512ceSopenharmony_ci 167648f512ceSopenharmony_ci StdoutRecord stdoutRecord; 167748f512ceSopenharmony_ci stdoutRecord.Start(); 167848f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 167948f512ceSopenharmony_ci 168048f512ceSopenharmony_ci std::string tidString = " -t "; 168148f512ceSopenharmony_ci tidString += std::to_string(tid1) + ","; 168248f512ceSopenharmony_ci tidString += std::to_string(tid2); 168348f512ceSopenharmony_ci 168448f512ceSopenharmony_ci std::string cmdString = "stat"; 168548f512ceSopenharmony_ci cmdString += tidString; 168648f512ceSopenharmony_ci cmdString += " -c 0 -d 3 --dumpoptions"; 168748f512ceSopenharmony_ci g_wait = true; 168848f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdString), true); 168948f512ceSopenharmony_ci g_wait = false; 169048f512ceSopenharmony_ci { 169148f512ceSopenharmony_ci std::unique_lock<std::mutex> lock(mtx); 169248f512ceSopenharmony_ci cv.notify_all(); 169348f512ceSopenharmony_ci } 169448f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 169548f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 169648f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 169748f512ceSopenharmony_ci 169848f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 169948f512ceSopenharmony_ci if (HasFailure()) { 170048f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 170148f512ceSopenharmony_ci } 170248f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 170348f512ceSopenharmony_ci uint effectiveHeadCounter = 0u; 170448f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, defaultConfigNames_, effectiveHeadCounter), 170548f512ceSopenharmony_ci (defaultConfigNames_.size() - 1)); 170648f512ceSopenharmony_ci 170748f512ceSopenharmony_ci t1.join(); 170848f512ceSopenharmony_ci t2.join(); 170948f512ceSopenharmony_ci} 171048f512ceSopenharmony_ci 171148f512ceSopenharmony_ci/** 171248f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_p_t1 171348f512ceSopenharmony_ci * @tc.desc: -p -t 171448f512ceSopenharmony_ci * @tc.type: FUNC 171548f512ceSopenharmony_ci */ 171648f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_p_t1, TestSize.Level1) 171748f512ceSopenharmony_ci{ 171848f512ceSopenharmony_ci int tid1 = 0; 171948f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 172048f512ceSopenharmony_ci while (tid1 == 0) { 172148f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 172248f512ceSopenharmony_ci } 172348f512ceSopenharmony_ci 172448f512ceSopenharmony_ci StdoutRecord stdoutRecord; 172548f512ceSopenharmony_ci stdoutRecord.Start(); 172648f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 172748f512ceSopenharmony_ci 172848f512ceSopenharmony_ci std::string tidString = " -t "; 172948f512ceSopenharmony_ci tidString += std::to_string(tid1); 173048f512ceSopenharmony_ci 173148f512ceSopenharmony_ci std::string cmdString = "stat"; 173248f512ceSopenharmony_ci cmdString += tidString; 173348f512ceSopenharmony_ci cmdString += " -c 0 -d 3 --dumpoptions"; 173448f512ceSopenharmony_ci g_wait = true; 173548f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdString), true); 173648f512ceSopenharmony_ci g_wait = false; 173748f512ceSopenharmony_ci { 173848f512ceSopenharmony_ci std::unique_lock<std::mutex> lock(mtx); 173948f512ceSopenharmony_ci cv.notify_all(); 174048f512ceSopenharmony_ci } 174148f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 174248f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 174348f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 174448f512ceSopenharmony_ci 174548f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 174648f512ceSopenharmony_ci if (HasFailure()) { 174748f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 174848f512ceSopenharmony_ci } 174948f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 175048f512ceSopenharmony_ci uint effectiveHeadCounter = 0u; 175148f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, defaultConfigNames_, effectiveHeadCounter), 175248f512ceSopenharmony_ci (defaultConfigNames_.size() - 1)); 175348f512ceSopenharmony_ci t1.join(); 175448f512ceSopenharmony_ci} 175548f512ceSopenharmony_ci 175648f512ceSopenharmony_ci/** 175748f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_p_t2 175848f512ceSopenharmony_ci * @tc.desc: -p -t 175948f512ceSopenharmony_ci * @tc.type: FUNC 176048f512ceSopenharmony_ci */ 176148f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_p_t2, TestSize.Level1) 176248f512ceSopenharmony_ci{ 176348f512ceSopenharmony_ci StdoutRecord stdoutRecord; 176448f512ceSopenharmony_ci stdoutRecord.Start(); 176548f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 176648f512ceSopenharmony_ci 176748f512ceSopenharmony_ci std::string tidString = " -t "; 176848f512ceSopenharmony_ci tidString += "-1"; 176948f512ceSopenharmony_ci 177048f512ceSopenharmony_ci std::string cmdString = "stat"; 177148f512ceSopenharmony_ci cmdString += tidString; 177248f512ceSopenharmony_ci cmdString += " -c 0 -d 3 --dumpoptions"; 177348f512ceSopenharmony_ci 177448f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdString), false); 177548f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 177648f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 177748f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 177848f512ceSopenharmony_ci 177948f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 178048f512ceSopenharmony_ci if (HasFailure()) { 178148f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 178248f512ceSopenharmony_ci } 178348f512ceSopenharmony_ci 178448f512ceSopenharmony_ci std::string expectStr = "failed"; 178548f512ceSopenharmony_ci EXPECT_EQ(FindExpectStr(stringOut, expectStr), true); 178648f512ceSopenharmony_ci} 178748f512ceSopenharmony_ci 178848f512ceSopenharmony_ci/** 178948f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_p_t3 179048f512ceSopenharmony_ci * @tc.desc: -p -t 179148f512ceSopenharmony_ci * @tc.type: FUNC 179248f512ceSopenharmony_ci */ 179348f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_p_t3, TestSize.Level1) 179448f512ceSopenharmony_ci{ 179548f512ceSopenharmony_ci StdoutRecord stdoutRecord; 179648f512ceSopenharmony_ci stdoutRecord.Start(); 179748f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 179848f512ceSopenharmony_ci 179948f512ceSopenharmony_ci std::string tidString = " -t "; 180048f512ceSopenharmony_ci tidString += "test"; 180148f512ceSopenharmony_ci 180248f512ceSopenharmony_ci std::string cmdString = "stat"; 180348f512ceSopenharmony_ci cmdString += tidString; 180448f512ceSopenharmony_ci cmdString += " -c 0 -d 3 --dumpoptions"; 180548f512ceSopenharmony_ci 180648f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdString), false); 180748f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 180848f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 180948f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 181048f512ceSopenharmony_ci 181148f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 181248f512ceSopenharmony_ci if (HasFailure()) { 181348f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 181448f512ceSopenharmony_ci } 181548f512ceSopenharmony_ci 181648f512ceSopenharmony_ci std::string expectStr = "incorrect"; 181748f512ceSopenharmony_ci EXPECT_EQ(FindExpectStr(stringOut, expectStr), true); 181848f512ceSopenharmony_ci} 181948f512ceSopenharmony_ci 182048f512ceSopenharmony_ci/** 182148f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_p_t4 182248f512ceSopenharmony_ci * @tc.desc: -p -t 182348f512ceSopenharmony_ci * @tc.type: FUNC 182448f512ceSopenharmony_ci */ 182548f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_p_t4, TestSize.Level1) 182648f512ceSopenharmony_ci{ 182748f512ceSopenharmony_ci int tid1 = 0; 182848f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 182948f512ceSopenharmony_ci 183048f512ceSopenharmony_ci printf("wait child thread run.\n"); 183148f512ceSopenharmony_ci while (tid1 == 0) { 183248f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 183348f512ceSopenharmony_ci } 183448f512ceSopenharmony_ci 183548f512ceSopenharmony_ci StdoutRecord stdoutRecord; 183648f512ceSopenharmony_ci stdoutRecord.Start(); 183748f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 183848f512ceSopenharmony_ci 183948f512ceSopenharmony_ci std::string tidString = " -t "; 184048f512ceSopenharmony_ci tidString += std::to_string(tid1); 184148f512ceSopenharmony_ci 184248f512ceSopenharmony_ci std::string cmdString = "stat"; 184348f512ceSopenharmony_ci cmdString += tidString; 184448f512ceSopenharmony_ci cmdString += " -c 0 -d 3 --dumpoptions"; 184548f512ceSopenharmony_ci g_wait = true; 184648f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdString), true); 184748f512ceSopenharmony_ci g_wait = false; 184848f512ceSopenharmony_ci { 184948f512ceSopenharmony_ci std::unique_lock<std::mutex> lock(mtx); 185048f512ceSopenharmony_ci cv.notify_all(); 185148f512ceSopenharmony_ci } 185248f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 185348f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 185448f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 185548f512ceSopenharmony_ci 185648f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 185748f512ceSopenharmony_ci if (HasFailure()) { 185848f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 185948f512ceSopenharmony_ci } 186048f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 186148f512ceSopenharmony_ci uint effectiveHeadCounter = 0u; 186248f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, defaultConfigNames_, effectiveHeadCounter), 186348f512ceSopenharmony_ci (defaultConfigNames_.size() - 1)); 186448f512ceSopenharmony_ci t1.join(); 186548f512ceSopenharmony_ci} 186648f512ceSopenharmony_ci 186748f512ceSopenharmony_ci/** 186848f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_verbose 186948f512ceSopenharmony_ci * @tc.desc: -p -t 187048f512ceSopenharmony_ci * @tc.type: FUNC 187148f512ceSopenharmony_ci */ 187248f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_verbose, TestSize.Level1) 187348f512ceSopenharmony_ci{ 187448f512ceSopenharmony_ci int tid1 = 0; 187548f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 187648f512ceSopenharmony_ci 187748f512ceSopenharmony_ci printf("wait child thread run.\n"); 187848f512ceSopenharmony_ci while (tid1 == 0) { 187948f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 188048f512ceSopenharmony_ci } 188148f512ceSopenharmony_ci 188248f512ceSopenharmony_ci StdoutRecord stdoutRecord; 188348f512ceSopenharmony_ci stdoutRecord.Start(); 188448f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 188548f512ceSopenharmony_ci 188648f512ceSopenharmony_ci std::string tidString = " -t "; 188748f512ceSopenharmony_ci tidString += std::to_string(tid1); 188848f512ceSopenharmony_ci 188948f512ceSopenharmony_ci std::string cmdString = "stat"; 189048f512ceSopenharmony_ci cmdString += tidString; 189148f512ceSopenharmony_ci cmdString += " -c 0 -d 3 --verbose"; 189248f512ceSopenharmony_ci g_wait = true; 189348f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdString), true); 189448f512ceSopenharmony_ci g_wait = false; 189548f512ceSopenharmony_ci { 189648f512ceSopenharmony_ci std::unique_lock<std::mutex> lock(mtx); 189748f512ceSopenharmony_ci cv.notify_all(); 189848f512ceSopenharmony_ci } 189948f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 190048f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 190148f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 190248f512ceSopenharmony_ci 190348f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 190448f512ceSopenharmony_ci if (HasFailure()) { 190548f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 190648f512ceSopenharmony_ci } 190748f512ceSopenharmony_ci 190848f512ceSopenharmony_ci std::string expectStr = "timeEnabled:"; 190948f512ceSopenharmony_ci EXPECT_EQ(FindExpectStr(stringOut, expectStr), true); 191048f512ceSopenharmony_ci t1.join(); 191148f512ceSopenharmony_ci} 191248f512ceSopenharmony_ci 191348f512ceSopenharmony_ci/** 191448f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_verbose1 191548f512ceSopenharmony_ci * @tc.desc: -p -t 191648f512ceSopenharmony_ci * @tc.type: FUNC 191748f512ceSopenharmony_ci */ 191848f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_verbose1, TestSize.Level1) 191948f512ceSopenharmony_ci{ 192048f512ceSopenharmony_ci int tid1 = 0; 192148f512ceSopenharmony_ci std::thread t1(SubCommandStatTest::TestCodeThread, std::ref(tid1)); 192248f512ceSopenharmony_ci 192348f512ceSopenharmony_ci printf("wait child thread run.\n"); 192448f512ceSopenharmony_ci while (tid1 == 0) { 192548f512ceSopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(10)); 192648f512ceSopenharmony_ci } 192748f512ceSopenharmony_ci 192848f512ceSopenharmony_ci StdoutRecord stdoutRecord; 192948f512ceSopenharmony_ci stdoutRecord.Start(); 193048f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 193148f512ceSopenharmony_ci 193248f512ceSopenharmony_ci std::string tidString = " -t "; 193348f512ceSopenharmony_ci tidString += std::to_string(tid1); 193448f512ceSopenharmony_ci 193548f512ceSopenharmony_ci std::string cmdString = "stat"; 193648f512ceSopenharmony_ci cmdString += tidString; 193748f512ceSopenharmony_ci cmdString += " -c 0 -d 3"; 193848f512ceSopenharmony_ci g_wait = true; 193948f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdString), true); 194048f512ceSopenharmony_ci g_wait = false; 194148f512ceSopenharmony_ci { 194248f512ceSopenharmony_ci std::unique_lock<std::mutex> lock(mtx); 194348f512ceSopenharmony_ci cv.notify_all(); 194448f512ceSopenharmony_ci } 194548f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 194648f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 194748f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 194848f512ceSopenharmony_ci 194948f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 195048f512ceSopenharmony_ci if (HasFailure()) { 195148f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 195248f512ceSopenharmony_ci } 195348f512ceSopenharmony_ci 195448f512ceSopenharmony_ci std::string expectStr = "timeEnabled:"; 195548f512ceSopenharmony_ci EXPECT_EQ(FindExpectStr(stringOut, expectStr), false); 195648f512ceSopenharmony_ci t1.join(); 195748f512ceSopenharmony_ci} 195848f512ceSopenharmony_ci 195948f512ceSopenharmony_ci/** 196048f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_cmd 196148f512ceSopenharmony_ci * @tc.desc: hiperf stat <cmd> 196248f512ceSopenharmony_ci * @tc.type: FUNC 196348f512ceSopenharmony_ci */ 196448f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_cmd, TestSize.Level1) 196548f512ceSopenharmony_ci{ 196648f512ceSopenharmony_ci std::string cmdstr = "stat -c 0 -d 3 --dumpoptions ls -l"; 196748f512ceSopenharmony_ci 196848f512ceSopenharmony_ci StdoutRecord stdoutRecord; 196948f512ceSopenharmony_ci stdoutRecord.Start(); 197048f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 197148f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(cmdstr), true); 197248f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 197348f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 197448f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 197548f512ceSopenharmony_ci 197648f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 197748f512ceSopenharmony_ci if (HasFailure()) { 197848f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 197948f512ceSopenharmony_ci } 198048f512ceSopenharmony_ci // some times 'sw-page-faults' is 0 198148f512ceSopenharmony_ci uint effectiveHeadCounter = 0u; 198248f512ceSopenharmony_ci EXPECT_GE(EffectiveCounter(stringOut, defaultConfigNames_, effectiveHeadCounter), 198348f512ceSopenharmony_ci (defaultConfigNames_.size() - 1)); 198448f512ceSopenharmony_ci} 198548f512ceSopenharmony_ci 198648f512ceSopenharmony_ci/** 198748f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_ni 198848f512ceSopenharmony_ci * @tc.desc: --no-inherit 198948f512ceSopenharmony_ci * @tc.type: FUNC 199048f512ceSopenharmony_ci */ 199148f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_ni, TestSize.Level1) 199248f512ceSopenharmony_ci{ 199348f512ceSopenharmony_ci StdoutRecord stdoutRecord; 199448f512ceSopenharmony_ci const std::string configName {"hw-cpu-cycles"}; 199548f512ceSopenharmony_ci 199648f512ceSopenharmony_ci stdoutRecord.Start(); 199748f512ceSopenharmony_ci std::string testCMD = "stat --no-inherit -p 2 -c 0 -d 3 --dumpoptions -e "; 199848f512ceSopenharmony_ci testCMD += configName; 199948f512ceSopenharmony_ci const auto tick2 = std::chrono::steady_clock::now(); 200048f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand(testCMD), true); 200148f512ceSopenharmony_ci const auto tock2 = std::chrono::steady_clock::now(); 200248f512ceSopenharmony_ci const auto costMs2 = std::chrono::duration_cast<std::chrono::milliseconds>(tock2 - tick2); 200348f512ceSopenharmony_ci EXPECT_LE(costMs2.count(), defaultRunTimeoutMs); 200448f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 200548f512ceSopenharmony_ci if (HasFailure()) { 200648f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 200748f512ceSopenharmony_ci } 200848f512ceSopenharmony_ci int counterValueWithoutInherit = CounterValue(stringOut, configName); 200948f512ceSopenharmony_ci EXPECT_NE(counterValueWithoutInherit, 0); 201048f512ceSopenharmony_ci HLOGD("%s %d", configName.c_str(), counterValueWithoutInherit); 201148f512ceSopenharmony_ci} 201248f512ceSopenharmony_ci 201348f512ceSopenharmony_ci// ParseOption DumpOptions PrintUsage 201448f512ceSopenharmony_ci/** 201548f512ceSopenharmony_ci * @tc.name: TestParseOption_ni 201648f512ceSopenharmony_ci * @tc.desc: --no-inherit 201748f512ceSopenharmony_ci * @tc.type: FUNC 201848f512ceSopenharmony_ci */ 201948f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestParseOption, TestSize.Level1) 202048f512ceSopenharmony_ci{ 202148f512ceSopenharmony_ci SubCommandStat cmdStat; 202248f512ceSopenharmony_ci std::vector<std::string> args; 202348f512ceSopenharmony_ci args = {"-h"}; 202448f512ceSopenharmony_ci EXPECT_EQ(cmdStat.ParseOption(args), true); 202548f512ceSopenharmony_ci args = {"-a"}; 202648f512ceSopenharmony_ci EXPECT_EQ(cmdStat.ParseOption(args), true); 202748f512ceSopenharmony_ci args = {"-c"}; 202848f512ceSopenharmony_ci EXPECT_EQ(cmdStat.ParseOption(args), false); 202948f512ceSopenharmony_ci args = {"-d"}; 203048f512ceSopenharmony_ci EXPECT_EQ(cmdStat.ParseOption(args), false); 203148f512ceSopenharmony_ci args = {"-i"}; 203248f512ceSopenharmony_ci EXPECT_EQ(cmdStat.ParseOption(args), false); 203348f512ceSopenharmony_ci args = {"-e"}; 203448f512ceSopenharmony_ci EXPECT_EQ(cmdStat.ParseOption(args), false); 203548f512ceSopenharmony_ci args = {"-g"}; 203648f512ceSopenharmony_ci EXPECT_EQ(cmdStat.ParseOption(args), false); 203748f512ceSopenharmony_ci args = {"--no-inherit"}; 203848f512ceSopenharmony_ci EXPECT_EQ(cmdStat.ParseOption(args), true); 203948f512ceSopenharmony_ci args = {"-p"}; 204048f512ceSopenharmony_ci EXPECT_EQ(cmdStat.ParseOption(args), false); 204148f512ceSopenharmony_ci args = {"-t"}; 204248f512ceSopenharmony_ci EXPECT_EQ(cmdStat.ParseOption(args), false); 204348f512ceSopenharmony_ci args = {"--verbose"}; 204448f512ceSopenharmony_ci EXPECT_EQ(cmdStat.ParseOption(args), true); 204548f512ceSopenharmony_ci args.clear(); 204648f512ceSopenharmony_ci EXPECT_EQ(cmdStat.ParseOption(args), true); 204748f512ceSopenharmony_ci} 204848f512ceSopenharmony_ci 204948f512ceSopenharmony_ci/** 205048f512ceSopenharmony_ci * @tc.name: TestDumpOptions 205148f512ceSopenharmony_ci * @tc.desc: 205248f512ceSopenharmony_ci * @tc.type: FUNC 205348f512ceSopenharmony_ci */ 205448f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestDumpOptions, TestSize.Level1) 205548f512ceSopenharmony_ci{ 205648f512ceSopenharmony_ci StdoutRecord stdoutRecord; 205748f512ceSopenharmony_ci stdoutRecord.Start(); 205848f512ceSopenharmony_ci SubCommandStat cmdStat; 205948f512ceSopenharmony_ci cmdStat.DumpOptions(); 206048f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 206148f512ceSopenharmony_ci EXPECT_TRUE(stringOut.find("10000.000000 sec") != std::string::npos); 206248f512ceSopenharmony_ci} 206348f512ceSopenharmony_ci 206448f512ceSopenharmony_ci/** 206548f512ceSopenharmony_ci * @tc.name: TestPrintUsage 206648f512ceSopenharmony_ci * @tc.desc: 206748f512ceSopenharmony_ci * @tc.type: FUNC 206848f512ceSopenharmony_ci */ 206948f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestPrintUsage, TestSize.Level1) 207048f512ceSopenharmony_ci{ 207148f512ceSopenharmony_ci StdoutRecord stdoutRecord; 207248f512ceSopenharmony_ci stdoutRecord.Start(); 207348f512ceSopenharmony_ci SubCommandStat cmdStat; 207448f512ceSopenharmony_ci cmdStat.PrintUsage(); 207548f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 207648f512ceSopenharmony_ci EXPECT_TRUE(stringOut.find("Usage: hiperf stat [options] [command [command-args]]") != 207748f512ceSopenharmony_ci std::string::npos); 207848f512ceSopenharmony_ci} 207948f512ceSopenharmony_ci 208048f512ceSopenharmony_ci/** 208148f512ceSopenharmony_ci * @tc.name: TestCheckOptions 208248f512ceSopenharmony_ci * @tc.desc: 208348f512ceSopenharmony_ci * @tc.type: FUNC 208448f512ceSopenharmony_ci */ 208548f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestCheckOptions, TestSize.Level1) 208648f512ceSopenharmony_ci{ 208748f512ceSopenharmony_ci SubCommandStat cmdStat; 208848f512ceSopenharmony_ci std::vector<pid_t> pids; 208948f512ceSopenharmony_ci 209048f512ceSopenharmony_ci cmdStat.timeStopSec_ = -1; 209148f512ceSopenharmony_ci EXPECT_EQ(cmdStat.CheckOptions(pids), false); 209248f512ceSopenharmony_ci 209348f512ceSopenharmony_ci cmdStat.timeReportMs_ = -1; 209448f512ceSopenharmony_ci EXPECT_EQ(cmdStat.CheckOptions(pids), false); 209548f512ceSopenharmony_ci 209648f512ceSopenharmony_ci cmdStat.targetSystemWide_ = true; 209748f512ceSopenharmony_ci pids = {1112, 1113}; 209848f512ceSopenharmony_ci EXPECT_EQ(cmdStat.CheckOptions(pids), false); 209948f512ceSopenharmony_ci 210048f512ceSopenharmony_ci cmdStat.trackedCommand_ = {"test"}; 210148f512ceSopenharmony_ci EXPECT_EQ(cmdStat.CheckOptions(pids), false); 210248f512ceSopenharmony_ci 210348f512ceSopenharmony_ci cmdStat.targetSystemWide_ = false; 210448f512ceSopenharmony_ci EXPECT_EQ(cmdStat.CheckOptions(pids), false); 210548f512ceSopenharmony_ci} 210648f512ceSopenharmony_ci 210748f512ceSopenharmony_ci/** 210848f512ceSopenharmony_ci * @tc.name: TestReport 210948f512ceSopenharmony_ci * @tc.desc: 211048f512ceSopenharmony_ci * @tc.type: FUNC 211148f512ceSopenharmony_ci */ 211248f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestReport, TestSize.Level1) 211348f512ceSopenharmony_ci{ 211448f512ceSopenharmony_ci StdoutRecord stdoutRecord; 211548f512ceSopenharmony_ci stdoutRecord.Start(); 211648f512ceSopenharmony_ci SubCommandStat cmdStat; 211748f512ceSopenharmony_ci std::map<std::string, std::unique_ptr<PerfEvents::CountEvent>> countEvents; 211848f512ceSopenharmony_ci std::unique_ptr<PerfEvents::CountEvent> testEvent(std::make_unique<PerfEvents::CountEvent>()); 211948f512ceSopenharmony_ci std::string test = "test"; 212048f512ceSopenharmony_ci countEvents[test] = std::move(testEvent); 212148f512ceSopenharmony_ci cmdStat.Report(countEvents); 212248f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 212348f512ceSopenharmony_ci EXPECT_TRUE(stringOut.find("test") != std::string::npos); 212448f512ceSopenharmony_ci EXPECT_TRUE(stringOut.find("count name") != std::string::npos); 212548f512ceSopenharmony_ci} 212648f512ceSopenharmony_ci 212748f512ceSopenharmony_ci/** 212848f512ceSopenharmony_ci * @tc.name: TestReport_Piling 212948f512ceSopenharmony_ci * @tc.desc: 213048f512ceSopenharmony_ci * @tc.type: FUNC 213148f512ceSopenharmony_ci */ 213248f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestReport_Piling, TestSize.Level1) 213348f512ceSopenharmony_ci{ 213448f512ceSopenharmony_ci SubCommandStat cmdStat; 213548f512ceSopenharmony_ci std::vector<std::string> eventNames = { 213648f512ceSopenharmony_ci "hw-branch-instructions", "hw-branch-misses", "hw-cpu-cycles", "hw-instructions", 213748f512ceSopenharmony_ci "sw-context-switches", "sw-page-faults", "sw-task-clock", "sw-cpu-migrations"}; 213848f512ceSopenharmony_ci StdoutRecord stdoutRecord; 213948f512ceSopenharmony_ci stdoutRecord.Start(); 214048f512ceSopenharmony_ci std::map<std::string, std::unique_ptr<PerfEvents::CountEvent>> countEvents; 214148f512ceSopenharmony_ci for (int i = 0; i < 8; i++) { 214248f512ceSopenharmony_ci auto countEvent = make_unique<PerfEvents::CountEvent>(PerfEvents::CountEvent {}); 214348f512ceSopenharmony_ci std::string configName = eventNames[i]; 214448f512ceSopenharmony_ci countEvents[configName] = std::move(countEvent); 214548f512ceSopenharmony_ci countEvents[configName]->userOnly = false; 214648f512ceSopenharmony_ci countEvents[configName]->kernelOnly = false; 214748f512ceSopenharmony_ci std::unique_ptr<PerfEvents::CountEvent> &countEventTmp = countEvents[configName]; 214848f512ceSopenharmony_ci if (i == 0) { 214948f512ceSopenharmony_ci countEventTmp->eventCount = 20283000 * 10; 215048f512ceSopenharmony_ci } else if (i == 4) { 215148f512ceSopenharmony_ci countEventTmp->eventCount = 2028300; 215248f512ceSopenharmony_ci } else if (i == 5) { 215348f512ceSopenharmony_ci countEventTmp->eventCount = 2000; 215448f512ceSopenharmony_ci } else if (i == 7) { 215548f512ceSopenharmony_ci countEventTmp->eventCount = 20; 215648f512ceSopenharmony_ci } else { 215748f512ceSopenharmony_ci countEventTmp->eventCount = 20283000; 215848f512ceSopenharmony_ci } 215948f512ceSopenharmony_ci countEventTmp->timeEnabled = 2830280; 216048f512ceSopenharmony_ci countEventTmp->timeRunning = 2278140; 216148f512ceSopenharmony_ci countEventTmp->id = 0; 216248f512ceSopenharmony_ci countEventTmp->usedCpus = countEventTmp->eventCount / 1e9; 216348f512ceSopenharmony_ci } 216448f512ceSopenharmony_ci cmdStat.Report(countEvents); 216548f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 216648f512ceSopenharmony_ci printf("output: %s\n", stringOut.c_str()); 216748f512ceSopenharmony_ci EXPECT_EQ(FindExpectStr(stringOut, "G/sec"), true); 216848f512ceSopenharmony_ci EXPECT_EQ(FindExpectStr(stringOut, "M/sec"), true); 216948f512ceSopenharmony_ci EXPECT_EQ(FindExpectStr(stringOut, "K/sec"), true); 217048f512ceSopenharmony_ci EXPECT_EQ(FindExpectStr(stringOut, "/sec"), true); 217148f512ceSopenharmony_ci} 217248f512ceSopenharmony_ci 217348f512ceSopenharmony_ci/** 217448f512ceSopenharmony_ci * @tc.name: HandleOtherConfig 217548f512ceSopenharmony_ci * @tc.desc: Test handle other config 217648f512ceSopenharmony_ci * @tc.type: FUNC 217748f512ceSopenharmony_ci */ 217848f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, HandleOtherConfig, TestSize.Level1) 217948f512ceSopenharmony_ci{ 218048f512ceSopenharmony_ci PerfEvents::Summary summary(1, 1, 1, 1, 1); 218148f512ceSopenharmony_ci double comment = 0; 218248f512ceSopenharmony_ci constexpr int testNum = 100; 218348f512ceSopenharmony_ci EXPECT_EQ(SubCommandStat::HandleOtherConfig(comment, summary, testNum, testNum, true), ""); 218448f512ceSopenharmony_ci} 218548f512ceSopenharmony_ci 218648f512ceSopenharmony_ci/** 218748f512ceSopenharmony_ci * @tc.name: CheckOptionPidAndApp 218848f512ceSopenharmony_ci * @tc.desc: Test handle other config 218948f512ceSopenharmony_ci * @tc.type: FUNC 219048f512ceSopenharmony_ci */ 219148f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, CheckOptionPidAndApp, TestSize.Level1) 219248f512ceSopenharmony_ci{ 219348f512ceSopenharmony_ci SubCommandStat stat; 219448f512ceSopenharmony_ci std::vector<pid_t> pids; 219548f512ceSopenharmony_ci EXPECT_EQ(stat.CheckOptionPidAndApp(pids), true); 219648f512ceSopenharmony_ci pids.push_back(1); 219748f512ceSopenharmony_ci pids.push_back(2); // 2: pid 219848f512ceSopenharmony_ci EXPECT_EQ(stat.CheckOptionPidAndApp(pids), true); 219948f512ceSopenharmony_ci pids.push_back(700011); // 700011: invalid pid 220048f512ceSopenharmony_ci EXPECT_EQ(stat.CheckOptionPidAndApp(pids), false); 220148f512ceSopenharmony_ci} 220248f512ceSopenharmony_ci 220348f512ceSopenharmony_ci/** 220448f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_restart_fail 220548f512ceSopenharmony_ci * @tc.desc: --restart 220648f512ceSopenharmony_ci * @tc.type: FUNC 220748f512ceSopenharmony_ci */ 220848f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_restart_fail, TestSize.Level1) 220948f512ceSopenharmony_ci{ 221048f512ceSopenharmony_ci StdoutRecord stdoutRecord; 221148f512ceSopenharmony_ci stdoutRecord.Start(); 221248f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 221348f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand("stat --restart"), false); 221448f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 221548f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 221648f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 221748f512ceSopenharmony_ci 221848f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 221948f512ceSopenharmony_ci if (HasFailure()) { 222048f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 222148f512ceSopenharmony_ci } 222248f512ceSopenharmony_ci} 222348f512ceSopenharmony_ci 222448f512ceSopenharmony_ci/** 222548f512ceSopenharmony_ci * @tc.name: TestOnSubCommand_app_running 222648f512ceSopenharmony_ci * @tc.desc: --app 222748f512ceSopenharmony_ci * @tc.type: FUNC 222848f512ceSopenharmony_ci */ 222948f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, TestOnSubCommand_app_running, TestSize.Level1) 223048f512ceSopenharmony_ci{ 223148f512ceSopenharmony_ci StdoutRecord stdoutRecord; 223248f512ceSopenharmony_ci stdoutRecord.Start(); 223348f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand("stat --app com.app.notrunning -d 2"), false); 223448f512ceSopenharmony_ci 223548f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 223648f512ceSopenharmony_ci if (HasFailure()) { 223748f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 223848f512ceSopenharmony_ci } 223948f512ceSopenharmony_ci} 224048f512ceSopenharmony_ci 224148f512ceSopenharmony_ci/** 224248f512ceSopenharmony_ci * @tc.name: CheckPidAndApp 224348f512ceSopenharmony_ci * @tc.desc: -p 224448f512ceSopenharmony_ci * @tc.type: FUNC 224548f512ceSopenharmony_ci */ 224648f512ceSopenharmony_ciHWTEST_F(SubCommandStatTest, CheckPidAndApp, TestSize.Level1) 224748f512ceSopenharmony_ci{ 224848f512ceSopenharmony_ci StdoutRecord stdoutRecord; 224948f512ceSopenharmony_ci stdoutRecord.Start(); 225048f512ceSopenharmony_ci const auto startTime = chrono::steady_clock::now(); 225148f512ceSopenharmony_ci EXPECT_EQ(Command::DispatchCommand("stat -p 700001 -d 2"), true); 225248f512ceSopenharmony_ci const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>( 225348f512ceSopenharmony_ci chrono::steady_clock::now() - startTime); 225448f512ceSopenharmony_ci EXPECT_LE(costMs.count(), defaultRunTimeoutMs); 225548f512ceSopenharmony_ci 225648f512ceSopenharmony_ci std::string stringOut = stdoutRecord.Stop(); 225748f512ceSopenharmony_ci if (HasFailure()) { 225848f512ceSopenharmony_ci printf("output:\n%s", stringOut.c_str()); 225948f512ceSopenharmony_ci } 226048f512ceSopenharmony_ci} 226148f512ceSopenharmony_ci} // namespace HiPerf 226248f512ceSopenharmony_ci} // namespace Developtools 226348f512ceSopenharmony_ci} // namespace OHOS 2264