[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 12/14] add basic task tests
From: |
Luca Dariz |
Subject: |
[PATCH 12/14] add basic task tests |
Date: |
Thu, 28 Dec 2023 20:42:59 +0100 |
---
tests/test-task.c | 149 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 149 insertions(+)
create mode 100644 tests/test-task.c
diff --git a/tests/test-task.c b/tests/test-task.c
new file mode 100644
index 00000000..da9289ff
--- /dev/null
+++ b/tests/test-task.c
@@ -0,0 +1,149 @@
+
+#include <syscalls.h>
+#include <testlib.h>
+
+#include <mach/machine/vm_param.h>
+#include <mach/std_types.h>
+#include <mach/mach_types.h>
+#include <mach/vm_wire.h>
+#include <mach/vm_param.h>
+
+#include <gnumach.user.h>
+#include <mach.user.h>
+
+
+void test_task()
+{
+ mach_port_t ourtask = mach_task_self();
+ mach_msg_type_number_t count;
+ int err;
+
+ struct task_basic_info binfo;
+ count = TASK_BASIC_INFO_COUNT;
+ err = task_info(ourtask, TASK_BASIC_INFO, (task_info_t)&binfo, &count);
+ ASSERT_RET(err, "TASK_BASIC_INFO");
+
+ struct task_events_info einfo;
+ count = TASK_EVENTS_INFO_COUNT;
+ err = task_info(ourtask, TASK_EVENTS_INFO, (task_info_t)&einfo, &count);
+ ASSERT_RET(err, "TASK_EVENTS_INFO");
+
+ struct task_thread_times_info ttinfo;
+ count = TASK_THREAD_TIMES_INFO_COUNT;
+ err = task_info(ourtask, TASK_THREAD_TIMES_INFO, (task_info_t)&ttinfo,
&count);
+ ASSERT_RET(err, "TASK_THREAD_TIMES_INFO");
+}
+
+
+void dummy_thread(void *arg)
+{
+ printf("started dummy thread\n");
+ while (1)
+ ;
+}
+
+void check_threads(thread_t *threads, mach_msg_type_number_t nthreads)
+{
+ for (int tid=0; tid<nthreads; tid++)
+ {
+ struct thread_basic_info tinfo;
+ mach_msg_type_number_t thcount = THREAD_BASIC_INFO_COUNT;
+ int err = thread_info(threads[tid], THREAD_BASIC_INFO,
(thread_info_t)&tinfo, &thcount);
+ ASSERT_RET(err, "thread_info");
+ ASSERT(thcount == THREAD_BASIC_INFO_COUNT, "thcount");
+ printf("th%d (port %d):\n", tid, threads[tid]);
+ printf(" user time %d.%06d\n", tinfo.user_time.seconds,
tinfo.user_time.microseconds);
+ printf(" system time %d.%06d\n", tinfo.system_time.seconds,
tinfo.system_time.microseconds);
+ printf(" cpu usage %d\n", tinfo.cpu_usage);
+ printf(" creation time %d.%06d\n", tinfo.creation_time.seconds,
tinfo.creation_time.microseconds);
+ }
+}
+
+static void test_task_threads()
+{
+ thread_t *threads;
+ mach_msg_type_number_t nthreads;
+ int err;
+
+ err = task_threads(mach_task_self(), &threads, &nthreads);
+ ASSERT_RET(err, "task_threads");
+ ASSERT(nthreads == 1, "nthreads");
+ check_threads(threads, nthreads);
+
+ thread_t t1 = test_thread_start(mach_task_self(), dummy_thread, 0);
+
+ thread_t t2 = test_thread_start(mach_task_self(), dummy_thread, 0);
+
+ // let the threads run
+ msleep(100);
+
+ err = task_threads(mach_task_self(), &threads, &nthreads);
+ ASSERT_RET(err, "task_threads");
+ ASSERT(nthreads == 3, "nthreads");
+ check_threads(threads, nthreads);
+
+ err = thread_terminate(t1);
+ ASSERT_RET(err, "thread_terminate");
+ err = thread_terminate(t2);
+ ASSERT_RET(err, "thread_terminate");
+
+ err = task_threads(mach_task_self(), &threads, &nthreads);
+ ASSERT_RET(err, "task_threads");
+ ASSERT(nthreads == 1, "nthreads");
+ check_threads(threads, nthreads);
+}
+
+void test_new_task()
+{
+ int err;
+ task_t newtask;
+ err = task_create(mach_task_self(), 1, &newtask);
+ ASSERT_RET(err, "task_create");
+
+ err = task_suspend(newtask);
+ ASSERT_RET(err, "task_suspend");
+
+ err = task_set_name(newtask, "newtask");
+ ASSERT_RET(err, "task_set_name");
+
+ thread_t *threads;
+ mach_msg_type_number_t nthreads;
+ err = task_threads(newtask, &threads, &nthreads);
+ ASSERT_RET(err, "task_threads");
+ ASSERT(nthreads == 0, "nthreads 0");
+
+ test_thread_start(newtask, dummy_thread, 0);
+
+ err = task_resume(newtask);
+ ASSERT_RET(err, "task_resume");
+
+ msleep(100); // let the thread run a bit
+
+ err = task_threads(newtask, &threads, &nthreads);
+ ASSERT_RET(err, "task_threads");
+ ASSERT(nthreads == 1, "nthreads 1");
+ check_threads(threads, nthreads);
+
+ err = thread_terminate(threads[0]);
+ ASSERT_RET(err, "thread_terminate");
+
+ err = task_terminate(newtask);
+ ASSERT_RET(err, "task_terminate");
+}
+
+int test_errors()
+{
+ int err;
+ err = task_resume(MACH_PORT_NAME_DEAD);
+ ASSERT(err == MACH_SEND_INVALID_DEST, "task DEAD");
+}
+
+
+int main(int argc, char *argv[], int envc, char *envp[])
+{
+ test_task();
+ test_task_threads();
+ test_new_task();
+ test_errors();
+ return 0;
+}
--
2.39.2
- [PATCH 07/14] add basic vm tests, (continued)
- [PATCH 07/14] add basic vm tests, Luca Dariz, 2023/12/28
- [PATCH 09/14] add syscall tests, Luca Dariz, 2023/12/28
- [PATCH 10/14] expose MACH_MSG_USER_ALIGNMENT for manually-built messages, Luca Dariz, 2023/12/28
- [PATCH 11/14] add raw mach_msg tests, Luca Dariz, 2023/12/28
- [PATCH 14/14] add tests to make check, Luca Dariz, 2023/12/28
- [PATCH 12/14] add basic task tests,
Luca Dariz <=