1976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda/*
2976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda * Copyright (c) 2015 Cedric Hnyda <chnyda@suse.com>
3976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda *
4976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda * This program is free software; you can redistribute it and/or
5976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda * modify it under the terms of the GNU General Public License as
6976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda * published by the Free Software Foundation; either version 2 of
7976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda * the License, or (at your option) any later version.
8976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda *
9976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda * This program is distributed in the hope that it would be useful,
10976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda * but WITHOUT ANY WARRANTY; without even the implied warranty of
11976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda * GNU General Public License for more details.
13976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda *
14976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda * You should have received a copy of the GNU General Public License
15976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda * along with this program; if not, write the Free Software Foundation,
16976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda */
18976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda
19976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda /*
20976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda  *  Create a virtual device (mouse), send empty events to /dev/uinput
21976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda  *  and check that the events are not received in /dev/inputX
22976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda  */
23976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda
24976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda#include <linux/input.h>
25976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda
26976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda#include "test.h"
27976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda#include "safe_macros.h"
28976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda#include "lapi/fcntl.h"
29976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda#include "input_helper.h"
30976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda
31976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda#define NB_TEST 20
32976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda
33976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnydastatic void setup(void);
34976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnydastatic void send_events(void);
35976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnydastatic void cleanup(void);
36976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda
37976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnydastatic int fd, fd2;
38976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda
39976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnydachar *TCID = "input04";
40976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda
41976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnydaint main(int ac, char **av)
42976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda{
43976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda	int lc;
44976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda	int pid;
45976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda
46976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda	tst_parse_opts(ac, av, NULL, NULL);
47976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda
48976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda	setup();
49976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda
50976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda	for (lc = 0; TEST_LOOPING(lc); ++lc) {
51976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda		pid = tst_fork();
52976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda
53976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda		switch (pid) {
54976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda		case 0:
55976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda			send_events();
56976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda			exit(0);
57976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda		case -1:
58976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda			tst_brkm(TBROK | TERRNO, cleanup, "fork() failed");
59976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda		default:
60976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda			if (no_events_queued(fd2))
61976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda				tst_resm(TPASS,
62976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda					"No data received in /dev/inputX");
63976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda			else
64976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda				tst_resm(TFAIL,
65976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda					"Data received /dev/inputX");
66976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda		break;
67976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda		}
68976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda
69976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda		SAFE_WAITPID(NULL, pid, NULL, 0);
70976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda	}
71976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda
72976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda	cleanup();
73976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda	tst_exit();
74976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda}
75976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda
76976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnydastatic void setup(void)
77976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda{
78976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda	tst_require_root();
79976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda
80976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda	fd = open_uinput();
81976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda	setup_mouse_events(fd);
82976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda	create_device(fd);
83976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda
84976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda	fd2 = open_device();
85976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda}
86976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda
87976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnydastatic void send_events(void)
88976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda{
89976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda	int nb;
90976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda
91976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda	for (nb = 0; nb < NB_TEST; ++nb) {
92976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda		send_rel_move(fd, 0, 0);
93976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda		usleep(1000);
94976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda	}
95976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda}
96976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda
97976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnydastatic void cleanup(void)
98976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda{
99976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda	if (fd2 > 0 && close(fd2))
100976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda		tst_resm(TWARN | TERRNO, "close(fd2)");
101976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda
102976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda	destroy_device(fd);
103976c9c736c3afbbefe14930601aa5972da1709f9Cedric Hnyda}
104