From df8f3300d6ea7f4b59bf8fc8f03f14b28940c28a Mon Sep 17 00:00:00 2001 From: Axel Fagerstedt Date: Fri, 1 Feb 2013 12:52:57 +0100 Subject: Inital commit for the alarm-dev test --- alarmdevtest/Android.mk | 8 ++ alarmdevtest/Makefile | 11 +++ alarmdevtest/alarm-dev-test.c | 194 ++++++++++++++++++++++++++++++++++++++++++ alarmdevtest/android_alarm.h | 54 ++++++++++++ product.mk | 3 +- 5 files changed, 269 insertions(+), 1 deletion(-) create mode 100644 alarmdevtest/Android.mk create mode 100644 alarmdevtest/Makefile create mode 100644 alarmdevtest/alarm-dev-test.c create mode 100644 alarmdevtest/android_alarm.h diff --git a/alarmdevtest/Android.mk b/alarmdevtest/Android.mk new file mode 100644 index 0000000..fdc33b0 --- /dev/null +++ b/alarmdevtest/Android.mk @@ -0,0 +1,8 @@ +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := alarm-dev-test.c +LOCAL_MODULE := alarm-dev-test +LOCAL_MODULE_TAGS := optional tests + +include $(BUILD_EXECUTABLE) diff --git a/alarmdevtest/Makefile b/alarmdevtest/Makefile new file mode 100644 index 0000000..fa4c3b2 --- /dev/null +++ b/alarmdevtest/Makefile @@ -0,0 +1,11 @@ +CFLAGS += -O3 -Wl,-no-as-needed +LDFLAGS += -lrt -lpthread +bins = alarm-dev-test + + +all: ${bins} + +clean: + rm -f ${bins} + + diff --git a/alarmdevtest/alarm-dev-test.c b/alarmdevtest/alarm-dev-test.c new file mode 100644 index 0000000..7aeb018 --- /dev/null +++ b/alarmdevtest/alarm-dev-test.c @@ -0,0 +1,194 @@ +/* + * alarm-dev-test.c Trivial Android Alarm-dev unit test + * + * By: John Stultz + * + * For each alarm type, gets, sets and waits for an alarm. + * Then sets the RTC back 10 seconds. + * + * TODO: + * - Settle on license + * - Add android build changes + */ + +#include +#include +#include +#include +#include +#include "android_alarm.h" + + +int alarmfd; + +int alarm_set(int type, struct timespec *ts) +{ + return ioctl(alarmfd, ANDROID_ALARM_SET(type), ts); +} + +int alarm_get_time(int type, struct timespec *ts) +{ + return ioctl(alarmfd, ANDROID_ALARM_GET_TIME(type), ts); +} + + +int alarm_set_and_wait(int type, struct timespec *ts) +{ + return ioctl(alarmfd, ANDROID_ALARM_SET_AND_WAIT(type), ts); +} + +int alarm_wait(void) +{ + return ioctl(alarmfd, ANDROID_ALARM_WAIT, 0); +} + +int alarm_clear(int type) +{ + return ioctl(alarmfd, ANDROID_ALARM_CLEAR(type),0); +} + +int alarm_set_rtc(struct timespec *ts) +{ + return ioctl(alarmfd, ANDROID_ALARM_SET_RTC, ts); +} + + +#define DELAY 5 + +int main(void) +{ + struct timespec target, now; + int ret; + int alarm_type; + + if (getuid()) { + printf("Error: Need to run as root\n"); + return -1; + } + + alarmfd = open("/dev/alarm", O_RDWR); + if (alarmfd < 1) { + printf("Error opening /dev/alarm\n"); + return -1; + } + + 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"); + return -1; + } + + 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"); + return -1; + } + + + ret = alarm_get_time(alarm_type, &now); + if (ret) { + printf("Bad return value\n"); + 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; + } + + 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"); + return -1; + } + + ret = alarm_wait(); + printf("(%i) alarm_wait()\n", ret); + if (ret != (1 << alarm_type)) { + printf("Bad return value\n"); + return -1; + } + + ret = alarm_get_time(alarm_type, &now); + 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"); + 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"); + return -1; + } + ret = alarm_clear(alarm_type); + printf("(%i) alarm_clear()\n", ret); + if (ret) { + printf("Bad return value\n"); + 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"); + return -1; + } + 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"); + 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"); + return -1; + } + + if (now.tv_sec < target.tv_sec) { + printf("Error: Bad time!\n"); + return -1; + } + + return 0; +} diff --git a/alarmdevtest/android_alarm.h b/alarmdevtest/android_alarm.h new file mode 100644 index 0000000..5a28d39 --- /dev/null +++ b/alarmdevtest/android_alarm.h @@ -0,0 +1,54 @@ +/**************************************************************************** + **************************************************************************** + *** + *** This header was automatically generated from a Linux kernel header + *** of the same name, to make information necessary for userspace to + *** call into the kernel available to libc. It contains only constants, + *** structures, and macros generated from the original header, and thus, + *** contains no copyrightable information. + *** + *** To edit the content of this header, modify the corresponding + *** source file (e.g. under external/kernel-headers/original/) then + *** run bionic/libc/kernel/tools/update_all.py + *** + *** Any manual change here will be lost the next time this script will + *** be run. You've been warned! + *** + **************************************************************************** + ****************************************************************************/ +#ifndef _LINUX_ANDROID_ALARM_H +#define _LINUX_ANDROID_ALARM_H +#include +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +typedef enum { + ANDROID_ALARM_RTC_WAKEUP, + ANDROID_ALARM_RTC, + ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + ANDROID_ALARM_ELAPSED_REALTIME, + ANDROID_ALARM_SYSTEMTIME, + ANDROID_ALARM_TYPE_COUNT, +} android_alarm_type_t; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +typedef enum { + ANDROID_ALARM_RTC_WAKEUP_MASK = 1U << ANDROID_ALARM_RTC_WAKEUP, + ANDROID_ALARM_RTC_MASK = 1U << ANDROID_ALARM_RTC, + ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP_MASK = 1U << ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + ANDROID_ALARM_ELAPSED_REALTIME_MASK = 1U << ANDROID_ALARM_ELAPSED_REALTIME, + ANDROID_ALARM_SYSTEMTIME_MASK = 1U << ANDROID_ALARM_SYSTEMTIME, + ANDROID_ALARM_TIME_CHANGE_MASK = 1U << 16 +} android_alarm_return_flags_t; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define ANDROID_ALARM_CLEAR(type) _IO('a', 0 | ((type) << 4)) +#define ANDROID_ALARM_WAIT _IO('a', 1) +#define ANDROID_ALARM_SET(type) _IOW('a', 2 | ((type) << 4), struct timespec) +#define ANDROID_ALARM_SET_AND_WAIT(type) _IOW('a', 3 | ((type) << 4), struct timespec) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define ANDROID_ALARM_GET_TIME(type) _IOW('a', 4 | ((type) << 4), struct timespec) +#define ANDROID_ALARM_SET_RTC _IOW('a', 5, struct timespec) +#define ANDROID_ALARM_SET_TIMEZONE _IOW('a', 6, struct timezone) +#define ANDROID_ALARM_BASE_CMD(cmd) (cmd & ~(_IOC(0, 0, 0xf0, 0))) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define ANDROID_ALARM_IOCTL_TO_TYPE(cmd) (_IOC_NR(cmd) >> 4) +#endif diff --git a/product.mk b/product.mk index 1f6a7d5..eb180e0 100644 --- a/product.mk +++ b/product.mk @@ -1,5 +1,6 @@ # pick up tests for inclusion in the system image -PRODUCT_PACKAGES += ashmemtest \ +PRODUCT_PACKAGES += alarm-dev-test \ + ashmemtest \ ashmemtest-expanded \ sync-basic PRODUCT_COPY_FILES += external/linaro-android-kernel-test/ashmemtest-expanded/ashmemtest-expanded-runner.sh:system/bin/ashmemtest-expanded-runner.sh -- cgit v1.2.3