From 13613137bc4266656bffce464e525eb9ae6371f0 Mon Sep 17 00:00:00 2001 From: Christopher Ferris Date: Mon, 28 Oct 2013 15:24:04 -0700 Subject: [PATCH] Fix up failing glibc tests. There is a known bug running clone with the CLONE_VM flag, so for host create an empty test. Change the expected output of the stdio test for a glibc difference. Change the pause test to use ScopedSignalHandler to setup/restore the SIGALRM handler. After this, running bionic-unit-tests-glibc passes for all tests. Bug: 11389824 Change-Id: Ib304eae4164115835a54991dfdca5821ecc3db5e --- tests/ScopedSignalHandler.h | 41 +++++++++++++++++++++++++++++++++++++ tests/sched_test.cpp | 12 ++++++++++- tests/signal_test.cpp | 21 ++----------------- tests/stdio_test.cpp | 4 ++++ tests/unistd_test.cpp | 4 +++- 5 files changed, 61 insertions(+), 21 deletions(-) create mode 100644 tests/ScopedSignalHandler.h diff --git a/tests/ScopedSignalHandler.h b/tests/ScopedSignalHandler.h new file mode 100644 index 000000000..89a14a6b2 --- /dev/null +++ b/tests/ScopedSignalHandler.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _BIONIC_TESTS_SCOPED_SIGNAL_HANDLER_H +#define _BIONIC_TESTS_SCOPED_SIGNAL_HANDLER_H + +#include + +class ScopedSignalHandler { + public: + ScopedSignalHandler(int signal_number, void (*handler)(int)) : signal_number_(signal_number) { + sigemptyset(&action_.sa_mask); + action_.sa_flags = 0; + action_.sa_handler = handler; + sigaction(signal_number_, &action_, &old_action_); + } + + ~ScopedSignalHandler() { + sigaction(signal_number_, &old_action_, NULL); + } + + private: + struct sigaction action_; + struct sigaction old_action_; + const int signal_number_; +}; + +#endif // _BIONIC_TESTS_SCOPED_SIGNAL_HANDLER_H diff --git a/tests/sched_test.cpp b/tests/sched_test.cpp index ec48a4b37..49f164281 100644 --- a/tests/sched_test.cpp +++ b/tests/sched_test.cpp @@ -21,6 +21,7 @@ #include #include +#ifdef __BIONIC__ static int child_fn(void* i_ptr) { *reinterpret_cast(i_ptr) = 42; return 123; @@ -30,7 +31,7 @@ TEST(sched, clone) { void* child_stack[1024]; int i = 0; - pid_t tid = clone(child_fn, &child_stack[1024], /*CLONE_FILES | CLONE_FS | */CLONE_VM/* | CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM*/, &i); + pid_t tid = clone(child_fn, &child_stack[1024], CLONE_VM, &i); int status; ASSERT_EQ(tid, TEMP_FAILURE_RETRY(waitpid(tid, &status, __WCLONE))); @@ -40,3 +41,12 @@ TEST(sched, clone) { ASSERT_TRUE(WIFEXITED(status)); ASSERT_EQ(123, WEXITSTATUS(status)); } +#else +// For glibc, any call to clone with CLONE_VM set will cause later pthread +// calls in the same process to misbehave. +// See https://sourceware.org/bugzilla/show_bug.cgi?id=10311 for more details. +TEST(sched, clone) { + // In order to enumerate all possible tests for CTS, create an empty test. + GTEST_LOG_(INFO) << "This test does nothing.\n"; +} +#endif diff --git a/tests/signal_test.cpp b/tests/signal_test.cpp index 7705e2c49..a7e5b9aff 100644 --- a/tests/signal_test.cpp +++ b/tests/signal_test.cpp @@ -19,6 +19,8 @@ #include #include +#include "ScopedSignalHandler.h" + static size_t SIGNAL_MIN() { return 1; // Signals start at 1 (SIGHUP), not 0. } @@ -85,25 +87,6 @@ static void TestSigSet2(Fn fn) { ASSERT_EQ(0, errno); } -class ScopedSignalHandler { - public: - ScopedSignalHandler(int signal_number, void (*handler)(int)) : signal_number_(signal_number) { - sigemptyset(&action_.sa_mask); - action_.sa_flags = 0; - action_.sa_handler = handler; - sigaction(signal_number_, &action_, &old_action_); - } - - ~ScopedSignalHandler() { - sigaction(signal_number_, &old_action_, NULL); - } - - private: - struct sigaction action_; - struct sigaction old_action_; - const int signal_number_; -}; - TEST(signal, sigismember_invalid) { TestSigSet2(sigismember); } diff --git a/tests/stdio_test.cpp b/tests/stdio_test.cpp index 2d9717f5c..11bd17f84 100644 --- a/tests/stdio_test.cpp +++ b/tests/stdio_test.cpp @@ -273,7 +273,11 @@ TEST(stdio, snprintf_smoke) { void* p = NULL; snprintf(buf, sizeof(buf), "a%d,%pz", 5, p); +#if defined(__BIONIC__) EXPECT_STREQ("a5,0x0z", buf); +#else + EXPECT_STREQ("a5,(nil)z", buf); +#endif snprintf(buf, sizeof(buf), "a%lld,%d,%d,%dz", 0x1000000000LL, 6, 7, 8); EXPECT_STREQ("a68719476736,6,7,8z", buf); diff --git a/tests/unistd_test.cpp b/tests/unistd_test.cpp index 7d0af7c7e..2308ad95f 100644 --- a/tests/unistd_test.cpp +++ b/tests/unistd_test.cpp @@ -15,6 +15,7 @@ */ #include +#include "ScopedSignalHandler.h" #include "TemporaryFile.h" #include @@ -80,7 +81,8 @@ static void PauseTestSignalHandler(int) { } TEST(unistd, pause) { - signal(SIGALRM, PauseTestSignalHandler); + ScopedSignalHandler handler(SIGALRM, PauseTestSignalHandler); + alarm(1); ASSERT_FALSE(gPauseTestFlag); ASSERT_EQ(-1, pause());