summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid 'Digit' Turner <digit@google.com>2010-01-28 10:53:00 -0800
committerDavid 'Digit' Turner <digit@google.com>2010-01-28 10:53:00 -0800
commit84a66d0c8d79857586bad4e3d3010ee44f8f6971 (patch)
tree0c3d80930cf0238a12748adffe58f18d34880467
parent5b805c490e90b9702fb1010415db3994aba85798 (diff)
downloadextras-84a66d0c8d79857586bad4e3d3010ee44f8f6971.tar.gz
Add clone() test.
This also refreshes the tests to properly compile with the latest host toolchain.
-rw-r--r--tests/bionic/libc/Android.mk15
-rw-r--r--tests/bionic/libc/bionic/lib_static_init.h5
-rw-r--r--tests/bionic/libc/common/test_clone.c56
-rw-r--r--tests/bionic/libc/common/test_static_cpp_mutex.cpp6
4 files changed, 80 insertions, 2 deletions
diff --git a/tests/bionic/libc/Android.mk b/tests/bionic/libc/Android.mk
index d08d30a6..4056d55b 100644
--- a/tests/bionic/libc/Android.mk
+++ b/tests/bionic/libc/Android.mk
@@ -31,7 +31,6 @@ define device-test
$(eval LOCAL_SRC_FILES := $(file)) \
$(eval LOCAL_MODULE := $(notdir $(file:%.c=%))) \
$(eval LOCAL_MODULE := $(LOCAL_MODULE:%.cpp=%)) \
- $(eval $(info LOCAL_MODULE=$(LOCAL_MODULE))) \
$(eval LOCAL_CFLAGS += $(EXTRA_CFLAGS)) \
$(eval LOCAL_MODULE_TAGS := tests) \
$(eval include $(BUILD_EXECUTABLE)) \
@@ -48,7 +47,6 @@ define host-test
$(eval LOCAL_SRC_FILES := $(file)) \
$(eval LOCAL_MODULE := $(notdir $(file:%.c=%))) \
$(eval LOCAL_MODULE := $(LOCAL_MODULE:%.cpp=%)) \
- $(eval $(info LOCAL_MODULE=$(LOCAL_MODULE) file=$(file))) \
$(eval LOCAL_CFLAGS += $(EXTRA_CFLAGS)) \
$(eval LOCAL_LDLIBS += $(EXTRA_LDLIBS)) \
$(eval LOCAL_MODULE_TAGS := tests) \
@@ -148,6 +146,19 @@ LOCAL_MODULE := test_static_init
LOCAL_SHARED_LIBRARIES := libtest_static_init
include $(BUILD_EXECUTABLE)
+# Testing 'clone' is only possible on Linux systems
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := common/test_clone.c
+LOCAL_MODULE := test_clone
+include $(BUILD_EXECUTABLE)
+
+ifeq ($(HOST_OS),linux)
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := common/test_clone.c
+LOCAL_MODULE := test_clone
+include $(BUILD_HOST_EXECUTABLE)
+endif
+
# TODO: Add a variety of GLibc test programs too...
# Hello World to test libstdc++ support
diff --git a/tests/bionic/libc/bionic/lib_static_init.h b/tests/bionic/libc/bionic/lib_static_init.h
index f455de8e..934eb8f4 100644
--- a/tests/bionic/libc/bionic/lib_static_init.h
+++ b/tests/bionic/libc/bionic/lib_static_init.h
@@ -8,8 +8,13 @@ private:
public:
virtual int getValue();
Foo();
+ virtual ~Foo();
};
+Foo::~Foo()
+{
+}
+
extern Foo theFoo;
#endif /* _lib_static_init_h */
diff --git a/tests/bionic/libc/common/test_clone.c b/tests/bionic/libc/common/test_clone.c
new file mode 100644
index 00000000..afbb9c17
--- /dev/null
+++ b/tests/bionic/libc/common/test_clone.c
@@ -0,0 +1,56 @@
+/* Check that clone() is implemented and properly works
+ */
+#define __GNU_SOURCE 1
+#include <stdio.h>
+#include <errno.h>
+#include <sched.h>
+#include <unistd.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <sys/ptrace.h>
+#include <sys/wait.h>
+#include <stdarg.h>
+#include <string.h>
+
+static int
+clone_child (void *arg)
+{
+ errno = 0;
+ ptrace (PTRACE_TRACEME, 0, 0, 0);
+ if (errno != 0)
+ perror ("ptrace");
+ if (kill (getpid (), SIGSTOP) < 0)
+ perror ("kill");
+ return 0;
+}
+
+#define PAGE_SIZE 4096
+#define STACK_SIZE (4 * PAGE_SIZE)
+
+char clone_stack[STACK_SIZE] __attribute__ ((aligned (PAGE_SIZE)));
+
+int
+main ()
+{
+ int pid,child;
+ int status;
+
+ pid = clone (clone_child, clone_stack + 3 * PAGE_SIZE,
+ CLONE_VM | SIGCHLD, NULL);
+ if (pid < 0)
+ {
+ perror ("clone");
+ exit (1);
+ }
+ printf ("child pid %d\n", pid);
+
+ //sleep(20);
+ child = waitpid (pid, &status, 0);
+ printf("waitpid returned %d\n", child);
+ if (child < 0) {
+ perror ("waitpid");
+ return 1;
+ }
+ printf ("child %d, status 0x%x\n", child, status);
+ return 0;
+}
diff --git a/tests/bionic/libc/common/test_static_cpp_mutex.cpp b/tests/bionic/libc/common/test_static_cpp_mutex.cpp
index 33a56ef4..ea5d4793 100644
--- a/tests/bionic/libc/common/test_static_cpp_mutex.cpp
+++ b/tests/bionic/libc/common/test_static_cpp_mutex.cpp
@@ -37,6 +37,7 @@ private:
public:
virtual int getValue();
Foo();
+ virtual ~Foo();
};
Foo::Foo()
@@ -50,6 +51,11 @@ Foo::Foo()
fprintf(stderr, "recursive lock initialized and locked\n" );
}
+Foo::~Foo()
+{
+ pthread_mutex_unlock(&mMutex);
+}
+
int Foo::getValue()
{
return 0;