--- /dev/null
+#define SENSOR_NUM 27
+#define TEST_COUNT 1000
+#define PASS 90
+
+#include <glib.h>
+#include <sensor.h>
+
+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;
+}
+