summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAxel Fagerstedt <axel.fagerstedt@linaro.org>2013-02-01 12:52:57 +0100
committerAxel Fagerstedt <axel.fagerstedt@linaro.org>2013-02-01 12:52:57 +0100
commitdf8f3300d6ea7f4b59bf8fc8f03f14b28940c28a (patch)
tree038bae51bc251abf9805f925c4243f1112aef8e3
parentda26a199b4c717e110cd597ca878a3d2831fead7 (diff)
downloadlinaro-android-kernel-test-df8f3300d6ea7f4b59bf8fc8f03f14b28940c28a.tar.gz
Inital commit for the alarm-dev test
-rw-r--r--alarmdevtest/Android.mk8
-rw-r--r--alarmdevtest/Makefile11
-rw-r--r--alarmdevtest/alarm-dev-test.c194
-rw-r--r--alarmdevtest/android_alarm.h54
-rw-r--r--product.mk3
5 files changed, 269 insertions, 1 deletions
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 <john.stultz@linaro.org>
+ *
+ * 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 <stdio.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <time.h>
+#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 <asm/ioctl.h>
+/* 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