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