aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorYabin Cui2014-12-01 19:41:04 -0600
committerYabin Cui2014-12-08 23:52:43 -0600
commit634816055f51c536d24dea30dfe930b7fe2fa603 (patch)
tree5d3739b116df16774776010538254c10007c0a76 /tests
parentf64c43ba6c9244c50e904961dc432f04b1dfcfd9 (diff)
downloadplatform-bionic-634816055f51c536d24dea30dfe930b7fe2fa603.tar.gz
platform-bionic-634816055f51c536d24dea30dfe930b7fe2fa603.tar.xz
platform-bionic-634816055f51c536d24dea30dfe930b7fe2fa603.zip
support _POSIX_REALTIME_SIGNALS
Bug: 18489947 Change-Id: I2e834d68bc10ca5fc7ebde047b517a3074179475
Diffstat (limited to 'tests')
-rw-r--r--tests/ScopedSignalHandler.h12
-rw-r--r--tests/pthread_test.cpp59
-rw-r--r--tests/signal_test.cpp101
-rw-r--r--tests/unistd_test.cpp4
4 files changed, 154 insertions, 22 deletions
diff --git a/tests/ScopedSignalHandler.h b/tests/ScopedSignalHandler.h
index 3ec23b0d..3fb60a16 100644
--- a/tests/ScopedSignalHandler.h
+++ b/tests/ScopedSignalHandler.h
@@ -18,17 +18,27 @@
18#define _BIONIC_TESTS_SCOPED_SIGNAL_HANDLER_H 18#define _BIONIC_TESTS_SCOPED_SIGNAL_HANDLER_H
19 19
20#include <signal.h> 20#include <signal.h>
21#include <string.h>
21 22
22class ScopedSignalHandler { 23class ScopedSignalHandler {
23 public: 24 public:
24 ScopedSignalHandler(int signal_number, void (*handler)(int), int sa_flags = 0) 25 ScopedSignalHandler(int signal_number, void (*handler)(int), int sa_flags = 0)
25 : signal_number_(signal_number) { 26 : signal_number_(signal_number) {
26 sigemptyset(&action_.sa_mask); 27 memset(&action_, 0, sizeof(action_));
27 action_.sa_flags = sa_flags; 28 action_.sa_flags = sa_flags;
28 action_.sa_handler = handler; 29 action_.sa_handler = handler;
29 sigaction(signal_number_, &action_, &old_action_); 30 sigaction(signal_number_, &action_, &old_action_);
30 } 31 }
31 32
33 ScopedSignalHandler(int signal_number, void (*action)(int, siginfo_t*, void*),
34 int sa_flags = SA_SIGINFO)
35 : signal_number_(signal_number) {
36 memset(&action_, 0, sizeof(action_));
37 action_.sa_flags = sa_flags;
38 action_.sa_sigaction = action;
39 sigaction(signal_number_, &action_, &old_action_);
40 }
41
32 ~ScopedSignalHandler() { 42 ~ScopedSignalHandler() {
33 sigaction(signal_number_, &old_action_, NULL); 43 sigaction(signal_number_, &old_action_, NULL);
34 } 44 }
diff --git a/tests/pthread_test.cpp b/tests/pthread_test.cpp
index 797468ef..f63d1ee9 100644
--- a/tests/pthread_test.cpp
+++ b/tests/pthread_test.cpp
@@ -178,17 +178,34 @@ static void* IdFn(void* arg) {
178 return arg; 178 return arg;
179} 179}
180 180
181static void* SleepFn(void* arg) { 181class SpinFunctionHelper {
182 sleep(reinterpret_cast<uintptr_t>(arg)); 182 public:
183 return NULL; 183 SpinFunctionHelper() {
184} 184 SpinFunctionHelper::spin_flag_ = true;
185 }
186 ~SpinFunctionHelper() {
187 UnSpin();
188 }
189 auto GetFunction() -> void* (*)(void*) {
190 return SpinFunctionHelper::SpinFn;
191 }
185 192
186static void* SpinFn(void* arg) { 193 void UnSpin() {
187 volatile bool* b = reinterpret_cast<volatile bool*>(arg); 194 SpinFunctionHelper::spin_flag_ = false;
188 while (!*b) {
189 } 195 }
190 return NULL; 196
191} 197 private:
198 static void* SpinFn(void*) {
199 while (spin_flag_) {}
200 return NULL;
201 }
202 static volatile bool spin_flag_;
203};
204
205// It doesn't matter if spin_flag_ is used in several tests,
206// because it is always set to false after each test. Each thread
207// loops on spin_flag_ can find it becomes false at some time.
208volatile bool SpinFunctionHelper::spin_flag_ = false;
192 209
193static void* JoinFn(void* arg) { 210static void* JoinFn(void* arg) {
194 return reinterpret_cast<void*>(pthread_join(reinterpret_cast<pthread_t>(arg), NULL)); 211 return reinterpret_cast<void*>(pthread_join(reinterpret_cast<pthread_t>(arg), NULL));
@@ -229,8 +246,10 @@ TEST(pthread, pthread_create_EAGAIN) {
229} 246}
230 247
231TEST(pthread, pthread_no_join_after_detach) { 248TEST(pthread, pthread_no_join_after_detach) {
249 SpinFunctionHelper spinhelper;
250
232 pthread_t t1; 251 pthread_t t1;
233 ASSERT_EQ(0, pthread_create(&t1, NULL, SleepFn, reinterpret_cast<void*>(5))); 252 ASSERT_EQ(0, pthread_create(&t1, NULL, spinhelper.GetFunction(), NULL));
234 253
235 // After a pthread_detach... 254 // After a pthread_detach...
236 ASSERT_EQ(0, pthread_detach(t1)); 255 ASSERT_EQ(0, pthread_detach(t1));
@@ -241,10 +260,10 @@ TEST(pthread, pthread_no_join_after_detach) {
241} 260}
242 261
243TEST(pthread, pthread_no_op_detach_after_join) { 262TEST(pthread, pthread_no_op_detach_after_join) {
244 bool done = false; 263 SpinFunctionHelper spinhelper;
245 264
246 pthread_t t1; 265 pthread_t t1;
247 ASSERT_EQ(0, pthread_create(&t1, NULL, SpinFn, &done)); 266 ASSERT_EQ(0, pthread_create(&t1, NULL, spinhelper.GetFunction(), NULL));
248 267
249 // If thread 2 is already waiting to join thread 1... 268 // If thread 2 is already waiting to join thread 1...
250 pthread_t t2; 269 pthread_t t2;
@@ -256,7 +275,7 @@ TEST(pthread, pthread_no_op_detach_after_join) {
256 ASSERT_EQ(0, pthread_detach(t1)); 275 ASSERT_EQ(0, pthread_detach(t1));
257 AssertDetached(t1, false); 276 AssertDetached(t1, false);
258 277
259 done = true; 278 spinhelper.UnSpin();
260 279
261 // ...but t2's join on t1 still goes ahead (which we can tell because our join on t2 finishes). 280 // ...but t2's join on t1 still goes ahead (which we can tell because our join on t2 finishes).
262 void* join_result; 281 void* join_result;
@@ -369,8 +388,10 @@ TEST(pthread, pthread_setname_np__self) {
369} 388}
370 389
371TEST(pthread, pthread_setname_np__other) { 390TEST(pthread, pthread_setname_np__other) {
391 SpinFunctionHelper spinhelper;
392
372 pthread_t t1; 393 pthread_t t1;
373 ASSERT_EQ(0, pthread_create(&t1, NULL, SleepFn, reinterpret_cast<void*>(5))); 394 ASSERT_EQ(0, pthread_create(&t1, NULL, spinhelper.GetFunction(), NULL));
374 ASSERT_EQ(0, pthread_setname_np(t1, "short 2")); 395 ASSERT_EQ(0, pthread_setname_np(t1, "short 2"));
375} 396}
376 397
@@ -451,8 +472,10 @@ TEST(pthread, pthread_detach__leak) {
451} 472}
452 473
453TEST(pthread, pthread_getcpuclockid__clock_gettime) { 474TEST(pthread, pthread_getcpuclockid__clock_gettime) {
475 SpinFunctionHelper spinhelper;
476
454 pthread_t t; 477 pthread_t t;
455 ASSERT_EQ(0, pthread_create(&t, NULL, SleepFn, reinterpret_cast<void*>(5))); 478 ASSERT_EQ(0, pthread_create(&t, NULL, spinhelper.GetFunction(), NULL));
456 479
457 clockid_t c; 480 clockid_t c;
458 ASSERT_EQ(0, pthread_getcpuclockid(t, &c)); 481 ASSERT_EQ(0, pthread_getcpuclockid(t, &c));
@@ -501,10 +524,10 @@ TEST(pthread, pthread_kill__no_such_thread) {
501} 524}
502 525
503TEST(pthread, pthread_join__multijoin) { 526TEST(pthread, pthread_join__multijoin) {
504 bool done = false; 527 SpinFunctionHelper spinhelper;
505 528
506 pthread_t t1; 529 pthread_t t1;
507 ASSERT_EQ(0, pthread_create(&t1, NULL, SpinFn, &done)); 530 ASSERT_EQ(0, pthread_create(&t1, NULL, spinhelper.GetFunction(), NULL));
508 531
509 pthread_t t2; 532 pthread_t t2;
510 ASSERT_EQ(0, pthread_create(&t2, NULL, JoinFn, reinterpret_cast<void*>(t1))); 533 ASSERT_EQ(0, pthread_create(&t2, NULL, JoinFn, reinterpret_cast<void*>(t1)));
@@ -514,7 +537,7 @@ TEST(pthread, pthread_join__multijoin) {
514 // Multiple joins to the same thread should fail. 537 // Multiple joins to the same thread should fail.
515 ASSERT_EQ(EINVAL, pthread_join(t1, NULL)); 538 ASSERT_EQ(EINVAL, pthread_join(t1, NULL));
516 539
517 done = true; 540 spinhelper.UnSpin();
518 541
519 // ...but t2's join on t1 still goes ahead (which we can tell because our join on t2 finishes). 542 // ...but t2's join on t1 still goes ahead (which we can tell because our join on t2 finishes).
520 void* join_result; 543 void* join_result;
diff --git a/tests/signal_test.cpp b/tests/signal_test.cpp
index 8fd8b72f..f8fdc3f9 100644
--- a/tests/signal_test.cpp
+++ b/tests/signal_test.cpp
@@ -16,9 +16,10 @@
16 16
17#include <signal.h> 17#include <signal.h>
18 18
19#include <errno.h>
20#include <gtest/gtest.h> 19#include <gtest/gtest.h>
21 20
21#include <errno.h>
22
22#include "ScopedSignalHandler.h" 23#include "ScopedSignalHandler.h"
23 24
24static size_t SIGNAL_MIN() { 25static size_t SIGNAL_MIN() {
@@ -276,3 +277,101 @@ TEST(signal, limits) {
276 // We don't currently reserve any at the top. 277 // We don't currently reserve any at the top.
277 ASSERT_EQ(SIGRTMAX, __SIGRTMAX); 278 ASSERT_EQ(SIGRTMAX, __SIGRTMAX);
278} 279}
280
281static int g_sigqueue_signal_handler_call_count = 0;
282
283static void SigqueueSignalHandler(int signum, siginfo_t* info, void*) {
284 ASSERT_EQ(SIGALRM, signum);
285 ASSERT_EQ(SIGALRM, info->si_signo);
286 ASSERT_EQ(SI_QUEUE, info->si_code);
287 ASSERT_EQ(1, info->si_value.sival_int);
288 ++g_sigqueue_signal_handler_call_count;
289}
290
291TEST(signal, sigqueue) {
292 ScopedSignalHandler ssh(SIGALRM, SigqueueSignalHandler, SA_SIGINFO);
293 sigval_t sigval;
294 sigval.sival_int = 1;
295 errno = 0;
296 ASSERT_EQ(0, sigqueue(getpid(), SIGALRM, sigval));
297 ASSERT_EQ(0, errno);
298 ASSERT_EQ(1, g_sigqueue_signal_handler_call_count);
299}
300
301TEST(signal, sigwaitinfo) {
302 // Block SIGALRM.
303 sigset_t just_SIGALRM;
304 sigemptyset(&just_SIGALRM);
305 sigaddset(&just_SIGALRM, SIGALRM);
306 sigset_t original_set;
307 ASSERT_EQ(0, sigprocmask(SIG_BLOCK, &just_SIGALRM, &original_set));
308
309 // Raise SIGALRM.
310 sigval_t sigval;
311 sigval.sival_int = 1;
312 ASSERT_EQ(0, sigqueue(getpid(), SIGALRM, sigval));
313
314 // Get pending SIGALRM.
315 siginfo_t info;
316 errno = 0;
317 ASSERT_EQ(SIGALRM, sigwaitinfo(&just_SIGALRM, &info));
318 ASSERT_EQ(0, errno);
319 ASSERT_EQ(SIGALRM, info.si_signo);
320 ASSERT_EQ(1, info.si_value.sival_int);
321
322 ASSERT_EQ(0, sigprocmask(SIG_SETMASK, &original_set, NULL));
323}
324
325TEST(signal, sigtimedwait) {
326 // Block SIGALRM.
327 sigset_t just_SIGALRM;
328 sigemptyset(&just_SIGALRM);
329 sigaddset(&just_SIGALRM, SIGALRM);
330 sigset_t original_set;
331 ASSERT_EQ(0, sigprocmask(SIG_BLOCK, &just_SIGALRM, &original_set));
332
333 // Raise SIGALRM.
334 sigval_t sigval;
335 sigval.sival_int = 1;
336 ASSERT_EQ(0, sigqueue(getpid(), SIGALRM, sigval));
337
338 // Get pending SIGALRM.
339 siginfo_t info;
340 struct timespec timeout;
341 timeout.tv_sec = 2;
342 timeout.tv_nsec = 0;
343 errno = 0;
344 ASSERT_EQ(SIGALRM, sigtimedwait(&just_SIGALRM, &info, &timeout));
345 ASSERT_EQ(0, errno);
346
347 ASSERT_EQ(0, sigprocmask(SIG_SETMASK, &original_set, NULL));
348}
349
350static int64_t NanoTime() {
351 struct timespec t;
352 t.tv_sec = t.tv_nsec = 0;
353 clock_gettime(CLOCK_MONOTONIC, &t);
354 return static_cast<int64_t>(t.tv_sec) * 1000000000LL + t.tv_nsec;
355}
356
357TEST(signal, sigtimedwait_timeout) {
358 // Block SIGALRM.
359 sigset_t just_SIGALRM;
360 sigemptyset(&just_SIGALRM);
361 sigaddset(&just_SIGALRM, SIGALRM);
362 sigset_t original_set;
363 ASSERT_EQ(0, sigprocmask(SIG_BLOCK, &just_SIGALRM, &original_set));
364
365 // Wait timeout.
366 int64_t start_time = NanoTime();
367 siginfo_t info;
368 struct timespec timeout;
369 timeout.tv_sec = 0;
370 timeout.tv_nsec = 1000000;
371 errno = 0;
372 ASSERT_EQ(-1, sigtimedwait(&just_SIGALRM, &info, &timeout));
373 ASSERT_EQ(EAGAIN, errno);
374 ASSERT_GE(NanoTime() - start_time, 1000000);
375
376 ASSERT_EQ(0, sigprocmask(SIG_SETMASK, &original_set, NULL));
377}
diff --git a/tests/unistd_test.cpp b/tests/unistd_test.cpp
index f0aeb09c..433c1b50 100644
--- a/tests/unistd_test.cpp
+++ b/tests/unistd_test.cpp
@@ -554,6 +554,7 @@ TEST(unistd, _POSIX_macros_smoke) {
554 EXPECT_EQ(_POSIX_VERSION, _POSIX_PRIORITY_SCHEDULING); 554 EXPECT_EQ(_POSIX_VERSION, _POSIX_PRIORITY_SCHEDULING);
555 EXPECT_EQ(_POSIX_VERSION, _POSIX_RAW_SOCKETS); 555 EXPECT_EQ(_POSIX_VERSION, _POSIX_RAW_SOCKETS);
556 EXPECT_EQ(_POSIX_VERSION, _POSIX_READER_WRITER_LOCKS); 556 EXPECT_EQ(_POSIX_VERSION, _POSIX_READER_WRITER_LOCKS);
557 EXPECT_EQ(_POSIX_VERSION, _POSIX_REALTIME_SIGNALS);
557 EXPECT_GT(_POSIX_REGEXP, 0); 558 EXPECT_GT(_POSIX_REGEXP, 0);
558 EXPECT_GT(_POSIX_RE_DUP_MAX, 0); 559 EXPECT_GT(_POSIX_RE_DUP_MAX, 0);
559 EXPECT_GT(_POSIX_SAVED_IDS, 0); 560 EXPECT_GT(_POSIX_SAVED_IDS, 0);
@@ -617,7 +618,6 @@ TEST(unistd, _POSIX_macros_smoke) {
617 EXPECT_EQ(-1, _POSIX_CPUTIME); 618 EXPECT_EQ(-1, _POSIX_CPUTIME);
618 EXPECT_EQ(-1, _POSIX_MESSAGE_PASSING); 619 EXPECT_EQ(-1, _POSIX_MESSAGE_PASSING);
619 EXPECT_EQ(-1, _POSIX_PRIORITIZED_IO); 620 EXPECT_EQ(-1, _POSIX_PRIORITIZED_IO);
620 EXPECT_EQ(-1, _POSIX_REALTIME_SIGNALS);
621 EXPECT_EQ(-1, _POSIX_SHARED_MEMORY_OBJECTS); 621 EXPECT_EQ(-1, _POSIX_SHARED_MEMORY_OBJECTS);
622 EXPECT_EQ(-1, _POSIX_SPAWN); 622 EXPECT_EQ(-1, _POSIX_SPAWN);
623 EXPECT_EQ(-1, _POSIX_SPIN_LOCKS); 623 EXPECT_EQ(-1, _POSIX_SPIN_LOCKS);
@@ -702,6 +702,7 @@ TEST(unistd, sysconf) {
702 VERIFY_SYSCONF_POSIX_VERSION(_SC_MEMLOCK_RANGE); 702 VERIFY_SYSCONF_POSIX_VERSION(_SC_MEMLOCK_RANGE);
703 VERIFY_SYSCONF_POSIX_VERSION(_SC_MEMORY_PROTECTION); 703 VERIFY_SYSCONF_POSIX_VERSION(_SC_MEMORY_PROTECTION);
704 VERIFY_SYSCONF_POSIX_VERSION(_SC_PRIORITY_SCHEDULING); 704 VERIFY_SYSCONF_POSIX_VERSION(_SC_PRIORITY_SCHEDULING);
705 VERIFY_SYSCONF_POSIX_VERSION(_SC_REALTIME_SIGNALS);
705 VERIFY_SYSCONF_POSIX_VERSION(_SC_SEMAPHORES); 706 VERIFY_SYSCONF_POSIX_VERSION(_SC_SEMAPHORES);
706 VERIFY_SYSCONF_POSIX_VERSION(_SC_SYNCHRONIZED_IO); 707 VERIFY_SYSCONF_POSIX_VERSION(_SC_SYNCHRONIZED_IO);
707 VERIFY_SYSCONF_POSIX_VERSION(_SC_TIMERS); 708 VERIFY_SYSCONF_POSIX_VERSION(_SC_TIMERS);
@@ -778,7 +779,6 @@ TEST(unistd, sysconf) {
778 VERIFY_SYSCONF_NOT_SUPPORT(_SC_CPUTIME); 779 VERIFY_SYSCONF_NOT_SUPPORT(_SC_CPUTIME);
779 VERIFY_SYSCONF_NOT_SUPPORT(_SC_MESSAGE_PASSING); 780 VERIFY_SYSCONF_NOT_SUPPORT(_SC_MESSAGE_PASSING);
780 VERIFY_SYSCONF_NOT_SUPPORT(_SC_PRIORITIZED_IO); 781 VERIFY_SYSCONF_NOT_SUPPORT(_SC_PRIORITIZED_IO);
781 VERIFY_SYSCONF_NOT_SUPPORT(_SC_REALTIME_SIGNALS);
782 VERIFY_SYSCONF_NOT_SUPPORT(_SC_SHARED_MEMORY_OBJECTS); 782 VERIFY_SYSCONF_NOT_SUPPORT(_SC_SHARED_MEMORY_OBJECTS);
783 VERIFY_SYSCONF_NOT_SUPPORT(_SC_SPAWN); 783 VERIFY_SYSCONF_NOT_SUPPORT(_SC_SPAWN);
784 VERIFY_SYSCONF_NOT_SUPPORT(_SC_SPIN_LOCKS); 784 VERIFY_SYSCONF_NOT_SUPPORT(_SC_SPIN_LOCKS);