Index: test/win/win_multiprocess.h |
diff --git a/test/win/win_multiprocess.h b/test/win/win_multiprocess.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7624adabec09f61220e3faa8ef858f3f8b77c713 |
--- /dev/null |
+++ b/test/win/win_multiprocess.h |
@@ -0,0 +1,127 @@ |
+// Copyright 2015 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. |
+ |
+#ifndef CRASHPAD_TEST_WIN_WIN_MULTIPROCESS_H_ |
+#define CRASHPAD_TEST_WIN_WIN_MULTIPROCESS_H_ |
+ |
+#include <windows.h> |
+ |
+#include "base/basictypes.h" |
+#include "util/file/file_io.h" |
+#include "util/win/scoped_handle.h" |
+ |
+namespace crashpad { |
+namespace test { |
+ |
+//! \brief Manages a multiprocess test on Windows. |
+class WinMultiprocess { |
+ public: |
+ WinMultiprocess(); |
+ |
+ //! \brief Runs the test. |
+ //! |
+ //! This method establishes the testing environment by respawning the process |
+ //! as a child with additional flags. |
+ //! |
+ //! In the parent process, WinMultiprocessParent() is run, and in the child |
+ //! WinMultiprocessChild(). |
+ void Run(); |
+ |
+ //! \brief Sets the expected exit code of the child process. |
+ //! |
+ //! The default expected termination code is `EXIT_SUCCESS` (`0`). |
+ //! |
+ //! \param[in] code The expected exit status of the child. |
+ void SetExpectedChildExitCode(unsigned int exit_code); |
+ |
+ protected: |
+ virtual ~WinMultiprocess(); |
+ |
+ //! \brief Returns the read pipe's file handle. |
+ //! |
+ //! This method may be called by either the parent or the child process. |
+ //! Anything written to the write pipe in the partner process will appear |
+ //! on this file handle in this process. |
+ //! |
+ //! It is an error to call this after CloseReadPipe() has been called. |
+ //! |
+ //! \return The read pipe's file handle. |
+ FileHandle ReadPipeHandle() const; |
+ |
+ //! \brief Returns the write pipe's file handle. |
+ //! |
+ //! This method may be called by either the parent or the child process. |
+ //! Anything written to this file handle in this process will appear on |
+ //! the read pipe in the partner process. |
+ //! |
+ //! It is an error to call this after CloseWritePipe() has been called. |
+ //! |
+ //! \return The write pipe's file handle. |
+ FileHandle WritePipeHandle() const; |
+ |
+ //! \brief Closes the read pipe. |
+ //! |
+ //! This method may be called by either the parent or the child process. |
+ //! ReadPipeHandle() must not be called after this. |
+ void CloseReadPipe(); |
+ |
+ //! \brief Closes the write pipe. |
+ //! |
+ //! This method may be called by either the parent or the child process. An |
+ //! attempt to read from the read pipe in the partner process will indicate |
+ //! end-of-file. WritePipeHandle() must not be called after this. |
+ void CloseWritePipe(); |
+ |
+ //! \brief Returns a handle to the child process. |
+ //! |
+ //! This method may only be called by the parent process. |
+ HANDLE ChildProcess() const; |
+ |
+ private: |
+ //! \brief The subclass-provided parent routine. |
+ //! |
+ //! Test failures should be reported via gtest: `EXPECT_*()`, `ASSERT_*()`, |
+ //! `FAIL()`, etc. |
+ //! |
+ //! This method need not use `WaitForSingleObject()`-family call to wait for |
+ //! the child process to exit, as this is handled by this class. |
+ //! |
+ //! Subclasses must implement this method to define how the parent operates. |
+ virtual void WinMultiprocessParent() = 0; |
+ |
+ //! \brief The subclass-provided child routine. |
+ //! |
+ //! Test failures should be reported via gtest: `EXPECT_*()`, `ASSERT_*()`, |
erikwright (departed)
2015/06/01 15:35:17
Is this true? What happens if a child process reco
|
+ //! `FAIL()`, etc. |
+ //! |
+ //! Subclasses must implement this method to define how the child operates. |
+ //! Subclasses may exit with a failure status by using `LOG(FATAL)`, |
+ //! `abort()`, or similar. They may exit cleanly by returning from this |
+ //! method. |
+ virtual void WinMultiprocessChild() = 0; |
+ |
+ ScopedFileHANDLE pipe_c2p_read_; |
+ ScopedFileHANDLE pipe_c2p_write_; |
+ ScopedFileHANDLE pipe_p2c_read_; |
+ ScopedFileHANDLE pipe_p2c_write_; |
+ ScopedKernelHANDLE child_handle_; |
+ unsigned int exit_code_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(WinMultiprocess); |
+}; |
+ |
+} // namespace test |
+} // namespace crashpad |
+ |
+#endif // CRASHPAD_TEST_WIN_WIN_MULTIPROCESS_H_ |