1/*
2 * Copyright (c) 2015 Cedric Hnyda <chnyda@suse.com>
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of
7 * the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it would be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write the Free Software Foundation,
16 * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17 */
18
19 /*
20  *  Create a virtual device (mouse), send events to /dev/uinput
21  *  and check that the events are not received in /dev/input/eventX
22  *  because the device is grabbed by another process
23  */
24
25#include <linux/input.h>
26
27#include "test.h"
28#include "safe_macros.h"
29#include "lapi/fcntl.h"
30#include "input_helper.h"
31
32#define NB_TEST 20
33
34static void setup(void);
35static void send_information(void);
36static void cleanup(void);
37
38static int fd;
39static int fd2;
40
41char *TCID = "input02";
42
43int main(int ac, char **av)
44{
45	int lc;
46	int pid;
47
48	tst_parse_opts(ac, av, NULL, NULL);
49
50	setup();
51
52	for (lc = 0; TEST_LOOPING(lc); ++lc) {
53		pid = tst_fork();
54
55		fd2 = open_device();
56
57		switch (pid) {
58		case 0:
59			send_information();
60			exit(0);
61		case -1:
62			tst_brkm(TBROK | TERRNO, cleanup, "fork() failed");
63		default:
64			if (no_events_queued(fd2))
65				tst_resm(TPASS, "No data received in eventX");
66			else
67				tst_resm(TFAIL, "Data received in eventX");
68			SAFE_CLOSE(NULL, fd2);
69		break;
70		}
71
72		SAFE_WAITPID(NULL, pid, NULL, 0);
73	}
74
75	cleanup();
76	tst_exit();
77}
78
79static void setup(void)
80{
81	tst_require_root();
82
83	fd = open_uinput();
84	setup_mouse_events(fd);
85	create_device(fd);
86}
87
88static void send_information(void)
89{
90	int nb;
91
92	SAFE_IOCTL(NULL, fd2, EVIOCGRAB, 1);
93	tst_resm(TINFO, "The virtual device was grabbed");
94
95	for (nb = 0; nb < NB_TEST; ++nb) {
96		send_rel_move(fd, 10, 1);
97		usleep(1000);
98	}
99
100	SAFE_CLOSE(NULL, fd2);
101}
102
103static void cleanup(void)
104{
105	destroy_device(fd);
106}
107