[LTP] [PATCH v3] input/input06: Fix auto-repeat key test

Sandeep Patil sspatil@google.com
Tue Sep 5 23:43:44 CEST 2017


On Thu, Aug 31, 2017 at 02:45:47PM +0200, Cyril Hrubis wrote:
> Hi!
> > +static struct input_event *next_event()
>                                          ^
> 					 Old style definition,
> 					 checkpatch.pl should warn about
> 					 these

It didn't but my checkpatch.pl may have been slightly older. Will fix it
anyway.

> > +{
> > +	struct input_event *ev = NULL;
>                             ^
> 			    Why do we initialize the value here if it's
> 			    not used at all?

Agree, will fix.

> 
> > -	rd = read(fd2, iev, sizeof(iev));
> > +	if (!have_events())
> > +		read_events();
> >  
> > -	check_size(rd);
> > +	ev = &events[ev_iter++];
> > +	return ev;
> 
> Why not just return &events[ev_iter++]; ?

Wonder why I did that, but sure, will fix.

> 
> > +}
> >  
> > -	if (rd > 0 && check_event(&iev[i], EV_KEY, KEY_X, 1))
> > -		i++;
> > +static int check_sync_event(void)
> > +{
> > +	return check_event_code(next_event(), EV_SYN, SYN_REPORT);
> > +}
> >  
> > -	while (check_bound(i, rd) && !check_event(&iev[i], EV_KEY, KEY_X, 0)) {
> > +static int parse_autorepeat_config(struct input_event *iev)
> > +{
> > +	if (!check_event_code(iev, EV_REP, REP_DELAY)) {
> > +		tst_resm(TFAIL,
> > +			 "Didn't get EV_REP configuration with code REP_DELAY");
> > +		return 0;
> > +	}
> > +
> > +	if (!check_event_code(next_event(), EV_REP, REP_PERIOD)) {
> > +		tst_resm(TFAIL,
> > +			 "Didn't get EV_REP configuration with code REP_PERIOD");
> > +		return 0;
> > +	}
> > +
> > +	return 1;
> > +}
> > +
> > +static int parse_key(struct input_event *iev)
> > +{
> > +	int autorep_count = 0;
> > +
> > +	if (!check_event(iev, EV_KEY, KEY_X, 1) || !check_sync_event()) {
> > +		tst_resm(TFAIL, "Didn't get expected key press for KEY_X");
> > +		return 0;
> > +	}
> >  
> > -		if (iev[i].type != EV_SYN
> > -			&& !check_event(&iev[i], EV_KEY, KEY_X, 2)) {
> > -			tst_resm(TINFO,
> > -				"Didn't receive EV_KEY KEY_X with value 2");
> > +	iev = next_event();
> > +	while (check_event(iev, EV_KEY, KEY_X, 2) && check_sync_event()) {
> > +		autorep_count++;
> > +		iev = next_event();
> > +	}
> > +
> > +	/* make sure we have atleast one auto-repeated key event */
> > +	if (!autorep_count) {
> > +		tst_resm(TFAIL,
> > +			 "Didn't get autorepeat events for the key - KEY_X");
> > +		return 0;
> > +	}
> > +
> > +	if (!check_event(iev, EV_KEY, KEY_X, 0) || !check_sync_event()) {
> > +		tst_resm(TFAIL,
> > +			 "Didn't get expected key release for KEY_X");
> > +		return 0;
> > +	}
> > +
> > +	tst_resm(TINFO,
> > +		 "Received %d repititions for KEY_X", autorep_count);
> > +
> > +	return 1;
> > +}
> > +
> > +static int check_events(void)
> > +{
> > +	struct input_event *iev;
> > +	int ret;
> > +	int rep_config_done = 0;
> > +	int rep_keys_done = 0;
> > +
> > +	read_events();
> > +
> > +	while (have_events()) {
> > +		iev = next_event();
> > +		switch (iev->type) {
> > +		case EV_REP:
> > +			ret = parse_autorepeat_config(iev);
> > +			if (!rep_config_done)
>                         ^
> 			This if is useless here.
> > +				rep_config_done = 1;
> > +			break;
> > +		case EV_KEY:
> > +			ret = parse_key(iev);
> > +			if (!rep_keys_done)
>                         ^
> 			Here as well.

ack.

> > +				rep_keys_done = 1;
> > +			break;
> > +		default:
> > +			tst_resm(TFAIL,
> > +				 "Unexpected event type '0x%04x' received",
> > +				iev->type);
> > +			ret = 0;
> >  			break;
> >  		}
> > -		i++;
> > -		nb++;
> >  
> > -		if (i == rd / sizeof(struct input_event)) {
> > -			i = 0;
> > -			rd = read(fd2, iev, sizeof(iev));
> > -			check_size(rd);
> > -		}
> > +		if (!ret || (rep_config_done && rep_keys_done))
> > +			break;
> >  	}
> >  
> > -	return (nb > 0 && check_bound(i, rd)
> > -		&& check_event(&iev[i], EV_KEY, KEY_X, 0));
> > +	return ret;
> >  }
> 
> Also I would disagree that the value for sync event is undefined, it has
> been 0 since the beginning and if you look into the kernel input.h
> header it has:


I thought that too but then I saw a test incorrectly failing due to value
check for '0'. So, I went by the documentation ...

From: https://www.kernel.org/doc/Documentation/input/event-codes.txt
"
Event codes:
===========
Event codes define the precise type of event.

EV_SYN:
----------
EV_SYN event values are undefined. Their usage is defined only by when they are
sent in the evdev event stream.

* SYN_REPORT:
  - Used to synchronize and separate events into packets of input data changes
    occurring at the same moment in time. For example, motion of a mouse may set
    the REL_X and REL_Y values for one motion, then emit a SYN_REPORT. The next
    motion will emit more REL_X and REL_Y values and send anot
....
"


> 
> static inline void input_sync(struct input_dev *dev)
> {
>         input_event(dev, EV_SYN, SYN_REPORT, 0);
> }
> 
> 
> 
> Apart from that it looks OK.

ack, will re-spin a v4 with your comments addressed.

- ssp


More information about the ltp mailing list