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.9  Added string content validation
      5  * 19 Apr 2009  0.8  Also check std field
      6  * 18 Apr 2009  0.7  More strict check for strings
      7  *  3 Apr 2009  0.6  Test case for NULL parameter reworked
      8  * 28 Mar 2009  0.5  Clean up ret and errno variable names and dprintf() output
      9  * 18 Jan 2009  0.4  Test case for MAX_EM28XX_TVNORMS removed, test cases for
     10  *                   S32_MAX & U32_MAX are enough
     11  *  1 Jan 2009  0.3  Added index=S32_MAX and S32_MAX+1
     12  * 22 Dec 2008  0.2  Test case with NULL parameter added
     13  * 18 Dec 2008  0.1  First release
     14  *
     15  * Written by Mrton Nmeth <nm127 (at) freemail.hu>
     16  * Released under GPL
     17  */
     18 
     19 /* TODO: from V4L2 Spec:
     20  * "Drivers may enumerate a different set of standards after switching the video input or output."
     21  *
     22  */
     23 
     24 #include <stdio.h>
     25 #include <sys/types.h>
     26 #include <sys/stat.h>
     27 #include <fcntl.h>
     28 #include <unistd.h>
     29 #include <sys/ioctl.h>
     30 #include <errno.h>
     31 #include <string.h>
     32 
     33 #include <linux/videodev2.h>
     34 #include <linux/errno.h>
     35 
     36 #include <CUnit/CUnit.h>
     37 #include <CUnit/Basic.h>
     38 
     39 #include "v4l2_test.h"
     40 #include "dev_video.h"
     41 #include "video_limits.h"
     42 #include "v4l2_validator.h"
     43 
     44 #include "test_VIDIOC_ENUMSTD.h"
     45 
     46 void test_VIDIOC_ENUMSTD()
     47 {
     48 	int ret_enum, errno_enum;
     49 	struct v4l2_standard std;
     50 	struct v4l2_standard std2;
     51 	__u32 i;
     52 
     53 	i = 0;
     54 	do {
     55 		memset(&std, 0xff, sizeof(std));
     56 		std.index = i;
     57 		ret_enum = ioctl(get_video_fd(), VIDIOC_ENUMSTD, &std);
     58 		errno_enum = errno;
     59 
     60 		dprintf("\t%s:%u: VIDIOC_ENUMSTD, ret_enum=%i, errno_enum=%i\n",
     61 			__FILE__, __LINE__, ret_enum, errno_enum);
     62 
     63 		if (ret_enum == 0) {
     64 			CU_ASSERT_EQUAL(ret_enum, 0);
     65 			CU_ASSERT_EQUAL(std.index, i);
     66 			CU_ASSERT(valid_v4l2_std_id(std.id));
     67 
     68 			CU_ASSERT(0 < strlen((char *)std.name));
     69 			CU_ASSERT(valid_string
     70 				  ((char *)std.name, sizeof(std.name)));
     71 
     72 			//CU_ASSERT_EQUAL(std.frameperiod.numerator, ?);
     73 			//CU_ASSERT_EQUAL(std.frameperiod.denominator, ?);
     74 			//CU_ASSERT_EQUAL(std.framelines, ?);
     75 			CU_ASSERT_EQUAL(std.reserved[0], 0);
     76 			CU_ASSERT_EQUAL(std.reserved[1], 0);
     77 			CU_ASSERT_EQUAL(std.reserved[2], 0);
     78 			CU_ASSERT_EQUAL(std.reserved[3], 0);
     79 
     80 			/* Check if the unused bytes of the name string is also filled
     81 			 * with zeros. Also check if there is any padding byte between
     82 			 * any two fields then this padding byte is also filled with zeros.
     83 			 */
     84 			memset(&std2, 0, sizeof(std2));
     85 			std2.index = std.index;
     86 			std2.id = std.id;
     87 			strncpy((char *)std2.name, (char *)std.name,
     88 				sizeof(std2.name));
     89 			std2.frameperiod.numerator = std.frameperiod.numerator;
     90 			std2.frameperiod.denominator =
     91 			    std.frameperiod.denominator;
     92 			std2.framelines = std.framelines;
     93 			CU_ASSERT_EQUAL(memcmp(&std, &std2, sizeof(std)), 0);
     94 
     95 			dprintf("\tstd = {.index=%u, .id=%llX, .name=\"%s\", "
     96 				".frameperiod={ .numerator=%u, .denominator=%u }, "
     97 				".framelines=%u, "
     98 				".reserved[]={ 0x%X, 0x%X, 0x%X, 0x%X } }\n",
     99 				std.index,
    100 				std.id,
    101 				std.name,
    102 				std.frameperiod.numerator,
    103 				std.frameperiod.denominator,
    104 				std.framelines,
    105 				std.reserved[0],
    106 				std.reserved[1],
    107 				std.reserved[2], std.reserved[3]
    108 			    );
    109 
    110 		} else {
    111 			CU_ASSERT_EQUAL(ret_enum, -1);
    112 			CU_ASSERT_EQUAL(errno_enum, EINVAL);
    113 
    114 			memset(&std2, 0xff, sizeof(std2));
    115 			std2.index = i;
    116 			CU_ASSERT_EQUAL(memcmp(&std, &std2, sizeof(std)), 0);
    117 
    118 		}
    119 		i++;
    120 	} while (ret_enum == 0);
    121 }
    122 
    123 void test_VIDIOC_ENUMSTD_S32_MAX()
    124 {
    125 	int ret_enum, errno_enum;
    126 	struct v4l2_standard std;
    127 	struct v4l2_standard std2;
    128 
    129 	memset(&std, 0xff, sizeof(std));
    130 	std.index = (__u32) S32_MAX;
    131 	ret_enum = ioctl(get_video_fd(), VIDIOC_ENUMSTD, &std);
    132 	errno_enum = errno;
    133 
    134 	CU_ASSERT_EQUAL(ret_enum, -1);
    135 	CU_ASSERT_EQUAL(errno_enum, EINVAL);
    136 
    137 	memset(&std2, 0xff, sizeof(std2));
    138 	std2.index = (__u32) S32_MAX;
    139 	CU_ASSERT_EQUAL(memcmp(&std, &std2, sizeof(std)), 0);
    140 }
    141 
    142 void test_VIDIOC_ENUMSTD_S32_MAX_1()
    143 {
    144 	int ret_enum, errno_enum;
    145 	struct v4l2_standard std;
    146 	struct v4l2_standard std2;
    147 
    148 	memset(&std, 0xff, sizeof(std));
    149 	std.index = ((__u32) S32_MAX) + 1;
    150 	ret_enum = ioctl(get_video_fd(), VIDIOC_ENUMSTD, &std);
    151 	errno_enum = errno;
    152 
    153 	CU_ASSERT_EQUAL(ret_enum, -1);
    154 	CU_ASSERT_EQUAL(errno_enum, EINVAL);
    155 
    156 	memset(&std2, 0xff, sizeof(std2));
    157 	std2.index = ((__u32) S32_MAX) + 1;
    158 	CU_ASSERT_EQUAL(memcmp(&std, &std2, sizeof(std)), 0);
    159 }
    160 
    161 void test_VIDIOC_ENUMSTD_U32_MAX()
    162 {
    163 	int ret_enum, errno_enum;
    164 	struct v4l2_standard std;
    165 	struct v4l2_standard std2;
    166 
    167 	memset(&std, 0xff, sizeof(std));
    168 	std.index = U32_MAX;
    169 	ret_enum = ioctl(get_video_fd(), VIDIOC_ENUMSTD, &std);
    170 	errno_enum = errno;
    171 
    172 	dprintf("\t%s:%u: VIDIOC_ENUMSTD, ret_enum=%i, errno_enum=%i\n",
    173 		__FILE__, __LINE__, ret_enum, errno_enum);
    174 
    175 	CU_ASSERT_EQUAL(ret_enum, -1);
    176 	CU_ASSERT_EQUAL(errno_enum, EINVAL);
    177 
    178 	memset(&std2, 0xff, sizeof(std2));
    179 	std2.index = U32_MAX;
    180 	CU_ASSERT_EQUAL(memcmp(&std, &std2, sizeof(std)), 0);
    181 }
    182 
    183 void test_VIDIOC_ENUMSTD_NULL()
    184 {
    185 	int ret_enum, errno_enum;
    186 	int ret_null, errno_null;
    187 	struct v4l2_standard std;
    188 
    189 	memset(&std, 0xff, sizeof(std));
    190 	std.index = 0;
    191 	ret_enum = ioctl(get_video_fd(), VIDIOC_ENUMSTD, &std);
    192 	errno_enum = errno;
    193 
    194 	dprintf("\t%s:%u: VIDIOC_ENUMSTD, ret_enum=%i, errno_enum=%i\n",
    195 		__FILE__, __LINE__, ret_enum, errno_enum);
    196 
    197 	ret_null = ioctl(get_video_fd(), VIDIOC_ENUMSTD, NULL);
    198 	errno_null = errno;
    199 
    200 	dprintf("\t%s:%u: VIDIOC_ENUMSTD, ret_null=%i, errno_null=%i\n",
    201 		__FILE__, __LINE__, ret_null, errno_null);
    202 
    203 	if (ret_enum == 0) {
    204 		CU_ASSERT_EQUAL(ret_enum, 0);
    205 		CU_ASSERT_EQUAL(ret_null, -1);
    206 		CU_ASSERT_EQUAL(errno_null, EFAULT);
    207 	} else {
    208 		CU_ASSERT_EQUAL(ret_enum, -1);
    209 		CU_ASSERT_EQUAL(errno_enum, EINVAL);
    210 		CU_ASSERT_EQUAL(ret_null, -1);
    211 		CU_ASSERT_EQUAL(errno_null, EINVAL);
    212 	}
    213 
    214 }
    215