Home | History | Annotate | Download | only in input
      1 /*
      2  * Copyright (c) 2015 Cedric Hnyda <chnyda (at) 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 empty events to /dev/uinput
     21   *  and check that the events are not received in /dev/inputX
     22   */
     23 
     24 #include <linux/input.h>
     25 
     26 #include "test.h"
     27 #include "safe_macros.h"
     28 #include "lapi/fcntl.h"
     29 #include "input_helper.h"
     30 
     31 #define NB_TEST 20
     32 
     33 static void setup(void);
     34 static void send_events(void);
     35 static void cleanup(void);
     36 
     37 static int fd, fd2;
     38 
     39 char *TCID = "input04";
     40 
     41 int main(int ac, char **av)
     42 {
     43 	int lc;
     44 	int pid;
     45 
     46 	tst_parse_opts(ac, av, NULL, NULL);
     47 
     48 	setup();
     49 
     50 	for (lc = 0; TEST_LOOPING(lc); ++lc) {
     51 		pid = tst_fork();
     52 
     53 		switch (pid) {
     54 		case 0:
     55 			send_events();
     56 			exit(0);
     57 		case -1:
     58 			tst_brkm(TBROK | TERRNO, cleanup, "fork() failed");
     59 		default:
     60 			if (no_events_queued(fd2, 1))
     61 				tst_resm(TPASS,
     62 					"No data received in /dev/inputX");
     63 			else
     64 				tst_resm(TFAIL,
     65 					"Data received /dev/inputX");
     66 		break;
     67 		}
     68 
     69 		SAFE_WAITPID(NULL, pid, NULL, 0);
     70 	}
     71 
     72 	cleanup();
     73 	tst_exit();
     74 }
     75 
     76 static void setup(void)
     77 {
     78 	tst_require_root();
     79 
     80 	fd = open_uinput();
     81 	setup_mouse_events(fd);
     82 	create_device(fd);
     83 
     84 	fd2 = open_device();
     85 }
     86 
     87 static void send_events(void)
     88 {
     89 	int nb;
     90 
     91 	for (nb = 0; nb < NB_TEST; ++nb) {
     92 		send_rel_move(fd, 0, 0);
     93 		usleep(1000);
     94 	}
     95 }
     96 
     97 static void cleanup(void)
     98 {
     99 	if (fd2 > 0 && close(fd2))
    100 		tst_resm(TWARN | TERRNO, "close(fd2)");
    101 
    102 	destroy_device(fd);
    103 }
    104