crashpad/util/test/multiprocess_exec_test.cc
Scott Graham 892c29e8ba Reorganize Multiprocess and implement for Windows
- Various "FD" to "Handle"
- Existing Multiprocess implementation moves to _posix.
- Stub implementation for _win.

At the moment, multiprocess_exec_win.cc contains implementations of both
Multiprocess methods and MultiprocessExec functions. This will need more
work in the future, but reflects the idea that all tests should be in
terms of MultiprocessExec eventually.

Currently, this works sufficiently to have util_test succeed (including
multiprocess_exec_test, and the recently ported HTTPTransport tests.)

R=mark@chromium.org
BUG=crashpad:1, crashpad:7

Review URL: https://codereview.chromium.org/880763002
2015-01-28 14:49:42 -08:00

69 lines
2.1 KiB
C++

// Copyright 2014 The Crashpad Authors. All rights reserved.
//
// 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 "util/test/multiprocess_exec.h"
#include "base/basictypes.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
#include "gtest/gtest.h"
#include "util/file/file_io.h"
#include "util/test/executable_path.h"
namespace crashpad {
namespace test {
namespace {
class TestMultiprocessExec final : public MultiprocessExec {
public:
TestMultiprocessExec() : MultiprocessExec() {}
~TestMultiprocessExec() {}
private:
void MultiprocessParent() override {
// Use Logging*File() instead of Checked*File() so that the test can fail
// gracefully with a gtest assertion if the child does not execute properly.
char c = 'z';
ASSERT_TRUE(LoggingWriteFile(WritePipeHandle(), &c, 1));
ASSERT_TRUE(LoggingReadFile(ReadPipeHandle(), &c, 1));
EXPECT_EQ('Z', c);
}
DISALLOW_COPY_AND_ASSIGN(TestMultiprocessExec);
};
TEST(MultiprocessExec, MultiprocessExec) {
TestMultiprocessExec multiprocess_exec;
base::FilePath test_executable = ExecutablePath();
#if defined(OS_POSIX)
std::string child_test_executable = test_executable.value();
#elif defined(OS_WIN)
std::string child_test_executable =
base::UTF16ToUTF8(test_executable.RemoveFinalExtension().value());
#endif // OS_POSIX
child_test_executable += "_multiprocess_exec_test_child";
#if defined(OS_WIN)
child_test_executable += ".exe";
#endif
multiprocess_exec.SetChildCommand(child_test_executable, nullptr);
multiprocess_exec.Run();
}
} // namespace
} // namespace test
} // namespace crashpad