diff --git a/tests/gtest_ex.h b/tests/gtest_ex.h new file mode 100644 index 000000000..41ee22bfa --- /dev/null +++ b/tests/gtest_ex.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2014 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. + */ + +#include + +template +void test_forked(F test) { + int pid = fork(); + ASSERT_NE(-1, pid) << strerror(errno); + + if (pid == 0) { + test(); + _exit(testing::Test::HasFailure() ? 1 : 0); + } + + int status; + ASSERT_EQ(pid, waitpid(pid, &status, 0)); + ASSERT_TRUE(WIFEXITED(status)); + ASSERT_EQ(0, WEXITSTATUS(status)) << "Forked test has failed, see above.."; +} diff --git a/tests/pthread_test.cpp b/tests/pthread_test.cpp index b5e12a548..f45e2e6ba 100644 --- a/tests/pthread_test.cpp +++ b/tests/pthread_test.cpp @@ -19,6 +19,7 @@ #include "private/ScopeGuard.h" #include "BionicDeathTest.h" #include "ScopedSignalHandler.h" +#include "gtest_ex.h" #include #include @@ -721,22 +722,24 @@ static int g_atfork_child_calls = 0; static void AtForkChild1() { g_atfork_child_calls = (g_atfork_child_calls << 4) | 1; } static void AtForkChild2() { g_atfork_child_calls = (g_atfork_child_calls << 4) | 2; } -TEST(pthread, pthread_atfork) { - ASSERT_EQ(0, pthread_atfork(AtForkPrepare1, AtForkParent1, AtForkChild1)); - ASSERT_EQ(0, pthread_atfork(AtForkPrepare2, AtForkParent2, AtForkChild2)); +TEST(pthread, pthread_atfork_smoke) { + test_forked([]() { + ASSERT_EQ(0, pthread_atfork(AtForkPrepare1, AtForkParent1, AtForkChild1)); + ASSERT_EQ(0, pthread_atfork(AtForkPrepare2, AtForkParent2, AtForkChild2)); - int pid = fork(); - ASSERT_NE(-1, pid) << strerror(errno); + int pid = fork(); + ASSERT_NE(-1, pid) << strerror(errno); - // Child and parent calls are made in the order they were registered. - if (pid == 0) { - ASSERT_EQ(0x12, g_atfork_child_calls); - _exit(0); - } - ASSERT_EQ(0x12, g_atfork_parent_calls); + // Child and parent calls are made in the order they were registered. + if (pid == 0) { + ASSERT_EQ(0x12, g_atfork_child_calls); + _exit(0); + } + ASSERT_EQ(0x12, g_atfork_parent_calls); - // Prepare calls are made in the reverse order. - ASSERT_EQ(0x21, g_atfork_prepare_calls); + // Prepare calls are made in the reverse order. + ASSERT_EQ(0x21, g_atfork_prepare_calls); + }); } TEST(pthread, pthread_attr_getscope) {