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