Use share_ptr to send message, Use reference to send_sync message
[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 #define BUF_SIZE 4000
359 TESTCASE(sensor_listener, set_get_attribute_string_2)
360 {
361         int err = 0;
362         bool ret = true;
363         int handle = 0;
364         char *value = NULL;
365         int len = 0;
366         sensor_t sensor = NULL;
367         int attr = 1;
368         char attr_value[BUF_SIZE] = {1, };
369         attr_value[BUF_SIZE - 1] = 1;
370
371         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
372         ASSERT_EQ(err, 0);
373
374         handle = sensord_connect(sensor);
375         err = sensord_set_attribute_str(handle, attr, attr_value, BUF_SIZE);
376         ASSERT_EQ(err, 0);
377
378         err = sensord_get_attribute_str(handle, attr, &value, &len);
379         ASSERT_EQ(err, 0);
380         ASSERT_EQ(len, BUF_SIZE);
381
382         ret = sensord_disconnect(handle);
383         ASSERT_TRUE(ret);
384
385         free(value);
386         return true;
387 }
388
389 TESTCASE(sensor_listener, set_get_get_attribute_string_1)
390 {
391         int err;
392         bool ret;
393         int handle;
394         char *value = NULL;
395         int len = 0;
396         sensor_t sensor;
397         int attr = 1;
398
399         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
400         ASSERT_EQ(err, 0);
401
402         handle = sensord_connect(sensor);
403         err = sensord_set_attribute_str(handle, attr, TEST_STRING, TEST_STRING_LEN);
404         ASSERT_EQ(err, 0);
405
406         err = sensord_get_attribute_str(handle, attr, &value, &len);
407         ASSERT_EQ(err, 0);
408         ASSERT_EQ(len, TEST_STRING_LEN);
409         ASSERT_EQ(strncmp(value, TEST_STRING, len), 0);
410
411         ret = sensord_disconnect(handle);
412         ASSERT_TRUE(ret);
413
414         free(value);
415
416         value = NULL;
417         len = 0;
418
419         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
420         ASSERT_EQ(err, 0);
421
422         handle = sensord_connect(sensor);
423
424         err = sensord_get_attribute_str(handle, attr, &value, &len);
425         ASSERT_EQ(err, 0);
426         ASSERT_EQ(len, TEST_STRING_LEN);
427         ASSERT_EQ(strncmp(value, TEST_STRING, len), 0);
428
429         ret = sensord_disconnect(handle);
430         ASSERT_TRUE(ret);
431
432         free(value);
433         return true;
434 }
435
436 TESTCASE(sensor_listener, get_attribute_string_2)
437 {
438         int err;
439         bool ret;
440         int handle;
441         char *value;
442         int len;
443         sensor_t sensor;
444         int attr = 100;
445
446         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
447         ASSERT_EQ(err, 0);
448
449         handle = sensord_connect(sensor);
450
451         // attr 100 value is never set in these tests.
452         err = sensord_get_attribute_str(handle, attr, &value, &len);
453         ASSERT_EQ(err, -EIO);
454
455         ret = sensord_disconnect(handle);
456         ASSERT_TRUE(ret);
457
458         return true;
459 }
460
461 #define SENSOR_SHIFT_TYPE 16
462 TESTCASE(sensor_listener, get_data_list)
463 {
464         int err;
465         bool ret;
466         int handle;
467         sensor_t sensor;
468         sensor_type_t type;
469
470         called = false;
471
472         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
473         ASSERT_EQ(err, 0);
474
475         handle = sensord_connect(sensor);
476
477         sensord_get_type(sensor, &type);
478         ASSERT_EQ(err, 0);
479
480         ret = sensord_start(handle, 0);
481         ASSERT_TRUE(ret);
482
483         sensor_data_t* data_list = NULL;
484         int count = 0;
485         unsigned int data_id = type << SENSOR_SHIFT_TYPE | 0x1;
486
487         ret = sensord_get_data_list(handle, data_id, &data_list, &count);
488         ASSERT_TRUE(ret);
489         ASSERT_EQ(count, 1);
490
491         for (int i = 0 ; i < count; i++) {
492                 _I("[%llu]", data_list[i].timestamp);
493                 for (int j = 0; j < data_list[i].value_count; j++)
494                         _I(" %f", data_list[i].values[j]);
495                 _I("\n");
496         }
497         free(data_list);
498
499         ret = sensord_stop(handle);
500         ASSERT_TRUE(ret);
501
502         ret = sensord_unregister_events(handle, 1);
503         ASSERT_TRUE(ret);
504
505         ret = sensord_disconnect(handle);
506         ASSERT_TRUE(ret);
507
508         return true;
509 }
510
511 void sensor_attribute_int_changed_callback(sensor_t sensor, int attribute, int value, void *data)
512 {
513         _I("[ATTRIBUTE INT CHANGED] attribute : %d, value : %d\n", attribute, value);
514 }
515
516 TESTCASE(skip_sensor_listener, register_attribute_int_changed)
517 {
518         int err;
519         bool ret;
520         int handle;
521         sensor_t sensor;
522
523         called = false;
524
525         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
526         ASSERT_EQ(err, 0);
527
528         handle = sensord_connect(sensor);
529         ASSERT_EQ(err, 0);
530
531         ret = sensord_register_attribute_int_changed_cb(handle, sensor_attribute_int_changed_callback, NULL);
532         ASSERT_TRUE(ret);
533
534         ret = sensord_start(handle, 0);
535         ASSERT_TRUE(ret);
536
537         mainloop::run();
538
539         ret = sensord_stop(handle);
540         ASSERT_TRUE(ret);
541
542         ret = sensord_unregister_attribute_int_changed_cb(handle);
543         ASSERT_TRUE(ret);
544
545         ret = sensord_disconnect(handle);
546         ASSERT_TRUE(ret);
547
548         return true;
549 }
550
551 static int attribute = 1; // 1 is SENSOR_ATTRIBUTE_AXIS_ORIENTATION of sensor_attribute_e in sensor.h
552 static int attribute_value = 0;
553
554 static gboolean change_attribute_int(gpointer gdata)
555 {
556         int *handle = reinterpret_cast<int *>(gdata);
557
558         sensord_set_attribute_int(*handle, attribute, attribute_value);
559
560         _N("[ SET ATTRIBUTE INT ] attribute %d, value : %d\n", attribute, attribute_value);
561
562         g_timeout_add_seconds(1, change_attribute_int, handle);
563
564         attribute_value ? attribute_value = 0 : attribute_value = 1;
565
566         return FALSE;
567 }
568
569 TESTCASE(skip_sensor_listener, attribute_int_changer)
570 {
571         int err;
572         bool ret;
573         int handle;
574         sensor_t sensor;
575
576         called = false;
577
578         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
579         ASSERT_EQ(err, 0);
580
581         handle = sensord_connect(sensor);
582         ASSERT_EQ(err, 0);
583
584         ret = sensord_start(handle, 0);
585         ASSERT_TRUE(ret);
586
587         g_timeout_add_seconds(1, change_attribute_int, &handle);
588         mainloop::run();
589
590         ret = sensord_stop(handle);
591         ASSERT_TRUE(ret);
592
593         ret = sensord_disconnect(handle);
594         ASSERT_TRUE(ret);
595
596         return true;
597 }
598
599 void sensor_attribute_str_changed_callback(sensor_t sensor, int attribute, const char *value, int len, void *data)
600 {
601         _I("[ATTRIBUTE STR CHANGED] attribute : %d, value : %s, len : %d\n", attribute, value, len);
602 }
603
604 TESTCASE(skip_sensor_listener, register_attribute_str_changed)
605 {
606         int err;
607         bool ret;
608         int handle;
609         sensor_t sensor;
610
611         called = false;
612
613         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
614         ASSERT_EQ(err, 0);
615
616         handle = sensord_connect(sensor);
617         ASSERT_EQ(err, 0);
618
619         ret = sensord_register_attribute_str_changed_cb(handle, sensor_attribute_str_changed_callback, NULL);
620         ASSERT_TRUE(ret);
621
622         ret = sensord_start(handle, 0);
623         ASSERT_TRUE(ret);
624
625         mainloop::run();
626
627         ret = sensord_stop(handle);
628         ASSERT_TRUE(ret);
629
630         ret = sensord_unregister_attribute_int_changed_cb(handle);
631         ASSERT_TRUE(ret);
632
633         ret = sensord_disconnect(handle);
634         ASSERT_TRUE(ret);
635
636         return true;
637 }
638
639 static const char *attribute_value_str1 = "test_str_1";
640 static const char *attribute_value_str2 = "test_str_2";
641 static const char *attribute_value_str = attribute_value_str1;
642
643 static gboolean change_attribute_str(gpointer gdata)
644 {
645         int *handle = reinterpret_cast<int *>(gdata);
646         int len = strlen(attribute_value_str) + 1;
647         sensord_set_attribute_str(*handle, attribute, attribute_value_str, len);
648
649         _N("[ SET ATTRIBUTE STR ] attribute %d, value : %s, len : %d\n", attribute, attribute_value_str, len);
650
651         g_timeout_add_seconds(1, change_attribute_str, handle);
652
653         if (attribute_value_str == attribute_value_str1) {
654                 attribute_value_str = attribute_value_str2;
655         } else {
656                 attribute_value_str = attribute_value_str1;
657         }
658
659         return FALSE;
660 }
661
662 TESTCASE(skip_sensor_listener, attribute_str_changer)
663 {
664         int err;
665         bool ret;
666         int handle;
667         sensor_t sensor;
668
669         called = false;
670
671         err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
672         ASSERT_EQ(err, 0);
673
674         handle = sensord_connect(sensor);
675         ASSERT_EQ(err, 0);
676
677         ret = sensord_start(handle, 0);
678         ASSERT_TRUE(ret);
679
680         g_timeout_add_seconds(1, change_attribute_str, &handle);
681         mainloop::run();
682
683         ret = sensord_stop(handle);
684         ASSERT_TRUE(ret);
685
686         ret = sensord_disconnect(handle);
687         ASSERT_TRUE(ret);
688
689         return true;
690 }