Chromium Code Reviews| Index: sandbox/linux/tests/unit_tests.cc |
| diff --git a/sandbox/linux/tests/unit_tests.cc b/sandbox/linux/tests/unit_tests.cc |
| index 2e24d8c07c8ffa27386099f439bbda83b1894e2c..78a3bc841984e591271ad64aa2391e2442c6760f 100644 |
| --- a/sandbox/linux/tests/unit_tests.cc |
| +++ b/sandbox/linux/tests/unit_tests.cc |
| @@ -2,13 +2,64 @@ |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| -#include "testing/gtest/include/gtest/gtest.h" |
| -int main(int argc, char *argv[]) { |
| - testing::InitGoogleTest(&argc, argv); |
| - // Always go through re-execution for death tests. |
| - // This makes gtest only marginally slower for us and has the |
| - // additional side effect of getting rid of gtest warnings about fork() |
| - // safety. |
| - ::testing::FLAGS_gtest_death_test_style = "threadsafe"; |
| - return RUN_ALL_TESTS(); |
| +#include <stdio.h> |
| +#include <sys/resource.h> |
| +#include <sys/time.h> |
| + |
| +#include "base/file_util.h" |
| +#include "sandbox/linux/tests/unit_tests.h" |
| + |
| +namespace sandbox { |
| + |
| +void UnitTests::RunTestInProcess(UnitTests::Test test) { |
| + // Runs a test in a sub-process. This is necessary for most of the code |
| + // in the BPF sandbox, as it potentially makes global state changes and as |
| + // it also tends to raise fatal errors, if the code has been used in an |
| + // insecure manner. |
| + int fds[2]; |
| + ASSERT_EQ(pipe(fds), 0); |
| + |
| + pid_t pid; |
| + ASSERT_GE((pid = fork()), 0); |
| + if (!pid) { |
| + // In child process |
| + // Redirect stderr to our pipe. This way, we can capture all error |
| + // messages, if we decide we want to do so in our tests. |
| + SANDBOX_ASSERT(dup2(fds[1], 2) == 2); |
| + SANDBOX_ASSERT(!close(fds[0])); |
| + SANDBOX_ASSERT(!close(fds[1])); |
| + |
| + // Disable core files. They are not very useful for our individual test |
| + // cases. |
| + struct rlimit no_core = { 0 }; |
| + setrlimit(RLIMIT_CORE, &no_core); |
| + |
| + SANDBOX_ASSERT(test()); |
| + _exit(1); |
| + } |
| + |
| + HANDLE_EINTR(close(fds[1])); |
| + std::vector<char> msg; |
| + ssize_t rc; |
| + do { |
| + const int kCapacity = 256; |
|
jln (very slow on Chromium)
2012/08/23 22:53:09
I think we want:
1. To make msg a std::string
2.
|
| + size_t len = msg.size(); |
| + msg.resize(len + kCapacity); |
| + rc = HANDLE_EINTR(read(fds[0], &msg[len], kCapacity)); |
| + msg.resize(len + std::max(rc, static_cast<ssize_t>(0))); |
| + } while (rc > 0); |
| + HANDLE_EINTR(close(fds[0])); |
| + EXPECT_EQ(msg.size(), 0u) << std::string(msg.begin(), msg.end()); |
| + |
| + int status; |
| + HANDLE_EINTR(waitpid(pid, &status, 0)); |
|
jln (very slow on Chromium)
2012/08/23 22:53:09
We should check for error here. Maybe RunTestInPro
|
| } |
| + |
| +void UnitTests::AssertionFailure(const char *expr, const char *file, |
| + int line) { |
| + fprintf(stderr, "%s:%d:%s\n", file, line, expr); |
| + fflush(stderr); |
| + _exit(1); |
| +} |
| + |
| +} // namespace |