From 77ab966ca8b50e01128779e94f3cc0f1bceacdfa Mon Sep 17 00:00:00 2001 From: Bintian Wang Date: Sat, 20 Jul 2013 00:13:40 +0800 Subject: Update juice_evtest.c after John's code review Signed-off-by: Bintian Wang --- evdevtest/juice_evtest.c | 411 ++++++++++++++++++++--------------------------- 1 file changed, 177 insertions(+), 234 deletions(-) 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 #include #include +#include + +#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) +{ + /*We just want to test the suspend and resuem + * nothing need to be done here! + */ +} + +static int suspend_resume_test(const int seconds) { -// struct timespec now, target, latest; 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 @@ int main (int argc, char **argv) { "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; - } - } - - if (!evdevice) { - perror("You need to input the event input device!\n"); + 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) { + 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 @@ int main (int argc, char **argv) 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, ¶meter1); - 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, ¶meter2); - 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, ¶meter3); - 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; } -- cgit v1.2.3