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