mirror of
https://github.com/google/googletest.git
synced 2024-12-30 21:23:01 +08:00
Get all the things to work.
This commit is contained in:
parent
b6cb5c3e40
commit
96c3c422ad
@ -245,6 +245,13 @@ static const char kDeathTestReturned = 'R';
|
||||
static const char kDeathTestThrew = 'T';
|
||||
static const char kDeathTestInternalError = 'I';
|
||||
|
||||
#if GTEST_OS_FUCHSIA
|
||||
|
||||
// File descriptor used for the pipe in the child process.
|
||||
static const int kFuchsiaReadPipeFd = 3;
|
||||
|
||||
#endif
|
||||
|
||||
// An enumeration describing all of the possible ways that a death test can
|
||||
// conclude. DIED means that the process died while executing the test
|
||||
// code; LIVED means that process lived beyond the end of the test code;
|
||||
@ -544,9 +551,7 @@ bool DeathTestImpl::Passed(bool status_ok) {
|
||||
if (!spawned())
|
||||
return false;
|
||||
|
||||
// FIXME: This isn't working.
|
||||
//const std::string error_message = GetCapturedStderr();
|
||||
const std::string error_message = "";
|
||||
const std::string error_message = GetCapturedStderr();
|
||||
|
||||
bool success = false;
|
||||
Message buffer;
|
||||
@ -811,7 +816,6 @@ class FuchsiaDeathTest : public DeathTestImpl {
|
||||
const int line_;
|
||||
|
||||
zx_handle_t child_process_;
|
||||
zx_handle_t pipe_handle_;
|
||||
};
|
||||
|
||||
// Utility class for accumulating command-line arguments.
|
||||
@ -868,16 +872,16 @@ int FuchsiaDeathTest::Wait() {
|
||||
&signals);
|
||||
GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);
|
||||
|
||||
// Close the pipe.
|
||||
status_zx = zx_handle_close(pipe_handle_);
|
||||
GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);
|
||||
|
||||
ReadAndInterpretStatusByte();
|
||||
|
||||
zx_info_process_t buffer;
|
||||
size_t actual;
|
||||
size_t avail;
|
||||
status_zx = zx_object_get_info(child_process_, ZX_INFO_PROCESS, &buffer, sizeof(buffer), &actual, &avail);
|
||||
status_zx = zx_object_get_info(
|
||||
child_process_,
|
||||
ZX_INFO_PROCESS,
|
||||
&buffer,
|
||||
sizeof(buffer),
|
||||
nullptr,
|
||||
nullptr);
|
||||
GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);
|
||||
|
||||
GTEST_DEATH_TEST_CHECK_(buffer.exited);
|
||||
@ -900,53 +904,49 @@ DeathTest::TestRole FuchsiaDeathTest::AssumeRole() {
|
||||
if (flag != NULL) {
|
||||
// ParseInternalRunDeathTestFlag() has performed all the necessary
|
||||
// processing.
|
||||
set_write_fd(flag->write_fd());
|
||||
set_write_fd(kFuchsiaReadPipeFd);
|
||||
return EXECUTE_TEST;
|
||||
}
|
||||
|
||||
// FIXME: This isn't working on Fuchsia.
|
||||
// CaptureStderr();
|
||||
|
||||
CaptureStderr();
|
||||
// Flush the log buffers since the log streams are shared with the child.
|
||||
FlushInfoLog();
|
||||
|
||||
// Create the pipe
|
||||
zx_status_t status;
|
||||
uint32_t id;
|
||||
status = fdio_pipe_half(&pipe_handle_, &id);
|
||||
GTEST_DEATH_TEST_CHECK_(status >= 0);
|
||||
set_read_fd(status);
|
||||
|
||||
// Build the child process launcher.
|
||||
launchpad_t* lp;
|
||||
status = launchpad_create(ZX_HANDLE_INVALID, "processname", &lp);
|
||||
GTEST_DEATH_TEST_CHECK_(status == ZX_OK);
|
||||
|
||||
// Build the writing pipe for the child.
|
||||
int write_fd;
|
||||
status = launchpad_add_pipe(lp, &write_fd, read_fd());
|
||||
GTEST_DEATH_TEST_CHECK_(status == ZX_OK);
|
||||
|
||||
// Build the child process command line.
|
||||
const std::string filter_flag =
|
||||
std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "="
|
||||
+ info->test_case_name() + "." + info->name();
|
||||
const std::string internal_flag =
|
||||
std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "="
|
||||
+ file_ + "|" + StreamableToString(line_) + "|"
|
||||
+ StreamableToString(death_test_index) + "|"
|
||||
+ StreamableToString(write_fd);
|
||||
+ file_ + "|"
|
||||
+ StreamableToString(line_) + "|"
|
||||
+ StreamableToString(death_test_index);
|
||||
Arguments args;
|
||||
args.AddArguments(GetInjectableArgvs());
|
||||
args.AddArgument(filter_flag.c_str());
|
||||
args.AddArgument(internal_flag.c_str());
|
||||
|
||||
// Build the child process launcher.
|
||||
zx_status_t status;
|
||||
launchpad_t* lp;
|
||||
status = launchpad_create(ZX_HANDLE_INVALID, args.Argv()[0], &lp);
|
||||
GTEST_DEATH_TEST_CHECK_(status == ZX_OK);
|
||||
|
||||
// Build the pipe for communication with the child.
|
||||
int read_fd;
|
||||
status = launchpad_add_pipe(lp, &read_fd, 3);
|
||||
GTEST_DEATH_TEST_CHECK_(status == ZX_OK);
|
||||
set_read_fd(read_fd);
|
||||
|
||||
// Set the command line arguments.
|
||||
status = launchpad_load_from_file(lp, args.Argv()[0]);
|
||||
GTEST_DEATH_TEST_CHECK_(status == ZX_OK);
|
||||
status = launchpad_set_args(lp, args.size(), args.Argv());
|
||||
GTEST_DEATH_TEST_CHECK_(status == ZX_OK);
|
||||
|
||||
// Clone all the things (environment, stdio, namespace, ...).
|
||||
launchpad_clone(lp, LP_CLONE_ALL);
|
||||
|
||||
// Launch the child process.
|
||||
status = launchpad_go(lp, &child_process_, nullptr);
|
||||
GTEST_DEATH_TEST_CHECK_(status == ZX_OK);
|
||||
@ -1505,6 +1505,16 @@ InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
|
||||
write_fd = GetStatusFileDescriptor(parent_process_id,
|
||||
write_handle_as_size_t,
|
||||
event_handle_as_size_t);
|
||||
|
||||
# elif GTEST_OS_FUCHSIA
|
||||
|
||||
if (fields.size() != 3
|
||||
|| !ParseNaturalNumber(fields[1], &line)
|
||||
|| !ParseNaturalNumber(fields[2], &index)) {
|
||||
DeathTestAbort("Bad --gtest_internal_run_death_test flag: "
|
||||
+ GTEST_FLAG(internal_run_death_test));
|
||||
}
|
||||
|
||||
# else
|
||||
|
||||
if (fields.size() != 4
|
||||
|
Loading…
x
Reference in New Issue
Block a user