Update juice_evtest.c after John's code review

Signed-off-by: Bintian Wang <bintian.wang@linaro.org>
diff --git a/evdevtest/juice_evtest.c b/evdevtest/juice_evtest.c
index 0d4dac2..e2e0ccc 100644
--- a/evdevtest/juice_evtest.c
+++ b/evdevtest/juice_evtest.c
@@ -8,128 +8,104 @@
 #include <getopt.h>
 #include <errno.h>
 #include <time.h>
+#include <signal.h>
+
+#define debug 0
+#define JUICE_DEBUG() if (debug) \
+		do \
+			printf("##Juice debug in %s and line ##\n", __FUNCTION__, __LINE__); \
+		while(0)
+
+#define JUICE_ERROR(X) \
+		do \
+			printf("##Juice error: %s in %s at line %d ##\n", X, __FUNCTION__, __LINE__); \
+		while(0)
 
 #define DELAY 10
 #define CLOCK_REALTIME_ALARM        8
 #define CLOCK_BOOTTIME_ALARM        9
 
-static int suspend_resume_test(int seconds)
+void sigalarm(int signumber)
 {
-//	struct timespec now, target, latest;
+	/*We just want to test the suspend and resuem
+	 * nothing need to be done here!
+	 */
+}
+
+static int suspend_resume_test(const int seconds)
+{
 	int ret;
-	int pm_state_fd;
-	int len, n;
-	char buf[32];
 	timer_t timerid;
 	struct itimerspec its;	
 	struct timespec t1, t2;
+	struct sigevent se;
+	struct sigaction act;
+	sigset_t sigmask;
+	int signum = SIGRTMAX;
+
+	/* Set up signal handler */
+	sigfillset(&act.sa_mask);
+	act.sa_flags = 0;
+	act.sa_handler = sigalarm;
+	sigaction(signum, &act, NULL);
+
+	/* Set up timer */
+	memset(&se, 0, sizeof(se));
+	se.sigev_notify = SIGEV_SIGNAL;
+	se.sigev_signo = signum;
+	se.sigev_value.sival_int = 0;
 
 	if (seconds < 6) {
-		printf("Please input suspend time more than 4 seconds!\n");
+		JUICE_ERROR("Input suspend time less than 6 seconds");
 		return -1;
 	}
 
-	ret = timer_create(CLOCK_REALTIME_ALARM, NULL, &timerid);
+	ret = timer_create(CLOCK_REALTIME_ALARM, &se, &timerid);
 	if (-1 == ret) {
-//		printf("Create alarm timer failed!\n");
+		JUICE_ERROR("Create alarm timer failed");
 		return -1;
 	}
 	
-	if(clock_gettime(CLOCK_REALTIME_ALARM, &its.it_value))
+	memset(&its, 0, sizeof(struct itimerspec));
+	ret = clock_gettime(CLOCK_REALTIME_ALARM, &its.it_value);
+	if (-1 == ret) {
+		JUICE_ERROR("Get time failed");
 		return -1;
+	}
 
 	its.it_value.tv_sec += seconds;
-	
+
 	ret = timer_settime(timerid, TIMER_ABSTIME, &its, NULL);
 	if (-1 == ret) {
-//		perror("Set alarm timer failed!\n");
+		JUICE_ERROR("Set alarm timer failed");
 		return -1;
 	}
-	
+
+	/*record the suspend start time*/
 	ret = clock_gettime(CLOCK_REALTIME, &t1);
 	if (-1 == ret) {
-//		perror("Get the suspend start time failed\n");
+		JUICE_ERROR("Get start time of suspend failed");
 		return -1;
 	}
 
-#if 0		
-	fd = open("/dev/alarm", O_RDWR);
-	if (fd < 0) {
-		printf("Open /dev/alarm failed!\n");
-		return -1;
-	}
-	
-	ret = ioctl(fd, ANDROID_ALARM_GET_TIME(ANDROID_ALARM_RTC_WAKEUP), &now);
-	if (ret < 0) {
-		printf("Get time failed!\n");
-		close(fd);
-		return -1;
-	}
-
-	target = now;
-	target.tv_sec += seconds;
-
-	ret = ioctl(fd, ANDROID_ALARM_SET(ANDROID_ALARM_RTC_WAKEUP), &target);
-	if (ret < 0) {
-		printf("Set time failed:");
-		if (errno == EBUSY)
-			printf("Android using this alarm ANDROID_ALARM_RTC_WAKEUP!\n");
-		close(fd);
-		return -1;
-	}
-#endif
-
 	/*start suspend the system now*/
-	pm_state_fd = open("/sys/power/state", O_WRONLY);
-	if (pm_state_fd < 0) {
-//		printf("Open /sys/power/state failed!\n");
-		return -1;
-	}
-	sprintf(buf, "%s\n", "mem");
-	len = strlen(buf);
-	n = write(pm_state_fd, buf, len);
-	if (n < 0 || n != len) {
-//		printf("Write /sys/power/state failed!\n");
-		close(pm_state_fd);
-		return -1;
-	}	
-#if 0
-	/*Get the time after the system resume*/	
-	ret = ioctl(fd, ANDROID_ALARM_GET_TIME(ANDROID_ALARM_RTC_WAKEUP), &latest);
-	if (ret < 0) {
-		printf("Get time again failed!\n");
-		close(fd);
-		close(pm_state_fd);
+	ret = system("echo mem > /sys/power/state");
+	if (-1 == ret) {
+		JUICE_ERROR("echo mem to power state failed");
 		return -1;
 	}
 
-	/*judge if the system suspend/resume works well */
-	if (latest.tv_sec - now.tv_sec >= seconds) {
-		close(fd);
-		close(pm_state_fd);
-		return 0;
-	} else {
-		close(fd);
-		close(pm_state_fd);
-		return 1;
-	}
-#endif
-	close(pm_state_fd);
-	/*Maybe need sleep here for several seconds to wait system to suspend itself!!!!*/
-	/*
-	 *
-	 *
-	 */
+	/*record the system resume time*/
 	ret = clock_gettime(CLOCK_REALTIME, &t2);
 	if (-1 == ret) {
-//		printf("Get the suspend start time failed\n");
+		JUICE_ERROR("Get the suspend end time failed");
 		return -1;
 	}
 
-	if (t2.tv_sec - t1.tv_sec >= seconds) 
+	if (t2.tv_sec - t1.tv_sec >= seconds)
 		return 0;
-	else 
-		return 1;	
+	else
+		return 1;
 }
 
 int main (int argc, char **argv)
@@ -139,76 +115,71 @@
 		{ "help", 	no_argument, NULL, 'h' },
 		{ NULL, 0, NULL, 0 },
 	};
-	
-	char parameter1=0;
-	int	 parameter2=0;
-	long long parameter3=0;
 
-    char * shopt = "p:h";
-    char *evdevice = NULL;
-	long enable_lock=1, disable_lock=0, lockvalue = -1;
-    int fd, fd_evdev_run;
-    int c, opti = 0;
-	int ret, len, n;
-	char buf[32];
+	char parameter1 = 0;
+	int	 parameter2 = 0;
+	long long parameter3 = 0;
+
+	char * shopt = "p:h";
+	char *evdevice = NULL;
+	long enable_lock = 1, disable_lock = 0, lockvalue = -1;
+	int fd, c, opti = 0, ret;
 	unsigned int clk;
-    struct input_event ev[64];  
+	struct input_event ev[64];
 	struct timespec tp1, tp2;
 
 	if(getuid()) {
-		perror("Need run this test as root!\n");
+		JUICE_ERROR("Not run this test as root");
 		return -1;
 	}
 
-    while ((c = getopt_long(argc, argv, shopt, lopt, &opti)) != -1 ) {
-        switch (c) {
-		case 'h':
-			fprintf(stdout, "Userage:\n" "juice_evtest -p /dev/input/eventX \n");
-			break;
-        case 'p':
-            evdevice = strdup(optarg);
-            break;
-        default:
-            perror("Warning, unknown option!\n");
-            break;
-        }
-    }
+	while ((c = getopt_long(argc, argv, shopt, lopt, &opti)) != -1 ) {
+		switch (c) {
+			case 'h':
+				fprintf(stdout, "Userage:\n" "juice_evtest -p /dev/input/eventX \n");
+				break;
+			case 'p':
+				evdevice = strdup(optarg);
+				break;
+			default:
+				JUICE_ERROR("Warning, unknown option!");
+				break;
+		}
+	}
 
-	if (!evdevice) { 
-		perror("You need to input the event input device!\n");
+	if (!evdevice) {
+		JUICE_ERROR("No input device");
 		return -1;
 	}
 
 	/*Open the evdev input device*/
 	if ((fd = open(evdevice, O_RDONLY)) < 0) {
-		perror("Open input device failed, please check it!\n");
+		JUICE_ERROR("Open input device failed");
 		return -1;
 	}
 
-	
+
 	printf("===========================\n");
-	printf("Starting evdev ioctl cmd EVIOCGSUSPENDBLOCK/EVIOCCSUSPENDBLOCK test:\n");
+	printf("Starting input ioctl cmd EVIOCGSUSPENDBLOCK/EVIOCCSUSPENDBLOCK test:\n");
 	/* Read lock command */
-	if (ioctl(fd, EVIOCGSUSPENDBLOCK, &lockvalue)) 
+	if (ioctl(fd, EVIOCGSUSPENDBLOCK, &lockvalue))
 		printf("[EVDEV_EVIOCGSUSPENDBLOCK_READ_TEST1]: test failed\n");
-	else 
+	else
 		printf("[EVDEV_EVIOCGSUSPENDBLOCK_READ_TEST1]: test passed\n");
 
 	if (0 == lockvalue)  /*default lock value*/
 		printf("[EVDEV_TEST2]: test passed\n");
-	else 
+	else
 		printf("[EVDEV_TEST2]: test failed\n");
 
 	/*Set user_wake_lock*/
-	if (ioctl(fd, EVIOCSSUSPENDBLOCK, enable_lock)) 
+	if (ioctl(fd, EVIOCSSUSPENDBLOCK, enable_lock))
 		printf("[EVDEV_EVIOCSSUSPENDBLOCK_SET_TEST3]: test failed\n");
-	else 
+	else
 		printf("[EVDEV_EVIOCSSUSPENDBLOCK_SET_TEST3]: test passed\n");
-	
-	/*Verfify the lock value equals what we set before*/
-	if (ioctl(fd, EVIOCGSUSPENDBLOCK, &lockvalue)) 
-		perror("[EVDEV_READ_user_wake_lock_value]: test failed\n");
-	
+
+	/*Verfify the lock value equals what we set*/
+	ioctl(fd, EVIOCGSUSPENDBLOCK, &lockvalue);
 	if (enable_lock == lockvalue)
 		printf("[EVDEV_TEST4]: test passed\n");
 	else {
@@ -216,243 +187,215 @@
 		goto para_test;
 	}
 
-	if ((fd_evdev_run = open("/sys/juice_input/run", O_WRONLY)) < 0) {
-		perror("[EVDEV_OPEN_SYS_RUN]: test failed\n");
-		perror("Please check input kernel test module!\n");
+	/*Start generating input event*/
+	ret = system("echo 1 > /sys/juice_input/run");
+	if (-1 == ret) {
+		JUICE_ERROR("Enable generate input event failed");
 		goto para_test;
-	} else {
-		sprintf(buf, "%d\n", 1);
-		len = strlen(buf);
-		n = write(fd_evdev_run, buf, len);
-		if (n < 0 || n != len) 
-			perror("Write /sys/juice_input/run failed!\n");
-		
-		close(fd_evdev_run);
 	}
-	/*Judge the system can not be suspend*/	
+
+	/*Judge the system can not suspend*/
 	ret = suspend_resume_test(DELAY);
 	if (1 == ret)
 		printf("[EVDEV_CMD_DISABLE_SUSPEND_TEST5]: test passed\n");
 	else 
 		printf("[EVDEV_CMD_DISABLE_SUSPEND_TEST5]: test failed\n");
-	
+
 	/*Disable evdev usr_wake_lock*/
 	ioctl(fd, EVIOCSSUSPENDBLOCK, disable_lock);
 	ioctl(fd, EVIOCGSUSPENDBLOCK, &lockvalue);
-	if ( disable_lock == lockvalue)
+	if ( disable_lock == lockvalue )
 		printf("[EVDEV_TEST6]: test passed\n");
-	else 
+	else
 		printf("[EVDEV_TEST6]: test failed\n");
 
 	/*Judge the system can be suspend resume*/
 	ret = suspend_resume_test(DELAY);
 	if (0 == ret)
 		printf("[EVDEV_ENABLE_SUSPEND_RESUME_TEST7]: test passed\n");
-	else 
+	else
 		printf("[EVDEV_ENABLE_SUSPEND_RESUME_TEST7]: test failed\n");
 
-	if ((fd_evdev_run = open("/sys/juice_input/run", O_WRONLY)) < 0) {
-		perror("[EVDEV_OPEN_SYS_RUN]: test failed\n");
+	/*Stop generateing input event*/
+	ret = system("echo 0 > /sys/juice_input/run");
+	if (-1 == ret) {
+		JUICE_ERROR("Disable generate input event failed");
 		goto para_test;
-	} else {
-		sprintf(buf, "%d\n", 0);
-		len = strlen(buf);
-		n = write(fd_evdev_run, buf, len);
-		if (n < 0 || n != len) 
-			perror("Write /sys/juice_input/run failed!\n");
-		
-		close(fd_evdev_run);
 	}
 
 
-para_test:	
-	/*The following is the test cases for verifying different parameters*/
+
+	/*The followings are the test cases for verifying different parameters*/
+para_test:
 	/* Null parameters test!*/
 	printf("Starting test EVIOCGSUSPENDBLOCK/EVIOCSSUSPENDBLOCK with different parameters:\n");
 	ret = ioctl(fd, EVIOCGSUSPENDBLOCK);
-	if (ret == -1)
+	if (-1 == ret)
 		printf("[EVDEV_TEST8]: test passed\n");
-	else 
+	else
 		printf("[EVDEV_TEST8]: test failed\n");
-	
+
 	ret = ioctl(fd, EVIOCSSUSPENDBLOCK);
 	if (!ret) 
 		printf("[EVDEV_TEST9]: test passed\n");
-	else 
+	else
 		printf("[EVDEV_TEST9]: test failed\n");
 
 	/* byte parameters test*/
 	ret = ioctl(fd, EVIOCGSUSPENDBLOCK, &parameter1);
-	if (!ret) 
+	if (!ret)
 		printf("[EVDEV_TEST10]: test passed\n");
-	else 
+	else
 		printf("[EVDEV_TEST10]: test failed\n");
 
 	ret = ioctl(fd, EVIOCSSUSPENDBLOCK, parameter1);
-	if (!ret) 
+	if (!ret)
 		printf("[EVDEV_TEST11]: test passed\n");
-	else 
+	else
 		printf("[EVDEV_TEST11]: test failed\n");
 
 	/* int parameters test*/
 	ret = ioctl(fd, EVIOCGSUSPENDBLOCK, &parameter2);
-	if (!ret) 
+	if (!ret)
 		printf("[EVDEV_TEST12]: test passed\n");
-	else 
+	else
 		printf("[EVDEV_TEST12]: test failed\n");
-	
+
 	ret = ioctl(fd, EVIOCSSUSPENDBLOCK, parameter2);
-	if (!ret) 
+	if (!ret)
 		printf("[EVDEV_TEST13]: test passed\n");
-	else 
+	else
 		printf("[EVDEV_TEST13]: test failed\n");
 
 	/* 64bit parameters test*/
 	ret = ioctl(fd, EVIOCGSUSPENDBLOCK, &parameter3);
-	if (!ret) 
+	if (!ret)
 		printf("[EVDEV_TEST14]: test passed\n");
-	else 
+	else
 		printf("[EVDEV_TEST14]: test failed\n");
 
 	ret = ioctl(fd, EVIOCSSUSPENDBLOCK, parameter3);
-	if (!ret) 
+	if (!ret)
 		printf("[EVDEV_TEST15]: test passed\n");
-	else 
+	else
 		printf("[EVDEV_TEST15]: test failed\n");
 
 
-/*EVIOCSCLOCKID test*/
+
+/*The followings are testcases for ioctl cmd EVIOCSCLOCKID*/
 	printf("Starting EVIOCSCLOCKID test:\n");
+
 	clk = CLOCK_REALTIME_ALARM;
 	ret = ioctl(fd, EVIOCSCLOCKID, &clk);
-	if (ret < 0)
+	if (-1 == ret)
 		printf("[EVDEV_TEST16]: test passed\n");
-	else 
+	else
 		printf("[EVDEV_TEST16]: test failed\n");
+
 	clk = CLOCK_BOOTTIME;
 	ret = ioctl(fd, EVIOCSCLOCKID, &clk);
 	if (ret < 0)
 		printf("[EVDEV_TEST17]: test passed\n");
-	else 
+	else
 		printf("[EVDEV_TEST17]: test failed\n");
 
 	ret = ioctl(fd, EVIOCSCLOCKID);
 	if (ret < 0)
 		printf("[EVDEV_TEST18]: test passed\n");
-	else 
+	else
 		printf("[EVDEV_TEST18]: test failed\n");
 
-/*EVIOCSCLOCKID & CLOCK_REALTIME test*/
+
+	/*EVIOCSCLOCKID with CLOCK_REALTIME test start*/
 	clk = CLOCK_REALTIME;
 	ret = ioctl(fd, EVIOCSCLOCKID, &clk);
 	if (ret < 0)
 		printf("[EVDEV_TEST19]: test failed\n");
-	else 
+	else
 		printf("[EVDEV_TEST19]: test passed\n");
 
-	/*Start generate event here!*/
-	if ((fd_evdev_run = open("/sys/juice_input/run", O_WRONLY)) < 0) {
-		perror("[EVDEV_OPEN_SYS_RUN]: test failed\n");
+	/*Start generate event*/
+	ret = system("echo 1 > /sys/juice_input/run");
+	if (-1 == ret) {
+		JUICE_ERROR("Enable generating input event failed");
 		goto finish;
-	} else {
-		sprintf(buf, "%d\n", 1);
-		len = strlen(buf);
-		n = write(fd_evdev_run, buf, len);
-		if (n < 0 || n != len) 
-			perror("Write /sys/juice_input/run failed!\n");
-		
-		close(fd_evdev_run);
 	}
 
 	ret = clock_gettime(CLOCK_REALTIME, &tp1);
 	if (ret < 0)
-		perror("Clock MONOTONIC gettime1 FAILED\n");
-	
+		JUICE_ERROR("Get time with clock id REALTIME failed");
+
 	/*Get event here!*/
 	ret = read(fd, ev, sizeof(struct input_event));
 	if (ret < (int) sizeof(struct input_event)) 
-		perror("evtest: error reading\n");
+		JUICE_ERROR("Reading input event failed");
 
 	ret = clock_gettime(CLOCK_REALTIME, &tp2);
 	if (ret < 0)
-		perror("Clock MONOTONIC gettime2 FAILED\n");
-	
+		JUICE_ERROR("Get time with clock id REALTIME failed");
+
 	if (tp1.tv_sec <= ev[0].time.tv_sec && ev[0].time.tv_sec <= tp2.tv_sec)
 		printf("[EVDEV_TEST20]: test passed\n");
-	else 
+	else
 		printf("[EVDEV_TEST20]: test failed\n");
 
-	if ((fd_evdev_run = open("/sys/juice_input/run", O_WRONLY)) < 0) {
-		perror("[EVDEV_OPEN_SYS_RUN]: test failed\n");
+	/*Stop generate input event*/
+	ret = system("echo 0 > /sys/juice_input/run");
+	if (-1 == ret) {
+		JUICE_ERROR("Disable generating input event failed");
 		goto finish;
-	} else {
-		sprintf(buf, "%d\n", 0);
-		len = strlen(buf);
-		n = write(fd_evdev_run, buf, len);
-		if (n < 0 || n != len) 
-			perror("Write /sys/juice_input/run failed!\n");
-		close(fd_evdev_run);
 	}
+	/*EVIOCSCLOCKID with CLOCK_REALTIME test end*/
 
-/*EVIOCSCLOCKID & CLOCK_MONOTONIC test*/
+
+	/*EVIOCSCLOCKID with CLOCK_MONOTONIC test start*/
 	close(fd);
 	if ((fd = open(evdevice, O_RDONLY)) < 0) {
-		perror("Test is not finished but exit!\n");
+		JUICE_ERROR("Open input device failed");
 		return -1;
-	} 
+	}
 
 	clk = CLOCK_MONOTONIC;
 	ret = ioctl(fd, EVIOCSCLOCKID, &clk);
-	if (ret < 0) 
+	if (ret < 0)
 		printf("[EVDEV_TEST21]: test failed\n");
-	else 
+	else
 		printf("[EVDEV_TEST21]: test passed\n");
 
-	if ((fd_evdev_run = open("/sys/juice_input/run", O_WRONLY)) < 0) {
-		perror("[EVDEV_OPEN_SYS_RUN]: test failed\n");
+	ret = system("echo 1 > /sys/juice_input/run");
+	if (-1 == ret) {
+		JUICE_ERROR("Enable generating input event failed");
 		goto finish;
-	} else {
-		sprintf(buf, "%d\n", 1);
-		len = strlen(buf);
-		n = write(fd_evdev_run, buf, len);
-		if (n < 0 || n != len) 
-			perror("Write /sys/juice_input/run failed!\n");
-		close(fd_evdev_run);
 	}
 
 	ret = clock_gettime(CLOCK_MONOTONIC, &tp1);
 	if (ret < 0)
-		perror("Clock MONOTONIC gettime1 FAIL\n");
+		JUICE_ERROR("Get time with clock id MONOTONIC failed");
 
 	/*Get event here!*/
 	ret = read(fd, ev, sizeof(struct input_event));
-	if (ret < (int) sizeof(struct input_event))   
-		perror("evtest: error reading\n");
-	
+	if (ret < (int) sizeof(struct input_event))
+		JUICE_ERROR("Reading input event failed");
+
 	ret = clock_gettime(CLOCK_MONOTONIC, &tp2);
 	if (ret < 0)
-		perror("Clock MONOTONIC gettime2 FAILED\n");
-	
+		JUICE_ERROR("Get time with clock id MONOTONIC failed");
+
 	if (tp1.tv_sec <= ev[0].time.tv_sec && ev[0].time.tv_sec<= tp2.tv_sec)
 		printf("[EVDEV_TEST22]: test passed\n");
-	else 
+	else
 		printf("[EVDEV_TEST22]: test failed\n");
 
-	/*Stop generate input dev event here!*/
-	if ((fd_evdev_run = open("/sys/juice_input/run", O_WRONLY)) < 0) {
-		perror("[EVDEV_OPEN_SYS_RUN]: test failed\n");
+	/*Stop generate input event*/
+	ret = system("echo 0 > /sys/juice_input/run");
+	if (-1 == ret) {
+		JUICE_ERROR("Disable generating input event failed");
 		goto finish;
-	} else {
-		sprintf(buf, "%d\n", 0);
-		len = strlen(buf);
-		n = write(fd_evdev_run, buf, len);
-		if (n < 0 || n != len) 
-			perror("Write /sys/juice_input/run failed!\n");
-		close(fd_evdev_run);
 	}
+	/*EVIOCSCLOCKID with CLOCK_MONOTONIC test end*/
 
 finish:
 	close(fd);
 	printf("===========================\n");
-	return -1;
+	return 0;
 }