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