summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordmitry pervushin <dpervushin@gmail.com>2013-04-02 19:52:13 +0200
committerdmitry pervushin <dpervushin@gmail.com>2013-04-02 19:52:13 +0200
commit54321321febdbef022662d2e9b094c2820d5aac0 (patch)
tree4b4d50d7bff39df9bc52e308708f2e7c6f9e5ee0
parentda135c9b2f728ad2298465b3df60d7b1c6b4c38b (diff)
downloadlinaro-android-kernel-test-54321321febdbef022662d2e9b094c2820d5aac0.tar.gz
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
-rw-r--r--alarmdevtest/alarm-dev-test.c88
1 files 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 <sys/types.h>
#include <fcntl.h>
#include <time.h>
+#include <errno.h>
#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;
}