blob: a896beba979cd05ab91f5f43f540619326b7357f [file] [log] [blame]
/*
* v4l-test: Test environment for Video For Linux Two API
*
* 20 Apr 2009 0.5 Added string content validation
* 18 Apr 2009 0.4 More strict check for strings
* 29 Mar 2009 0.3 Clean up ret and errno variable names and dprintf() output
* 22 Dec 2008 0.2 Test case with NULL parameter added
* 18 Dec 2008 0.1 First release
*
* Written by Márton Németh <nm127@freemail.hu>
* Released under GPL
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <string.h>
#include <linux/videodev2.h>
#include <linux/errno.h>
#include <CUnit/CUnit.h>
#include <CUnit/Basic.h>
#include "v4l2_test.h"
#include "dev_video.h"
#include "video_limits.h"
#include "v4l2_validator.h"
#include "test_VIDIOC_QUERYCAP.h"
int valid_capabilities(__u32 capabilities) {
int valid = 1;
if ((capabilities & ~(V4L2_CAP_VIDEO_CAPTURE |
V4L2_CAP_VIDEO_OUTPUT |
V4L2_CAP_VIDEO_OVERLAY |
V4L2_CAP_VBI_CAPTURE |
V4L2_CAP_VBI_OUTPUT |
V4L2_CAP_SLICED_VBI_CAPTURE |
V4L2_CAP_SLICED_VBI_OUTPUT |
V4L2_CAP_RDS_CAPTURE |
V4L2_CAP_VIDEO_OUTPUT_OVERLAY |
V4L2_CAP_TUNER |
V4L2_CAP_AUDIO |
V4L2_CAP_RADIO |
V4L2_CAP_READWRITE |
V4L2_CAP_ASYNCIO |
V4L2_CAP_STREAMING)) != 0) {
valid = 0;
}
return valid;
}
void test_VIDIOC_QUERYCAP() {
int ret;
struct v4l2_capability cap;
struct v4l2_capability cap2;
memset(&cap, 0xff, sizeof(cap));
ret = ioctl(get_video_fd(), VIDIOC_QUERYCAP, &cap);
dprintf("VIDIOC_QUERYCAP, ret=%i\n", ret);
dprintf("\tcap = { .driver = \"%s\", .card = \"%s\", "
".bus_info = \"%s\", "
".version = %u.%u.%u, "
".capabilities = 0x%X, "
".reserved[]={ 0x%X, 0x%X, 0x%X, 0x%X } }\n",
cap.driver,
cap.card,
cap.bus_info,
(cap.version >> 16) & 0xFF,
(cap.version >> 8) & 0xFF,
cap.version & 0xFF,
cap.capabilities,
cap.reserved[0],
cap.reserved[1],
cap.reserved[2],
cap.reserved[3]
);
/* This ioctl must be implemented by ALL drivers */
CU_ASSERT_EQUAL(ret, 0);
if (ret == 0) {
CU_ASSERT(0 < strlen( (char*)cap.driver) );
CU_ASSERT(valid_string((char*)cap.driver, sizeof(cap.driver)));
CU_ASSERT(0 < strlen( (char*)cap.card) );
CU_ASSERT(valid_string((char*)cap.card, sizeof(cap.card)));
/* cap.bus_info is allowed to be an empty string ("") if no
* is info available
*/
CU_ASSERT(valid_string((char*)cap.bus_info, sizeof(cap.bus_info)));
//CU_ASSERT_EQUAL(cap.version, ?);
CU_ASSERT(valid_capabilities(cap.capabilities));
CU_ASSERT_EQUAL(cap.reserved[0], 0);
CU_ASSERT_EQUAL(cap.reserved[1], 0);
CU_ASSERT_EQUAL(cap.reserved[2], 0);
CU_ASSERT_EQUAL(cap.reserved[3], 0);
/* Check if the unused bytes of the driver, card and bus_info
* strings are also filled with zeros. Also check if there is
* any padding byte between any two fields then this padding
* byte is also filled with zeros.
*/
memset(&cap2, 0, sizeof(cap2));
strncpy((char*)cap2.driver, (char*)cap.driver, sizeof(cap2.driver));
strncpy((char*)cap2.card, (char*)cap.card, sizeof(cap2.card));
strncpy((char*)cap2.bus_info, (char*)cap.bus_info, sizeof(cap2.bus_info));
cap2.version = cap.version;
cap2.capabilities = cap.capabilities;
CU_ASSERT_EQUAL(memcmp(&cap, &cap2, sizeof(cap)), 0);
}
}
void test_VIDIOC_QUERYCAP_NULL() {
int ret_null, errno_null;
ret_null = ioctl(get_video_fd(), VIDIOC_QUERYCAP, NULL);
errno_null = errno;
dprintf("\t%s:%u: VIDIOC_QUERYCAP, ret_null=%i, errno_null=%i\n",
__FILE__, __LINE__, ret_null, errno_null);
/* VIDIOC_QUERYCAP is a mandatory command, all drivers shall
* support it. The parameter shall be always tested.
*/
CU_ASSERT_EQUAL(ret_null, -1);
CU_ASSERT_EQUAL(errno_null, EFAULT);
}