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