1 /* 2 * v4l-test: Test environment for Video For Linux Two API 3 * 4 * 4 Apr 2009 0.3 Test case for NULL parameter reworked 5 * 27 Mar 2009 0.2 Correct VIDIOC_S_PRIORITY test cases 6 * 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 31 #include "test_VIDIOC_PRIORITY.h" 32 33 int valid_priority(enum v4l2_priority priority) 34 { 35 int valid = 0; 36 37 CU_ASSERT_EQUAL(V4L2_PRIORITY_DEFAULT, V4L2_PRIORITY_INTERACTIVE); 38 39 switch (priority) { 40 case V4L2_PRIORITY_UNSET: 41 case V4L2_PRIORITY_BACKGROUND: 42 case V4L2_PRIORITY_INTERACTIVE: 43 case V4L2_PRIORITY_RECORD: 44 valid = 1; 45 break; 46 default: 47 valid = 0; 48 } 49 return valid; 50 } 51 52 static void do_set_priority(enum v4l2_priority priority) 53 { 54 int ret_set, errno_set; 55 int ret_get, errno_get; 56 enum v4l2_priority new_priority; 57 58 dprintf("\t%s:%u: set priority to %i\n", __FILE__, __LINE__, priority); 59 ret_set = ioctl(get_video_fd(), VIDIOC_S_PRIORITY, &priority); 60 errno_set = errno; 61 62 dprintf("\t%s:%u: VIDIOC_S_PRIORITY, ret_set=%i, errno_set=%i\n", 63 __FILE__, __LINE__, ret_set, errno_set); 64 65 CU_ASSERT_EQUAL(ret_set, 0); 66 if (ret_set == 0) { 67 memset(&new_priority, 0xff, sizeof(new_priority)); 68 ret_get = 69 ioctl(get_video_fd(), VIDIOC_G_PRIORITY, &new_priority); 70 errno_get = errno; 71 72 CU_ASSERT_EQUAL(ret_get, 0); 73 if (ret_get == 0) { 74 CU_ASSERT_EQUAL(new_priority, priority); 75 } 76 } 77 } 78 79 static void do_set_invalid_priority(enum v4l2_priority orig_priority, 80 enum v4l2_priority priority) 81 { 82 int ret_set, errno_set; 83 int ret_get, errno_get; 84 enum v4l2_priority new_priority; 85 86 dprintf("\t%s:%u: try to set priority to %i\n", __FILE__, __LINE__, 87 priority); 88 ret_set = ioctl(get_video_fd(), VIDIOC_S_PRIORITY, &priority); 89 errno_set = errno; 90 91 dprintf("\t%s:%u: VIDIOC_S_PRIORITY, ret_set=%i, errno_set=%i\n", 92 __FILE__, __LINE__, ret_set, errno_set); 93 94 CU_ASSERT_EQUAL(ret_set, -1); 95 CU_ASSERT_EQUAL(errno_set, EINVAL); 96 if (ret_set == -1 && errno_set == EINVAL) { 97 memset(&new_priority, 0xff, sizeof(new_priority)); 98 ret_get = 99 ioctl(get_video_fd(), VIDIOC_G_PRIORITY, &new_priority); 100 errno_get = errno; 101 102 CU_ASSERT_EQUAL(ret_get, 0); 103 if (ret_get == 0) { 104 CU_ASSERT_EQUAL(new_priority, orig_priority); 105 } 106 } 107 } 108 109 void test_VIDIOC_G_PRIORITY() 110 { 111 int ret_get, errno_get; 112 enum v4l2_priority orig_priority; 113 114 memset(&orig_priority, 0xff, sizeof(orig_priority)); 115 ret_get = ioctl(get_video_fd(), VIDIOC_G_PRIORITY, &orig_priority); 116 errno_get = errno; 117 118 dprintf 119 ("\t%s:%u: VIDIOC_G_PRIORITY, ret_get=%i, errno_get=%i, orig_priority=%i\n", 120 __FILE__, __LINE__, ret_get, errno_get, orig_priority); 121 122 if (ret_get == 0) { 123 CU_ASSERT_EQUAL(ret_get, 0); 124 CU_ASSERT(valid_priority(orig_priority)); 125 126 } else { 127 CU_ASSERT_EQUAL(ret_get, -1); 128 CU_ASSERT_EQUAL(errno_get, EINVAL); 129 130 } 131 132 } 133 134 void test_VIDIOC_G_PRIORITY_NULL() 135 { 136 int ret_get, errno_get; 137 int ret_null, errno_null; 138 enum v4l2_priority priority; 139 140 memset(&priority, 0xff, sizeof(priority)); 141 ret_get = ioctl(get_video_fd(), VIDIOC_G_PRIORITY, &priority); 142 errno_get = errno; 143 144 dprintf("\t%s:%u: VIDIOC_G_PRIORITY: ret_get=%i, errno_get=%i\n", 145 __FILE__, __LINE__, ret_get, errno_get); 146 147 ret_null = ioctl(get_video_fd(), VIDIOC_G_PRIORITY, NULL); 148 errno_null = errno; 149 150 dprintf("\t%s:%u: VIDIOC_G_PRIORITY: ret_null=%i, errno_null=%i\n", 151 __FILE__, __LINE__, ret_null, errno_null); 152 153 /* check if VIDIOC_G_PRIORITY is supported at all or not */ 154 if (ret_get == -1 && errno_get == EINVAL) { 155 /* VIDIOC_G_PRIORITY not supported at all, the parameter should not be evaluated */ 156 CU_ASSERT_EQUAL(ret_null, -1); 157 CU_ASSERT_EQUAL(errno_null, EINVAL); 158 159 } else { 160 /* VIDIOC_G_PRIORITY is supported, the parameter should be checked */ 161 CU_ASSERT_EQUAL(ret_null, -1); 162 CU_ASSERT_EQUAL(errno_null, EFAULT); 163 } 164 } 165 166 void test_VIDIOC_S_PRIORITY() 167 { 168 int ret_get, errno_get; 169 enum v4l2_priority orig_priority; 170 171 memset(&orig_priority, 0xff, sizeof(orig_priority)); 172 ret_get = ioctl(get_video_fd(), VIDIOC_G_PRIORITY, &orig_priority); 173 errno_get = errno; 174 175 dprintf("\t%s:%u: VIDIOC_G_PRIORITY, ret_get=%i, errno_get=%i\n", 176 __FILE__, __LINE__, ret_get, errno_get); 177 178 if (ret_get == 0) { 179 CU_ASSERT_EQUAL(ret_get, 0); 180 CU_ASSERT(valid_priority(orig_priority)); 181 182 dprintf("\torig_priority = %u\n", orig_priority); 183 184 do_set_priority(V4L2_PRIORITY_UNSET); 185 do_set_priority(V4L2_PRIORITY_BACKGROUND); 186 do_set_priority(V4L2_PRIORITY_INTERACTIVE); 187 do_set_priority(V4L2_PRIORITY_RECORD); 188 189 CU_ASSERT_EQUAL(V4L2_PRIORITY_DEFAULT, 190 V4L2_PRIORITY_INTERACTIVE); 191 192 do_set_priority(orig_priority); 193 194 } else { 195 CU_ASSERT_EQUAL(ret_get, -1); 196 CU_ASSERT_EQUAL(errno_get, EINVAL); 197 198 } 199 } 200 201 void test_VIDIOC_S_PRIORITY_invalid() 202 { 203 int ret_get, errno_get; 204 enum v4l2_priority orig_priority; 205 206 memset(&orig_priority, 0xff, sizeof(orig_priority)); 207 ret_get = ioctl(get_video_fd(), VIDIOC_G_PRIORITY, &orig_priority); 208 errno_get = errno; 209 210 dprintf("\t%s:%u: VIDIOC_G_PRIORITY, ret_get=%i, errno_get=%i\n", 211 __FILE__, __LINE__, ret_get, errno_get); 212 213 if (ret_get == 0) { 214 CU_ASSERT_EQUAL(ret_get, 0); 215 CU_ASSERT(valid_priority(orig_priority)); 216 217 dprintf("\torig_priority = %u\n", orig_priority); 218 219 do_set_invalid_priority(orig_priority, 4); 220 do_set_invalid_priority(orig_priority, S32_MAX); 221 do_set_invalid_priority(orig_priority, ((__u32) S32_MAX) + 1); 222 do_set_invalid_priority(orig_priority, U32_MAX); 223 224 do_set_priority(orig_priority); 225 226 } else { 227 CU_ASSERT_EQUAL(ret_get, -1); 228 CU_ASSERT_EQUAL(errno_get, EINVAL); 229 230 } 231 } 232 233 void test_VIDIOC_S_PRIORITY_NULL() 234 { 235 int ret_orig, errno_orig; 236 int ret_set, errno_set; 237 int ret_null, errno_null; 238 enum v4l2_priority priority_orig; 239 enum v4l2_priority priority; 240 241 memset(&priority_orig, 0, sizeof(priority_orig)); 242 ret_orig = ioctl(get_video_fd(), VIDIOC_G_PRIORITY, &priority_orig); 243 errno_orig = errno; 244 245 dprintf("\t%s:%u: VIDIOC_G_PRIORITY, ret_orig=%i, errno_orig=%i\n", 246 __FILE__, __LINE__, ret_orig, errno_orig); 247 248 if (ret_orig == 0) { 249 priority = priority_orig; 250 } else { 251 priority = V4L2_PRIORITY_DEFAULT; 252 } 253 254 ret_set = ioctl(get_video_fd(), VIDIOC_S_PRIORITY, &priority); 255 errno_set = errno; 256 257 dprintf("\t%s:%u: VIDIOC_S_PRIORITY, ret_set=%d, errno_set=%i\n", 258 __FILE__, __LINE__, ret_set, errno_set); 259 260 ret_null = ioctl(get_video_fd(), VIDIOC_S_PRIORITY, NULL); 261 errno_null = errno; 262 263 dprintf("\t%s:%u: VIDIOC_S_PRIORITY, ret_null=%d, errno_null=%i\n", 264 __FILE__, __LINE__, ret_null, errno_null); 265 266 /* check if VIDIOC_S_PRIORITY is supported at all or not */ 267 if (ret_set == 0) { 268 /* VIDIOC_S_PRIORITY is supported, the parameter should be checked */ 269 CU_ASSERT_EQUAL(ret_set, 0); 270 CU_ASSERT_EQUAL(ret_null, -1); 271 CU_ASSERT_EQUAL(errno_null, EFAULT); 272 } else { 273 /* VIDIOC_S_PRIORITY not supported at all, the parameter should not be evaluated */ 274 CU_ASSERT_EQUAL(ret_set, -1); 275 CU_ASSERT_EQUAL(errno_set, EINVAL); 276 CU_ASSERT_EQUAL(ret_null, -1); 277 CU_ASSERT_EQUAL(errno_null, EINVAL); 278 } 279 280 } 281