From b271fd48dc27a97024e2de3224a10d523eff618a Mon Sep 17 00:00:00 2001 From: "taemin.yeom" Date: Mon, 14 Jun 2021 16:32:46 +0900 Subject: [PATCH] Add a test verifying range of sensor Change-Id: I80c77778e9c0263498c1aedd8f8aac52d4f41046 Signed-off-by: taemin.yeom --- CMakeLists.txt | 4 +- packaging/capi-system-sensor.spec | 13 ++ test/CMakeLists.txt | 22 +++ test/main.c | 245 ++++++++++++++++++++++++++++++ 4 files changed, 283 insertions(+), 1 deletion(-) create mode 100644 test/CMakeLists.txt create mode 100644 test/main.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 1664239..6cd4d80 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,7 @@ ENDFOREACH(flag) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fPIC -Wall -Werror -g -fdump-rtl-expand") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} -std=c++0x") SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g") -SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -Wl, --rpath=${LIB_INSTALL_DIR}") +SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -Wl,--rpath=${LIB_INSTALL_DIR}") # Internal Logging Option #ADD_DEFINITIONS("-DTIZEN_DEBUG") @@ -56,3 +56,5 @@ CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME} INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) INSTALL(FILES include/sensor.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor) INSTALL(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) + +ADD_SUBDIRECTORY(test) \ No newline at end of file diff --git a/packaging/capi-system-sensor.spec b/packaging/capi-system-sensor.spec index 9850c5f..48e50ed 100644 --- a/packaging/capi-system-sensor.spec +++ b/packaging/capi-system-sensor.spec @@ -40,6 +40,14 @@ Requires: %{name} = %{version}-%{release} A Sensor library in TIZEN C API package (Development). %devel_desc +%package test +Summary: Tizen Sensor Test Programs (test) +Group: System & System Tools/Testing +Requires: %{name} = %{version}-%{release} + +%description test +Tizen Sensor Test Programs (test) + %if 0%{?gcov:1} %package gcov Summary: Tizen Sensor Library API (gcov) @@ -92,6 +100,11 @@ install -m 0644 gcov-obj/* %{buildroot}%{_datadir}/gcov/obj %{_includedir}/sensor/*.h %{_libdir}/libcapi-system-sensor.so +%files test +%manifest packaging/capi-system-sensor.manifest +%defattr(-,root,root,-) +%{_bindir}/sensor-stresstests + %if 0%{?gcov:1} %files gcov %{_datadir}/gcov/obj/* diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 0000000..8cf32be --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,22 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(sensor-stresstests C) + +SET(PKG_MODULES + glib-2.0) + +INCLUDE(FindPkgConfig) +PKG_CHECK_MODULES(PKGS REQUIRED ${PKG_MODULES}) + +INCLUDE_DIRECTORIES(${PKGS_INCLUDE_DIRS}) +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) + +FOREACH(flag ${PKGS_CFLAGS}) + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}") +ENDFOREACH(flag) + +# Installing files +FILE(GLOB_RECURSE SRCS main.c) +ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE C) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PKGS_LDFLAGS} capi-system-sensor) +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR}) diff --git a/test/main.c b/test/main.c new file mode 100644 index 0000000..ca498c8 --- /dev/null +++ b/test/main.c @@ -0,0 +1,245 @@ +#define SENSOR_NUM 27 +#define TEST_COUNT 1000 +#define PASS 90 + +#include +#include + +const sensor_type_e sensor_type[] = +{ + SENSOR_ACCELEROMETER, + SENSOR_GRAVITY, + SENSOR_LINEAR_ACCELERATION, + SENSOR_MAGNETIC, + SENSOR_ROTATION_VECTOR, + SENSOR_ORIENTATION, + SENSOR_GYROSCOPE, + SENSOR_LIGHT, + SENSOR_PROXIMITY, + SENSOR_PRESSURE, + SENSOR_ULTRAVIOLET, + SENSOR_TEMPERATURE, + SENSOR_HUMIDITY, + SENSOR_HRM, + SENSOR_HRM_LED_GREEN, + SENSOR_HRM_LED_IR, + SENSOR_HRM_LED_RED, + SENSOR_GYROSCOPE_UNCALIBRATED, + SENSOR_GEOMAGNETIC_UNCALIBRATED, + SENSOR_GYROSCOPE_ROTATION_VECTOR, + SENSOR_GEOMAGNETIC_ROTATION_VECTOR, + SENSOR_SIGNIFICANT_MOTION, + SENSOR_HRM_BATCH, + SENSOR_HRM_LED_GREEN_BATCH, + SENSOR_HUMAN_PEDOMETER, + SENSOR_HUMAN_SLEEP_MONITOR, + SENSOR_HUMAN_SLEEP_DETECTOR +}; + +const char *sensor_name[] = { + "Accelerometer", + "Gravity sensor", + "Linear acceleration sensor", + "Magnetic sensor", + "Rotation vector sensor", + "Orientation sensor", + "Gyroscope", + "Light sensor", + "Proximity sensor", + "Pressure sensor", + "Ultraviolet sensor", + "Temperature sensor", + "Humidity sensor", + "Heart-rate monitor", + "Green LED sensor of HRM", + "Infra-Red LED sensor of HRM", + "Red LED sensor of HRM", + "Uncalibrated Gyroscope sensor", + "Uncalibrated Geomagnetic sensor", + "Gyroscope-based rotation vector sensor", + "Geomagnetic-based rotation vector sensor", + "Significant motion sensor", + "Heart-rate monitor batch sensor", + "Green LED of HRM batch sensor", + "Pedometer", + "Sleep monitor", + "Sleep detector" +}; + +// the number of value to be verified of the sensor +const int value_num[] = {3, 3, 3, 3, 4, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 6, 4, 4, 1, 1, 1, 3, 1}; + +GMainLoop *loop; +bool turned_on[SENSOR_NUM]; +int min_range[SENSOR_NUM]; +int max_range[SENSOR_NUM]; +int called_num[SENSOR_NUM]; +int miss[SENSOR_NUM]; +int callback_count; +bool running; + +void sensor_callback(sensor_h sensor, sensor_event_s events[], int events_count, void *user_data) +{ + const char *name; + sensor_type_e type; + sensor_get_type(sensor, &type); + int num = 0; + bool missed; + + ++callback_count; + + for (int i = 0; i < SENSOR_NUM; ++i){ + if (sensor_type[i] == type){ + name = sensor_name[i]; + num = i; + break; + } + } + + for (int i = 0; i < events_count; ++i) { + missed = false; + ++called_num[num]; + + int value_count; + if (events[i].value_count < value_num[num]) + value_count = events[i].value_count; + else + value_count = value_num[num]; + + for (int j = 0; j < value_count; ++j) { + if (events[i].values[j] < min_range[num] || events[i].values[j] > max_range[num]) { + missed = true; + } + } + + if(missed) + ++miss[num]; + } + + if (running && callback_count >= TEST_COUNT) { + g_print("done.\n"); + running = false; + g_main_loop_quit(loop); + } + + else if (callback_count == TEST_COUNT / 10 * 2) { + g_print("20%%... "); + } + + else if (callback_count == TEST_COUNT / 10 * 4) { + g_print("40%%... "); + } + + else if (callback_count == TEST_COUNT / 10 * 6) { + g_print("60%%... "); + } + + else if (callback_count == TEST_COUNT / 10 * 8) { + g_print("80%%... "); + } +} + +int create_sensor_listener(int num, sensor_h *sensor, sensor_listener_h *listener) +{ + bool supported; + int ret; + float min, max; + const char *name = sensor_name[num]; + sensor_type_e type = sensor_type[num]; + + sensor_is_supported(type, &supported); + if(!supported) { + return -1; + } + + sensor_get_default_sensor(type, sensor); + + sensor_create_listener(*sensor, listener); + sensor_listener_set_events_cb(*listener, sensor_callback, NULL); + sensor_listener_set_option(*listener, SENSOR_OPTION_ALWAYS_ON); + sensor_listener_set_interval(*listener, 100); + + sensor_get_min_range(*sensor, &min); + sensor_get_max_range(*sensor, &max); + min_range[num] = min; + max_range[num] = max; + + g_print("%s : %f ~ %f\n", name, min, max); + + ret = sensor_listener_start(*listener); + if (ret < 0) { + g_print("%s error in listnener_start : %d\n", name, ret); + return ret; + } + + return 0; +} + +int main() +{ + g_print("====================\n"); + g_print("sensor stress test\n"); + g_print("====================\n"); + + sensor_h sensor[29]; + sensor_listener_h listener[29]; + + for (int i = 0; i < SENSOR_NUM; ++i) { + called_num[i] = 0; + miss[i] = 0; + if (create_sensor_listener(i, &sensor[i], &listener[i])) + turned_on[i] = false; + else + turned_on[i] = true; + } + + + g_print("testing... "); + + running = true; + loop = g_main_loop_new(NULL, FALSE); + g_main_loop_run(loop); + + g_print("====================\n"); + g_print("test result\n"); + g_print("====================\n"); + + int total_miss = 0; + double rate = 0; + for (int i = 0; i < SENSOR_NUM; ++i) { + if (turned_on[i]) { + if (called_num[i]) { + rate = (double) (called_num[i] - miss[i]) / called_num[i] * 100; + g_print("%s : %d / %d \n", sensor_name[i], called_num[i] - miss[i], called_num[i]); + + if (rate >= PASS) + g_print("PASS %.2lf%%\n", rate); + else + g_print("FAIL %.2lf%%\n", rate); + } + else { + g_print("%s value change was not occurred.\n", sensor_name[i]); + } + } + total_miss += miss[i]; + } + + g_print("total : %d / %d \n", callback_count - total_miss, callback_count); + rate = (double) (callback_count - total_miss) / callback_count * 100; + if (rate >= PASS) + g_print("PASS %.2lf%%\n", rate); + else + g_print("FAIL %.2lf%%\n", rate); + + g_print("====================\n"); + g_print("Not supported sensors list\n"); + g_print("====================\n"); + + for (int i = 0; i < SENSOR_NUM; ++i) { + if (turned_on[i] == false) + g_print("%s\n", sensor_name[i]); + } + + return 0; +} + -- 2.34.1