Home | History | Annotate | Download | only in user_space
      1 /*
      2  * v4l-test: Test environment for Video For Linux Two API
      3  *
      4  * 20 Apr 2009  0.7  Added string content validation
      5  * 18 Apr 2009  0.6  More strict check for strings
      6  * 29 Mar 2009  0.5  Clean up test case for NULL parameter
      7  * 28 Mar 2009  0.4  Clean up ret and errno variable names and dprintf() output
      8  *  1 Jan 2009  0.3  Added index=S32_MAX, S32_MAX+1 and U32_MAX
      9  * 22 Dec 2008  0.2  Test case with NULL parameter added
     10  * 18 Dec 2008  0.1  First release
     11  *
     12  * Written by Mrton Nmeth <nm127 (at) freemail.hu>
     13  * Released under GPL
     14  */
     15 
     16 #include <stdio.h>
     17 #include <sys/types.h>
     18 #include <sys/stat.h>
     19 #include <fcntl.h>
     20 #include <unistd.h>
     21 #include <sys/ioctl.h>
     22 #include <errno.h>
     23 #include <string.h>
     24 
     25 #include <linux/videodev2.h>
     26 #include <linux/errno.h>
     27 
     28 #include <CUnit/CUnit.h>
     29 #include <CUnit/Basic.h>
     30 
     31 #include "v4l2_test.h"
     32 #include "dev_video.h"
     33 #include "video_limits.h"
     34 #include "v4l2_validator.h"
     35 
     36 #include "test_VIDIOC_ENUMAUDIO.h"
     37 
     38 void test_VIDIOC_ENUMAUDIO()
     39 {
     40 	int ret_enum, errno_enum;
     41 	struct v4l2_audio audio;
     42 	struct v4l2_audio audio2;
     43 	__u32 i;
     44 
     45 	i = 0;
     46 	do {
     47 		memset(&audio, 0xff, sizeof(audio));
     48 		audio.index = i;
     49 		ret_enum = ioctl(get_video_fd(), VIDIOC_ENUMAUDIO, &audio);
     50 		errno_enum = errno;
     51 
     52 		dprintf
     53 		    ("\t%s:%u: VIDIOC_ENUMAUDIO, ret_enum=%i, errno_enum=%i\n",
     54 		     __FILE__, __LINE__, ret_enum, errno_enum);
     55 
     56 		if (ret_enum == 0) {
     57 			CU_ASSERT_EQUAL(ret_enum, 0);
     58 			CU_ASSERT_EQUAL(audio.index, i);
     59 
     60 			CU_ASSERT(0 < strlen((char *)audio.name));
     61 			CU_ASSERT(valid_string
     62 				  ((char *)audio.name, sizeof(audio.name)));
     63 
     64 			//CU_ASSERT_EQUAL(audio.capability, ?);
     65 			//CU_ASSERT_EQUAL(audio.mode, ?);
     66 			CU_ASSERT_EQUAL(audio.reserved[0], 0);
     67 			CU_ASSERT_EQUAL(audio.reserved[1], 0);
     68 
     69 			/* Check if the unused bytes of the name string are
     70 			 * also filled with zeros. Also check if there is any
     71 			 * padding byte between any two fields then this
     72 			 * padding byte is also filled with zeros.
     73 			 */
     74 			memset(&audio2, 0, sizeof(audio2));
     75 			audio2.index = audio.index;
     76 			strncpy((char *)audio2.name, (char *)audio.name,
     77 				sizeof(audio2.name));
     78 			audio2.capability = audio.capability;
     79 			audio2.mode = audio.mode;
     80 			CU_ASSERT_EQUAL(memcmp(&audio, &audio2, sizeof(audio)),
     81 					0);
     82 
     83 			dprintf("\taudio = {.index=%u, .name=\"%s\", "
     84 				".capability=0x%X, .mode=0x%X, "
     85 				".reserved[]={ 0x%X, 0x%X } }\n",
     86 				audio.index,
     87 				audio.name,
     88 				audio.capability,
     89 				audio.mode, audio.reserved[0], audio.reserved[1]
     90 			    );
     91 
     92 		} else {
     93 			CU_ASSERT_EQUAL(ret_enum, -1);
     94 			CU_ASSERT_EQUAL(errno_enum, EINVAL);
     95 
     96 			memset(&audio2, 0xff, sizeof(audio2));
     97 			audio2.index = i;
     98 			CU_ASSERT_EQUAL(memcmp(&audio, &audio2, sizeof(audio)),
     99 					0);
    100 
    101 		}
    102 		i++;
    103 	} while (ret_enum == 0);
    104 
    105 }
    106 
    107 void test_VIDIOC_ENUMAUDIO_S32_MAX()
    108 {
    109 	int ret_enum, errno_enum;
    110 	struct v4l2_audio audio;
    111 	struct v4l2_audio audio2;
    112 
    113 	memset(&audio, 0xff, sizeof(audio));
    114 	audio.index = (__u32) S32_MAX;
    115 	ret_enum = ioctl(get_video_fd(), VIDIOC_ENUMAUDIO, &audio);
    116 	errno_enum = errno;
    117 
    118 	CU_ASSERT_EQUAL(ret_enum, -1);
    119 	CU_ASSERT_EQUAL(errno_enum, EINVAL);
    120 
    121 	/* Check whether the original audio struct is untouched */
    122 	memset(&audio2, 0xff, sizeof(audio2));
    123 	audio2.index = (__u32) S32_MAX;
    124 	CU_ASSERT_EQUAL(memcmp(&audio, &audio2, sizeof(audio)), 0);
    125 }
    126 
    127 void test_VIDIOC_ENUMAUDIO_S32_MAX_1()
    128 {
    129 	int ret_enum, errno_enum;
    130 	struct v4l2_audio audio;
    131 	struct v4l2_audio audio2;
    132 
    133 	memset(&audio, 0xff, sizeof(audio));
    134 	audio.index = ((__u32) S32_MAX) + 1;
    135 	ret_enum = ioctl(get_video_fd(), VIDIOC_ENUMAUDIO, &audio);
    136 	errno_enum = errno;
    137 
    138 	CU_ASSERT_EQUAL(ret_enum, -1);
    139 	CU_ASSERT_EQUAL(errno_enum, EINVAL);
    140 
    141 	/* Check whether the original audio struct is untouched */
    142 	memset(&audio2, 0xff, sizeof(audio2));
    143 	audio2.index = ((__u32) S32_MAX) + 1;
    144 	CU_ASSERT_EQUAL(memcmp(&audio, &audio2, sizeof(audio)), 0);
    145 }
    146 
    147 void test_VIDIOC_ENUMAUDIO_U32_MAX()
    148 {
    149 	int ret_enum, errno_enum;
    150 	struct v4l2_audio audio;
    151 	struct v4l2_audio audio2;
    152 
    153 	memset(&audio, 0xff, sizeof(audio));
    154 	audio.index = U32_MAX;
    155 	ret_enum = ioctl(get_video_fd(), VIDIOC_ENUMAUDIO, &audio);
    156 	errno_enum = errno;
    157 
    158 	CU_ASSERT_EQUAL(ret_enum, -1);
    159 	CU_ASSERT_EQUAL(errno_enum, EINVAL);
    160 
    161 	/* Check whether the original audio struct is untouched */
    162 	memset(&audio2, 0xff, sizeof(audio2));
    163 	audio2.index = U32_MAX;
    164 	CU_ASSERT_EQUAL(memcmp(&audio, &audio2, sizeof(audio)), 0);
    165 }
    166 
    167 void test_VIDIOC_ENUMAUDIO_NULL()
    168 {
    169 	int ret_enum, errno_enum;
    170 	int ret_null, errno_null;
    171 	struct v4l2_audio audio;
    172 
    173 	memset(&audio, 0, sizeof(audio));
    174 	audio.index = 0;
    175 	ret_enum = ioctl(get_video_fd(), VIDIOC_ENUMAUDIO, &audio);
    176 	errno_enum = errno;
    177 
    178 	dprintf("\t%s:%u: VIDIOC_ENUMAUDIO, ret_enum=%i, errno_enum=%i\n",
    179 		__FILE__, __LINE__, ret_enum, errno_enum);
    180 
    181 	ret_null = ioctl(get_video_fd(), VIDIOC_ENUMAUDIO, NULL);
    182 	errno_null = errno;
    183 
    184 	dprintf("\t%s:%u: VIDIOC_ENUMAUDIO, ret_null=%i, errno_null=%i\n",
    185 		__FILE__, __LINE__, ret_null, errno_null);
    186 
    187 	if (ret_enum == 0) {
    188 		CU_ASSERT_EQUAL(ret_enum, 0);
    189 		CU_ASSERT_EQUAL(ret_null, -1);
    190 		CU_ASSERT_EQUAL(errno_null, EFAULT);
    191 	} else {
    192 		CU_ASSERT_EQUAL(ret_enum, -1);
    193 		CU_ASSERT_EQUAL(errno_enum, EINVAL);
    194 		CU_ASSERT_EQUAL(ret_null, -1);
    195 		CU_ASSERT_EQUAL(errno_null, EINVAL);
    196 	}
    197 
    198 }
    199