Implement sensord_get_data_list
[platform/core/system/sensord.git] / src / sensorctl / testcase / sensor_listener.cpp
1 /*
2  * sensorctl
3  *
4  * Copyright (c) 2017 Samsung Electronics Co., Ltd.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19
20 #include <unistd.h>
21 #include <string.h>
22 #include <sensor_internal.h>
23 #include <sensor_utils.h>
24
25 #include <client/sensor_manager.h>
26 #include <client/sensor_listener.h>
27
28 #include "log.h"
29 #include "mainloop.h"
30 #include "test_bench.h"
31
32 static bool called = false;
33 static int count = 0;
34
35 static void event_cb(sensor_t sensor, unsigned int event_type, sensor_data_t *data, void *user_data)
36 {
37         _I("[%llu] %f %f %f\n", data->timestamp, data->values[0], data->values[1], data->values[2]);
38
39         if (count++ > 3)
40                 mainloop::stop();
41 }
42
43 TESTCASE(sensor_listener, get_default_sensor_p_1)
44 {
45         int err;
46         sensor_t sensor;
47
48         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
49         ASSERT_EQ(err, 0);
50
51         return true;
52 }
53
54 TESTCASE(sensor_listener, get_sensors_p_1)
55 {
56         int err;
57         int count;
58         sensor_t *sensors;
59
60         err = sensord_get_sensors(ACCELEROMETER_SENSOR, &sensors, &count);
61         ASSERT_EQ(err, 0);
62         ASSERT_GT(count, 0);
63
64         free(sensors);
65
66         return true;
67 }
68
69 TESTCASE(sensor_listener, connect_p_1)
70 {
71         int err;
72         int handle;
73         sensor_t sensor;
74
75         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
76         ASSERT_EQ(err, 0);
77
78         handle = sensord_connect(sensor);
79         ASSERT_GT(handle, 0);
80
81         err = sensord_disconnect(handle);
82         ASSERT_EQ(err, 1);
83
84         return true;
85 }
86
87 TESTCASE(sensor_listener, all_api_p_1)
88 {
89         int err;
90         bool ret;
91         int handle;
92         sensor_t sensor;
93         sensor_t *list;
94         int count;
95
96         called = false;
97
98         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
99         ASSERT_EQ(err, 0);
100
101         err = sensord_get_sensors(ALL_SENSOR, &list, &count);
102         ASSERT_EQ(err, 0);
103
104         handle = sensord_connect(sensor);
105         ASSERT_EQ(err, 0);
106
107         ret = sensord_register_event(handle, 1, 100, 100, event_cb, NULL);
108         ASSERT_TRUE(ret);
109
110         ret = sensord_start(handle, 0);
111         ASSERT_TRUE(ret);
112
113         ret = sensord_change_event_interval(handle, 0, 100);
114         ASSERT_TRUE(ret);
115
116         ret = sensord_change_event_max_batch_latency(handle, 0, 100);
117         ASSERT_TRUE(ret);
118
119         mainloop::run();
120
121         ret = sensord_stop(handle);
122         ASSERT_TRUE(ret);
123
124         ret = sensord_unregister_event(handle, 1);
125         ASSERT_TRUE(ret);
126
127         ret = sensord_disconnect(handle);
128         ASSERT_TRUE(ret);
129
130         free(list);
131
132         return true;
133 }
134
135 TESTCASE(sensor_listener, bad_unregister_stop_order_p_1)
136 {
137         int err;
138         bool ret;
139         int handle;
140         sensor_t sensor;
141
142         called = false;
143
144         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
145         ASSERT_EQ(err, 0);
146
147         handle = sensord_connect(sensor);
148         ret = sensord_register_event(handle, 1, 100, 100, event_cb, NULL);
149         ret = sensord_start(handle, 0);
150         ret = sensord_change_event_interval(handle, 0, 100);
151
152         mainloop::run();
153
154         /* [TEST] Unregister event before stop */
155         ret = sensord_unregister_event(handle, 1);
156         ASSERT_TRUE(ret);
157
158         ret = sensord_stop(handle);
159         ASSERT_TRUE(ret);
160
161         ret = sensord_disconnect(handle);
162         ASSERT_TRUE(ret);
163
164         return true;
165 }
166
167 TESTCASE(sensor_listener, bad_disconnect_p_1)
168 {
169         int err;
170         bool ret;
171         int handle;
172         sensor_t sensor;
173
174         called = false;
175
176         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
177         ASSERT_EQ(err, 0);
178
179         handle = sensord_connect(sensor);
180         ret = sensord_register_event(handle, 1, 100, 100, event_cb, NULL);
181         ret = sensord_start(handle, 0);
182         ret = sensord_change_event_interval(handle, 0, 100);
183
184         mainloop::run();
185
186         /* [TEST] Unregistering event is not called */
187
188         ret = sensord_stop(handle);
189         ASSERT_TRUE(ret);
190
191         ret = sensord_disconnect(handle);
192         ASSERT_TRUE(ret);
193
194         return true;
195 }
196
197 TESTCASE(sensor_listener, bad_disconnect_p_2)
198 {
199         int err;
200         bool ret;
201         int handle;
202         sensor_t sensor;
203
204         called = false;
205
206         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
207         ASSERT_EQ(err, 0);
208
209         handle = sensord_connect(sensor);
210         ret = sensord_register_event(handle, 1, 100, 100, event_cb, NULL);
211         ret = sensord_start(handle, 0);
212         ret = sensord_change_event_interval(handle, 0, 100);
213
214         mainloop::run();
215
216         ret = sensord_unregister_event(handle, 1);
217         ASSERT_TRUE(ret);
218
219         /* [TEST] stopping sensor is not called */
220
221         ret = sensord_disconnect(handle);
222         ASSERT_TRUE(ret);
223
224         return true;
225 }
226
227 TESTCASE(sensor_listener, set_get_attribute_int_1)
228 {
229         int err = 0;
230         bool ret = true;
231         int handle = 0;
232         sensor_t sensor = NULL;
233         int attr = 1;
234         int value = -1;
235
236         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
237         ASSERT_EQ(err, 0);
238
239         handle = sensord_connect(sensor);
240         err = sensord_set_attribute_int(handle, attr, 1);
241         ASSERT_EQ(err, 0);
242
243         err = sensord_get_attribute_int(handle, attr, &value);
244         ASSERT_EQ(err, 0);
245
246         ASSERT_EQ(value, 1);
247
248         ret = sensord_disconnect(handle);
249         ASSERT_TRUE(ret);
250
251         return true;
252 }
253
254 TESTCASE(sensor_listener, set_get_attribute_int_2)
255 {
256         int err = 0;
257         bool ret = true;
258         int handle = 0;
259         sensor_t sensor = NULL;
260         int attr = 20;
261         int value = -1;
262
263         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
264         ASSERT_EQ(err, 0);
265
266         handle = sensord_connect(sensor);
267         err = sensord_set_attribute_int(handle, attr, 1);
268         ASSERT_EQ(err, 0);
269
270         err = sensord_get_attribute_int(handle, attr, &value);
271         ASSERT_EQ(err, 0);
272
273         ASSERT_EQ(value, 1);
274
275         ret = sensord_disconnect(handle);
276         ASSERT_TRUE(ret);
277
278         return true;
279 }
280
281 TESTCASE(sensor_listener, get_attribute_int_1)
282 {
283         int err = 0;
284         bool ret = true;
285         int handle = 0;
286         sensor_t sensor = NULL;
287         int attr = 100;
288         int value = -1;
289
290         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
291         ASSERT_EQ(err, 0);
292
293         handle = sensord_connect(sensor);
294
295         // attr 100 value is never set in these tests.
296         err = sensord_get_attribute_int(handle, attr, &value);
297         ASSERT_EQ(err, -5);
298
299         ret = sensord_disconnect(handle);
300         ASSERT_TRUE(ret);
301
302         return true;
303 }
304
305 #define TEST_STRING "TESTTESTTEST"
306 #define TEST_STRING_LEN 13
307
308 TESTCASE(sensor_listener, set_attribute_string_1)
309 {
310         int err = 0;
311         bool ret = true;
312         int handle = 0;
313         sensor_t sensor = NULL;
314         int attr = 1;
315
316         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
317         ASSERT_EQ(err, 0);
318
319         handle = sensord_connect(sensor);
320         err = sensord_set_attribute_str(handle, attr, TEST_STRING, TEST_STRING_LEN);
321         ASSERT_EQ(err, 0);
322
323         ret = sensord_disconnect(handle);
324         ASSERT_TRUE(ret);
325
326         return true;
327 }
328
329 TESTCASE(sensor_listener, set_get_attribute_string_1)
330 {
331         int err = 0;
332         bool ret = true;
333         int handle = 0;
334         char *value = NULL;
335         int len = 0;
336         sensor_t sensor = NULL;
337         int attr = 1;
338
339         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
340         ASSERT_EQ(err, 0);
341
342         handle = sensord_connect(sensor);
343         err = sensord_set_attribute_str(handle, attr, TEST_STRING, TEST_STRING_LEN);
344         ASSERT_EQ(err, 0);
345
346         err = sensord_get_attribute_str(handle, attr, &value, &len);
347         ASSERT_EQ(err, 0);
348         ASSERT_EQ(len, TEST_STRING_LEN);
349         ASSERT_EQ(strncmp(value, TEST_STRING, len), 0);
350
351         ret = sensord_disconnect(handle);
352         ASSERT_TRUE(ret);
353
354         free(value);
355         return true;
356 }
357
358 TESTCASE(sensor_listener, set_get_get_attribute_string_1)
359 {
360         int err;
361         bool ret;
362         int handle;
363         char *value = NULL;
364         int len = 0;
365         sensor_t sensor;
366         int attr = 1;
367
368         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
369         ASSERT_EQ(err, 0);
370
371         handle = sensord_connect(sensor);
372         err = sensord_set_attribute_str(handle, attr, TEST_STRING, TEST_STRING_LEN);
373         ASSERT_EQ(err, 0);
374
375         err = sensord_get_attribute_str(handle, attr, &value, &len);
376         ASSERT_EQ(err, 0);
377         ASSERT_EQ(len, TEST_STRING_LEN);
378         ASSERT_EQ(strncmp(value, TEST_STRING, len), 0);
379
380         ret = sensord_disconnect(handle);
381         ASSERT_TRUE(ret);
382
383         free(value);
384
385         value = NULL;
386         len = 0;
387
388         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
389         ASSERT_EQ(err, 0);
390
391         handle = sensord_connect(sensor);
392
393         err = sensord_get_attribute_str(handle, attr, &value, &len);
394         ASSERT_EQ(err, 0);
395         ASSERT_EQ(len, TEST_STRING_LEN);
396         ASSERT_EQ(strncmp(value, TEST_STRING, len), 0);
397
398         ret = sensord_disconnect(handle);
399         ASSERT_TRUE(ret);
400
401         free(value);
402         return true;
403 }
404
405 TESTCASE(sensor_listener, get_attribute_string_2)
406 {
407         int err;
408         bool ret;
409         int handle;
410         char *value;
411         int len;
412         sensor_t sensor;
413         int attr = 100;
414
415         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
416         ASSERT_EQ(err, 0);
417
418         handle = sensord_connect(sensor);
419
420         // attr 100 value is never set in these tests.
421         err = sensord_get_attribute_str(handle, attr, &value, &len);
422         ASSERT_EQ(err, -EIO);
423
424         ret = sensord_disconnect(handle);
425         ASSERT_TRUE(ret);
426
427         return true;
428 }
429
430 #define SENSOR_SHIFT_TYPE 16
431 TESTCASE(sensor_listener, get_data_list)
432 {
433         int err;
434         bool ret;
435         int handle;
436         sensor_t sensor;
437         sensor_type_t type;
438
439         called = false;
440
441         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
442         ASSERT_EQ(err, 0);
443
444         handle = sensord_connect(sensor);
445
446         sensord_get_type(sensor, &type);
447         ASSERT_EQ(err, 0);
448
449         ret = sensord_start(handle, 0);
450         ASSERT_TRUE(ret);
451
452         sensor_data_t* data_list = NULL;
453         int count = 0;
454         unsigned int data_id = type << SENSOR_SHIFT_TYPE | 0x1;
455
456         ret = sensord_get_data_list(handle, data_id, &data_list, &count);
457         ASSERT_TRUE(ret);
458         ASSERT_EQ(count, 1);
459
460         for (int i = 0 ; i < count; i++) {
461                 _I("[%llu]", data_list[i].timestamp);
462                 for (int j = 0; j < data_list[i].value_count; j++)
463                         _I(" %f", data_list[i].values[j]);
464                 _I("\n");
465         }
466         free(data_list);
467
468         ret = sensord_stop(handle);
469         ASSERT_TRUE(ret);
470
471         ret = sensord_unregister_events(handle, 1);
472         ASSERT_TRUE(ret);
473
474         ret = sensord_disconnect(handle);
475         ASSERT_TRUE(ret);
476
477         return true;
478 }
479
480 void sensor_attribute_int_changed_callback(sensor_t sensor, int attribute, int value, void *data)
481 {
482         _I("[ATTRIBUTE INT CHANGED] attribute : %d, value : %d\n", attribute, value);
483 }
484
485 TESTCASE(skip_sensor_listener, register_attribute_int_changed)
486 {
487         int err;
488         bool ret;
489         int handle;
490         sensor_t sensor;
491
492         called = false;
493
494         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
495         ASSERT_EQ(err, 0);
496
497         handle = sensord_connect(sensor);
498         ASSERT_EQ(err, 0);
499
500         ret = sensord_register_attribute_int_changed_cb(handle, sensor_attribute_int_changed_callback, NULL);
501         ASSERT_TRUE(ret);
502
503         ret = sensord_start(handle, 0);
504         ASSERT_TRUE(ret);
505
506         mainloop::run();
507
508         ret = sensord_stop(handle);
509         ASSERT_TRUE(ret);
510
511         ret = sensord_unregister_attribute_int_changed_cb(handle);
512         ASSERT_TRUE(ret);
513
514         ret = sensord_disconnect(handle);
515         ASSERT_TRUE(ret);
516
517         return true;
518 }
519
520 static int attribute = 1; // 1 is SENSOR_ATTRIBUTE_AXIS_ORIENTATION of sensor_attribute_e in sensor.h
521 static int attribute_value = 0;
522
523 static gboolean change_attribute_int(gpointer gdata)
524 {
525         int *handle = reinterpret_cast<int *>(gdata);
526
527         sensord_set_attribute_int(*handle, attribute, attribute_value);
528
529         _N("[ SET ATTRIBUTE INT ] attribute %d, value : %d\n", attribute, attribute_value);
530
531         g_timeout_add_seconds(1, change_attribute_int, handle);
532
533         attribute_value ? attribute_value = 0 : attribute_value = 1;
534
535         return FALSE;
536 }
537
538 TESTCASE(skip_sensor_listener, attribute_int_changer)
539 {
540         int err;
541         bool ret;
542         int handle;
543         sensor_t sensor;
544
545         called = false;
546
547         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
548         ASSERT_EQ(err, 0);
549
550         handle = sensord_connect(sensor);
551         ASSERT_EQ(err, 0);
552
553         ret = sensord_start(handle, 0);
554         ASSERT_TRUE(ret);
555
556         g_timeout_add_seconds(1, change_attribute_int, &handle);
557         mainloop::run();
558
559         ret = sensord_stop(handle);
560         ASSERT_TRUE(ret);
561
562         ret = sensord_disconnect(handle);
563         ASSERT_TRUE(ret);
564
565         return true;
566 }
567
568 void sensor_attribute_str_changed_callback(sensor_t sensor, int attribute, const char *value, int len, void *data)
569 {
570         _I("[ATTRIBUTE STR CHANGED] attribute : %d, value : %s, len : %d\n", attribute, value, len);
571 }
572
573 TESTCASE(skip_sensor_listener, register_attribute_str_changed)
574 {
575         int err;
576         bool ret;
577         int handle;
578         sensor_t sensor;
579
580         called = false;
581
582         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
583         ASSERT_EQ(err, 0);
584
585         handle = sensord_connect(sensor);
586         ASSERT_EQ(err, 0);
587
588         ret = sensord_register_attribute_str_changed_cb(handle, sensor_attribute_str_changed_callback, NULL);
589         ASSERT_TRUE(ret);
590
591         ret = sensord_start(handle, 0);
592         ASSERT_TRUE(ret);
593
594         mainloop::run();
595
596         ret = sensord_stop(handle);
597         ASSERT_TRUE(ret);
598
599         ret = sensord_unregister_attribute_int_changed_cb(handle);
600         ASSERT_TRUE(ret);
601
602         ret = sensord_disconnect(handle);
603         ASSERT_TRUE(ret);
604
605         return true;
606 }
607
608 static const char *attribute_value_str1 = "test_str_1";
609 static const char *attribute_value_str2 = "test_str_2";
610 static const char *attribute_value_str = attribute_value_str1;
611
612 static gboolean change_attribute_str(gpointer gdata)
613 {
614         int *handle = reinterpret_cast<int *>(gdata);
615         int len = strlen(attribute_value_str) + 1;
616         sensord_set_attribute_str(*handle, attribute, attribute_value_str, len);
617
618         _N("[ SET ATTRIBUTE STR ] attribute %d, value : %s, len : %d\n", attribute, attribute_value_str, len);
619
620         g_timeout_add_seconds(1, change_attribute_str, handle);
621
622         if (attribute_value_str == attribute_value_str1) {
623                 attribute_value_str = attribute_value_str2;
624         } else {
625                 attribute_value_str = attribute_value_str1;
626         }
627
628         return FALSE;
629 }
630
631 TESTCASE(skip_sensor_listener, attribute_str_changer)
632 {
633         int err;
634         bool ret;
635         int handle;
636         sensor_t sensor;
637
638         called = false;
639
640         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
641         ASSERT_EQ(err, 0);
642
643         handle = sensord_connect(sensor);
644         ASSERT_EQ(err, 0);
645
646         ret = sensord_start(handle, 0);
647         ASSERT_TRUE(ret);
648
649         g_timeout_add_seconds(1, change_attribute_str, &handle);
650         mainloop::run();
651
652         ret = sensord_stop(handle);
653         ASSERT_TRUE(ret);
654
655         ret = sensord_disconnect(handle);
656         ASSERT_TRUE(ret);
657
658         return true;
659 }