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 * 25 Mar 2009 0.2 Typos corrected, cleaned up dprintf() outputs;
7 * cleaned up ret and errno variable names
8 * 1 Jan 2009 0.1 First release
9 *
10 * Written by M�rton N�meth <nm127@freemail.hu>
11 * Released under GPL
12 *
13 * Note: in ioctl VIDIOC_ENUMAUDOUT reference (doc/spec/r8304.htm)
14 * the description text mentions the VIDIOC_G_AUDOUT should
15 * be called. This is a typo in the V4L2 specification (revision 0.24).
16 * To enumerate the audio outputs the VIDIOC_ENUMAUDOUT should be
17 * called.
18 *
19 */
20
21 #include <stdio.h>
22 #include <sys/types.h>
23 #include <sys/stat.h>
24 #include <fcntl.h>
25 #include <unistd.h>
26 #include <sys/ioctl.h>
27 #include <errno.h>
28 #include <string.h>
29
30 #include <linux/videodev2.h>
31 #include <linux/errno.h>
32
33 #include <CUnit/CUnit.h>
34 #include <CUnit/Basic.h>
35
36 #include "v4l2_test.h"
37 #include "dev_video.h"
38 #include "video_limits.h"
39 #include "v4l2_validator.h"
40
41 #include "test_VIDIOC_ENUMAUDOUT.h"
42
test_VIDIOC_ENUMAUDOUT()43 void test_VIDIOC_ENUMAUDOUT()
44 {
45 int ret_enum, errno_enum;
46 struct v4l2_audioout audioout;
47 struct v4l2_audioout audioout2;
48 __u32 i;
49
50 i = 0;
51 do {
52 memset(&audioout, 0xff, sizeof(audioout));
53 audioout.index = i;
54 ret_enum = ioctl(get_video_fd(), VIDIOC_ENUMAUDOUT, &audioout);
55 errno_enum = errno;
56
57 dprintf("\tVIDIOC_ENUMAUDOUT, ret_enum=%i, errno_enum=%i\n",
58 ret_enum, errno_enum);
59
60 if (ret_enum == 0) {
61 CU_ASSERT_EQUAL(ret_enum, 0);
62 CU_ASSERT_EQUAL(audioout.index, i);
63
64 CU_ASSERT(0 < strlen((char *)audioout.name));
65 CU_ASSERT(valid_string
66 ((char *)audioout.name,
67 sizeof(audioout.name)));
68
69 //CU_ASSERT_EQUAL(audioout.capability, ?);
70 //CU_ASSERT_EQUAL(audioout.mode, ?);
71 CU_ASSERT_EQUAL(audioout.reserved[0], 0);
72 CU_ASSERT_EQUAL(audioout.reserved[1], 0);
73
74 /* Check if the unused bytes of the name string are
75 * also filled with zeros. Also check if there is any
76 * padding byte between any two fields then this
77 * padding byte is also filled with zeros.
78 */
79 memset(&audioout2, 0, sizeof(audioout2));
80 audioout2.index = audioout.index;
81 strncpy((char *)audioout2.name, (char *)audioout.name,
82 sizeof(audioout2.name));
83 audioout2.capability = audioout.capability;
84 audioout2.mode = audioout.mode;
85 CU_ASSERT_EQUAL(memcmp
86 (&audioout, &audioout2,
87 sizeof(audioout)), 0);
88
89 dprintf("\taudioout = {.index=%u, .name=\"%s\", "
90 ".capability=0x%X, .mode=0x%X, "
91 ".reserved[]={ 0x%X, 0x%X } }\n",
92 audioout.index,
93 audioout.name,
94 audioout.capability,
95 audioout.mode,
96 audioout.reserved[0], audioout.reserved[1]
97 );
98
99 } else {
100 CU_ASSERT_EQUAL(ret_enum, -1);
101 CU_ASSERT_EQUAL(errno_enum, EINVAL);
102
103 /* check whether the structure is untouched */
104 memset(&audioout2, 0xff, sizeof(audioout2));
105 audioout2.index = i;
106 CU_ASSERT_EQUAL(memcmp
107 (&audioout, &audioout2,
108 sizeof(audioout)), 0);
109
110 }
111 i++;
112 } while (ret_enum == 0);
113
114 }
115
test_VIDIOC_ENUMAUDOUT_S32_MAX()116 void test_VIDIOC_ENUMAUDOUT_S32_MAX()
117 {
118 int ret_enum, errno_enum;
119 struct v4l2_audioout audioout;
120 struct v4l2_audioout audioout2;
121
122 memset(&audioout, 0xff, sizeof(audioout));
123 audioout.index = (__u32) S32_MAX;
124 ret_enum = ioctl(get_video_fd(), VIDIOC_ENUMAUDOUT, &audioout);
125 errno_enum = errno;
126
127 CU_ASSERT_EQUAL(ret_enum, -1);
128 CU_ASSERT_EQUAL(errno_enum, EINVAL);
129
130 /* Check whether the original audioout struct is untouched */
131 memset(&audioout2, 0xff, sizeof(audioout2));
132 audioout2.index = (__u32) S32_MAX;
133 CU_ASSERT_EQUAL(memcmp(&audioout, &audioout2, sizeof(audioout)), 0);
134 }
135
test_VIDIOC_ENUMAUDOUT_S32_MAX_1()136 void test_VIDIOC_ENUMAUDOUT_S32_MAX_1()
137 {
138 int ret_enum, errno_enum;
139 struct v4l2_audioout audioout;
140 struct v4l2_audioout audioout2;
141
142 memset(&audioout, 0xff, sizeof(audioout));
143 audioout.index = ((__u32) S32_MAX) + 1;
144 ret_enum = ioctl(get_video_fd(), VIDIOC_ENUMAUDOUT, &audioout);
145 errno_enum = errno;
146
147 CU_ASSERT_EQUAL(ret_enum, -1);
148 CU_ASSERT_EQUAL(errno_enum, EINVAL);
149
150 /* Check whether the original audioout struct is untouched */
151 memset(&audioout2, 0xff, sizeof(audioout2));
152 audioout2.index = ((__u32) S32_MAX) + 1;
153 CU_ASSERT_EQUAL(memcmp(&audioout, &audioout2, sizeof(audioout)), 0);
154 }
155
test_VIDIOC_ENUMAUDOUT_U32_MAX()156 void test_VIDIOC_ENUMAUDOUT_U32_MAX()
157 {
158 int ret_enum, errno_enum;
159 struct v4l2_audioout audioout;
160 struct v4l2_audioout audioout2;
161
162 memset(&audioout, 0xff, sizeof(audioout));
163 audioout.index = U32_MAX;
164 ret_enum = ioctl(get_video_fd(), VIDIOC_ENUMAUDOUT, &audioout);
165 errno_enum = errno;
166
167 CU_ASSERT_EQUAL(ret_enum, -1);
168 CU_ASSERT_EQUAL(errno_enum, EINVAL);
169
170 /* Check whether the original audioout struct is untouched */
171 memset(&audioout2, 0xff, sizeof(audioout2));
172 audioout2.index = U32_MAX;
173 CU_ASSERT_EQUAL(memcmp(&audioout, &audioout2, sizeof(audioout)), 0);
174 }
175
test_VIDIOC_ENUMAUDOUT_NULL()176 void test_VIDIOC_ENUMAUDOUT_NULL()
177 {
178 int ret_enum, errno_enum;
179 struct v4l2_audioout audioout;
180 int ret_null, errno_null;
181
182 memset(&audioout, 0, sizeof(audioout));
183 audioout.index = 0;
184 ret_enum = ioctl(get_video_fd(), VIDIOC_ENUMAUDOUT, &audioout);
185 errno_enum = errno;
186
187 dprintf("\t%s:%u: VIDIOC_ENUMAUDOUT, ret_enum=%i, errno_enum=%i\n",
188 __FILE__, __LINE__, ret_enum, errno_enum);
189
190 ret_null = ioctl(get_video_fd(), VIDIOC_ENUMAUDOUT, NULL);
191 errno_null = errno;
192
193 dprintf("\t%s:%u: VIDIOC_ENUMAUDOUT, ret_null=%i, errno_null=%i\n",
194 __FILE__, __LINE__, ret_null, errno_null);
195
196 if (ret_enum == 0) {
197 CU_ASSERT_EQUAL(ret_enum, 0);
198 CU_ASSERT_EQUAL(ret_null, -1);
199 CU_ASSERT_EQUAL(errno_null, EFAULT);
200 } else {
201 CU_ASSERT_EQUAL(ret_enum, -1);
202 CU_ASSERT_EQUAL(errno_enum, EINVAL);
203 CU_ASSERT_EQUAL(ret_null, -1);
204 CU_ASSERT_EQUAL(errno_null, EINVAL);
205 }
206
207 }
208