diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/Makefile | 27 | ||||
| -rw-r--r-- | tests/Makefile.am | 23 | ||||
| -rw-r--r-- | tests/drmtest.c | 83 | ||||
| -rw-r--r-- | tests/drmtest.h | 37 | ||||
| -rw-r--r-- | tests/getclient.c | 60 | ||||
| -rw-r--r-- | tests/getversion.c | 47 | ||||
| -rw-r--r-- | tests/openclose.c | 37 | ||||
| -rw-r--r-- | tests/updatedraw.c | 127 | 
8 files changed, 414 insertions, 27 deletions
| diff --git a/tests/Makefile b/tests/Makefile deleted file mode 100644 index b406e0ad..00000000 --- a/tests/Makefile +++ /dev/null @@ -1,27 +0,0 @@ - -# These definitions are for handling dependencies in the out of kernel build. - -PROGS = dristat drmstat - -CLEANFILES = *.o *.ko $(PROGS) .depend .*.flags .*.d  - -# Build test utilities - -PRGCFLAGS = $(CFLAGS) -g -ansi -pedantic -DPOSIX_C_SOURCE=199309L \ -	    -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE \ -	    -I. -I../libdrm -I../shared-core - -DRMSTATLIBS = -L../libdrm -ldrm - - -programs: $(PROGS) - -dristat: dristat.c -	$(CC) $(PRGCFLAGS) $< -o $@ - -drmstat: drmstat.c -	$(CC) $(PRGCFLAGS) $< -o $@ $(DRMSTATLIBS) - -clean: -	rm -f $(CLEANFILES) - diff --git a/tests/Makefile.am b/tests/Makefile.am new file mode 100644 index 00000000..3b97fb79 --- /dev/null +++ b/tests/Makefile.am @@ -0,0 +1,23 @@ +AM_CFLAGS = \ +	-I $(top_srcdir)/shared-core + +noinst_PROGRAMS = \ +	dristat \ +	drmstat + +EXTRA_LTLIBRARIES = libdrmtest.la +libdrmtest_la_SOURCES = \ +	drmtest.c \ +	drmtest.h +libdrmtest_la_LIBADD = \ +	$(top_builddir)/libdrm/libdrm.la + +LDADD = libdrmtest.la + +TESTS = openclose \ +	getversion \ +	getclient \ +	updatedraw + +EXTRA_PROGRAMS = $(TESTS) +CLEANFILES = $(EXTRA_PROGRAMS) $(EXTRA_LTLIBRARIES)
\ No newline at end of file diff --git a/tests/drmtest.c b/tests/drmtest.c new file mode 100644 index 00000000..cae99a0c --- /dev/null +++ b/tests/drmtest.c @@ -0,0 +1,83 @@ +/* + * Copyright © 2007 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + *    Eric Anholt <eric@anholt.net> + * + */ + +#include <fcntl.h> +#include "drmtest.h" + +/** Open the first DRM device we can find, searching up to 16 device nodes */ +int drm_open_any(void) +{ +	char name[20]; +	int i, fd; + +	for (i = 0; i < 16; i++) { +		sprintf(name, "/dev/dri/card%d", i); +		fd = open(name, O_RDWR); +		if (fd != -1) +			return fd; +	} +	abort(); +} + + +/** + * Open the first DRM device we can find where we end up being the master. + */ +int drm_open_any_master(void) +{ +	char name[20]; +	int i, fd; + +	for (i = 0; i < 16; i++) { +		drm_client_t client; +		int ret; + +		sprintf(name, "/dev/dri/card%d", i); +		fd = open(name, O_RDWR); +		if (fd == -1) +			continue; + +		/* Check that we're the only opener and authed. */ +		client.idx = 0; +		ret = ioctl(fd, DRM_IOCTL_GET_CLIENT, &client); +		assert (ret == 0); +		if (!client.auth) { +			close(fd); +			continue; +		} +		client.idx = 1; +		ret = ioctl(fd, DRM_IOCTL_GET_CLIENT, &client); +		if (ret != -1 || errno != EINVAL) { +			close(fd); +			continue; +		} +		return fd; +	} +	fprintf(stderr, "Couldn't find an un-controlled DRM device\n"); +	abort(); +} + diff --git a/tests/drmtest.h b/tests/drmtest.h new file mode 100644 index 00000000..afa0df4a --- /dev/null +++ b/tests/drmtest.h @@ -0,0 +1,37 @@ +/* + * Copyright © 2007 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + *    Eric Anholt <eric@anholt.net> + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <assert.h> +#include <errno.h> + +#include "xf86drm.h" + +int drm_open_any(void); +int drm_open_any_master(void); diff --git a/tests/getclient.c b/tests/getclient.c new file mode 100644 index 00000000..349c16ec --- /dev/null +++ b/tests/getclient.c @@ -0,0 +1,60 @@ +/* + * Copyright © 2007 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + *    Eric Anholt <eric@anholt.net> + * + */ + +#include <limits.h> +#include "drmtest.h" + +/** + * Checks DRM_IOCTL_GET_CLIENT. + */ +int main(int argc, char **argv) +{ +	int fd, ret; +	drm_client_t client; + +	fd = drm_open_any(); + +	/* Look for client index 0.  This should exist whether we're operating +	 * on an otherwise unused drm device, or the X Server is running on +	 * the device. +	 */ +	client.idx = 0; +	ret = ioctl(fd, DRM_IOCTL_GET_CLIENT, &client); +	assert(ret == 0); + +	/* Look for some absurd client index and make sure it's invalid. +	 * The DRM drivers currently always return data, so the user has +	 * no real way to detect when the list has terminated.  That's bad, +	 * and this test is XFAIL as a result. +	 */ +	client.idx = 0x7fffffff; +	ret = ioctl(fd, DRM_IOCTL_GET_CLIENT, &client); +	assert(ret == -1 && errno == EINVAL); + +	close(fd); +	return 0; +} diff --git a/tests/getversion.c b/tests/getversion.c new file mode 100644 index 00000000..3de90de6 --- /dev/null +++ b/tests/getversion.c @@ -0,0 +1,47 @@ +/* + * Copyright © 2007 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + *    Eric Anholt <eric@anholt.net> + * + */ + +#include "drmtest.h" + +/** + * Checks DRM_IOCTL_GET_VERSION and libdrm's drmGetVersion() interface to it. + */ +int main(int argc, char **argv) +{ +	int fd; +	drmVersionPtr v; + +	fd = drm_open_any(); +	v = drmGetVersion(fd); +	assert(strlen(v->name) != 0); +	assert(strlen(v->date) != 0); +	assert(strlen(v->desc) != 0); +	assert(v->version_major >= 1); +	drmFree(v); +	close(fd); +	return 0; +} diff --git a/tests/openclose.c b/tests/openclose.c new file mode 100644 index 00000000..946a4459 --- /dev/null +++ b/tests/openclose.c @@ -0,0 +1,37 @@ +/* + * Copyright © 2007 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + *    Eric Anholt <eric@anholt.net> + * + */ + +#include "drmtest.h" + +int main(int argc, char **argv) +{ +	int fd; + +	fd = drm_open_any(); +	close(fd); +	return 0; +} diff --git a/tests/updatedraw.c b/tests/updatedraw.c new file mode 100644 index 00000000..1186783a --- /dev/null +++ b/tests/updatedraw.c @@ -0,0 +1,127 @@ +/* + * Copyright © 2007 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + *    Eric Anholt <eric@anholt.net> + * + */ + +#include "drmtest.h" + +static void +set_draw_cliprects_empty(int fd, int drawable) +{ +	int ret; +	struct drm_update_draw update; + +	update.handle = drawable; +	update.type = DRM_DRAWABLE_CLIPRECTS; +	update.num = 0; +	update.data = 0; + +	ret = ioctl(fd, DRM_IOCTL_UPDATE_DRAW, &update); +	assert(ret == 0); +} + +static void +set_draw_cliprects_empty_fail(int fd, int drawable) +{ +	int ret; +	struct drm_update_draw update; + +	update.handle = drawable; +	update.type = DRM_DRAWABLE_CLIPRECTS; +	update.num = 0; +	update.data = 0; + +	ret = ioctl(fd, DRM_IOCTL_UPDATE_DRAW, &update); +	assert(ret == -1 && errno == EINVAL); +} + +static void +set_draw_cliprects_2(int fd, int drawable) +{ +	int ret; +	struct drm_update_draw update; +	drm_clip_rect_t rects[2]; + +	rects[0].x1 = 0; +	rects[0].y1 = 0; +	rects[0].x2 = 10; +	rects[0].y2 = 10; + +	rects[1].x1 = 10; +	rects[1].y1 = 10; +	rects[1].x2 = 20; +	rects[1].y2 = 20; + +	update.handle = drawable; +	update.type = DRM_DRAWABLE_CLIPRECTS; +	update.num = 2; +	update.data = (unsigned long long)(uintptr_t)&rects; + +	ret = ioctl(fd, DRM_IOCTL_UPDATE_DRAW, &update); +	assert(ret == 0); +} + +/** + * Tests drawable management: adding, removing, and updating the cliprects of + * drawables. + */ +int main(int argc, char **argv) +{ +	drm_draw_t drawarg; +	int fd, ret, drawable; + +	fd = drm_open_any_master(); + +	/* Create a drawable. +	 * IOCTL_ADD_DRAW is RDWR, though it should really just be RD +	 */ +	drawarg.handle = 0; +	ret = ioctl(fd, DRM_IOCTL_ADD_DRAW, &drawarg); +	assert(ret == 0); +	drawable = drawarg.handle; + +	/* Do a series of cliprect updates */ +	set_draw_cliprects_empty(fd, drawable); +	set_draw_cliprects_2(fd, drawable); +	set_draw_cliprects_empty(fd, drawable); + +	/* Remove our drawable */ +	drawarg.handle = drawable; +	ret = ioctl(fd, DRM_IOCTL_RM_DRAW, &drawarg); +	assert(ret == 0); +	drawable = drawarg.handle; + +	/* Check that removing an unknown drawable returns error */ +	drawarg.handle = 0x7fffffff; +	ret = ioctl(fd, DRM_IOCTL_RM_DRAW, &drawarg); +	assert(ret == -1 && errno == EINVAL); +	drawable = drawarg.handle; + +	/* Attempt to set cliprects on a nonexistent drawable */ +	set_draw_cliprects_empty_fail(fd, drawable); + +	close(fd); +	return 0; +} | 
