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();