1/* 2 * Copyright (c) 2022-2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include <benchmark/benchmark.h> 17#include <cmath> 18#include <cstdio> 19#include <gtest/gtest.h> 20#include <securec.h> 21#include <string> 22#include <unistd.h> 23#include <vector> 24#include "hdf_base.h" 25#include "osal_time.h" 26#include "sensor_callback_impl.h" 27#include "sensor_type.h" 28#include "sensor_uhdf_log.h" 29#include "v2_0/isensor_interface.h" 30 31using namespace OHOS::HDI::Sensor::V2_0; 32using namespace testing::ext; 33using namespace std; 34 35namespace { 36 sptr<ISensorInterface> g_sensorInterface = nullptr; 37 sptr<ISensorCallback> g_traditionalCallback = new SensorCallbackImpl(); 38 sptr<ISensorCallback> g_medicalCallback = new SensorCallbackImpl(); 39 std::vector<HdfSensorInformation> g_info; 40 41 constexpr int32_t ITERATION_FREQUENCY = 100; 42 constexpr int32_t REPETITION_FREQUENCY = 3; 43 constexpr int32_t SENSOR_INTERVAL1 = 20; 44 constexpr int32_t SENSOR_INTERVAL2 = 2; 45 constexpr int32_t SENSOR_POLL_TIME = 3; 46 constexpr int32_t SENSOR_WAIT_TIME = 10; 47 constexpr uint32_t OPTION = 0; 48 constexpr uint32_t SENSOR_DATA_FLAG = 1; 49 50class SensorBenchmarkTest : public benchmark::Fixture { 51public: 52 void SetUp(const ::benchmark::State &state); 53 void TearDown(const ::benchmark::State &state); 54}; 55 56void SensorBenchmarkTest::SetUp(const ::benchmark::State &state) 57{ 58 g_sensorInterface = ISensorInterface::Get(); 59} 60 61void SensorBenchmarkTest::TearDown(const ::benchmark::State &state) 62{ 63} 64 65/** 66 * @tc.name: DriverSystem_SensorBenchmark_GetAllSensorInfo 67 * @tc.desc: Benchmarktest for interface GetAllSensorInfo 68 * Obtains information about all sensors in the system 69 * @tc.type: FUNC 70 */ 71BENCHMARK_F(SensorBenchmarkTest, GetAllSensorInfo)(benchmark::State &state) 72{ 73 ASSERT_NE(nullptr, g_sensorInterface); 74 75 int32_t ret; 76 77 for (auto _ : state) { 78 ret = g_sensorInterface->GetAllSensorInfo(g_info); 79 EXPECT_EQ(SENSOR_SUCCESS, ret); 80 } 81} 82 83BENCHMARK_REGISTER_F(SensorBenchmarkTest, GetAllSensorInfo)-> 84 Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly(); 85 86/** 87 * @tc.name: DriverSystem_SensorBenchmark_register 88 * @tc.desc: Benchmarktest for interface register 89 * Returns 0 if the callback is successfully registered; returns a negative value otherwise 90 * @tc.type: FUNC 91 */ 92BENCHMARK_F(SensorBenchmarkTest, register)(benchmark::State &state) 93{ 94 ASSERT_NE(nullptr, g_sensorInterface); 95 96 int32_t ret; 97 98 for (auto _ : state) { 99 ret = g_sensorInterface->Register(TRADITIONAL_SENSOR_TYPE, g_traditionalCallback); 100 EXPECT_EQ(SENSOR_SUCCESS, ret); 101 } 102 ret = g_sensorInterface->Unregister(TRADITIONAL_SENSOR_TYPE, g_traditionalCallback); 103 EXPECT_EQ(SENSOR_SUCCESS, ret); 104} 105 106BENCHMARK_REGISTER_F(SensorBenchmarkTest, register)-> 107 Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly(); 108 109/** 110 * @tc.name: DriverSystem_SensorBenchmark_Unregister 111 * @tc.desc: Benchmarktest for interface Unregister 112 * Returns 0 if the callback is successfully registered; returns a negative value otherwise 113 * @tc.type: FUNC 114 */ 115BENCHMARK_F(SensorBenchmarkTest, Unregister)(benchmark::State &state) 116{ 117 ASSERT_NE(nullptr, g_sensorInterface); 118 119 int32_t ret; 120 121 for (auto _ : state) { 122 ret = g_sensorInterface->Register(TRADITIONAL_SENSOR_TYPE, g_traditionalCallback); 123 OsalMSleep(SENSOR_POLL_TIME); 124 EXPECT_EQ(SENSOR_SUCCESS, ret); 125 ret = g_sensorInterface->Unregister(TRADITIONAL_SENSOR_TYPE, g_traditionalCallback); 126 OsalMSleep(SENSOR_POLL_TIME); 127 EXPECT_EQ(SENSOR_SUCCESS, ret); 128 } 129} 130 131BENCHMARK_REGISTER_F(SensorBenchmarkTest, Unregister)-> 132 Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly(); 133 134/** 135 * @tc.name: DriverSystem_SensorBenchmark_Enable 136 * @tc.desc: Benchmarktest for interface Enable 137 * Enables the sensor unavailable in the sensor list based on the specified sensor ID 138 * @tc.type: FUNC 139 */ 140BENCHMARK_F(SensorBenchmarkTest, Enable)(benchmark::State &state) 141{ 142 ASSERT_NE(nullptr, g_sensorInterface); 143 144 int32_t ret; 145 146 ret = g_sensorInterface->Register(TRADITIONAL_SENSOR_TYPE, g_traditionalCallback); 147 EXPECT_EQ(SENSOR_SUCCESS, ret); 148 149 EXPECT_GT(g_info.size(), 0); 150 151 for (auto iter : g_info) { 152 HDF_LOGI("get sensoriId[%{public}d], info name[%{public}s], power[%{public}f]\n\r", 153 iter.sensorId, iter.sensorName.c_str(), iter.power); 154 ret = g_sensorInterface->SetBatch(iter.sensorId, SENSOR_INTERVAL1, SENSOR_POLL_TIME); 155 EXPECT_EQ(SENSOR_SUCCESS, ret); 156 for (auto _ : state) { 157 ret = g_sensorInterface->Enable(iter.sensorId); 158 EXPECT_EQ(SENSOR_SUCCESS, ret); 159 } 160 OsalMSleep(SENSOR_POLL_TIME); 161 ret = g_sensorInterface->Disable(iter.sensorId); 162 EXPECT_EQ(SENSOR_SUCCESS, ret); 163 } 164 ret = g_sensorInterface->Unregister(TRADITIONAL_SENSOR_TYPE, g_traditionalCallback); 165 EXPECT_EQ(SensorCallbackImpl::sensorDataFlag, SENSOR_DATA_FLAG); 166 SensorCallbackImpl::sensorDataFlag = SENSOR_DATA_FLAG; 167} 168 169BENCHMARK_REGISTER_F(SensorBenchmarkTest, Enable)-> 170 Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly(); 171 172/** 173 * @tc.name: DriverSystem_SensorBenchmark_Disable 174 * @tc.desc: Benchmarktest for interface Disable 175 * Enables the sensor unavailable in the sensor list based on the specified sensor ID 176 * @tc.type: FUNC 177 */ 178BENCHMARK_F(SensorBenchmarkTest, Disable)(benchmark::State &state) 179{ 180 ASSERT_NE(nullptr, g_sensorInterface); 181 182 int32_t ret; 183 184 ret = g_sensorInterface->Register(TRADITIONAL_SENSOR_TYPE, g_traditionalCallback); 185 EXPECT_EQ(SENSOR_SUCCESS, ret); 186 EXPECT_GT(g_info.size(), 0); 187 188 for (auto iter : g_info) { 189 HDF_LOGI("get sensoriId[%{public}d], info name[%{public}s], power[%{public}f]\n\r", 190 iter.sensorId, iter.sensorName.c_str(), iter.power); 191 ret = g_sensorInterface->SetBatch(iter.sensorId, SENSOR_INTERVAL1, SENSOR_POLL_TIME); 192 EXPECT_EQ(SENSOR_SUCCESS, ret); 193 ret = g_sensorInterface->Enable(iter.sensorId); 194 EXPECT_EQ(SENSOR_SUCCESS, ret); 195 OsalMSleep(SENSOR_POLL_TIME); 196 for (auto _ : state) { 197 ret = g_sensorInterface->Disable(iter.sensorId); 198 EXPECT_EQ(SENSOR_SUCCESS, ret); 199 } 200 } 201 ret = g_sensorInterface->Unregister(TRADITIONAL_SENSOR_TYPE, g_traditionalCallback); 202 EXPECT_EQ(SensorCallbackImpl::sensorDataFlag, SENSOR_DATA_FLAG); 203 SensorCallbackImpl::sensorDataFlag = SENSOR_DATA_FLAG; 204} 205 206BENCHMARK_REGISTER_F(SensorBenchmarkTest, Disable)-> 207 Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly(); 208 209/** 210 * @tc.name: DriverSystem_SensorBenchmark_SetBatch 211 * @tc.desc: Benchmarktest for interface SetBatch 212 * Sets the sampling time and data report interval for sensors in batches 213 * @tc.type: FUNC 214 */ 215BENCHMARK_F(SensorBenchmarkTest, SetBatch)(benchmark::State &state) 216{ 217 ASSERT_NE(nullptr, g_sensorInterface); 218 219 int32_t ret; 220 221 ret = g_sensorInterface->Register(TRADITIONAL_SENSOR_TYPE, g_traditionalCallback); 222 EXPECT_EQ(SENSOR_SUCCESS, ret); 223 224 EXPECT_GT(g_info.size(), 0); 225 for (auto iter : g_info) { 226 HDF_LOGI("get sensoriId[%{public}d], info name[%{public}s], power[%{public}f]\n\r", 227 iter.sensorId, iter.sensorName.c_str(), iter.power); 228 for (auto _ : state) { 229 ret = g_sensorInterface->SetBatch(iter.sensorId, SENSOR_INTERVAL2, SENSOR_POLL_TIME); 230 EXPECT_EQ(SENSOR_SUCCESS, ret); 231 } 232 ret = g_sensorInterface->Enable(iter.sensorId); 233 EXPECT_EQ(SENSOR_SUCCESS, ret); 234 OsalMSleep(SENSOR_WAIT_TIME); 235 ret = g_sensorInterface->Disable(iter.sensorId); 236 EXPECT_EQ(SENSOR_SUCCESS, ret); 237 } 238 ret = g_sensorInterface->Unregister(TRADITIONAL_SENSOR_TYPE, g_traditionalCallback); 239 EXPECT_EQ(SENSOR_SUCCESS, ret); 240 EXPECT_EQ(SensorCallbackImpl::sensorDataFlag, SENSOR_DATA_FLAG); 241 SensorCallbackImpl::sensorDataFlag = SENSOR_DATA_FLAG; 242} 243 244BENCHMARK_REGISTER_F(SensorBenchmarkTest, SetBatch)-> 245 Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly(); 246 247/** 248 * @tc.name: DriverSystem_SensorBenchmark_SetMode 249 * @tc.desc: Benchmarktest for interface SetMode 250 * Sets the data reporting mode for the specified sensor 251 * @tc.type: FUNC 252 */ 253BENCHMARK_F(SensorBenchmarkTest, SetMode)(benchmark::State &state) 254{ 255 ASSERT_NE(nullptr, g_sensorInterface); 256 EXPECT_GT(g_info.size(), 0); 257 258 int32_t ret; 259 EXPECT_GT(g_info.size(), 0); 260 for (auto iter : g_info) { 261 HDF_LOGI("get sensoriId[%{public}d], info name[%{public}s], power[%{public}f]\n\r", 262 iter.sensorId, iter.sensorName.c_str(), iter.power); 263 ret = g_sensorInterface->SetBatch(iter.sensorId, SENSOR_INTERVAL1, SENSOR_POLL_TIME); 264 EXPECT_EQ(SENSOR_SUCCESS, ret); 265 for (auto _ : state) { 266 if (SENSOR_TYPE_HALL == 0) { 267 ret = g_sensorInterface->SetMode(iter.sensorId, SENSOR_MODE_ON_CHANGE); 268 } else { 269 ret = g_sensorInterface->SetMode(iter.sensorId, SENSOR_MODE_REALTIME); 270 } 271 EXPECT_EQ(SENSOR_SUCCESS, ret); 272 } 273 ret = g_sensorInterface->Enable(iter.sensorId); 274 EXPECT_EQ(SENSOR_SUCCESS, ret); 275 OsalMSleep(SENSOR_WAIT_TIME); 276 ret = g_sensorInterface->Disable(iter.sensorId); 277 EXPECT_EQ(SENSOR_SUCCESS, ret); 278 } 279} 280 281BENCHMARK_REGISTER_F(SensorBenchmarkTest, SetMode)-> 282 Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly(); 283 284/** 285 * @tc.name: DriverSystem_SensorBenchmark_SetOption 286 * @tc.desc: Benchmarktest for interface SetOption 287 * Sets options for the specified sensor, including its measurement range and accuracy 288 * @tc.type: FUNC 289 */ 290BENCHMARK_F(SensorBenchmarkTest, SetOption)(benchmark::State &state) 291{ 292 ASSERT_NE(nullptr, g_sensorInterface); 293 EXPECT_GT(g_info.size(), 0); 294 295 int32_t ret; 296 EXPECT_GT(g_info.size(), 0); 297 for (auto iter : g_info) { 298 HDF_LOGI("get sensoriId[%{public}d], info name[%{public}s], power[%{public}f]\n\r", 299 iter.sensorId, iter.sensorName.c_str(), iter.power); 300 for (auto _ : state) { 301 ret = g_sensorInterface->SetOption(iter.sensorId, OPTION); 302 EXPECT_EQ(SENSOR_SUCCESS, ret); 303 } 304 } 305} 306 307BENCHMARK_REGISTER_F(SensorBenchmarkTest, SetOption)-> 308 Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly(); 309} 310 311BENCHMARK_MAIN(); 312