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.4  Added string content validation
      5  * 18 Apr 2009  0.3  More strict check for strings
      6  * 28 Mar 2009  0.2  Clean up ret and errno variable names and dprintf() output
      7  *  2 Feb 2009  0.1  First release
      8  *
      9  * Written by Mrton Nmeth <nm127 (at) freemail.hu>
     10  * Released under GPL
     11  */
     12 
     13 #include <stdio.h>
     14 #include <sys/types.h>
     15 #include <sys/stat.h>
     16 #include <fcntl.h>
     17 #include <unistd.h>
     18 #include <sys/ioctl.h>
     19 #include <errno.h>
     20 #include <string.h>
     21 
     22 #include <linux/videodev2.h>
     23 #include <linux/errno.h>
     24 
     25 #include <CUnit/CUnit.h>
     26 
     27 #include "v4l2_test.h"
     28 #include "dev_video.h"
     29 #include "video_limits.h"
     30 #include "v4l2_validator.h"
     31 
     32 #include "test_VIDIOC_MODULATOR.h"
     33 
     34 int valid_modulator_sub(__u32 tuner_sub)
     35 {
     36 	int valid = 0;
     37 
     38 	CU_ASSERT_EQUAL(V4L2_TUNER_SUB_SAP, V4L2_TUNER_SUB_LANG2);
     39 
     40 	if ((tuner_sub & ~(V4L2_TUNER_SUB_MONO |
     41 			   V4L2_TUNER_SUB_STEREO |
     42 			   V4L2_TUNER_SUB_LANG1 |
     43 			   V4L2_TUNER_SUB_LANG2 | V4L2_TUNER_SUB_SAP))
     44 	    == 0) {
     45 		valid = 1;
     46 	} else {
     47 		valid = 0;
     48 	}
     49 	return valid;
     50 }
     51 
     52 static int do_get_modulator(int f, __u32 index)
     53 {
     54 	int ret_get, errno_get;
     55 	struct v4l2_modulator modulator;
     56 	struct v4l2_modulator modulator2;
     57 
     58 	memset(&modulator, 0xff, sizeof(modulator));
     59 	modulator.index = index;
     60 	ret_get = ioctl(f, VIDIOC_G_MODULATOR, &modulator);
     61 	errno_get = errno;
     62 
     63 	dprintf("\t%s:%u: VIDIOC_G_MODULATOR, ret_get=%i, errno_get=%i\n",
     64 		__FILE__, __LINE__, ret_get, errno_get);
     65 
     66 	if (ret_get == 0) {
     67 		CU_ASSERT_EQUAL(ret_get, 0);
     68 
     69 		CU_ASSERT_EQUAL(modulator.index, index);
     70 
     71 		CU_ASSERT(0 < strlen((char *)modulator.name));
     72 		CU_ASSERT(valid_string
     73 			  ((char *)modulator.name, sizeof(modulator.name)));
     74 
     75 		CU_ASSERT(valid_modulator_capability(modulator.capability));
     76 
     77 		CU_ASSERT(modulator.rangelow <= modulator.rangehigh);
     78 
     79 		CU_ASSERT(valid_modulator_sub(modulator.txsubchans));
     80 
     81 		CU_ASSERT_EQUAL(modulator.reserved[0], 0);
     82 		CU_ASSERT_EQUAL(modulator.reserved[1], 0);
     83 		CU_ASSERT_EQUAL(modulator.reserved[2], 0);
     84 		CU_ASSERT_EQUAL(modulator.reserved[3], 0);
     85 
     86 		/* Check if the unused bytes of the name string are also filled
     87 		 * with zeros. Also check if there is any padding byte between
     88 		 * any two fields then this padding byte is also filled with
     89 		 * zeros.
     90 		 */
     91 		memset(&modulator2, 0, sizeof(modulator2));
     92 		modulator2.index = modulator.index;
     93 		strncpy((char *)modulator2.name, (char *)modulator.name,
     94 			sizeof(modulator2.name));
     95 		modulator2.capability = modulator.capability;
     96 		modulator2.rangelow = modulator.rangelow;
     97 		modulator2.rangehigh = modulator.rangehigh;
     98 		modulator2.txsubchans = modulator.txsubchans;
     99 		CU_ASSERT_EQUAL(memcmp
    100 				(&modulator, &modulator2, sizeof(modulator)),
    101 				0);
    102 
    103 		dprintf("\tmodulator = { "
    104 			".index = %u, "
    105 			".name = \"%s\", "
    106 			".capability = 0x%X, "
    107 			".rangelow = %u, "
    108 			".rangehigh = %u, "
    109 			".txsubchans = %u, "
    110 			".reserved[]={ 0x%X, 0x%X, 0x%X, 0x%X } }\n",
    111 			modulator.index,
    112 			modulator.name,
    113 			modulator.capability,
    114 			modulator.rangelow,
    115 			modulator.rangehigh,
    116 			modulator.txsubchans,
    117 			modulator.reserved[0],
    118 			modulator.reserved[1],
    119 			modulator.reserved[2], modulator.reserved[3]
    120 		    );
    121 
    122 	} else {
    123 		dprintf("\t%s:%u: ret_get=%d (expected %d)\n", __FILE__,
    124 			__LINE__, ret_get, -1);
    125 		dprintf("\t%s:%u: errno_get=%d (expected %d)\n", __FILE__,
    126 			__LINE__, errno_get, EINVAL);
    127 		CU_ASSERT_EQUAL(ret_get, -1);
    128 		CU_ASSERT_EQUAL(errno_get, EINVAL);
    129 	}
    130 
    131 	return ret_get;
    132 }
    133 
    134 void test_VIDIOC_G_MODULATOR()
    135 {
    136 	int ret;
    137 	__u32 index;
    138 	int f;
    139 
    140 	f = get_video_fd();
    141 
    142 	index = 0;
    143 	do {
    144 		ret = do_get_modulator(f, index);
    145 		index++;
    146 	} while (ret == 0);
    147 
    148 }
    149 
    150 void test_VIDIOC_G_MODULATOR_S32_MAX()
    151 {
    152 	int ret_get, errno_get;
    153 	__u32 index;
    154 	struct v4l2_modulator modulator;
    155 
    156 	index = (__u32) S32_MAX;
    157 
    158 	memset(&modulator, 0xff, sizeof(modulator));
    159 	modulator.index = index;
    160 	ret_get = ioctl(get_video_fd(), VIDIOC_G_MODULATOR, &modulator);
    161 	errno_get = errno;
    162 
    163 	dprintf("\t%s:%u: VIDIOC_G_MODULATOR, ret_get=%i, errno_get=%i\n",
    164 		__FILE__, __LINE__, ret_get, errno_get);
    165 
    166 	dprintf("\t%s:%u: ret_get=%d (expected %d)\n", __FILE__, __LINE__,
    167 		ret_get, -1);
    168 	dprintf("\t%s:%u: errno_get=%d (expected %d)\n", __FILE__, __LINE__,
    169 		errno_get, EINVAL);
    170 	CU_ASSERT_EQUAL(ret_get, -1);
    171 	CU_ASSERT_EQUAL(errno_get, EINVAL);
    172 }
    173 
    174 void test_VIDIOC_G_MODULATOR_S32_MAX_1()
    175 {
    176 	int ret_get, errno_get;
    177 	__u32 index;
    178 	struct v4l2_modulator modulator;
    179 
    180 	index = (__u32) S32_MAX + 1;
    181 
    182 	memset(&modulator, 0xff, sizeof(modulator));
    183 	modulator.index = index;
    184 	ret_get = ioctl(get_video_fd(), VIDIOC_G_MODULATOR, &modulator);
    185 	errno_get = errno;
    186 
    187 	dprintf("VIDIOC_G_MODULATOR, ret_get=%i\n", ret_get);
    188 
    189 	dprintf("\t%s:%u: ret_get=%d (expected %d)\n", __FILE__, __LINE__,
    190 		ret_get, -1);
    191 	dprintf("\t%s:%u: errno_get=%d (expected %d)\n", __FILE__, __LINE__,
    192 		errno_get, EINVAL);
    193 	CU_ASSERT_EQUAL(ret_get, -1);
    194 	CU_ASSERT_EQUAL(errno_get, EINVAL);
    195 }
    196 
    197 void test_VIDIOC_G_MODULATOR_U32_MAX()
    198 {
    199 	int ret_get, errno_get;
    200 	__u32 index;
    201 	struct v4l2_modulator modulator;
    202 
    203 	index = U32_MAX;
    204 
    205 	memset(&modulator, 0xff, sizeof(modulator));
    206 	modulator.index = index;
    207 	ret_get = ioctl(get_video_fd(), VIDIOC_G_MODULATOR, &modulator);
    208 	errno_get = errno;
    209 
    210 	dprintf("\t%s:%u: VIDIOC_G_MODULATOR, ret_get=%i, errno_get=%i\n",
    211 		__FILE__, __LINE__, ret_get, errno_get);
    212 
    213 	dprintf("\t%s:%u: ret_get=%d (expected %d)\n", __FILE__, __LINE__,
    214 		ret_get, -1);
    215 	dprintf("\t%s:%u: errno_get=%d (expected %d)\n", __FILE__, __LINE__,
    216 		errno_get, EINVAL);
    217 	CU_ASSERT_EQUAL(ret_get, -1);
    218 	CU_ASSERT_EQUAL(errno_get, EINVAL);
    219 }
    220 
    221 void test_VIDIOC_G_MODULATOR_NULL()
    222 {
    223 	int ret_get, errno_get;
    224 	int ret_null, errno_null;
    225 	struct v4l2_modulator modulator;
    226 
    227 	memset(&modulator, 0xff, sizeof(modulator));
    228 	modulator.index = 0;
    229 	ret_get = ioctl(get_video_fd(), VIDIOC_G_MODULATOR, &modulator);
    230 	errno_get = errno;
    231 
    232 	dprintf("\t%s:%u: VIDIOC_G_MODULATOR, ret_get=%i, errno_get=%i\n",
    233 		__FILE__, __LINE__, ret_get, errno_get);
    234 
    235 	ret_null = ioctl(get_video_fd(), VIDIOC_G_MODULATOR, NULL);
    236 	errno_null = errno;
    237 
    238 	dprintf("\t%s:%u: VIDIOC_G_MODULATOR, ret_null=%i, errno_null=%i\n",
    239 		__FILE__, __LINE__, ret_null, errno_null);
    240 
    241 	/* check if VIDIOC_G_MODULATOR is supported at all or not */
    242 	if (ret_get == 0) {
    243 		/* VIDIOC_G_MODULATOR is supported, the parameter should be checked */
    244 		CU_ASSERT_EQUAL(ret_get, 0);
    245 		CU_ASSERT_EQUAL(ret_null, -1);
    246 		CU_ASSERT_EQUAL(errno_null, EFAULT);
    247 	} else {
    248 		/* VIDIOC_G_MODULATOR not supported at all, the parameter should not be evaluated */
    249 		CU_ASSERT_EQUAL(ret_get, -1);
    250 		CU_ASSERT_EQUAL(errno_get, EINVAL);
    251 		CU_ASSERT_EQUAL(ret_null, -1);
    252 		CU_ASSERT_EQUAL(errno_null, EINVAL);
    253 	}
    254 
    255 }
    256 
    257 /* TODO: test cases for VIDIOC_S_MODULATOR */
    258