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 M�rton N�meth <nm127@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
test_VIDIOC_ENUMAUDIO()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
test_VIDIOC_ENUMAUDIO_S32_MAX()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
test_VIDIOC_ENUMAUDIO_S32_MAX_1()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
test_VIDIOC_ENUMAUDIO_U32_MAX()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
test_VIDIOC_ENUMAUDIO_NULL()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