From 54321321febdbef022662d2e9b094c2820d5aac0 Mon Sep 17 00:00:00 2001 From: dmitry pervushin Date: Tue, 2 Apr 2013 19:52:13 +0200 Subject: alarmdevtest: let the test pass The history is explained here: https://bugs.launchpad.net/linaro-android/+bug/1160633/ * Add error reporting (perror instead of printing ioctl return code) * Fix handling of positive ioctl return codes (alarm bitmasks) * Treat EBUSY on alarm_set_and_wait as non-fatal error and skip the test for this alarm type --- alarmdevtest/alarm-dev-test.c | 88 ++++++++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 38 deletions(-) diff --git a/alarmdevtest/alarm-dev-test.c b/alarmdevtest/alarm-dev-test.c index 4f56a78..d567e52 100644 --- a/alarmdevtest/alarm-dev-test.c +++ b/alarmdevtest/alarm-dev-test.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "android_alarm.h" @@ -84,27 +85,34 @@ int main(void) for (alarm_type = ANDROID_ALARM_RTC_WAKEUP; alarm_type < ANDROID_ALARM_TYPE_COUNT; alarm_type++) { ret = alarm_get_time(alarm_type, &now); - - printf("(%i) gettime(%i): %ld:%ld\n", ret, alarm_type, now.tv_sec, now.tv_nsec); - if (ret) { - printf("Bad return value\n"); + if (ret < 0) { + perror("Error: alarm_get_time"); return -1; } + printf("(%i) gettime(%i): %ld:%ld\n", ret, alarm_type, now.tv_sec, now.tv_nsec); target = now; target.tv_sec += DELAY; - ret = alarm_set_and_wait(alarm_type, &target); - printf("(%i) alarm_set_and_wait(%i)\n", ret, alarm_type); - if (ret != (1 << alarm_type)) { - printf("Bad return value\n"); + ret = alarm_set_and_wait(alarm_type, &target); + if (ret < 0) { + if (errno == EBUSY) { + printf("Warning: EBUSY on alarm_set_and_wait, this is likely due to the " + "Android environment using this alarm type(%d). Skipping.", alarm_type); + continue; + } + perror("Error: alarm_set_and_wait"); + return -1; + } + printf("(0x%x) alarm_set_and_wait(0x%x)\n", ret, alarm_type); + if (!(ret & (1 << alarm_type))) { + printf("Error: alarm_wait: expected bit 0x%x set, got 0x%x", 1 << alarm_type, ret); return -1; } - ret = alarm_get_time(alarm_type, &now); - if (ret) { - printf("Bad return value\n"); + if (ret < 0) { + perror("Error: alarm_get_time"); return -1; } @@ -120,84 +128,88 @@ int main(void) target.tv_sec += DELAY; ret = alarm_set(alarm_type, &target); - printf("(%i) alarm_set(%i)\n", ret, alarm_type); - if (ret) { - printf("Bad return value\n"); + if (ret < 0) { + perror("Error: alarm_set"); return -1; } + printf("(%i) alarm_set(%i)\n", ret, alarm_type); ret = alarm_wait(); - printf("(%i) alarm_wait()\n", ret); - if (ret != (1 << alarm_type)) { - printf("Bad return value\n"); + if (ret < 0) { + perror("Error: alarm_wait"); + } + printf("(0x%x) alarm_wait()\n", ret); + if (!(ret & (1 << alarm_type))) { + printf("Error: alarm_wait: expected bit 0x%x set, got 0x%x", 1 << alarm_type, ret); return -1; } ret = alarm_get_time(alarm_type, &now); + if (ret < 0) { + perror("Error: alarm_get_time"); + return -1; + } if (now.tv_sec < target.tv_sec) { printf("Error: Early timer return!\n"); return -1; } - if (now.tv_sec > target.tv_sec + 1) { printf("Error: Late timer return!\n"); return -1; } - if (ret) { - printf("Bad return value\n"); - return -1; - } - ret = alarm_clear(alarm_type); printf("(%i) alarm_clear()\n", ret); - if (ret) { - printf("Bad return value\n"); + if (ret < 0) { + perror("Error: alarm_clear"); return -1; } target.tv_sec += DELAY; ret = alarm_set(alarm_type, &target); printf("(%i) alarm_set(%i)\n", ret, alarm_type); - if (ret) { - printf("Bad return value\n"); + if (ret < 0) { + perror("Error: alarm_set"); return -1; } ret = alarm_clear(alarm_type); printf("(%i) alarm_clear()\n", ret); - if (ret) { - printf("Bad return value\n"); + if (ret < 0) { + perror("Error: alarm_clear"); return -1; } } ret = alarm_get_time(ANDROID_ALARM_RTC, &now); - printf("(%i) gettime(ANDROID_ALARM_RTC): %ld:%ld\n", ret, now.tv_sec, now.tv_nsec); - if (ret) { - printf("Bad return value\n"); + if (ret < 0) { + perror("Error: alarm_get_time"); return -1; } + printf("(%i) gettime(ANDROID_ALARM_RTC): %ld:%ld\n", ret, now.tv_sec, now.tv_nsec); + target = now; target.tv_sec -= 10; ret = alarm_set_rtc(&target); - printf("(%i) setting rtc back 10 sec (%ld:%ld)\n", ret, target.tv_sec, target.tv_nsec); - if (ret) { - printf("Bad return value\n"); + if (ret < 0) { + perror("Error: alarm_set_rtc"); return -1; } + printf("(%i) setting rtc back 10 sec (%ld:%ld)\n", ret, target.tv_sec, target.tv_nsec); ret = alarm_get_time(ANDROID_ALARM_RTC, &now); - printf("(%i) gettime(ANDROID_ALARM_RTC): %ld:%ld\n", ret, now.tv_sec, now.tv_nsec); - if (ret) { - printf("Bad return value\n"); + if (ret < 0) { + perror("Error: alarm_get_time"); return -1; } + printf("(%i) gettime(ANDROID_ALARM_RTC): %ld:%ld\n", ret, now.tv_sec, now.tv_nsec); if (now.tv_sec < target.tv_sec) { printf("Error: Bad time!\n"); return -1; } + printf("Pass\n"); + return 0; } -- cgit v1.2.3