blob: 3ec7aff247cbaea321b25834106ca5bb56853d86 [file] [log] [blame]
/*
* v4l-test: Test environment for Video For Linux Two API
*
* 19 May 2009 0.1 First release
*
* Written by Márton Németh <nm127@freemail.hu>
* Released under GPL
*/
/*
* Note: V4L2_CID_LASTP1 != V4L2_CID_BASE_LASTP1
*/
#include <sys/ioctl.h>
#include <errno.h>
#include <string.h>
#include <linux/videodev2.h>
#include <linux/errno.h>
#include <CUnit/CUnit.h>
#include "v4l2_test.h"
#include "dev_video.h"
#include "video_limits.h"
#include "test_VIDIOC_EXT_CTRLS.h"
void test_VIDIOC_G_EXT_CTRLS_zero() {
struct v4l2_ext_controls controls;
int ret_get, errno_get;
memset(&controls, 0xff, sizeof(controls));
controls.ctrl_class = V4L2_CTRL_CLASS_USER;
controls.count = 0;
controls.controls = NULL;
ret_get = ioctl(get_video_fd(), VIDIOC_G_EXT_CTRLS, &controls);
errno_get = errno;
dprintf("\t%s:%u: VIDIOC_G_EXT_CTRLS, ret_get=%i, errno_get=%i\n",
__FILE__, __LINE__, ret_get, errno_get);
if (ret_get == 0) {
CU_ASSERT_EQUAL(ret_get, 0);
CU_ASSERT_EQUAL(controls.ctrl_class, V4L2_CTRL_CLASS_USER);
CU_ASSERT_EQUAL(controls.count, 0);
// The value of controls.error_idx is not defined when ret_get == 0
CU_ASSERT_EQUAL(controls.reserved[0], 0);
CU_ASSERT_EQUAL(controls.reserved[1], 0);
CU_ASSERT_EQUAL(controls.controls, NULL);
} else {
CU_ASSERT_EQUAL(ret_get, -1);
CU_ASSERT_EQUAL(errno_get, EINVAL);
}
}
void test_VIDIOC_G_EXT_CTRLS_zero_invalid_count() {
struct v4l2_ext_controls controls;
int ret_get, errno_get;
int ret_get_invalid, errno_get_invalid;
__u32 count;
count = 0;
memset(&controls, 0, sizeof(controls));
controls.ctrl_class = V4L2_CTRL_CLASS_USER;
controls.count = count;
controls.controls = NULL;
ret_get = ioctl(get_video_fd(), VIDIOC_G_EXT_CTRLS, &controls);
errno_get = errno;
dprintf("\t%s:%u: VIDIOC_G_EXT_CTRLS, count=0%x, ret_get=%i, errno_get=%i\n",
__FILE__, __LINE__, count, ret_get, errno_get);
count = 1;
/* Note: this loop also covers ((__u32)S32_MAX)+1 = 0x80000000 */
do {
memset(&controls, 0xff, sizeof(controls));
controls.ctrl_class = V4L2_CTRL_CLASS_USER;
controls.count = count;
controls.controls = NULL;
ret_get_invalid = ioctl(get_video_fd(), VIDIOC_G_EXT_CTRLS, &controls);
errno_get_invalid = errno;
dprintf("\t%s:%u: VIDIOC_G_EXT_CTRLS, count=0x%x, ret_get_invalid=%i, errno_get_invalid=%i\n",
__FILE__, __LINE__, count, ret_get_invalid, errno_get_invalid);
if (ret_get == 0) {
CU_ASSERT_EQUAL(ret_get, 0);
/* if the VIDIOC_G_EXT_CTRLS is supported by the driver
* it shall complain about the NULL pointer at
* cotrols.controls because this does not match the
* controls.count value
*/
CU_ASSERT_EQUAL(ret_get_invalid, -1);
CU_ASSERT(errno_get_invalid == EFAULT || errno_get_invalid == ENOMEM);
} else {
CU_ASSERT_EQUAL(ret_get, -1);
CU_ASSERT_EQUAL(errno_get, EINVAL);
CU_ASSERT_EQUAL(ret_get_invalid, -1);
CU_ASSERT_EQUAL(errno_get_invalid, EINVAL);
}
count <<= 1;
} while (count != 0);
count = (__u32)S32_MAX;
memset(&controls, 0xff, sizeof(controls));
controls.ctrl_class = V4L2_CTRL_CLASS_USER;
controls.count = count;
controls.controls = NULL;
ret_get_invalid = ioctl(get_video_fd(), VIDIOC_G_EXT_CTRLS, &controls);
errno_get_invalid = errno;
dprintf("\t%s:%u: VIDIOC_G_EXT_CTRLS, count=0x%x, ret_get_invalid=%i, errno_get_invalid=%i\n",
__FILE__, __LINE__, count, ret_get_invalid, errno_get_invalid);
if (ret_get == 0) {
CU_ASSERT_EQUAL(ret_get, 0);
CU_ASSERT_EQUAL(ret_get_invalid, -1);
CU_ASSERT(errno_get_invalid == EFAULT || errno_get_invalid == ENOMEM);
} else {
CU_ASSERT_EQUAL(ret_get, -1);
CU_ASSERT_EQUAL(errno_get, EINVAL);
CU_ASSERT_EQUAL(ret_get_invalid, -1);
CU_ASSERT_EQUAL(errno_get_invalid, EINVAL);
}
count = U32_MAX;
memset(&controls, 0xff, sizeof(controls));
controls.ctrl_class = V4L2_CTRL_CLASS_USER;
controls.count = count;
controls.controls = NULL;
ret_get_invalid = ioctl(get_video_fd(), VIDIOC_G_EXT_CTRLS, &controls);
errno_get_invalid = errno;
dprintf("\t%s:%u: VIDIOC_G_EXT_CTRLS, count=0x%x, ret_get_invalid=%i, errno_get_invalid=%i\n",
__FILE__, __LINE__, count, ret_get_invalid, errno_get_invalid);
if (ret_get == 0) {
CU_ASSERT_EQUAL(ret_get, 0);
CU_ASSERT_EQUAL(ret_get_invalid, -1);
CU_ASSERT(errno_get_invalid == EFAULT || errno_get_invalid == ENOMEM);
} else {
CU_ASSERT_EQUAL(ret_get, -1);
CU_ASSERT_EQUAL(errno_get, EINVAL);
CU_ASSERT_EQUAL(ret_get_invalid, -1);
CU_ASSERT_EQUAL(errno_get_invalid, EINVAL);
}
}
static int do_get_ext_control_one(__u32 ctrl_class, __u32 id) {
int ret_query, errno_query;
int ret_get, errno_get;
struct v4l2_queryctrl queryctrl;
struct v4l2_ext_controls controls;
struct v4l2_ext_control control;
/* The expected return value of VIDIOC_G_EXT_CTRLS depens on the value
* reported by VIDIOC_QUERYCTRL
*/
memset(&queryctrl, 0, sizeof(queryctrl));
queryctrl.id = id;
ret_query = ioctl(get_video_fd(), VIDIOC_QUERYCTRL, &queryctrl);
errno_query = errno;
dprintf("\t%s:%u: VIDIOC_QUERYCTRL, id=%u (V4L2_CID_BASE+%i), ret_query=%i, errno_query=%i\n",
__FILE__, __LINE__, id, id-V4L2_CID_BASE, ret_query, errno_query);
if (ret_query == 0) {
dprintf("\t%s:%u: queryctrl = {.id=%u, .type=%i, .name=\"%s\", "
".minimum=%i, .maximum=%i, .step=%i, "
".default_value=%i, "
".flags=0x%X, "
".reserved[]={ 0x%X, 0x%X } }\n",
__FILE__, __LINE__,
queryctrl.id,
queryctrl.type,
queryctrl.name,
queryctrl.minimum,
queryctrl.maximum,
queryctrl.step,
queryctrl.default_value,
queryctrl.flags,
queryctrl.reserved[0],
queryctrl.reserved[1]
);
}
memset(&control, 0xff, sizeof(control));
control.id = id;
memset(&controls, 0xff, sizeof(controls));
controls.ctrl_class = ctrl_class;
controls.count = 1;
controls.controls = &control;
ret_get = ioctl(get_video_fd(), VIDIOC_G_EXT_CTRLS, &controls);
errno_get = errno;
dprintf("\t%s:%u: VIDIOC_G_EXT_CTRLS, id=%u (V4L2_CID_BASE+%i), ret_get=%i, errno_get=%i\n",
__FILE__, __LINE__,
id, id-V4L2_CID_BASE, ret_get, errno_get);
if (ret_query == 0) {
CU_ASSERT_EQUAL(ret_query, 0);
switch (queryctrl.type) {
case V4L2_CTRL_TYPE_INTEGER:
case V4L2_CTRL_TYPE_BOOLEAN:
case V4L2_CTRL_TYPE_MENU:
if (ret_get == 0) {
CU_ASSERT_EQUAL(ret_get, 0);
CU_ASSERT(queryctrl.minimum <= control.value);
CU_ASSERT(control.value <= queryctrl.maximum);
} else {
/* This is the case when VIDIOC_G_CTRLS is not
* supported at all.
*/
CU_ASSERT_EQUAL(ret_get, -1);
CU_ASSERT_EQUAL(errno_get, EINVAL);
}
break;
case V4L2_CTRL_TYPE_BUTTON:
/* This control only performs an action, does not have
* any value
*/
CU_ASSERT_EQUAL(ret_get, -1);
CU_ASSERT_EQUAL(errno_get, EINVAL);
break;
case V4L2_CTRL_TYPE_INTEGER64: /* TODO: what about this case? */
case V4L2_CTRL_TYPE_CTRL_CLASS:
default:
CU_ASSERT_EQUAL(ret_get, -1);
CU_ASSERT_EQUAL(errno_get, EINVAL);
}
} else {
CU_ASSERT_EQUAL(ret_query, -1);
CU_ASSERT_EQUAL(errno_query, EINVAL);
CU_ASSERT_EQUAL(ret_get, -1);
CU_ASSERT_EQUAL(errno_get, EINVAL);
}
return ret_query;
}
void test_VIDIOC_G_EXT_CTRLS_one() {
int ret1;
__u32 i;
for (i = V4L2_CID_BASE; i < V4L2_CID_LASTP1; i++) {
ret1 = do_get_ext_control_one(V4L2_CTRL_CLASS_USER, i);
}
ret1 = do_get_ext_control_one(V4L2_CTRL_CLASS_USER, V4L2_CID_BASE-1);
ret1 = do_get_ext_control_one(V4L2_CTRL_CLASS_USER, V4L2_CID_LASTP1);
ret1 = do_get_ext_control_one(V4L2_CTRL_CLASS_USER, V4L2_CID_PRIVATE_BASE-1);
i = V4L2_CID_PRIVATE_BASE;
do {
ret1 = do_get_ext_control_one(V4L2_CTRL_CLASS_USER, i);
i++;
} while (ret1 == 0);
ret1 = do_get_ext_control_one(V4L2_CTRL_CLASS_USER, i);
}
void test_VIDIOC_G_EXT_CTRLS_NULL() {
struct v4l2_ext_controls controls;
int ret_get, errno_get;
int ret_null, errno_null;
memset(&controls, 0xff, sizeof(controls));
controls.ctrl_class = V4L2_CTRL_CLASS_USER;
controls.count = 0;
controls.controls = NULL;
ret_get = ioctl(get_video_fd(), VIDIOC_G_EXT_CTRLS, &controls);
errno_get = errno;
dprintf("\t%s:%u: VIDIOC_G_EXT_CTRLS, ret_get=%i, errno_get=%i\n",
__FILE__, __LINE__, ret_get, errno_get);
ret_null = ioctl(get_video_fd(), VIDIOC_G_EXT_CTRLS, NULL);
errno_null = errno;
dprintf("\t%s:%u: VIDIOC_G_EXT_CTRLS, ret_null=%i, errno_null=%i\n",
__FILE__, __LINE__, ret_null, errno_null);
if (ret_get == 0) {
CU_ASSERT_EQUAL(ret_get, 0);
CU_ASSERT_EQUAL(ret_null, -1);
CU_ASSERT_EQUAL(errno_null, EFAULT);
} else {
CU_ASSERT_EQUAL(ret_get, -1);
CU_ASSERT_EQUAL(errno_get, EINVAL);
CU_ASSERT_EQUAL(ret_null, -1);
CU_ASSERT_EQUAL(errno_null, EINVAL);
}
}
void test_VIDIOC_S_EXT_CTRLS_zero() {
struct v4l2_ext_controls controls;
int ret_set, errno_set;
memset(&controls, 0xff, sizeof(controls));
controls.ctrl_class = V4L2_CTRL_CLASS_USER;
controls.count = 0;
controls.controls = NULL;
ret_set = ioctl(get_video_fd(), VIDIOC_S_EXT_CTRLS, &controls);
errno_set = errno;
dprintf("\t%s:%u: VIDIOC_S_EXT_CTRLS, ret_set=%i, errno_set=%i\n",
__FILE__, __LINE__, ret_set, errno_set);
if (ret_set == 0) {
CU_ASSERT_EQUAL(ret_set, 0);
CU_ASSERT_EQUAL(controls.ctrl_class, V4L2_CTRL_CLASS_USER);
CU_ASSERT_EQUAL(controls.count, 0);
// The value of controls.error_idx is not defined when ret_set == 0
CU_ASSERT_EQUAL(controls.reserved[0], 0);
CU_ASSERT_EQUAL(controls.reserved[1], 0);
CU_ASSERT_EQUAL(controls.controls, NULL);
} else {
CU_ASSERT_EQUAL(ret_set, -1);
CU_ASSERT_EQUAL(errno_set, EINVAL);
}
}
void test_VIDIOC_S_EXT_CTRLS_zero_invalid_count() {
struct v4l2_ext_controls controls;
int ret_set, errno_set;
int ret_set_invalid, errno_set_invalid;
__u32 count;
count = 0;
memset(&controls, 0, sizeof(controls));
controls.ctrl_class = V4L2_CTRL_CLASS_USER;
controls.count = count;
controls.controls = NULL;
ret_set = ioctl(get_video_fd(), VIDIOC_S_EXT_CTRLS, &controls);
errno_set = errno;
dprintf("\t%s:%u: VIDIOC_S_EXT_CTRLS, count=0%x, ret_set=%i, errno_set=%i\n",
__FILE__, __LINE__, count, ret_set, errno_set);
count = 1;
/* Note: this loop also covers ((__u32)S32_MAX)+1 = 0x80000000 */
do {
memset(&controls, 0xff, sizeof(controls));
controls.ctrl_class = V4L2_CTRL_CLASS_USER;
controls.count = count;
controls.controls = NULL;
ret_set_invalid = ioctl(get_video_fd(), VIDIOC_S_EXT_CTRLS, &controls);
errno_set_invalid = errno;
dprintf("\t%s:%u: VIDIOC_S_EXT_CTRLS, count=0x%x, ret_set_invalid=%i, errno_set_invalid=%i\n",
__FILE__, __LINE__, count, ret_set_invalid, errno_set_invalid);
if (ret_set == 0) {
CU_ASSERT_EQUAL(ret_set, 0);
/* if the VIDIOC_S_EXT_CTRLS is supported by the driver
* it shall complain about the NULL pointer at
* cotrols.controls because this does not match the
* controls.count value
*/
CU_ASSERT_EQUAL(ret_set_invalid, -1);
CU_ASSERT(errno_set_invalid == EFAULT || errno_set_invalid == ENOMEM);
} else {
CU_ASSERT_EQUAL(ret_set, -1);
CU_ASSERT_EQUAL(errno_set, EINVAL);
CU_ASSERT_EQUAL(ret_set_invalid, -1);
CU_ASSERT_EQUAL(errno_set_invalid, EINVAL);
}
count <<= 1;
} while (count != 0);
count = (__u32)S32_MAX;
memset(&controls, 0xff, sizeof(controls));
controls.ctrl_class = V4L2_CTRL_CLASS_USER;
controls.count = count;
controls.controls = NULL;
ret_set_invalid = ioctl(get_video_fd(), VIDIOC_S_EXT_CTRLS, &controls);
errno_set_invalid = errno;
dprintf("\t%s:%u: VIDIOC_S_EXT_CTRLS, count=0x%x, ret_set_invalid=%i, errno_set_invalid=%i\n",
__FILE__, __LINE__, count, ret_set_invalid, errno_set_invalid);
if (ret_set == 0) {
CU_ASSERT_EQUAL(ret_set, 0);
CU_ASSERT_EQUAL(ret_set_invalid, -1);
CU_ASSERT(errno_set_invalid == EFAULT || errno_set_invalid == ENOMEM);
} else {
CU_ASSERT_EQUAL(ret_set, -1);
CU_ASSERT_EQUAL(errno_set, EINVAL);
CU_ASSERT_EQUAL(ret_set_invalid, -1);
CU_ASSERT_EQUAL(errno_set_invalid, EINVAL);
}
count = U32_MAX;
memset(&controls, 0xff, sizeof(controls));
controls.ctrl_class = V4L2_CTRL_CLASS_USER;
controls.count = count;
controls.controls = NULL;
ret_set_invalid = ioctl(get_video_fd(), VIDIOC_S_EXT_CTRLS, &controls);
errno_set_invalid = errno;
dprintf("\t%s:%u: VIDIOC_S_EXT_CTRLS, count=0x%x, ret_set_invalid=%i, errno_set_invalid=%i\n",
__FILE__, __LINE__, count, ret_set_invalid, errno_set_invalid);
if (ret_set == 0) {
CU_ASSERT_EQUAL(ret_set, 0);
CU_ASSERT_EQUAL(ret_set_invalid, -1);
CU_ASSERT(errno_set_invalid == EFAULT || errno_set_invalid == ENOMEM);
} else {
CU_ASSERT_EQUAL(ret_set, -1);
CU_ASSERT_EQUAL(errno_set, EINVAL);
CU_ASSERT_EQUAL(ret_set_invalid, -1);
CU_ASSERT_EQUAL(errno_set_invalid, EINVAL);
}
}
void test_VIDIOC_S_EXT_CTRLS_NULL() {
struct v4l2_ext_controls controls;
int ret_set, errno_set;
int ret_null, errno_null;
memset(&controls, 0xff, sizeof(controls));
controls.ctrl_class = V4L2_CTRL_CLASS_USER;
controls.count = 0;
controls.controls = NULL;
ret_set = ioctl(get_video_fd(), VIDIOC_S_EXT_CTRLS, &controls);
errno_set = errno;
dprintf("\t%s:%u: VIDIOC_S_EXT_CTRLS, ret_set=%i, errno_set=%i\n",
__FILE__, __LINE__, ret_set, errno_set);
ret_null = ioctl(get_video_fd(), VIDIOC_S_EXT_CTRLS, NULL);
errno_null = errno;
dprintf("\t%s:%u: VIDIOC_S_EXT_CTRLS, ret_null=%i, errno_null=%i\n",
__FILE__, __LINE__, ret_null, errno_null);
if (ret_set == 0) {
CU_ASSERT_EQUAL(ret_set, 0);
CU_ASSERT_EQUAL(ret_null, -1);
CU_ASSERT_EQUAL(errno_null, EFAULT);
} else {
CU_ASSERT_EQUAL(ret_set, -1);
CU_ASSERT_EQUAL(errno_set, EINVAL);
CU_ASSERT_EQUAL(ret_null, -1);
CU_ASSERT_EQUAL(errno_null, EINVAL);
}
}
void test_VIDIOC_TRY_EXT_CTRLS_zero() {
struct v4l2_ext_controls controls;
int ret_try, errno_try;
memset(&controls, 0xff, sizeof(controls));
controls.ctrl_class = V4L2_CTRL_CLASS_USER;
controls.count = 0;
controls.controls = NULL;
ret_try = ioctl(get_video_fd(), VIDIOC_TRY_EXT_CTRLS, &controls);
errno_try = errno;
dprintf("\t%s:%u: VIDIOC_TRY_EXT_CTRLS, ret_try=%i, errno_try=%i\n",
__FILE__, __LINE__, ret_try, errno_try);
if (ret_try == 0) {
CU_ASSERT_EQUAL(ret_try, 0);
CU_ASSERT_EQUAL(controls.ctrl_class, V4L2_CTRL_CLASS_USER);
CU_ASSERT_EQUAL(controls.count, 0);
// The value of controls.error_idx is not defined when ret_try == 0
CU_ASSERT_EQUAL(controls.reserved[0], 0);
CU_ASSERT_EQUAL(controls.reserved[1], 0);
CU_ASSERT_EQUAL(controls.controls, NULL);
} else {
CU_ASSERT_EQUAL(ret_try, -1);
CU_ASSERT_EQUAL(errno_try, EINVAL);
}
}
void test_VIDIOC_TRY_EXT_CTRLS_zero_invalid_count() {
struct v4l2_ext_controls controls;
int ret_try, errno_try;
int ret_try_invalid, errno_try_invalid;
__u32 count;
count = 0;
memset(&controls, 0, sizeof(controls));
controls.ctrl_class = V4L2_CTRL_CLASS_USER;
controls.count = count;
controls.controls = NULL;
ret_try = ioctl(get_video_fd(), VIDIOC_TRY_EXT_CTRLS, &controls);
errno_try = errno;
dprintf("\t%s:%u: VIDIOC_TRY_EXT_CTRLS, count=0x%x, ret_try=%i, errno_try=%i\n",
__FILE__, __LINE__, count, ret_try, errno_try);
count = 1;
/* Note: this loop also covers ((__u32)S32_MAX)+1 = 0x80000000 */
do {
memset(&controls, 0xff, sizeof(controls));
controls.ctrl_class = V4L2_CTRL_CLASS_USER;
controls.count = count;
controls.controls = NULL;
ret_try_invalid = ioctl(get_video_fd(), VIDIOC_TRY_EXT_CTRLS, &controls);
errno_try_invalid = errno;
dprintf("\t%s:%u: VIDIOC_TRY_EXT_CTRLS, count=0x%x, ret_try_invalid=%i, errno_try_invalid=%i\n",
__FILE__, __LINE__, count, ret_try_invalid, errno_try_invalid);
if (ret_try == 0) {
CU_ASSERT_EQUAL(ret_try, 0);
/* if the VIDIOC_TRY_EXT_CTRLS is supported by the driver
* it shall complain about the NULL pointer at
* cotrols.controls because this does not match the
* controls.count value
*/
CU_ASSERT_EQUAL(ret_try_invalid, -1);
CU_ASSERT(errno_try_invalid == EFAULT || errno_try_invalid == ENOMEM);
} else {
CU_ASSERT_EQUAL(ret_try, -1);
CU_ASSERT_EQUAL(errno_try, EINVAL);
CU_ASSERT_EQUAL(ret_try_invalid, -1);
CU_ASSERT_EQUAL(errno_try_invalid, EINVAL);
}
count <<= 1;
} while (count != 0);
count = (__u32)S32_MAX;
memset(&controls, 0xff, sizeof(controls));
controls.ctrl_class = V4L2_CTRL_CLASS_USER;
controls.count = count;
controls.controls = NULL;
ret_try_invalid = ioctl(get_video_fd(), VIDIOC_TRY_EXT_CTRLS, &controls);
errno_try_invalid = errno;
dprintf("\t%s:%u: VIDIOC_TRY_EXT_CTRLS, count=0x%x, ret_try_invalid=%i, errno_try_invalid=%i\n",
__FILE__, __LINE__, count, ret_try_invalid, errno_try_invalid);
if (ret_try == 0) {
CU_ASSERT_EQUAL(ret_try, 0);
CU_ASSERT_EQUAL(ret_try_invalid, -1);
CU_ASSERT(errno_try_invalid == EFAULT || errno_try_invalid == ENOMEM);
} else {
CU_ASSERT_EQUAL(ret_try, -1);
CU_ASSERT_EQUAL(errno_try, EINVAL);
CU_ASSERT_EQUAL(ret_try_invalid, -1);
CU_ASSERT_EQUAL(errno_try_invalid, EINVAL);
}
count = U32_MAX;
memset(&controls, 0xff, sizeof(controls));
controls.ctrl_class = V4L2_CTRL_CLASS_USER;
controls.count = count;
controls.controls = NULL;
ret_try_invalid = ioctl(get_video_fd(), VIDIOC_TRY_EXT_CTRLS, &controls);
errno_try_invalid = errno;
dprintf("\t%s:%u: VIDIOC_TRY_EXT_CTRLS, count=0x%x, ret_try_invalid=%i, errno_try_invalid=%i\n",
__FILE__, __LINE__, count, ret_try_invalid, errno_try_invalid);
if (ret_try == 0) {
CU_ASSERT_EQUAL(ret_try, 0);
CU_ASSERT_EQUAL(ret_try_invalid, -1);
CU_ASSERT(errno_try_invalid == EFAULT || errno_try_invalid == ENOMEM);
} else {
CU_ASSERT_EQUAL(ret_try, -1);
CU_ASSERT_EQUAL(errno_try, EINVAL);
CU_ASSERT_EQUAL(ret_try_invalid, -1);
CU_ASSERT_EQUAL(errno_try_invalid, EINVAL);
}
}
void test_VIDIOC_TRY_EXT_CTRLS_NULL() {
struct v4l2_ext_controls controls;
int ret_try, errno_try;
int ret_null, errno_null;
memset(&controls, 0xff, sizeof(controls));
controls.ctrl_class = V4L2_CTRL_CLASS_USER;
controls.count = 0;
controls.controls = NULL;
ret_try = ioctl(get_video_fd(), VIDIOC_TRY_EXT_CTRLS, &controls);
errno_try = errno;
dprintf("\t%s:%u: VIDIOC_TRY_EXT_CTRLS, ret_try=%i, errno_try=%i\n",
__FILE__, __LINE__, ret_try, errno_try);
ret_null = ioctl(get_video_fd(), VIDIOC_TRY_EXT_CTRLS, NULL);
errno_null = errno;
dprintf("\t%s:%u: VIDIOC_TRY_EXT_CTRLS, ret_null=%i, errno_null=%i\n",
__FILE__, __LINE__, ret_null, errno_null);
if (ret_try == 0) {
CU_ASSERT_EQUAL(ret_try, 0);
CU_ASSERT_EQUAL(ret_null, -1);
CU_ASSERT_EQUAL(errno_null, EFAULT);
} else {
CU_ASSERT_EQUAL(ret_try, -1);
CU_ASSERT_EQUAL(errno_try, EINVAL);
CU_ASSERT_EQUAL(ret_null, -1);
CU_ASSERT_EQUAL(errno_null, EINVAL);
}
}