[igt-dev] [PATCH 2/2] tests/fbdev: Add tests for read/write ops on framebuffer
Thomas Zimmermann
tzimmermann at suse.de
Tue Nov 3 10:48:13 UTC 2020
Read and write tests check the read and written buffer against the
content of the mapped framebuffer. Fbdev has some specific behavior
when reading/writing near the EOF, which the eof test checks.
Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
---
tests/fbdev.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 80 insertions(+)
diff --git a/tests/fbdev.c b/tests/fbdev.c
index 11df954d..045b0874 100644
--- a/tests/fbdev.c
+++ b/tests/fbdev.c
@@ -25,6 +25,7 @@
#include "igt.h"
+#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <sys/ioctl.h>
@@ -43,6 +44,7 @@ igt_main
struct fb_fix_screeninfo fix_info;
int fd = -1;
void *map = NULL;
+ void *buf = NULL;
/*
* Should this test focus on the fbdev independent of any drm driver,
@@ -82,7 +84,85 @@ igt_main
memset(map, 0, fix_info.smem_len);
}
+ igt_subtest("read") {
+ ssize_t ret;
+ int cmp;
+
+ /* allocate two additional byte for eof test */
+ buf = malloc(fix_info.smem_len + 2);
+ igt_assert(buf);
+
+ /* framebuffer should be 0 from mmap test */
+ ret = pread(fd, buf, fix_info.smem_len, 0);
+ igt_require_f(ret == (ssize_t)fix_info.smem_len, "pread failed\n");
+ cmp = memcmp(map, buf, fix_info.smem_len);
+ igt_require_f(!cmp, "read buffer differs from mapped framebuffer for 0\n");
+
+ /* fill framebuffer with 0x55 and compare again */
+ memset(map, 0x55, fix_info.smem_len);
+ ret = pread(fd, buf, fix_info.smem_len, 0);
+ igt_require_f(ret == (ssize_t)fix_info.smem_len, "pread failed\n");
+ cmp = memcmp(map, buf, fix_info.smem_len);
+ igt_require_f(!cmp, "read buffer differs from mapped framebuffer for 0x55\n");
+ }
+
+ igt_subtest("write") {
+ ssize_t ret;
+ int cmp;
+
+ /* clear framebuffer and compare again */
+ memset(buf, 0, fix_info.smem_len);
+ ret = pwrite(fd, buf, fix_info.smem_len, 0);
+ igt_require_f(ret == (ssize_t)fix_info.smem_len, "pwrite failed\n");
+ cmp = memcmp(map, buf, fix_info.smem_len);
+ igt_require_f(!cmp, "write buffer differs from mapped framebuffer for 0\n");
+ }
+
+ igt_subtest("eof") {
+ unsigned long lastindex = fix_info.smem_len - 1;
+ unsigned char *maplast = &((unsigned char *)map)[lastindex];
+ unsigned char *buflast = &((unsigned char *)buf)[lastindex];
+ long long ret;
+
+ *buflast = 0x55;
+
+ /* write across EOF; set remaining bytes */
+ ret = (long long)pwrite(fd, buflast, 2, lastindex);
+ igt_require_f(ret == 1, "write crossed EOF, ret=%lld\n", ret);
+ igt_require_f(*maplast == *buflast, "write buffer differs from mapped framebuffer at final byte, "
+ "maplast=%u buflast=%u\n", *maplast, *buflast);
+
+ /* write at EOF; get ENOSPC */
+ ret = (long long)pwrite(fd, &buflast[1], 1, lastindex + 1);
+ igt_require_f((ret == -1) && (errno == ENOSPC), "write at EOF, ret=%lld\n", ret);
+
+ *maplast = 0;
+
+ /* write final byte */
+ ret = (long long)pwrite(fd, buflast, 1, lastindex);
+ igt_require_f(ret == 1, "write before EOF, ret=%lld\n", ret);
+ igt_require_f(*maplast == *buflast, "write buffer differs from mapped framebuffer at final byte, "
+ "maplast=%u buflast=%u\n", *maplast, *buflast);
+
+ /* write after EOF; get EFBIG */
+ ret = (long long)pwrite(fd, &buflast[2], 1, lastindex + 2);
+ igt_require_f((ret == -1) && (errno == EFBIG), "write after EOF, ret=%lld\n", ret);
+
+ *maplast = 0;
+
+ /* read across the EOF; get remaining bytes */
+ ret = (long long)pread(fd, buflast, 2, lastindex);
+ igt_require_f(ret == 1, "read before EOF\n");
+ igt_require_f(*maplast == *buflast, "read buffer differs from mapped framebuffer at final byte, "
+ "maplast=%u buflast=%u\n", *maplast, *buflast);
+
+ /* read after EOF; get 0 */
+ ret = (long long)pread(fd, &buflast[1], 1, lastindex + 1);
+ igt_require_f(ret == 0, "read at EOF, ret=%lld\n", ret);
+ }
+
igt_fixture {
+ free(buf);
if (map && map != MAP_FAILED)
munmap(map, fix_info.smem_len);
close(fd);
--
2.29.0
More information about the igt-dev
mailing list