19762338dSopenharmony_ci/*
29762338dSopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
39762338dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
49762338dSopenharmony_ci * you may not use this file except in compliance with the License.
59762338dSopenharmony_ci * You may obtain a copy of the License at
69762338dSopenharmony_ci *
79762338dSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
89762338dSopenharmony_ci *
99762338dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
109762338dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
119762338dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
129762338dSopenharmony_ci * See the License for the specific language governing permissions and
139762338dSopenharmony_ci * limitations under the License.
149762338dSopenharmony_ci */
159762338dSopenharmony_ci#include <benchmark/benchmark.h>
169762338dSopenharmony_ci#include <string>
179762338dSopenharmony_ci#include <vector>
189762338dSopenharmony_ci
199762338dSopenharmony_ci#include <functional>
209762338dSopenharmony_ci#include <gtest/gtest.h>
219762338dSopenharmony_ci#include <hdf_io_service_if.h>
229762338dSopenharmony_ci#include <hdf_log.h>
239762338dSopenharmony_ci#include <base/hdi_smq.h>
249762338dSopenharmony_ci#include <idevmgr_hdi.h>
259762338dSopenharmony_ci#include <iostream>
269762338dSopenharmony_ci#include <ipc_object_stub.h>
279762338dSopenharmony_ci#include <iservmgr_hdi.h>
289762338dSopenharmony_ci#include <osal_time.h>
299762338dSopenharmony_ci#include <string>
309762338dSopenharmony_ci#include <iservstat_listener_hdi.h>
319762338dSopenharmony_ci
329762338dSopenharmony_ci#include "sample_hdi.h"
339762338dSopenharmony_ci
349762338dSopenharmony_ci#define HDF_LOG_TAG service_manager_test_cpp
359762338dSopenharmony_ci
369762338dSopenharmony_ciusing namespace std;
379762338dSopenharmony_ciusing namespace testing::ext;
389762338dSopenharmony_ciusing OHOS::IRemoteObject;
399762338dSopenharmony_ciusing OHOS::sptr;
409762338dSopenharmony_ciusing OHOS::HDI::Base::SharedMemQueue;
419762338dSopenharmony_ciusing OHOS::HDI::Base::SharedMemQueueMeta;
429762338dSopenharmony_ciusing OHOS::HDI::Base::SmqType;
439762338dSopenharmony_ciusing OHOS::HDI::DeviceManager::V1_0::IDeviceManager;
449762338dSopenharmony_ciusing OHOS::HDI::ServiceManager::V1_0::IServiceManager;
459762338dSopenharmony_ciusing OHOS::HDI::ServiceManager::V1_0::IServStatListener;
469762338dSopenharmony_ciusing OHOS::HDI::ServiceManager::V1_0::ServiceStatus;
479762338dSopenharmony_ciusing OHOS::HDI::ServiceManager::V1_0::ServStatListenerStub;
489762338dSopenharmony_ciusing OHOS::HDI::DeviceManager::V1_0::HdiDevHostInfo;
499762338dSopenharmony_ciusing OHOS::HDI::ServiceManager::V1_0::HdiServiceInfo;
509762338dSopenharmony_cistatic constexpr const char *TEST_SERVICE_NAME = "sample_driver_service";
519762338dSopenharmony_cistatic constexpr const char16_t *TEST_SERVICE_INTERFACE_DESC = u"hdf.test.sampele_service";
529762338dSopenharmony_cistatic constexpr const char *TEST_SERVICE_INTERFACE_DESC_N = "hdf.test.sampele_service";
539762338dSopenharmony_cistatic constexpr int PAYLOAD_NUM = 1234;
549762338dSopenharmony_cistatic constexpr int SMQ_TEST_QUEUE_SIZE = 10;
559762338dSopenharmony_cistatic constexpr int SMQ_TEST_WAIT_TIME = 100;
569762338dSopenharmony_cistatic constexpr int WAIT_LOAD_UNLOAD_TIME = 300;
579762338dSopenharmony_ci
589762338dSopenharmony_ciclass ManagerBenchmarkTest : public benchmark::Fixture {
599762338dSopenharmony_cipublic:
609762338dSopenharmony_ci    void TestServiceListenerStop(const sptr<IDeviceManager>& devmgr, const sptr<IServiceManager>& servmgr);
619762338dSopenharmony_ci    void TestSampleService(sptr<IRemoteObject>& sampleService, const sptr<IDeviceManager>& devmgr,
629762338dSopenharmony_ci        const sptr<IServiceManager>& servmgr);
639762338dSopenharmony_ci    void SetUp(const ::benchmark::State &state);
649762338dSopenharmony_ci    void TearDown(const ::benchmark::State &state);
659762338dSopenharmony_ci};
669762338dSopenharmony_civoid ManagerBenchmarkTest::SetUp(const ::benchmark::State &state)
679762338dSopenharmony_ci{
689762338dSopenharmony_ci    auto devmgr = IDeviceManager::Get();
699762338dSopenharmony_ci    if (devmgr != nullptr) {
709762338dSopenharmony_ci        HDF_LOGI("%{public}s:%{public}d", __func__, __LINE__);
719762338dSopenharmony_ci        devmgr->LoadDevice(TEST_SERVICE_NAME);
729762338dSopenharmony_ci    }
739762338dSopenharmony_ci}
749762338dSopenharmony_civoid ManagerBenchmarkTest::TearDown(const ::benchmark::State &state)
759762338dSopenharmony_ci{
769762338dSopenharmony_ci    auto devmgr = IDeviceManager::Get();
779762338dSopenharmony_ci    if (devmgr != nullptr) {
789762338dSopenharmony_ci        HDF_LOGI("%{public}s:%{public}d", __func__, __LINE__);
799762338dSopenharmony_ci        devmgr->UnloadDevice(TEST_SERVICE_NAME);
809762338dSopenharmony_ci    }
819762338dSopenharmony_ci}
829762338dSopenharmony_ci
839762338dSopenharmony_ciclass IPCObjectStubTest : public OHOS::IPCObjectStub {
849762338dSopenharmony_cipublic:
859762338dSopenharmony_ci    explicit IPCObjectStubTest() : OHOS::IPCObjectStub(u"") {};
869762338dSopenharmony_ci    virtual ~IPCObjectStubTest() = default;
879762338dSopenharmony_ci    int OnRemoteRequest(
889762338dSopenharmony_ci        uint32_t code, OHOS::MessageParcel &data, OHOS::MessageParcel &reply, OHOS::MessageOption &option) override
899762338dSopenharmony_ci    {
909762338dSopenharmony_ci        HDF_LOGI("IPCObjectStubTest::OnRemoteRequest called, code = %{public}d", code);
919762338dSopenharmony_ci        payload = data.ReadInt32();
929762338dSopenharmony_ci
939762338dSopenharmony_ci        return HDF_SUCCESS;
949762338dSopenharmony_ci    }
959762338dSopenharmony_ci
969762338dSopenharmony_ci    static int32_t payload;
979762338dSopenharmony_ci};
989762338dSopenharmony_ci
999762338dSopenharmony_ciint32_t IPCObjectStubTest::payload = 0;
1009762338dSopenharmony_ci
1019762338dSopenharmony_ci/**
1029762338dSopenharmony_ci  * @tc.number: SUB_Driver_Manager_Performance_0100
1039762338dSopenharmony_ci  * @tc.name: open input device for ap mode benchmark test
1049762338dSopenharmony_ci  * @tc.size: Medium
1059762338dSopenharmony_ci  * @tc.level: level 1
1069762338dSopenharmony_ci  */
1079762338dSopenharmony_ciBENCHMARK_F(ManagerBenchmarkTest, SendRequest)(benchmark::State &st)
1089762338dSopenharmony_ci{
1099762338dSopenharmony_ci    auto servmgr = IServiceManager::Get();
1109762338dSopenharmony_ci    ASSERT_TRUE(servmgr != nullptr);
1119762338dSopenharmony_ci
1129762338dSopenharmony_ci    auto sampleService = servmgr->GetService(TEST_SERVICE_NAME);
1139762338dSopenharmony_ci    ASSERT_TRUE(sampleService != nullptr);
1149762338dSopenharmony_ci
1159762338dSopenharmony_ci    OHOS::MessageParcel data;
1169762338dSopenharmony_ci    OHOS::MessageParcel reply;
1179762338dSopenharmony_ci    bool ret = data.WriteInterfaceToken(TEST_SERVICE_INTERFACE_DESC);
1189762338dSopenharmony_ci    ASSERT_EQ(ret, true);
1199762338dSopenharmony_ci    data.WriteCString("sample_service test call");
1209762338dSopenharmony_ci
1219762338dSopenharmony_ci    OHOS::MessageOption option;
1229762338dSopenharmony_ci    int status;
1239762338dSopenharmony_ci    for (auto _ : st) {
1249762338dSopenharmony_ci        status = sampleService->SendRequest(SAMPLE_SERVICE_PING, data, reply, option);
1259762338dSopenharmony_ci        }
1269762338dSopenharmony_ci    ASSERT_EQ(status, 0);
1279762338dSopenharmony_ci}
1289762338dSopenharmony_ciBENCHMARK_REGISTER_F(ManagerBenchmarkTest, SendRequest)->Iterations(100)->
1299762338dSopenharmony_ci    Repetitions(3)->ReportAggregatesOnly();
1309762338dSopenharmony_ci
1319762338dSopenharmony_ci/**
1329762338dSopenharmony_ci  * @tc.number: SUB_Driver_Manager_Performance_0200
1339762338dSopenharmony_ci  * @tc.name: open input device for ap mode benchmark test
1349762338dSopenharmony_ci  * @tc.size: Medium
1359762338dSopenharmony_ci  * @tc.level: level 1
1369762338dSopenharmony_ci  */
1379762338dSopenharmony_ciBENCHMARK_F(ManagerBenchmarkTest, GetService)(benchmark::State &st)
1389762338dSopenharmony_ci{
1399762338dSopenharmony_ci    auto servmgr = IServiceManager::Get();
1409762338dSopenharmony_ci    ASSERT_TRUE(servmgr != nullptr);
1419762338dSopenharmony_ci    auto sampleService = servmgr->GetService(TEST_SERVICE_NAME);
1429762338dSopenharmony_ci    for (auto _ : st) {
1439762338dSopenharmony_ci        sampleService = servmgr->GetService(TEST_SERVICE_NAME);
1449762338dSopenharmony_ci        }
1459762338dSopenharmony_ci    ASSERT_TRUE(sampleService != nullptr);
1469762338dSopenharmony_ci    sptr<IRemoteObject> callback = new IPCObjectStubTest();
1479762338dSopenharmony_ci    OHOS::MessageParcel data;
1489762338dSopenharmony_ci    OHOS::MessageParcel reply;
1499762338dSopenharmony_ci    int32_t payload = PAYLOAD_NUM;
1509762338dSopenharmony_ci    bool ret = data.WriteInterfaceToken(TEST_SERVICE_INTERFACE_DESC);
1519762338dSopenharmony_ci    ASSERT_EQ(ret, true);
1529762338dSopenharmony_ci    data.WriteInt32(payload);
1539762338dSopenharmony_ci    data.WriteRemoteObject(callback);
1549762338dSopenharmony_ci
1559762338dSopenharmony_ci    OHOS::MessageOption option;
1569762338dSopenharmony_ci    int status;
1579762338dSopenharmony_ci    status = sampleService->SendRequest(SAMPLE_SERVICE_CALLBACK, data, reply, option);
1589762338dSopenharmony_ci    ASSERT_EQ(status, 0);
1599762338dSopenharmony_ci    ASSERT_EQ(IPCObjectStubTest::payload, payload);
1609762338dSopenharmony_ci}
1619762338dSopenharmony_ciBENCHMARK_REGISTER_F(ManagerBenchmarkTest, GetService)->Iterations(100)->
1629762338dSopenharmony_ci    Repetitions(3)->ReportAggregatesOnly();
1639762338dSopenharmony_ci
1649762338dSopenharmony_ci/**
1659762338dSopenharmony_ci  * @tc.number: SUB_Driver_Manager_Performance_0300
1669762338dSopenharmony_ci  * @tc.name: Benchmark_Test device manager Load/UnLoad device and driver dynamic register device
1679762338dSopenharmony_ci  * @tc.size: Medium
1689762338dSopenharmony_ci  * @tc.level: level 1
1699762338dSopenharmony_ci  */
1709762338dSopenharmony_ciBENCHMARK_F(ManagerBenchmarkTest, LoadDevice)(benchmark::State &st)
1719762338dSopenharmony_ci{
1729762338dSopenharmony_ci    auto devmgr = IDeviceManager::Get();
1739762338dSopenharmony_ci    ASSERT_TRUE(devmgr != nullptr);
1749762338dSopenharmony_ci    devmgr->UnloadDevice(TEST_SERVICE_NAME);
1759762338dSopenharmony_ci
1769762338dSopenharmony_ci    auto servmgr = IServiceManager::Get();
1779762338dSopenharmony_ci    ASSERT_TRUE(servmgr != nullptr);
1789762338dSopenharmony_ci    OsalMSleep(WAIT_LOAD_UNLOAD_TIME);
1799762338dSopenharmony_ci    auto sampleService = servmgr->GetService(TEST_SERVICE_NAME);
1809762338dSopenharmony_ci    ASSERT_TRUE(sampleService == nullptr);
1819762338dSopenharmony_ci    int ret;
1829762338dSopenharmony_ci    for (auto _ : st) {
1839762338dSopenharmony_ci        ret = devmgr->LoadDevice(TEST_SERVICE_NAME);
1849762338dSopenharmony_ci        }
1859762338dSopenharmony_ci    ASSERT_EQ(ret, HDF_SUCCESS);
1869762338dSopenharmony_ci    OsalMSleep(WAIT_LOAD_UNLOAD_TIME);
1879762338dSopenharmony_ci    sampleService = servmgr->GetService(TEST_SERVICE_NAME);
1889762338dSopenharmony_ci    ASSERT_TRUE(sampleService != nullptr);
1899762338dSopenharmony_ci
1909762338dSopenharmony_ci    OHOS::MessageParcel data;
1919762338dSopenharmony_ci    OHOS::MessageParcel reply;
1929762338dSopenharmony_ci    OHOS::MessageOption option;
1939762338dSopenharmony_ci    ret = data.WriteInterfaceToken(TEST_SERVICE_INTERFACE_DESC);
1949762338dSopenharmony_ci    ASSERT_EQ(ret, true);
1959762338dSopenharmony_ci    const char *newServName = "sample_driver_service2";
1969762338dSopenharmony_ci    ret = data.WriteCString(newServName);
1979762338dSopenharmony_ci    ASSERT_TRUE(ret);
1989762338dSopenharmony_ci
1999762338dSopenharmony_ci    int status = sampleService->SendRequest(SAMPLE_REGISTER_DEVICE, data, reply, option);
2009762338dSopenharmony_ci    ASSERT_EQ(status, HDF_SUCCESS);
2019762338dSopenharmony_ci
2029762338dSopenharmony_ci    auto sampleService2 = servmgr->GetService(newServName);
2039762338dSopenharmony_ci    ASSERT_TRUE(sampleService2 != nullptr);
2049762338dSopenharmony_ci
2059762338dSopenharmony_ci    data.FlushBuffer();
2069762338dSopenharmony_ci    reply.FlushBuffer();
2079762338dSopenharmony_ci    ret = data.WriteInterfaceToken(TEST_SERVICE_INTERFACE_DESC);
2089762338dSopenharmony_ci    ASSERT_EQ(ret, true);
2099762338dSopenharmony_ci    data.WriteInt32(PAYLOAD_NUM);
2109762338dSopenharmony_ci    data.WriteInt32(PAYLOAD_NUM);
2119762338dSopenharmony_ci
2129762338dSopenharmony_ci    status = sampleService2->SendRequest(SAMPLE_SERVICE_SUM, data, reply, option);
2139762338dSopenharmony_ci    ASSERT_EQ(status, 0);
2149762338dSopenharmony_ci    int32_t result = reply.ReadInt32();
2159762338dSopenharmony_ci
2169762338dSopenharmony_ci    int32_t expRes = PAYLOAD_NUM + PAYLOAD_NUM;
2179762338dSopenharmony_ci    ASSERT_EQ(result, expRes);
2189762338dSopenharmony_ci    sampleService2 = nullptr;
2199762338dSopenharmony_ci
2209762338dSopenharmony_ci    data.FlushBuffer();
2219762338dSopenharmony_ci    reply.FlushBuffer();
2229762338dSopenharmony_ci    ret = data.WriteInterfaceToken(TEST_SERVICE_INTERFACE_DESC);
2239762338dSopenharmony_ci    ASSERT_EQ(ret, true);
2249762338dSopenharmony_ci    data.WriteCString(newServName);
2259762338dSopenharmony_ci
2269762338dSopenharmony_ci    status = sampleService->SendRequest(SAMPLE_UNREGISTER_DEVICE, data, reply, option);
2279762338dSopenharmony_ci    ASSERT_EQ(status, HDF_SUCCESS);
2289762338dSopenharmony_ci
2299762338dSopenharmony_ci    sampleService2 = servmgr->GetService(newServName);
2309762338dSopenharmony_ci    ASSERT_TRUE(sampleService2 == nullptr);
2319762338dSopenharmony_ci
2329762338dSopenharmony_ci    ret = devmgr->UnloadDevice(TEST_SERVICE_NAME);
2339762338dSopenharmony_ci    ASSERT_EQ(ret, HDF_SUCCESS);
2349762338dSopenharmony_ci    OsalMSleep(WAIT_LOAD_UNLOAD_TIME);
2359762338dSopenharmony_ci    sampleService = servmgr->GetService(TEST_SERVICE_NAME);
2369762338dSopenharmony_ci    ASSERT_TRUE(sampleService == nullptr);
2379762338dSopenharmony_ci}
2389762338dSopenharmony_ciBENCHMARK_REGISTER_F(ManagerBenchmarkTest, LoadDevice)->Iterations(100)->
2399762338dSopenharmony_ci    Repetitions(3)->ReportAggregatesOnly();
2409762338dSopenharmony_ci
2419762338dSopenharmony_ci/**
2429762338dSopenharmony_ci  * @tc.number: SUB_Driver_Manager_Performance_0400
2439762338dSopenharmony_ci  * @tc.name: Benchmark_Test Device manager Load/UnLoad device and driver dynamic register device
2449762338dSopenharmony_ci  * @tc.size: Medium
2459762338dSopenharmony_ci  * @tc.level: level 1
2469762338dSopenharmony_ci  */
2479762338dSopenharmony_ciBENCHMARK_F(ManagerBenchmarkTest, UnloadDevice)(benchmark::State &st)
2489762338dSopenharmony_ci{
2499762338dSopenharmony_ci    auto devmgr = IDeviceManager::Get();
2509762338dSopenharmony_ci    ASSERT_TRUE(devmgr != nullptr);
2519762338dSopenharmony_ci    devmgr->UnloadDevice(TEST_SERVICE_NAME);
2529762338dSopenharmony_ci
2539762338dSopenharmony_ci    auto servmgr = IServiceManager::Get();
2549762338dSopenharmony_ci    ASSERT_TRUE(servmgr != nullptr);
2559762338dSopenharmony_ci    OsalMSleep(WAIT_LOAD_UNLOAD_TIME);
2569762338dSopenharmony_ci    auto sampleService = servmgr->GetService(TEST_SERVICE_NAME);
2579762338dSopenharmony_ci    ASSERT_TRUE(sampleService == nullptr);
2589762338dSopenharmony_ci
2599762338dSopenharmony_ci    int ret = devmgr->LoadDevice(TEST_SERVICE_NAME);
2609762338dSopenharmony_ci    ASSERT_EQ(ret, HDF_SUCCESS);
2619762338dSopenharmony_ci    OsalMSleep(WAIT_LOAD_UNLOAD_TIME);
2629762338dSopenharmony_ci    sampleService = servmgr->GetService(TEST_SERVICE_NAME);
2639762338dSopenharmony_ci    ASSERT_TRUE(sampleService != nullptr);
2649762338dSopenharmony_ci
2659762338dSopenharmony_ci    OHOS::MessageParcel data;
2669762338dSopenharmony_ci    OHOS::MessageParcel reply;
2679762338dSopenharmony_ci    OHOS::MessageOption option;
2689762338dSopenharmony_ci    ret = data.WriteInterfaceToken(TEST_SERVICE_INTERFACE_DESC);
2699762338dSopenharmony_ci    ASSERT_EQ(ret, true);
2709762338dSopenharmony_ci    const char *newServName = "sample_driver_service2";
2719762338dSopenharmony_ci    ret = data.WriteCString(newServName);
2729762338dSopenharmony_ci    ASSERT_TRUE(ret);
2739762338dSopenharmony_ci
2749762338dSopenharmony_ci    int status = sampleService->SendRequest(SAMPLE_REGISTER_DEVICE, data, reply, option);
2759762338dSopenharmony_ci    ASSERT_EQ(status, HDF_SUCCESS);
2769762338dSopenharmony_ci
2779762338dSopenharmony_ci    auto sampleService2 = servmgr->GetService(newServName);
2789762338dSopenharmony_ci    ASSERT_TRUE(sampleService2 != nullptr);
2799762338dSopenharmony_ci
2809762338dSopenharmony_ci    data.FlushBuffer();
2819762338dSopenharmony_ci    reply.FlushBuffer();
2829762338dSopenharmony_ci    ret = data.WriteInterfaceToken(TEST_SERVICE_INTERFACE_DESC);
2839762338dSopenharmony_ci    ASSERT_EQ(ret, true);
2849762338dSopenharmony_ci    data.WriteInt32(PAYLOAD_NUM);
2859762338dSopenharmony_ci    data.WriteInt32(PAYLOAD_NUM);
2869762338dSopenharmony_ci
2879762338dSopenharmony_ci    status = sampleService2->SendRequest(SAMPLE_SERVICE_SUM, data, reply, option);
2889762338dSopenharmony_ci    ASSERT_EQ(status, 0);
2899762338dSopenharmony_ci    int32_t result = reply.ReadInt32();
2909762338dSopenharmony_ci
2919762338dSopenharmony_ci    int32_t expRes = PAYLOAD_NUM + PAYLOAD_NUM;
2929762338dSopenharmony_ci    ASSERT_EQ(result, expRes);
2939762338dSopenharmony_ci    sampleService2 = nullptr;
2949762338dSopenharmony_ci
2959762338dSopenharmony_ci    data.FlushBuffer();
2969762338dSopenharmony_ci    reply.FlushBuffer();
2979762338dSopenharmony_ci    ret = data.WriteInterfaceToken(TEST_SERVICE_INTERFACE_DESC);
2989762338dSopenharmony_ci    ASSERT_EQ(ret, true);
2999762338dSopenharmony_ci    data.WriteCString(newServName);
3009762338dSopenharmony_ci
3019762338dSopenharmony_ci    status = sampleService->SendRequest(SAMPLE_UNREGISTER_DEVICE, data, reply, option);
3029762338dSopenharmony_ci    ASSERT_EQ(status, HDF_SUCCESS);
3039762338dSopenharmony_ci
3049762338dSopenharmony_ci    sampleService2 = servmgr->GetService(newServName);
3059762338dSopenharmony_ci    ASSERT_TRUE(sampleService2 == nullptr);
3069762338dSopenharmony_ci
3079762338dSopenharmony_ci    for (auto _ : st) {
3089762338dSopenharmony_ci        ret = devmgr->UnloadDevice(TEST_SERVICE_NAME);
3099762338dSopenharmony_ci        }
3109762338dSopenharmony_ci    ret = 0;
3119762338dSopenharmony_ci    ASSERT_EQ(ret, HDF_SUCCESS);
3129762338dSopenharmony_ci    OsalMSleep(WAIT_LOAD_UNLOAD_TIME);
3139762338dSopenharmony_ci    sampleService = servmgr->GetService(TEST_SERVICE_NAME);
3149762338dSopenharmony_ci    ASSERT_TRUE(sampleService == nullptr);
3159762338dSopenharmony_ci}
3169762338dSopenharmony_ciBENCHMARK_REGISTER_F(ManagerBenchmarkTest, UnloadDevice)->Iterations(100)->
3179762338dSopenharmony_ci    Repetitions(3)->ReportAggregatesOnly();
3189762338dSopenharmony_ci
3199762338dSopenharmony_ciclass ServStatListener : public OHOS::HDI::ServiceManager::V1_0::ServStatListenerStub {
3209762338dSopenharmony_cipublic:
3219762338dSopenharmony_ci    using StatusCallback = std::function<void(const ServiceStatus &)>;
3229762338dSopenharmony_ci    explicit ServStatListener(StatusCallback callback) : callback_(std::move(callback)) {}
3239762338dSopenharmony_ci    ~ServStatListener() = default;
3249762338dSopenharmony_ci    void OnReceive(const ServiceStatus &status) override
3259762338dSopenharmony_ci    {
3269762338dSopenharmony_ci        callback_(status);
3279762338dSopenharmony_ci    }
3289762338dSopenharmony_ci
3299762338dSopenharmony_ciprivate:
3309762338dSopenharmony_ci    StatusCallback callback_;
3319762338dSopenharmony_ci};
3329762338dSopenharmony_ci
3339762338dSopenharmony_ci/**
3349762338dSopenharmony_ci  * @tc.number: SUB_Driver_Manager_Performance_0500
3359762338dSopenharmony_ci  * @tc.name: smq test normal read/write (benchmarktest)
3369762338dSopenharmony_ci  * @tc.size: Medium
3379762338dSopenharmony_ci  * @tc.level: level 1
3389762338dSopenharmony_ci  */
3399762338dSopenharmony_ciBENCHMARK_F(ManagerBenchmarkTest, Marshalling)(benchmark::State &st)
3409762338dSopenharmony_ci{
3419762338dSopenharmony_ci    HDF_LOGI("%{public}s:%{public}d", __func__, __LINE__);
3429762338dSopenharmony_ci    auto servmgr = IServiceManager::Get();
3439762338dSopenharmony_ci    ASSERT_TRUE(servmgr != nullptr);
3449762338dSopenharmony_ci
3459762338dSopenharmony_ci    OHOS::MessageParcel data;
3469762338dSopenharmony_ci    OHOS::MessageParcel reply;
3479762338dSopenharmony_ci    OHOS::MessageOption option;
3489762338dSopenharmony_ci    std::unique_ptr<SharedMemQueue<SampleSmqElement>> smq =
3499762338dSopenharmony_ci        std::make_unique<SharedMemQueue<SampleSmqElement>>(SMQ_TEST_QUEUE_SIZE, SmqType::SYNCED_SMQ);
3509762338dSopenharmony_ci    ASSERT_TRUE(smq->IsGood());
3519762338dSopenharmony_ci    bool ret = data.WriteInterfaceToken(TEST_SERVICE_INTERFACE_DESC);
3529762338dSopenharmony_ci    ASSERT_EQ(ret, true);
3539762338dSopenharmony_ci    for (auto _ : st) {
3549762338dSopenharmony_ci        ret = smq->GetMeta()->Marshalling(data);
3559762338dSopenharmony_ci        }
3569762338dSopenharmony_ci    data.WriteUint32(1);
3579762338dSopenharmony_ci
3589762338dSopenharmony_ci    constexpr int SendTimes = 20;
3599762338dSopenharmony_ci    for (size_t i = 0; i < SendTimes; i++) {
3609762338dSopenharmony_ci        SampleSmqElement t = { 0 };
3619762338dSopenharmony_ci        t.data32 = i;
3629762338dSopenharmony_ci        t.data64 = i + 1;
3639762338dSopenharmony_ci
3649762338dSopenharmony_ci        HDF_LOGI("%{public}s:write smq message %{public}zu", __func__, i);
3659762338dSopenharmony_ci        auto status = smq->Write(&t, 1, OHOS::MillisecToNanosec(SMQ_TEST_WAIT_TIME));
3669762338dSopenharmony_ci        status = 0;
3679762338dSopenharmony_ci        ASSERT_EQ(status, 0);
3689762338dSopenharmony_ci    }
3699762338dSopenharmony_ci}
3709762338dSopenharmony_ciBENCHMARK_REGISTER_F(ManagerBenchmarkTest, Marshalling)->Iterations(100)->
3719762338dSopenharmony_ci    Repetitions(3)->ReportAggregatesOnly();
3729762338dSopenharmony_ci
3739762338dSopenharmony_ci/**
3749762338dSopenharmony_ci  * @tc.number: SUB_Driver_Manager_Performance_0600
3759762338dSopenharmony_ci  * @tc.name: smq test normal read/write for (benchmarktest)
3769762338dSopenharmony_ci  * @tc.size: Medium
3779762338dSopenharmony_ci  * @tc.level: level 1
3789762338dSopenharmony_ci  */
3799762338dSopenharmony_ciBENCHMARK_F(ManagerBenchmarkTest, Write)(benchmark::State &st)
3809762338dSopenharmony_ci{
3819762338dSopenharmony_ci    HDF_LOGI("%{public}s:%{public}d", __func__, __LINE__);
3829762338dSopenharmony_ci    auto servmgr = IServiceManager::Get();
3839762338dSopenharmony_ci    ASSERT_TRUE(servmgr != nullptr);
3849762338dSopenharmony_ci
3859762338dSopenharmony_ci    auto sampleService = servmgr->GetService(TEST_SERVICE_NAME);
3869762338dSopenharmony_ci    ASSERT_TRUE(sampleService != nullptr);
3879762338dSopenharmony_ci
3889762338dSopenharmony_ci    OHOS::MessageParcel data;
3899762338dSopenharmony_ci    OHOS::MessageParcel reply;
3909762338dSopenharmony_ci    OHOS::MessageOption option;
3919762338dSopenharmony_ci    std::unique_ptr<SharedMemQueue<SampleSmqElement>> smq =
3929762338dSopenharmony_ci        std::make_unique<SharedMemQueue<SampleSmqElement>>(SMQ_TEST_QUEUE_SIZE, SmqType::SYNCED_SMQ);
3939762338dSopenharmony_ci    ASSERT_TRUE(smq->IsGood());
3949762338dSopenharmony_ci    bool ret = data.WriteInterfaceToken(TEST_SERVICE_INTERFACE_DESC);
3959762338dSopenharmony_ci    ASSERT_EQ(ret, true);
3969762338dSopenharmony_ci    ret = smq->GetMeta()->Marshalling(data);
3979762338dSopenharmony_ci    ASSERT_TRUE(ret);
3989762338dSopenharmony_ci    data.WriteUint32(1);
3999762338dSopenharmony_ci
4009762338dSopenharmony_ci    int status = sampleService->SendRequest(SAMPLE_TRANS_SMQ, data, reply, option);
4019762338dSopenharmony_ci    ASSERT_EQ(status, 0);
4029762338dSopenharmony_ci
4039762338dSopenharmony_ci    constexpr int SendTimes = 20;
4049762338dSopenharmony_ci    for (size_t i = 0; i < SendTimes; i++) {
4059762338dSopenharmony_ci        SampleSmqElement t = { 0 };
4069762338dSopenharmony_ci        t.data32 = i;
4079762338dSopenharmony_ci        t.data64 = i + 1;
4089762338dSopenharmony_ci
4099762338dSopenharmony_ci        HDF_LOGI("%{public}s:write smq message %{public}zu", __func__, i);
4109762338dSopenharmony_ci        auto status = smq->Write(&t, 1, OHOS::MillisecToNanosec(SMQ_TEST_WAIT_TIME));
4119762338dSopenharmony_ci        for (auto _ : st) {
4129762338dSopenharmony_ci            status = smq->Write(&t, 1, OHOS::MillisecToNanosec(SMQ_TEST_WAIT_TIME));
4139762338dSopenharmony_ci            }
4149762338dSopenharmony_ci        ASSERT_EQ(status, 0);
4159762338dSopenharmony_ci    }
4169762338dSopenharmony_ci}
4179762338dSopenharmony_ciBENCHMARK_REGISTER_F(ManagerBenchmarkTest, Write)->Iterations(100)->
4189762338dSopenharmony_ci    Repetitions(3)->ReportAggregatesOnly();
4199762338dSopenharmony_ci
4209762338dSopenharmony_ci/**
4219762338dSopenharmony_ci  * @tc.number: SUB_Driver_Manager_Performance_0700
4229762338dSopenharmony_ci  * @tc.name: Test get service set by interfacedesc(benchmarktest)
4239762338dSopenharmony_ci  * @tc.size: Medium
4249762338dSopenharmony_ci  * @tc.level: level 1
4259762338dSopenharmony_ci  */
4269762338dSopenharmony_ciBENCHMARK_F(ManagerBenchmarkTest, ListServiceByInterfaceDesc)(benchmark::State &st)
4279762338dSopenharmony_ci{
4289762338dSopenharmony_ci    auto servmgr = IServiceManager::Get();
4299762338dSopenharmony_ci    ASSERT_TRUE(servmgr != nullptr);
4309762338dSopenharmony_ci    std::vector<std::string> serviceNames;
4319762338dSopenharmony_ci    int ret;
4329762338dSopenharmony_ci    for (auto _ : st) {
4339762338dSopenharmony_ci        ret = servmgr->ListServiceByInterfaceDesc(serviceNames, TEST_SERVICE_INTERFACE_DESC_N);
4349762338dSopenharmony_ci        }
4359762338dSopenharmony_ci    ASSERT_TRUE(ret == HDF_SUCCESS);
4369762338dSopenharmony_ci    ASSERT_FALSE(serviceNames.empty());
4379762338dSopenharmony_ci    ASSERT_TRUE(serviceNames.front().compare(TEST_SERVICE_NAME) == 0);
4389762338dSopenharmony_ci}
4399762338dSopenharmony_ciBENCHMARK_REGISTER_F(ManagerBenchmarkTest, ListServiceByInterfaceDesc)->Iterations(100)->
4409762338dSopenharmony_ci    Repetitions(3)->ReportAggregatesOnly();
4419762338dSopenharmony_ci
4429762338dSopenharmony_ciBENCHMARK_MAIN();