Home | History | Annotate | Download | only in user_space
      1 /*
      2  * v4l-test: Test environment for Video For Linux Two API
      3  *
      4  * 16 Jul 2009  0.24 Test cases added for VIDIOC_G_JPEGCOMP and VIDIOC_ENUM_FRAMESIZES
      5  * 23 May 2009  0.23 Test cases added for VIDIOC_G_EXT_CTRLS, VIDIOC_S_EXT_CTRLS
      6  *  5 May 2009  0.22 Test cases added for VIDIOC_QUERYBUF
      7  * 29 Apr 2009  0.21 Test cases added for VIDIOC_REQBUFS
      8  * 18 Apr 2009  0.20 NULL parameter test suite split to read only, write only
      9  *                   and write/read ioctl suite
     10  * 16 Apr 2009  0.19 Test cases added for VIDIOC_S_FMT
     11  *  5 Apr 2009  0.18 Test cases for VIDIOC_QUERYMENU added
     12  *  4 Apr 2009  0.17 Test cases for VIDIOC_G_FMT added
     13  * 29 Mar 2009  0.16 Test case for VIDIOC_S_FREQUENCY with NULL parameter added
     14  * 22 Mar 2009  0.15 Test cases added for VIDIOC_G_OUTPUT and VIDIOC_S_OUTPUT
     15  * 18 Mar 2009  0.14 Test cases added for VIDIOC_G_PARM
     16  *  7 Mar 2009  0.13 Test cases added for VIDIOC_S_CROP
     17  * 22 Feb 2009  0.12 Test cases added for VIDIOC_S_CTRL
     18  * 19 Feb 2009  0.11 Test cases added for VIDIOC_G_CTRL
     19  *  7 Feb 2009  0.10 Test cases added for VIDIOC_G_AUDIO, VIDIOC_G_AUDOUT,
     20  *                   VIDIOC_S_AUDIO and VIDIOC_G_CROP
     21  *  3 Feb 2009  0.9  Test cases for VIDIOC_G_AUDIO and VIDIOC_G_AUDOUT added
     22  *  2 Feb 2009  0.8  Test cases for VIDIOC_G_MODULATOR, VIDIOC_G_PRIORITY
     23  *                   and VIDIOC_S_PRIORITY added
     24  *  1 Feb 2009  0.7  Test cases for VIDIOC_S_FREQUENCY added
     25  * 31 Jan 2009  0.6  Test cases for VIDIOC_G_TUNER added
     26  * 18 Jan 2009  0.5  Test cases for MAX_EM28XX_INPUT and MAX_EM28XX_TVNORMS
     27  *                   removed
     28  *  1 Jan 2009  0.4  Test cases for VIDIOC_ENUMOUTPUT, VIDIOC_ENUMAUDOUT,
     29  *                   VIDIOC_QUERYCTRL added;
     30  *                   New test cases for VIDIOC_ENUMAUDIO, VIDIOC_ENUM_FMT,
     31  *                   VIDIOC_ENUM_STD
     32  * 23 Dec 2008  0.3  Test cases for VIDIOC_LOG_STATUS added
     33  * 22 Dec 2008  0.2  Test cases with NULL parameter added;
     34  *                   Test cases for VIDIOC_CROPCAP added
     35  * 18 Dec 2008  0.1  First release
     36  *
     37  * Written by Mrton Nmeth <nm127 (at) freemail.hu>
     38  * Released under GPL
     39  */
     40 
     41 #include <stdio.h>
     42 #include <sys/types.h>
     43 #include <sys/stat.h>
     44 #include <fcntl.h>
     45 #include <unistd.h>
     46 #include <sys/ioctl.h>
     47 #include <errno.h>
     48 #include <string.h>
     49 
     50 #include <linux/videodev2.h>
     51 #include <linux/errno.h>
     52 
     53 #include <CUnit/CUnit.h>
     54 #include <CUnit/Basic.h>
     55 
     56 #include "v4l2_test.h"
     57 #include "dev_video.h"
     58 #include "video_limits.h"
     59 
     60 #include "test_VIDIOC_QUERYCAP.h"
     61 #include "test_VIDIOC_QUERYSTD.h"
     62 #include "test_VIDIOC_QUERYCTRL.h"
     63 #include "test_VIDIOC_QUERYMENU.h"
     64 #include "test_VIDIOC_CROPCAP.h"
     65 #include "test_VIDIOC_G_SLICED_VBI_CAP.h"
     66 
     67 #include "test_VIDIOC_ENUMAUDIO.h"
     68 #include "test_VIDIOC_ENUMAUDOUT.h"
     69 #include "test_VIDIOC_ENUMSTD.h"
     70 #include "test_VIDIOC_ENUM_FMT.h"
     71 #include "test_VIDIOC_ENUMINPUT.h"
     72 #include "test_VIDIOC_ENUMOUTPUT.h"
     73 #include "test_VIDIOC_ENUM_FRAMESIZES.h"
     74 
     75 #include "test_VIDIOC_STD.h"
     76 #include "test_VIDIOC_INPUT.h"
     77 #include "test_VIDIOC_OUTPUT.h"
     78 #include "test_VIDIOC_TUNER.h"
     79 #include "test_VIDIOC_MODULATOR.h"
     80 #include "test_VIDIOC_FREQUENCY.h"
     81 #include "test_VIDIOC_PRIORITY.h"
     82 #include "test_VIDIOC_AUDIO.h"
     83 #include "test_VIDIOC_AUDOUT.h"
     84 #include "test_VIDIOC_CROP.h"
     85 #include "test_VIDIOC_CTRL.h"
     86 #include "test_VIDIOC_EXT_CTRLS.h"
     87 #include "test_VIDIOC_PARM.h"
     88 #include "test_VIDIOC_FMT.h"
     89 #include "test_VIDIOC_JPEGCOMP.h"
     90 
     91 #include "test_VIDIOC_REQBUFS.h"
     92 #include "test_VIDIOC_QUERYBUF.h"
     93 
     94 #include "test_VIDIOC_LOG_STATUS.h"
     95 #include "test_invalid_ioctl.h"
     96 
     97 static CU_TestInfo suite_querycap[] = {
     98 	{"VIDIOC_QUERYCAP", test_VIDIOC_QUERYCAP},
     99 
    100 	{"VIDIOC_CROPCAP", test_VIDIOC_CROPCAP},
    101 	{"VIDIOC_CROPCAP with different inputs",
    102 	 test_VIDIOC_CROPCAP_enum_INPUT},
    103 
    104 	{"VIDIOC_G_SLICED_VBI_CAP", test_VIDIOC_G_SLICED_VBI_CAP},
    105 	{"VIDIOC_G_SLICED_VBI_CAP with invalid types",
    106 	 test_VIDIOC_G_SLICED_VBI_CAP_invalid},
    107 
    108 	CU_TEST_INFO_NULL,
    109 };
    110 
    111 static CU_TestInfo suite_enums[] = {
    112 	{"VIDIOC_ENUMAUDIO", test_VIDIOC_ENUMAUDIO},
    113 	{"VIDIOC_ENUMAUDIO, index=S32_MAX", test_VIDIOC_ENUMAUDIO_S32_MAX},
    114 	{"VIDIOC_ENUMAUDIO, index=S32_MAX+1", test_VIDIOC_ENUMAUDIO_S32_MAX_1},
    115 	{"VIDIOC_ENUMAUDIO, index=U32_MAX", test_VIDIOC_ENUMAUDIO_U32_MAX},
    116 
    117 	{"VIDIOC_ENUMAUDOUT", test_VIDIOC_ENUMAUDOUT},
    118 	{"VIDIOC_ENUMAUDOUT, index=S32_MAX", test_VIDIOC_ENUMAUDOUT_S32_MAX},
    119 	{"VIDIOC_ENUMAUDOUT, index=S32_MAX+1",
    120 	 test_VIDIOC_ENUMAUDOUT_S32_MAX_1},
    121 	{"VIDIOC_ENUMAUDOUT, index=U32_MAX", test_VIDIOC_ENUMAUDOUT_U32_MAX},
    122 
    123 	{"VIDIOC_ENUM_FMT", test_VIDIOC_ENUM_FMT},
    124 	{"VIDIOC_ENUM_FMT, index=S32_MAX", test_VIDIOC_ENUM_FMT_S32_MAX},
    125 	{"VIDIOC_ENUM_FMT, index=S32_MAX+1", test_VIDIOC_ENUM_FMT_S32_MAX_1},
    126 	{"VIDIOC_ENUM_FMT, index=U32_MAX", test_VIDIOC_ENUM_FMT_U32_MAX},
    127 	{"VIDIOC_ENUM_FMT, invalid type", test_VIDIOC_ENUM_FMT_invalid_type},
    128 
    129 	{"VIDIOC_ENUMINPUT", test_VIDIOC_ENUMINPUT},
    130 	{"VIDIOC_ENUMINPUT, index=S32_MAX", test_VIDIOC_ENUMINPUT_S32_MAX},
    131 	{"VIDIOC_ENUMINPUT, index=S32_MAX+1", test_VIDIOC_ENUMINPUT_S32_MAX_1},
    132 	{"VIDIOC_ENUMINPUT, index=U32_MAX", test_VIDIOC_ENUMINPUT_U32_MAX},
    133 
    134 	{"VIDIOC_ENUMOUTPUT", test_VIDIOC_ENUMOUTPUT},
    135 	{"VIDIOC_ENUMOUTPUT, index=S32_MAX", test_VIDIOC_ENUMOUTPUT_S32_MAX},
    136 	{"VIDIOC_ENUMOUTPUT, index=S32_MAX+1",
    137 	 test_VIDIOC_ENUMOUTPUT_S32_MAX_1},
    138 	{"VIDIOC_ENUMOUTPUT, index=U32_MAX", test_VIDIOC_ENUMOUTPUT_U32_MAX},
    139 
    140 	{"VIDIOC_ENUMSTD", test_VIDIOC_ENUMSTD},
    141 	{"VIDIOC_ENUMSTD, index=S32_MAX", test_VIDIOC_ENUMSTD_S32_MAX},
    142 	{"VIDIOC_ENUMSTD, index=S32_MAX+1", test_VIDIOC_ENUMSTD_S32_MAX_1},
    143 	{"VIDIOC_ENUMSTD, index=U32_MAX", test_VIDIOC_ENUMSTD_U32_MAX},
    144 
    145 	{"VIDIOC_QUERYCTRL", test_VIDIOC_QUERYCTRL},
    146 	{"VIDIOC_QUERYCTRL, id=V4L2_CID_BASE-1", test_VIDIOC_QUERYCTRL_BASE_1},
    147 	{"VIDIOC_QUERYCTRL, id=V4L2_CID_LASTP1", test_VIDIOC_QUERYCTRL_LASTP1},
    148 	{"VIDIOC_QUERYCTRL, id=V4L2_CID_LASTP1+1",
    149 	 test_VIDIOC_QUERYCTRL_LASTP1_1},
    150 	{"VIDIOC_QUERYCTRL with V4L2_CTRL_FLAG_NEXT_CTRL",
    151 	 test_VIDIOC_QUERYCTRL_flag_NEXT_CTRL},
    152 	{"VIDIOC_QUERYCTRL, enumerate private controls",
    153 	 test_VIDIOC_QUERYCTRL_private},
    154 	{"VIDIOC_QUERYCTRL, V4L2_CID_PRIVATE_BASE-1",
    155 	 test_VIDIOC_QUERYCTRL_private_base_1},
    156 	{"VIDIOC_QUERYCTRL, last private control+1",
    157 	 test_VIDIOC_QUERYCTRL_private_last_1},
    158 
    159 	{"VIDIOC_QUERYMENU", test_VIDIOC_QUERYMENU},
    160 	{"VIDIOC_QUERYMENU with invalid id", test_VIDIOC_QUERYMENU_invalid},
    161 	{"VIDIOC_QUERYMENU with private controls",
    162 	 test_VIDIOC_QUERYMENU_private},
    163 	{"VIDIOC_QUERYMENU, last private control+1",
    164 	 test_VIDIOC_QUERYMENU_private_last_1},
    165 
    166 	{"VIDIOC_ENUM_FRAMESIZES", test_VIDIOC_ENUM_FRAMESIZES},
    167 	{"VIDIOC_ENUM_FRAMESIZES with invalid index",
    168 	 test_VIDIOC_ENUM_FRAMESIZES_invalid_index},
    169 	{"VIDIOC_ENUM_FRAMESIZES with invalid pixel_format",
    170 	 test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format},
    171 
    172 	CU_TEST_INFO_NULL,
    173 };
    174 
    175 static CU_TestInfo suite_get_set_try[] = {
    176 	{"VIDIOC_G_STD", test_VIDIOC_G_STD},
    177 	{"VIDIOC_S_STD with the enumerated values",
    178 	 test_VIDIOC_S_STD_from_enum},
    179 	{"VIDIOC_S_STD", test_VIDIOC_S_STD},
    180 	{"VIDIOC_S_STD with invalid standard",
    181 	 test_VIDIOC_S_STD_invalid_standard},
    182 
    183 	{"VIDIOC_G_INPUT", test_VIDIOC_G_INPUT},
    184 	{"VIDIOC_S_INPUT from enum", test_VIDIOC_S_INPUT_from_enum},
    185 	{"VIDIOC_S_INPUT with invalid inputs",
    186 	 test_VIDIOC_S_INPUT_invalid_inputs},
    187 
    188 	{"VIDIOC_G_OUTPUT", test_VIDIOC_G_OUTPUT},
    189 	{"VIDIOC_S_OUTPUT from enum", test_VIDIOC_S_OUTPUT_from_enum},
    190 	{"VIDIOC_S_OUTPUT with invalid outputs",
    191 	 test_VIDIOC_S_OUTPUT_invalid_outputs},
    192 
    193 	{"VIDIOC_G_TUNER", test_VIDIOC_G_TUNER},
    194 	{"VIDIOC_G_TUNER, index=S32_MAX", test_VIDIOC_G_TUNER_S32_MAX},
    195 	{"VIDIOC_G_TUNER, index=S32_MAX+1", test_VIDIOC_G_TUNER_S32_MAX_1},
    196 	{"VIDIOC_G_TUNER, index=U32_MAX", test_VIDIOC_G_TUNER_U32_MAX},
    197 
    198 	{"VIDIOC_S_TUNER", test_VIDIOC_S_TUNER},
    199 	{"VIDIOC_S_TUNER with invalid index and audmode parameters",
    200 	 test_VIDIOC_S_TUNER_invalid},
    201 
    202 	{"VIDIOC_G_MODULATOR", test_VIDIOC_G_MODULATOR},
    203 	{"VIDIOC_G_MODULATOR, index=S32_MAX", test_VIDIOC_G_MODULATOR_S32_MAX},
    204 	{"VIDIOC_G_MODULATOR, index=S32_MAX+1",
    205 	 test_VIDIOC_G_MODULATOR_S32_MAX_1},
    206 	{"VIDIOC_G_MODULATOR, index=U32_MAX", test_VIDIOC_G_MODULATOR_U32_MAX},
    207 
    208 	{"VIDIOC_G_FREQUENCY", test_VIDIOC_G_FREQUENCY},
    209 	{"VIDIOC_G_FREQUENCY, tuner=S32_MAX", test_VIDIOC_G_FREQUENCY_S32_MAX},
    210 	{"VIDIOC_G_FREQUENCY, tuner=S32_MAX+1",
    211 	 test_VIDIOC_G_FREQUENCY_S32_MAX_1},
    212 	{"VIDIOC_G_FREQUENCY, tuner=U32_MAX", test_VIDIOC_G_FREQUENCY_U32_MAX},
    213 
    214 	{"VIDIOC_S_FREQUENCY", test_VIDIOC_S_FREQUENCY},
    215 	{"VIDIOC_S_FREQUENCY with boundary values",
    216 	 test_VIDIOC_S_FREQUENCY_boundaries},
    217 	{"VIDIOC_S_FREQUENCY scan all possbile values",
    218 	 test_VIDIOC_S_FREQUENCY_scan},
    219 
    220 	{"VIDIOC_G_PRIORITY", test_VIDIOC_G_PRIORITY},
    221 	{"VIDIOC_S_PRIORITY", test_VIDIOC_S_PRIORITY},
    222 	{"VIDIOC_S_PRIORITY with invalid values",
    223 	 test_VIDIOC_S_PRIORITY_invalid},
    224 
    225 	{"VIDIOC_G_AUDIO", test_VIDIOC_G_AUDIO},
    226 	{"VIDIOC_G_AUDIO, ignore index value",
    227 	 test_VIDIOC_G_AUDIO_ignore_index},
    228 
    229 	{"VIDIOC_S_AUDIO", test_VIDIOC_S_AUDIO},
    230 	{"VIDIOC_S_AUDIO, index=S32_MAX", test_VIDIOC_S_AUDIO_S32_MAX},
    231 	{"VIDIOC_S_AUDIO, index=S32_MAX+1", test_VIDIOC_S_AUDIO_S32_MAX_1},
    232 	{"VIDIOC_S_AUDIO, index=U32_MAX", test_VIDIOC_S_AUDIO_U32_MAX},
    233 
    234 	{"VIDIOC_G_AUDOUT", test_VIDIOC_G_AUDOUT},
    235 	{"VIDIOC_G_AUDOUT, ignore index value",
    236 	 test_VIDIOC_G_AUDOUT_ignore_index},
    237 
    238 	{"VIDIOC_S_AUDOUT", test_VIDIOC_S_AUDOUT},
    239 	{"VIDIOC_S_AUDOUT, index=S32_MAX", test_VIDIOC_S_AUDOUT_S32_MAX},
    240 	{"VIDIOC_S_AUDOUT, index=S32_MAX+1", test_VIDIOC_S_AUDOUT_S32_MAX_1},
    241 	{"VIDIOC_S_AUDOUT, index=U32_MAX", test_VIDIOC_S_AUDOUT_U32_MAX},
    242 
    243 	{"VIDIOC_G_CROP", test_VIDIOC_G_CROP},
    244 	{"VIDIOC_G_CROP with invalid type", test_VIDIOC_G_CROP_invalid},
    245 	{"VIDIOC_S_CROP", test_VIDIOC_S_CROP},
    246 	{"VIDIOC_S_CROP with invalid type", test_VIDIOC_S_CROP_invalid},
    247 
    248 	{"VIDIOC_G_CTRL", test_VIDIOC_G_CTRL},
    249 
    250 	{"VIDIOC_S_CTRL", test_VIDIOC_S_CTRL},
    251 	{"VIDIOC_S_CTRL with invalid value parameter",
    252 	 test_VIDIOC_S_CTRL_invalid},
    253 	{"VIDIOC_S_CTRL, withe balance", test_VIDIOC_S_CTRL_white_balance},
    254 	{"VIDIOC_S_CTRL, white balance with invalid value parameter",
    255 	 test_VIDIOC_S_CTRL_white_balance_invalid},
    256 	{"VIDIOC_S_CTRL, gain control", test_VIDIOC_S_CTRL_gain},
    257 	{"VIDIOC_S_CTRL, gain control with invalid value parameter",
    258 	 test_VIDIOC_S_CTRL_gain_invalid},
    259 
    260 	{"VIDIOC_G_EXT_CTRLS with zero items to get",
    261 	 test_VIDIOC_G_EXT_CTRLS_zero},
    262 	{"VIDIOC_G_EXT_CTRLS with zero items to get, but with invalid count values",
    263 	 test_VIDIOC_G_EXT_CTRLS_zero_invalid_count},
    264 	{"VIDIOC_G_EXT_CTRLS with only one item to get",
    265 	 test_VIDIOC_G_EXT_CTRLS_one},
    266 
    267 	{"VIDIOC_S_EXT_CTRLS with zero items to set",
    268 	 test_VIDIOC_S_EXT_CTRLS_zero},
    269 	{"VIDIOC_S_EXT_CTRLS with zero items to set, but with invalid count values",
    270 	 test_VIDIOC_S_EXT_CTRLS_zero_invalid_count},
    271 
    272 	{"VIDIOC_TRY_EXT_CTRLS with zero items to try",
    273 	 test_VIDIOC_TRY_EXT_CTRLS_zero},
    274 	{"VIDIOC_TRY_EXT_CTRLS with zero items to try, but with invalid count values",
    275 	 test_VIDIOC_TRY_EXT_CTRLS_zero_invalid_count},
    276 
    277 	{"VIDIOC_G_PARM", test_VIDIOC_G_PARM},
    278 	{"VIDIOC_G_PARM with invalid type parameter",
    279 	 test_VIDIOC_G_PARM_invalid},
    280 
    281 	{"VIDIOC_G_FMT", test_VIDIOC_G_FMT},
    282 	{"VIDIOC_G_FMT with invalid type parameter",
    283 	 test_VIDIOC_G_FMT_invalid_type},
    284 
    285 	{"VIDIOC_S_FMT with enumerated values", test_VIDIOC_S_FMT_enum},
    286 	{"VIDIOC_S_FMT with invalid type parameter", test_VIDIOC_S_FMT_type},
    287 
    288 	{"VIDIOC_G_JPEGCOMP", test_VIDIOC_G_JPEGCOMP},
    289 
    290 	CU_TEST_INFO_NULL,
    291 };
    292 
    293 static CU_TestInfo suite_querystd[] = {
    294 	{"VIDIOC_QUERYSTD", test_VIDIOC_QUERYSTD},
    295 
    296 	CU_TEST_INFO_NULL,
    297 };
    298 
    299 static CU_TestInfo suite_buffs[] = {
    300 	{"VIDIOC_REQBUFS with memory map capture streaming i/o",
    301 	 test_VIDIOC_REQBUFS_capture_mmap},
    302 	{"VIDIOC_REQBUFS with user pointer capture streaming i/o",
    303 	 test_VIDIOC_REQBUFS_capture_userptr},
    304 	{"VIDIOC_REQBUFS with memory map output streaming i/o",
    305 	 test_VIDIOC_REQBUFS_output_mmap},
    306 	{"VIDIOC_REQBUFS with user pointer output streaming i/o",
    307 	 test_VIDIOC_REQBUFS_output_userptr},
    308 	{"VIDIOC_REQBUFS with invalid memory parameter, capture",
    309 	 test_VIDIOC_REQBUFS_invalid_memory_capture},
    310 	{"VIDIOC_REQBUFS with invalid memory parameter, output",
    311 	 test_VIDIOC_REQBUFS_invalid_memory_output},
    312 	{"VIDIOC_REQBUFS with invalid type parameter, memory mapped i/o",
    313 	 test_VIDIOC_REQUBUFS_invalid_type_mmap},
    314 	{"VIDIOC_REQBUFS with invalid type parameter, user pointer i/o",
    315 	 test_VIDIOC_REQUBUFS_invalid_type_userptr},
    316 
    317 	{"VIDIOC_QUERYBUF with memory map capture streaming i/o",
    318 	 test_VIDIOC_QUERYBUF_capture_mmap},
    319 	{"VIDIOC_QUERYBUF with user pointer capture streaming i/o",
    320 	 test_VIDIOC_QUERYBUF_capture_userptr},
    321 	{"VIDIOC_QUERYBUF with memory map output streaming i/o",
    322 	 test_VIDIOC_QUERYBUF_output_mmap},
    323 	{"VIDIOC_QUERYBUF with user pointer output streaming i/o",
    324 	 test_VIDIOC_QUERYBUF_output_userptr},
    325 	{"VIDIOC_QUERYBUF with overlay capture (invalid)",
    326 	 test_VIDIOC_QUERYBUF_overlay_capture},
    327 	{"VIDIOC_QUERYBUF with overlay output (invalid)",
    328 	 test_VIDIOC_QUERYBUF_overlay_output},
    329 	{"VIDIOC_QUERYBUF with invalid memory parameter, capture",
    330 	 test_VIDIOC_QUERYBUF_invalid_memory_capture},
    331 	{"VIDIOC_QUERYBUF with invalid memory parameter, output",
    332 	 test_VIDIOC_QUERYBUF_invalid_memory_output},
    333 	{"VIDIOC_QUERYBUF with invalid type parameter, memory mapped i/o",
    334 	 test_VIDIOC_QUERYBUF_invalid_type_mmap},
    335 	{"VIDIOC_QUERYBUF with invalid type parameter, user pointer i/o",
    336 	 test_VIDIOC_QUERYBUF_invalid_type_userptr},
    337 
    338 	CU_TEST_INFO_NULL,
    339 };
    340 
    341 static CU_TestInfo suite_null_readonly[] = {
    342 	{"VIDIOC_QUERYCAP with NULL parameter", test_VIDIOC_QUERYCAP_NULL},
    343 	/* { "VIDIOC_G_FBUF with NULL parameter", }, */
    344 	{"VIDIOC_G_STD with NULL parameter", test_VIDIOC_G_STD_NULL},
    345 	{"VIDIOC_G_AUDIO with NULL parameter", test_VIDIOC_G_AUDIO_NULL},
    346 	{"VIDIOC_G_INPUT with NULL parameter", test_VIDIOC_G_INPUT_NULL},
    347 	{"VIDIOC_G_OUTPUT with NULL parameter", test_VIDIOC_G_OUTPUT_NULL},
    348 	{"VIDIOC_G_AUDOUT with NULL parameter", test_VIDIOC_G_AUDOUT_NULL},
    349 	{"VIDIOC_G_JPEGCOMP with NULL parameter", test_VIDIOC_G_JPEGCOMP_NULL},
    350 	{"VIDIOC_QUERYSTD with NULL parameter", test_VIDIOC_QUERYSTD_NULL},
    351 	{"VIDIOC_G_PRIORITY with NULL parameter", test_VIDIOC_G_PRIORITY_NULL},
    352 	/* { "VIDIOC_G_ENC_INDEX with NULL parameter", }, */
    353 
    354 	CU_TEST_INFO_NULL,
    355 };
    356 
    357 static CU_TestInfo suite_null_writeonly[] = {
    358 	/* { "VIDIOC_S_FBUF with NULL parameter", }, */
    359 	/* { "VIDIOC_OVERLAY with NULL parameter", }, */
    360 	/* { "VIDIOC_STREAMON with NULL parameter", }, */
    361 	/* { "VIDIOC_STREAMOFF with NULL parameter", }, */
    362 	{"VIDIOC_S_STD with NULL parameter", test_VIDIOC_S_STD_NULL},
    363 	{"VIDIOC_S_TUNER with NULL parameter", test_VIDIOC_S_TUNER_NULL},
    364 	{"VIDIOC_S_AUDIO with NULL parameter", test_VIDIOC_S_AUDIO_NULL},
    365 	{"VIDIOC_S_AUDOUT with NULL parameter", test_VIDIOC_S_AUDOUT_NULL},
    366 	/* { "VIDIOC_S_MODULATOR with NULL parameter", }, */
    367 	{"VIDIOC_S_FREQUENCY with NULL parameter",
    368 	 test_VIDIOC_S_FREQUENCY_NULL},
    369 	{"VIDIOC_S_CROP with NULL parameter", test_VIDIOC_S_CROP_NULL},
    370 	/* { "VIDIOC_S_JPEGCOMP with NULL parameter", }, */
    371 	{"VIDIOC_S_PRIORITY with NULL parameter", test_VIDIOC_S_PRIORITY_NULL},
    372 	/* { "VIDIOC_DBG_S_REGISTER with NULL parameter", }, */
    373 	/* { "VIDIOC_S_HW_FREQ_SEEK with NULL parameter", }, */
    374 
    375 	CU_TEST_INFO_NULL,
    376 };
    377 
    378 static CU_TestInfo suite_null_writeread[] = {
    379 	{"VIDIOC_ENUM_FMT with NULL parameter", test_VIDIOC_ENUM_FMT_NULL},
    380 	{"VIDIOC_G_FMT with NULL parameter", test_VIDIOC_G_FMT_NULL},
    381 	/* { "VIDIOC_S_FMT with NULL parameter", }, */
    382 	/* { "VIDIOC_REQBUFS with NULL parameter", } */
    383 	/* { "VIDIOC_QUERYBUF with NULL parameter", } */
    384 	/* { "VIDIOC_QBUF with NULL parameter", }, */
    385 	/* { "VIDIOC_DQBUF with NULL parameter", }, */
    386 	{"VIDIOC_G_PARM with NULL parameter", test_VIDIOC_G_PARM_NULL},
    387 	/* { "VIDIOC_S_PARM with NULL parameter", }, */
    388 	{"VIDIOC_ENUMSTD with NULL parameter", test_VIDIOC_ENUMSTD_NULL},
    389 	{"VIDIOC_ENUMINPUT with NULL parameter", test_VIDIOC_ENUMINPUT_NULL},
    390 	{"VIDIOC_G_CTRL with NULL parameter", test_VIDIOC_G_CTRL_NULL},
    391 	{"VIDIOC_S_CTRL with NULL parameter", test_VIDIOC_S_CTRL_NULL},
    392 	{"VIDIOC_G_TUNER with NULL parameter", test_VIDIOC_G_TUNER_NULL},
    393 	{"VIDIOC_QUERYCTRL with NULL parameter", test_VIDIOC_QUERYCTRL_NULL},
    394 	{"VIDIOC_QUERYMENU with NULL parameter", test_VIDIOC_QUERYMENU_NULL},
    395 	{"VIDIOC_S_INPUT with NULL parameter", test_VIDIOC_S_INPUT_NULL},
    396 	{"VIDIOC_S_OUTPUT with NULL parameter", test_VIDIOC_S_OUTPUT_NULL},
    397 	{"VIDIOC_ENUMOUTPUT with NULL parameter", test_VIDIOC_ENUMOUTPUT_NULL},
    398 	{"VIDIOC_G_MODULATOR with NULL parameter",
    399 	 test_VIDIOC_G_MODULATOR_NULL},
    400 	{"VIDIOC_G_FREQUENCY with NULL parameter",
    401 	 test_VIDIOC_G_FREQUENCY_NULL},
    402 	{"VIDIOC_CROPCAP with NULL parameter", test_VIDIOC_CROPCAP_NULL},
    403 	{"VIDIOC_G_CROP with NULL parameter", test_VIDIOC_G_CROP_NULL},
    404 	/* { "VIDIOC_TRY_FMT with NULL parameter", }, */
    405 	{"VIDIOC_ENUMAUDIO with NULL parameter", test_VIDIOC_ENUMAUDIO_NULL},
    406 	{"VIDIOC_ENUMAUDOUT with NULL parameter", test_VIDIOC_ENUMAUDOUT_NULL},
    407 	{"VIDIOC_G_SLICED_VBI_CAP with NULL parameter",
    408 	 test_VIDIOC_G_SLICED_VBI_CAP_NULL},
    409 	{"VIDIOC_G_EXT_CTRLS with NULL parameter",
    410 	 test_VIDIOC_G_EXT_CTRLS_NULL},
    411 	{"VIDIOC_S_EXT_CTRLS with NULL parameter",
    412 	 test_VIDIOC_S_EXT_CTRLS_NULL},
    413 	{"VIDIOC_TRY_EXT_CTRLS with NULL parameter",
    414 	 test_VIDIOC_TRY_EXT_CTRLS_NULL},
    415 	{"VIDIOC_ENUM_FRAMESIZES with NULL parameter",
    416 	 test_VIDIOC_ENUM_FRAMESIZES_NULL},
    417 	/* { "VIDIOC_ENUM_FRAMEINTERVALS with NULL parameter", }, */
    418 	/* { "VIDIOC_ENCODER_CMD with NULL parameter", }, */
    419 	/* { "VIDIOC_TRY_ENCODER_CMD with NULL parameter", }, */
    420 	/* { "VIDIOC_DBG_G_REGISTER with NULL parameter", }, */
    421 	/* { "VIDIOC_DBG_G_CHIP_IDENT with NULL parameter", }, */
    422 
    423 	CU_TEST_INFO_NULL,
    424 };
    425 
    426 static CU_TestInfo suite_invalid_ioctl[] = {
    427 	{"invalid ioctl _IO(0, 0)", test_invalid_ioctl_1},
    428 	{"invalid ioctl _IO(0xFF, 0xFF)", test_invalid_ioctl_2},
    429 	{"invalid v4l1 ioctl _IO('v', 0xFF)", test_invalid_ioctl_3},
    430 	{"invalid v4l2 ioctl _IO('V', 0xFF)", test_invalid_ioctl_4},
    431 
    432 	CU_TEST_INFO_NULL,
    433 };
    434 
    435 static CU_TestInfo suite_debug_ioctl[] = {
    436 	{"test_VIDIOC_LOG_STATUS", test_VIDIOC_LOG_STATUS},
    437 
    438 	CU_TEST_INFO_NULL,
    439 };
    440 
    441 static CU_SuiteInfo suites[] = {
    442 	{"VIDIOC_QUERYCAP", open_video, close_video, suite_querycap},
    443 	{"VIDIOC_ENUM* ioctl calls", open_video, close_video, suite_enums},
    444 	{"VIDIOC_G_*, VIDIOC_S_* and VIDIOC_TRY_* ioctl calls", open_video,
    445 	 close_video, suite_get_set_try},
    446 	{"VIDIOC_QUERYSTD", open_video, close_video, suite_querystd},
    447 	{"buffer i/o", open_video, close_video, suite_buffs},
    448 	{"read only IOCTLs with NULL parameter", open_video, close_video,
    449 	 suite_null_readonly},
    450 	{"write only IOCTLs with NULL parameter", open_video, close_video,
    451 	 suite_null_writeonly},
    452 	{"write and read IOCTLs with NULL parameter", open_video, close_video,
    453 	 suite_null_writeread},
    454 	{"debug ioctl calls", open_video, close_video, suite_debug_ioctl},
    455 	{"invalid ioctl calls", open_video, close_video, suite_invalid_ioctl},
    456 	CU_SUITE_INFO_NULL,
    457 };
    458 
    459 int main()
    460 {
    461 	CU_ErrorCode err;
    462 
    463 	err = CU_initialize_registry();
    464 	if (err != CUE_SUCCESS) {
    465 		printf("ERROR: cannot initialize CUNIT registry, giving up.\n");
    466 		return 1;
    467 	}
    468 
    469 	err = CU_register_suites(suites);
    470 	if (err == CUE_SUCCESS) {
    471 
    472 		//CU_basic_set_mode(CU_BRM_NORMAL);
    473 		//CU_basic_set_mode(CU_BRM_SILENT);
    474 		CU_basic_set_mode(CU_BRM_VERBOSE);
    475 		err = CU_basic_run_tests();
    476 		if (err != CUE_SUCCESS) {
    477 			printf("CU_basic_run_tests returned %i\n", err);
    478 		}
    479 
    480 	} else {
    481 		printf("ERROR: cannot add test suites\n");
    482 	}
    483 
    484 	CU_cleanup_registry();
    485 
    486 	tst_exit();
    487 }
    488