Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(926)

Unified Diff: util/test/multiprocess.h

Issue 506143002: Refactor MachMultiprocess (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « util/test/mac/mach_multiprocess_test.cc ('k') | util/test/multiprocess.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: util/test/multiprocess.h
diff --git a/util/test/mac/mach_multiprocess.h b/util/test/multiprocess.h
similarity index 52%
copy from util/test/mac/mach_multiprocess.h
copy to util/test/multiprocess.h
index d68355462976888be6ae166c4895dc98f4d1a996..80ee8415968fc433d8e8c8c79dd6c2fdef9e6b80 100644
--- a/util/test/mac/mach_multiprocess.h
+++ b/util/test/multiprocess.h
@@ -12,10 +12,9 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#ifndef CRASHPAD_UTIL_TEST_MAC_MACH_MULTIPROCESS_H_
-#define CRASHPAD_UTIL_TEST_MAC_MACH_MULTIPROCESS_H_
+#ifndef CRASHPAD_UTIL_TEST_MULTIPROCESS_H_
+#define CRASHPAD_UTIL_TEST_MULTIPROCESS_H_
-#include <mach/mach.h>
#include <unistd.h>
#include "base/basictypes.h"
@@ -24,54 +23,58 @@ namespace crashpad {
namespace test {
namespace internal {
-struct MachMultiprocessInfo;
-} // namespace internal
+struct MultiprocessInfo;
+};
-//! \brief Manages a Mach-aware multiprocess test.
+//! \brief Manages a multiprocess test.
//!
-//! These tests are `fork()`-based. The parent process has access to the child
-//! process’ task port. The parent and child processes are able to communicate
-//! via Mach IPC, and via a pair of POSIX pipes.
+//! These tests are `fork()`-based. The parent and child processes are able to
+//! communicate via a pair of POSIX pipes.
//!
//! Subclasses are expected to implement the parent and child by overriding the
//! appropriate methods.
-class MachMultiprocess {
+class Multiprocess {
public:
- MachMultiprocess();
+ Multiprocess();
//! \brief Runs the test.
//!
- //! This method establishes the proper testing environment and calls
- //! RunParent() in the parent process and RunChild() in the child process.
+ //! This method establishes the proper testing environment by calling
+ //! PreFork(), then calls `fork()`. In the parent process, it calls
+ //! RunParent(), and in the child process, it calls RunChild().
//!
//! This method uses gtest assertions to validate the testing environment. If
//! the testing environment cannot be set up properly, it is possible that
- //! Parent() or Child() will not be called. In the parent process, this method
- //! also waits for the child process to exit after Parent() returns, and
- //! verifies that it exited cleanly with gtest assertions.
+ //! MultiprocessParent() or MultiprocessChild() will not be called. In the
+ //! parent process, this method also waits for the child process to exit after
+ //! MultiprocessParent() returns, and verifies that it exited cleanly without
+ //! raising any gtest assertions.
void Run();
protected:
- ~MachMultiprocess();
+ ~Multiprocess();
- //! \brief The subclass-provided parent routine.
+ //! \brief Establishes the proper testing environment prior to forking.
//!
- //! Test failures should be reported via gtest: `EXPECT_*()`, `ASSERT_*()`,
- //! `FAIL()`, etc.
+ //! Subclasses that solely implement a test should not need to override this
+ //! method. Subclasses that do not implement tests but instead implement
+ //! additional testing features on top of this class may override this method
+ //! provided that they call the superclass’ implementation first as follows:
//!
- //! This method must not use a `wait()`-family system call to wait for the
- //! child process to exit, as this is handled by RunParent().
- //!
- //! Subclasses must implement this method to define how the parent operates.
- virtual void Parent() = 0;
-
- //! \brief The subclass-provided child routine.
+ //! \code
+ //! virtual void PreFork() override {
+ //! Multiprocess::PreFork();
+ //! if (testing::Test::HasFatalAssertions()) {
+ //! return;
+ //! }
//!
- //! Test failures should be reported via gtest: `EXPECT_*()`, `ASSERT_*()`,
- //! `FAIL()`, etc.
+ //! // Place subclass-specific pre-fork code here.
+ //! }
+ //! \endcode
//!
- //! Subclasses must implement this method to define how the child operates.
- virtual void Child() = 0;
+ //! Subclass implementations may signal failure by raising their own fatal
+ //! gtest assertions.
+ virtual void PreFork();
//! \brief Returns the child process’ process ID.
//!
@@ -92,48 +95,46 @@ class MachMultiprocess {
//! the read pipe in the partner process.
int WritePipeFD() const;
- //! \brief Returns a receive right for the local port.
- //!
- //! This method may be called by either the parent or the child process. It
- //! returns a receive right, with a corresponding send right held in the
- //! opposing process.
- mach_port_t LocalPort() const;
-
- //! \brief Returns a send right for the remote port.
- //!
- //! This method may be called by either the parent or the child process. It
- //! returns a send right, with the corresponding receive right held in the
- //! opposing process.
- mach_port_t RemotePort() const;
-
- //! \brief Returns a send right for the child’s task port.
- //!
- //! This method may only be called by the parent process.
- mach_port_t ChildTask() const;
-
private:
//! \brief Runs the parent side of the test.
//!
- //! This method establishes the parent’s environment, performs the handshake
- //! with the child, calls Parent(), and waits for the child process to exit.
- //! Assuming that the environment can be set up correctly and the child exits
- //! successfully, the test will pass.
+ //! This method establishes the parent’s environment and calls
+ //! MultiprocessParent().
void RunParent();
//! \brief Runs the child side of the test.
//!
- //! This method establishes the child’s environment, performs the handshake
- //! with the parent, calls Child(), and exits cleanly. However, if any failure
- //! (via fatal or nonfatal gtest assertion) is detected, the child will exit
- //! with a failure status.
+ //! This method establishes the child’s environment, calls
+ //! MultiprocessChild(), and exits cleanly. However, if any failure (via fatal
+ //! or nonfatal gtest assertion) is detected, the child will exit with a
+ //! failure status.
void RunChild();
- internal::MachMultiprocessInfo* info_;
+ //! \brief The subclass-provided parent routine.
+ //!
+ //! Test failures should be reported via gtest: `EXPECT_*()`, `ASSERT_*()`,
+ //! `FAIL()`, etc.
+ //!
+ //! This method must not use a `wait()`-family system 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 MultiprocessParent() = 0;
+
+ //! \brief The subclass-provided child routine.
+ //!
+ //! Test failures should be reported via gtest: `EXPECT_*()`, `ASSERT_*()`,
+ //! `FAIL()`, etc.
+ //!
+ //! Subclasses must implement this method to define how the child operates.
+ virtual void MultiprocessChild() = 0;
+
+ internal::MultiprocessInfo* info_;
- DISALLOW_COPY_AND_ASSIGN(MachMultiprocess);
+ DISALLOW_COPY_AND_ASSIGN(Multiprocess);
};
} // namespace test
} // namespace crashpad
-#endif // CRASHPAD_UTIL_TEST_MAC_MACH_MULTIPROCESS_H_
+#endif // CRASHPAD_UTIL_TEST_MULTIPROCESS_H_
« no previous file with comments | « util/test/mac/mach_multiprocess_test.cc ('k') | util/test/multiprocess.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698