summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorDavid 'Digit' Turner <digit@google.com>2010-05-11 18:16:24 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2010-05-11 18:16:24 -0700
commit4be25076006bb0d5d3568dcbd18b96e05e543a6c (patch)
tree11eb43ce2e17d770d7d9cb51f9fac4adf84125f3 /tests
parent220a991976c5a029a6b8463c10040c322218934b (diff)
parent479d9725ab0c5bc7d516e22e84c13d445bfd3c7c (diff)
downloadextras-4be25076006bb0d5d3568dcbd18b96e05e543a6c.tar.gz
Merge "Add setjmp() / longjmp() test."
Diffstat (limited to 'tests')
-rw-r--r--tests/bionic/libc/Android.mk1
-rw-r--r--tests/bionic/libc/bionic/test_setjmp.c86
2 files changed, 87 insertions, 0 deletions
diff --git a/tests/bionic/libc/Android.mk b/tests/bionic/libc/Android.mk
index f68d68b9..b88a99e5 100644
--- a/tests/bionic/libc/Android.mk
+++ b/tests/bionic/libc/Android.mk
@@ -97,6 +97,7 @@ sources := \
bionic/test_netinet_icmp.c \
bionic/test_pthread_cond.c \
bionic/test_pthread_create.c \
+ bionic/test_setjmp.c \
$(call device-test, $(sources))
diff --git a/tests/bionic/libc/bionic/test_setjmp.c b/tests/bionic/libc/bionic/test_setjmp.c
new file mode 100644
index 00000000..71607420
--- /dev/null
+++ b/tests/bionic/libc/bionic/test_setjmp.c
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/* Basic test of setjmp() functionality */
+
+#include <setjmp.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define INT_VALUE1 0x12345678
+#define INT_VALUE2 0xfedcba98
+
+#define FLOAT_VALUE1 (1.2345678)
+#define FLOAT_VALUE2 (9.8765432)
+
+int dummy_int;
+double dummy_double;
+
+/* test that integer registers are restored properly */
+static void
+test_int(void)
+{
+ jmp_buf jumper;
+ register int xx = INT_VALUE1;
+
+ if (setjmp(jumper) == 0) {
+ xx = INT_VALUE2;
+ longjmp(jumper, 1);
+ } else {
+ if (xx != INT_VALUE1) {
+ fprintf(stderr, "setjmp() is broken for integer registers !\n");
+ exit(1);
+ }
+ }
+ dummy_int = xx;
+}
+
+static void
+test_float(void)
+{
+ jmp_buf jumper;
+ register double xx = FLOAT_VALUE1;
+
+ if (setjmp(jumper) == 0) {
+ xx = FLOAT_VALUE2;
+ longjmp(jumper, 1);
+ } else {
+ if (xx != FLOAT_VALUE1) {
+ fprintf(stderr, "setjmp() is broken for floating point registers !\n");
+ exit(1);
+ }
+ }
+ dummy_double = xx;
+}
+
+int main(void)
+{
+ test_int();
+ test_float();
+ return 0;
+}